aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.eslintrc.json4
-rw-r--r--.prettierrc2
-rw-r--r--changelog.md2
-rw-r--r--demo/dist/demo.js8751
-rw-r--r--demo/dist/demo.js.map2
-rw-r--r--demo/dist/demo.min.js2
-rw-r--r--demo/dist/demo.min.js.map2
-rw-r--r--dist/plyr.js12769
-rw-r--r--dist/plyr.js.map2
-rw-r--r--dist/plyr.min.js2
-rw-r--r--dist/plyr.min.js.map2
-rw-r--r--dist/plyr.polyfilled.js26602
-rw-r--r--dist/plyr.polyfilled.js.map2
-rw-r--r--dist/plyr.polyfilled.min.js2
-rw-r--r--dist/plyr.polyfilled.min.js.map2
-rw-r--r--package.json10
-rw-r--r--plyr.code-workspace3
-rw-r--r--readme.md3
-rw-r--r--src/js/captions.js266
-rw-r--r--src/js/config/defaults.js (renamed from src/js/defaults.js)19
-rw-r--r--src/js/config/types.js (renamed from src/js/types.js)18
-rw-r--r--src/js/controls.js480
-rw-r--r--src/js/fullscreen.js57
-rw-r--r--src/js/html5.js84
-rw-r--r--src/js/i18n.js17
-rw-r--r--src/js/listeners.js296
-rw-r--r--src/js/media.js33
-rw-r--r--src/js/plugins/ads.js44
-rw-r--r--src/js/plugins/vimeo.js110
-rw-r--r--src/js/plugins/youtube.js246
-rw-r--r--src/js/plyr.js246
-rw-r--r--src/js/source.js65
-rw-r--r--src/js/storage.js13
-rw-r--r--src/js/support.js137
-rw-r--r--src/js/ui.js120
-rw-r--r--src/js/utils.js853
-rw-r--r--src/js/utils/animation.js30
-rw-r--r--src/js/utils/arrays.js23
-rw-r--r--src/js/utils/browser.js13
-rw-r--r--src/js/utils/elements.js285
-rw-r--r--src/js/utils/events.js120
-rw-r--r--src/js/utils/fetch.js42
-rw-r--r--src/js/utils/is.js67
-rw-r--r--src/js/utils/loadImage.js19
-rw-r--r--src/js/utils/loadScript.js14
-rw-r--r--src/js/utils/loadSprite.js75
-rw-r--r--src/js/utils/objects.js42
-rw-r--r--src/js/utils/strings.js85
-rw-r--r--src/js/utils/time.js36
-rw-r--r--src/js/utils/urls.js39
-rw-r--r--yarn.lock89
51 files changed, 26026 insertions, 26221 deletions
diff --git a/.eslintrc.json b/.eslintrc.json
index c8dc1b74..1fc24ce3 100644
--- a/.eslintrc.json
+++ b/.eslintrc.json
@@ -32,9 +32,7 @@
"message": "Use local parameter instead."
}
],
- "no-param-reassign": [2, { "props": false }],
- "array-bracket-newline": [2, { "minItems": 2 }],
- "array-element-newline": [2, { "minItems": 2 }]
+ "no-param-reassign": [2, { "props": false }]
},
"parserOptions": {
"sourceType": "module"
diff --git a/.prettierrc b/.prettierrc
index e1544230..68cc4db2 100644
--- a/.prettierrc
+++ b/.prettierrc
@@ -1,7 +1,7 @@
{
"useTabs": false,
"tabWidth": 4,
- "printWidth": 160,
+ "printWidth": 120,
"singleQuote": true,
"trailingComma": "all"
}
diff --git a/changelog.md b/changelog.md
index 1e20d19f..ce4d8d82 100644
--- a/changelog.md
+++ b/changelog.md
@@ -21,7 +21,7 @@
Again, more changes from @friday!
-- Restore window reference in `utils.is.cue()`
+- Restore window reference in `is.cue()`
- Fix InvalidStateError and IE11 issues
- Respect storage being disabled for storage getter
diff --git a/demo/dist/demo.js b/demo/dist/demo.js
index 23575805..eb7bfda1 100644
--- a/demo/dist/demo.js
+++ b/demo/dist/demo.js
@@ -1,4371 +1,4388 @@
typeof navigator === "object" && (function () {
-'use strict';
-
-var commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
-
-function createCommonjsModule(fn, module) {
- return module = { exports: {} }, fn(module, module.exports), module.exports;
-}
-
-var stringify_1 = createCommonjsModule(function (module, exports) {
-/*
- json-stringify-safe
- Like JSON.stringify, but doesn't throw on circular references.
-
- Originally forked from https://github.com/isaacs/json-stringify-safe
- version 5.0.1 on 3/8/2017 and modified to handle Errors serialization
- and IE8 compatibility. Tests for this are in test/vendor.
-
- ISC license: https://github.com/isaacs/json-stringify-safe/blob/master/LICENSE
-*/
-
-exports = module.exports = stringify;
-exports.getSerialize = serializer;
-
-function indexOf(haystack, needle) {
- for (var i = 0; i < haystack.length; ++i) {
- if (haystack[i] === needle) return i;
- }
- return -1;
-}
-
-function stringify(obj, replacer, spaces, cycleReplacer) {
- return JSON.stringify(obj, serializer(replacer, cycleReplacer), spaces);
-}
-
-// https://github.com/ftlabs/js-abbreviate/blob/fa709e5f139e7770a71827b1893f22418097fbda/index.js#L95-L106
-function stringifyError(value) {
- var err = {
- // These properties are implemented as magical getters and don't show up in for in
- stack: value.stack,
- message: value.message,
- name: value.name
- };
-
- for (var i in value) {
- if (Object.prototype.hasOwnProperty.call(value, i)) {
- err[i] = value[i];
- }
- }
-
- return err;
-}
-
-function serializer(replacer, cycleReplacer) {
- var stack = [];
- var keys = [];
-
- if (cycleReplacer == null) {
- cycleReplacer = function(key, value) {
- if (stack[0] === value) {
- return '[Circular ~]';
- }
- return '[Circular ~.' + keys.slice(0, indexOf(stack, value)).join('.') + ']';
- };
- }
-
- return function(key, value) {
- if (stack.length > 0) {
- var thisPos = indexOf(stack, this);
- ~thisPos ? stack.splice(thisPos + 1) : stack.push(this);
- ~thisPos ? keys.splice(thisPos, Infinity, key) : keys.push(key);
-
- if (~indexOf(stack, value)) {
- value = cycleReplacer.call(this, key, value);
- }
- } else {
- stack.push(value);
- }
-
- return replacer == null
- ? value instanceof Error ? stringifyError(value) : value
- : replacer.call(this, key, value);
- };
-}
-});
-var stringify_2 = stringify_1.getSerialize;
-
-var _window =
- typeof window !== 'undefined'
- ? window
- : typeof commonjsGlobal !== 'undefined' ? commonjsGlobal : typeof self !== 'undefined' ? self : {};
-
-function isObject(what) {
- return typeof what === 'object' && what !== null;
-}
-
-// Yanked from https://git.io/vS8DV re-used under CC0
-// with some tiny modifications
-function isError(value) {
- switch (Object.prototype.toString.call(value)) {
- case '[object Error]':
- return true;
- case '[object Exception]':
- return true;
- case '[object DOMException]':
- return true;
- default:
- return value instanceof Error;
- }
-}
-
-function isErrorEvent(value) {
- return Object.prototype.toString.call(value) === '[object ErrorEvent]';
-}
-
-function isDOMError(value) {
- return Object.prototype.toString.call(value) === '[object DOMError]';
-}
-
-function isDOMException(value) {
- return Object.prototype.toString.call(value) === '[object DOMException]';
-}
-
-function isUndefined(what) {
- return what === void 0;
-}
-
-function isFunction(what) {
- return typeof what === 'function';
-}
-
-function isPlainObject(what) {
- return Object.prototype.toString.call(what) === '[object Object]';
-}
-
-function isString(what) {
- return Object.prototype.toString.call(what) === '[object String]';
-}
-
-function isArray(what) {
- return Object.prototype.toString.call(what) === '[object Array]';
-}
-
-function isEmptyObject(what) {
- if (!isPlainObject(what)) return false;
-
- for (var _ in what) {
- if (what.hasOwnProperty(_)) {
- return false;
- }
- }
- return true;
-}
-
-function supportsErrorEvent() {
- try {
- new ErrorEvent(''); // eslint-disable-line no-new
- return true;
- } catch (e) {
- return false;
- }
-}
-
-function supportsDOMError() {
- try {
- new DOMError(''); // eslint-disable-line no-new
- return true;
- } catch (e) {
- return false;
- }
-}
-
-function supportsDOMException() {
- try {
- new DOMException(''); // eslint-disable-line no-new
- return true;
- } catch (e) {
- return false;
- }
-}
-
-function supportsFetch() {
- if (!('fetch' in _window)) return false;
-
- try {
- new Headers(); // eslint-disable-line no-new
- new Request(''); // eslint-disable-line no-new
- new Response(); // eslint-disable-line no-new
- return true;
- } catch (e) {
- return false;
- }
-}
-
-// Despite all stars in the sky saying that Edge supports old draft syntax, aka 'never', 'always', 'origin' and 'default
-// https://caniuse.com/#feat=referrer-policy
-// It doesn't. And it throw exception instead of ignoring this parameter...
-// REF: https://github.com/getsentry/raven-js/issues/1233
-function supportsReferrerPolicy() {
- if (!supportsFetch()) return false;
-
- try {
- // eslint-disable-next-line no-new
- new Request('pickleRick', {
- referrerPolicy: 'origin'
- });
- return true;
- } catch (e) {
- return false;
- }
-}
-
-function supportsPromiseRejectionEvent() {
- return typeof PromiseRejectionEvent === 'function';
-}
-
-function wrappedCallback(callback) {
- function dataCallback(data, original) {
- var normalizedData = callback(data) || data;
- if (original) {
- return original(normalizedData) || normalizedData;
- }
- return normalizedData;
- }
-
- return dataCallback;
-}
-
-function each(obj, callback) {
- var i, j;
-
- if (isUndefined(obj.length)) {
- for (i in obj) {
- if (hasKey(obj, i)) {
- callback.call(null, i, obj[i]);
- }
- }
- } else {
- j = obj.length;
- if (j) {
- for (i = 0; i < j; i++) {
- callback.call(null, i, obj[i]);
- }
- }
- }
-}
-
-function objectMerge(obj1, obj2) {
- if (!obj2) {
- return obj1;
- }
- each(obj2, function(key, value) {
- obj1[key] = value;
- });
- return obj1;
-}
-
-/**
- * This function is only used for react-native.
- * react-native freezes object that have already been sent over the
- * js bridge. We need this function in order to check if the object is frozen.
- * So it's ok that objectFrozen returns false if Object.isFrozen is not
- * supported because it's not relevant for other "platforms". See related issue:
- * https://github.com/getsentry/react-native-sentry/issues/57
- */
-function objectFrozen(obj) {
- if (!Object.isFrozen) {
- return false;
- }
- return Object.isFrozen(obj);
-}
-
-function truncate(str, max) {
- if (typeof max !== 'number') {
- throw new Error('2nd argument to `truncate` function should be a number');
- }
- if (typeof str !== 'string' || max === 0) {
- return str;
- }
- return str.length <= max ? str : str.substr(0, max) + '\u2026';
-}
-
-/**
- * hasKey, a better form of hasOwnProperty
- * Example: hasKey(MainHostObject, property) === true/false
- *
- * @param {Object} host object to check property
- * @param {string} key to check
- */
-function hasKey(object, key) {
- return Object.prototype.hasOwnProperty.call(object, key);
-}
-
-function joinRegExp(patterns) {
- // Combine an array of regular expressions and strings into one large regexp
- // Be mad.
- var sources = [],
- i = 0,
- len = patterns.length,
- pattern;
-
- for (; i < len; i++) {
- pattern = patterns[i];
- if (isString(pattern)) {
- // If it's a string, we need to escape it
- // Taken from: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions
- sources.push(pattern.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, '\\$1'));
- } else if (pattern && pattern.source) {
- // If it's a regexp already, we want to extract the source
- sources.push(pattern.source);
- }
- // Intentionally skip other cases
- }
- return new RegExp(sources.join('|'), 'i');
-}
-
-function urlencode(o) {
- var pairs = [];
- each(o, function(key, value) {
- pairs.push(encodeURIComponent(key) + '=' + encodeURIComponent(value));
- });
- return pairs.join('&');
-}
-
-// borrowed from https://tools.ietf.org/html/rfc3986#appendix-B
-// intentionally using regex and not <a/> href parsing trick because React Native and other
-// environments where DOM might not be available
-function parseUrl(url) {
- if (typeof url !== 'string') return {};
- var match = url.match(/^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?$/);
-
- // coerce to undefined values to empty string so we don't get 'undefined'
- var query = match[6] || '';
- var fragment = match[8] || '';
- return {
- protocol: match[2],
- host: match[4],
- path: match[5],
- relative: match[5] + query + fragment // everything minus origin
- };
-}
-function uuid4() {
- var crypto = _window.crypto || _window.msCrypto;
-
- if (!isUndefined(crypto) && crypto.getRandomValues) {
- // Use window.crypto API if available
- // eslint-disable-next-line no-undef
- var arr = new Uint16Array(8);
- crypto.getRandomValues(arr);
-
- // set 4 in byte 7
- arr[3] = (arr[3] & 0xfff) | 0x4000;
- // set 2 most significant bits of byte 9 to '10'
- arr[4] = (arr[4] & 0x3fff) | 0x8000;
-
- var pad = function(num) {
- var v = num.toString(16);
- while (v.length < 4) {
- v = '0' + v;
- }
- return v;
- };
-
- return (
- pad(arr[0]) +
- pad(arr[1]) +
- pad(arr[2]) +
- pad(arr[3]) +
- pad(arr[4]) +
- pad(arr[5]) +
- pad(arr[6]) +
- pad(arr[7])
- );
- } else {
- // http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#2117523
- return 'xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
- var r = (Math.random() * 16) | 0,
- v = c === 'x' ? r : (r & 0x3) | 0x8;
- return v.toString(16);
- });
- }
-}
-
-/**
- * Given a child DOM element, returns a query-selector statement describing that
- * and its ancestors
- * e.g. [HTMLElement] => body > div > input#foo.btn[name=baz]
- * @param elem
- * @returns {string}
- */
-function htmlTreeAsString(elem) {
- /* eslint no-extra-parens:0*/
- var MAX_TRAVERSE_HEIGHT = 5,
- MAX_OUTPUT_LEN = 80,
- out = [],
- height = 0,
- len = 0,
- separator = ' > ',
- sepLength = separator.length,
- nextStr;
-
- while (elem && height++ < MAX_TRAVERSE_HEIGHT) {
- nextStr = htmlElementAsString(elem);
- // bail out if
- // - nextStr is the 'html' element
- // - the length of the string that would be created exceeds MAX_OUTPUT_LEN
- // (ignore this limit if we are on the first iteration)
- if (
- nextStr === 'html' ||
- (height > 1 && len + out.length * sepLength + nextStr.length >= MAX_OUTPUT_LEN)
- ) {
- break;
- }
-
- out.push(nextStr);
-
- len += nextStr.length;
- elem = elem.parentNode;
- }
-
- return out.reverse().join(separator);
-}
-
-/**
- * Returns a simple, query-selector representation of a DOM element
- * e.g. [HTMLElement] => input#foo.btn[name=baz]
- * @param HTMLElement
- * @returns {string}
- */
-function htmlElementAsString(elem) {
- var out = [],
- className,
- classes,
- key,
- attr,
- i;
-
- if (!elem || !elem.tagName) {
- return '';
- }
-
- out.push(elem.tagName.toLowerCase());
- if (elem.id) {
- out.push('#' + elem.id);
- }
-
- className = elem.className;
- if (className && isString(className)) {
- classes = className.split(/\s+/);
- for (i = 0; i < classes.length; i++) {
- out.push('.' + classes[i]);
- }
- }
- var attrWhitelist = ['type', 'name', 'title', 'alt'];
- for (i = 0; i < attrWhitelist.length; i++) {
- key = attrWhitelist[i];
- attr = elem.getAttribute(key);
- if (attr) {
- out.push('[' + key + '="' + attr + '"]');
- }
- }
- return out.join('');
-}
-
-/**
- * Returns true if either a OR b is truthy, but not both
- */
-function isOnlyOneTruthy(a, b) {
- return !!(!!a ^ !!b);
-}
-
-/**
- * Returns true if both parameters are undefined
- */
-function isBothUndefined(a, b) {
- return isUndefined(a) && isUndefined(b);
-}
-
-/**
- * Returns true if the two input exception interfaces have the same content
- */
-function isSameException(ex1, ex2) {
- if (isOnlyOneTruthy(ex1, ex2)) return false;
-
- ex1 = ex1.values[0];
- ex2 = ex2.values[0];
-
- if (ex1.type !== ex2.type || ex1.value !== ex2.value) return false;
-
- // in case both stacktraces are undefined, we can't decide so default to false
- if (isBothUndefined(ex1.stacktrace, ex2.stacktrace)) return false;
-
- return isSameStacktrace(ex1.stacktrace, ex2.stacktrace);
-}
-
-/**
- * Returns true if the two input stack trace interfaces have the same content
- */
-function isSameStacktrace(stack1, stack2) {
- if (isOnlyOneTruthy(stack1, stack2)) return false;
-
- var frames1 = stack1.frames;
- var frames2 = stack2.frames;
-
- // Exit early if frame count differs
- if (frames1.length !== frames2.length) return false;
-
- // Iterate through every frame; bail out if anything differs
- var a, b;
- for (var i = 0; i < frames1.length; i++) {
- a = frames1[i];
- b = frames2[i];
- if (
- a.filename !== b.filename ||
- a.lineno !== b.lineno ||
- a.colno !== b.colno ||
- a['function'] !== b['function']
- )
- return false;
- }
- return true;
-}
-
-/**
- * Polyfill a method
- * @param obj object e.g. `document`
- * @param name method name present on object e.g. `addEventListener`
- * @param replacement replacement function
- * @param track {optional} record instrumentation to an array
- */
-function fill(obj, name, replacement, track) {
- if (obj == null) return;
- var orig = obj[name];
- obj[name] = replacement(orig);
- obj[name].__raven__ = true;
- obj[name].__orig__ = orig;
- if (track) {
- track.push([obj, name, orig]);
- }
-}
-
-/**
- * Join values in array
- * @param input array of values to be joined together
- * @param delimiter string to be placed in-between values
- * @returns {string}
- */
-function safeJoin(input, delimiter) {
- if (!isArray(input)) return '';
-
- var output = [];
-
- for (var i = 0; i < input.length; i++) {
- try {
- output.push(String(input[i]));
- } catch (e) {
- output.push('[value cannot be serialized]');
- }
- }
-
- return output.join(delimiter);
-}
-
-// Default Node.js REPL depth
-var MAX_SERIALIZE_EXCEPTION_DEPTH = 3;
-// 50kB, as 100kB is max payload size, so half sounds reasonable
-var MAX_SERIALIZE_EXCEPTION_SIZE = 50 * 1024;
-var MAX_SERIALIZE_KEYS_LENGTH = 40;
-
-function utf8Length(value) {
- return ~-encodeURI(value).split(/%..|./).length;
-}
-
-function jsonSize(value) {
- return utf8Length(JSON.stringify(value));
-}
-
-function serializeValue(value) {
- if (typeof value === 'string') {
- var maxLength = 40;
- return truncate(value, maxLength);
- } else if (
- typeof value === 'number' ||
- typeof value === 'boolean' ||
- typeof value === 'undefined'
- ) {
- return value;
- }
-
- var type = Object.prototype.toString.call(value);
-
- // Node.js REPL notation
- if (type === '[object Object]') return '[Object]';
- if (type === '[object Array]') return '[Array]';
- if (type === '[object Function]')
- return value.name ? '[Function: ' + value.name + ']' : '[Function]';
-
- return value;
-}
-
-function serializeObject(value, depth) {
- if (depth === 0) return serializeValue(value);
-
- if (isPlainObject(value)) {
- return Object.keys(value).reduce(function(acc, key) {
- acc[key] = serializeObject(value[key], depth - 1);
- return acc;
- }, {});
- } else if (Array.isArray(value)) {
- return value.map(function(val) {
- return serializeObject(val, depth - 1);
- });
- }
-
- return serializeValue(value);
-}
-
-function serializeException(ex, depth, maxSize) {
- if (!isPlainObject(ex)) return ex;
-
- depth = typeof depth !== 'number' ? MAX_SERIALIZE_EXCEPTION_DEPTH : depth;
- maxSize = typeof depth !== 'number' ? MAX_SERIALIZE_EXCEPTION_SIZE : maxSize;
-
- var serialized = serializeObject(ex, depth);
-
- if (jsonSize(stringify_1(serialized)) > maxSize) {
- return serializeException(ex, depth - 1);
- }
-
- return serialized;
-}
-
-function serializeKeysForMessage(keys, maxLength) {
- if (typeof keys === 'number' || typeof keys === 'string') return keys.toString();
- if (!Array.isArray(keys)) return '';
-
- keys = keys.filter(function(key) {
- return typeof key === 'string';
- });
- if (keys.length === 0) return '[object has no keys]';
-
- maxLength = typeof maxLength !== 'number' ? MAX_SERIALIZE_KEYS_LENGTH : maxLength;
- if (keys[0].length >= maxLength) return keys[0];
-
- for (var usedKeys = keys.length; usedKeys > 0; usedKeys--) {
- var serialized = keys.slice(0, usedKeys).join(', ');
- if (serialized.length > maxLength) continue;
- if (usedKeys === keys.length) return serialized;
- return serialized + '\u2026';
- }
-
- return '';
-}
-
-function sanitize(input, sanitizeKeys) {
- if (!isArray(sanitizeKeys) || (isArray(sanitizeKeys) && sanitizeKeys.length === 0))
- return input;
-
- var sanitizeRegExp = joinRegExp(sanitizeKeys);
- var sanitizeMask = '********';
- var safeInput;
-
- try {
- safeInput = JSON.parse(stringify_1(input));
- } catch (o_O) {
- return input;
- }
-
- function sanitizeWorker(workerInput) {
- if (isArray(workerInput)) {
- return workerInput.map(function(val) {
- return sanitizeWorker(val);
- });
- }
-
- if (isPlainObject(workerInput)) {
- return Object.keys(workerInput).reduce(function(acc, k) {
- if (sanitizeRegExp.test(k)) {
- acc[k] = sanitizeMask;
- } else {
- acc[k] = sanitizeWorker(workerInput[k]);
- }
- return acc;
- }, {});
- }
-
- return workerInput;
- }
-
- return sanitizeWorker(safeInput);
-}
-
-var utils = {
- isObject: isObject,
- isError: isError,
- isErrorEvent: isErrorEvent,
- isDOMError: isDOMError,
- isDOMException: isDOMException,
- isUndefined: isUndefined,
- isFunction: isFunction,
- isPlainObject: isPlainObject,
- isString: isString,
- isArray: isArray,
- isEmptyObject: isEmptyObject,
- supportsErrorEvent: supportsErrorEvent,
- supportsDOMError: supportsDOMError,
- supportsDOMException: supportsDOMException,
- supportsFetch: supportsFetch,
- supportsReferrerPolicy: supportsReferrerPolicy,
- supportsPromiseRejectionEvent: supportsPromiseRejectionEvent,
- wrappedCallback: wrappedCallback,
- each: each,
- objectMerge: objectMerge,
- truncate: truncate,
- objectFrozen: objectFrozen,
- hasKey: hasKey,
- joinRegExp: joinRegExp,
- urlencode: urlencode,
- uuid4: uuid4,
- htmlTreeAsString: htmlTreeAsString,
- htmlElementAsString: htmlElementAsString,
- isSameException: isSameException,
- isSameStacktrace: isSameStacktrace,
- parseUrl: parseUrl,
- fill: fill,
- safeJoin: safeJoin,
- serializeException: serializeException,
- serializeKeysForMessage: serializeKeysForMessage,
- sanitize: sanitize
-};
-
-/*
- TraceKit - Cross brower stack traces
-
- This was originally forked from github.com/occ/TraceKit, but has since been
- largely re-written and is now maintained as part of raven-js. Tests for
- this are in test/vendor.
-
- MIT license
-*/
-
-var TraceKit = {
- collectWindowErrors: true,
- debug: false
-};
-
-// This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785)
-var _window$1 =
- typeof window !== 'undefined'
- ? window
- : typeof commonjsGlobal !== 'undefined' ? commonjsGlobal : typeof self !== 'undefined' ? self : {};
-
-// global reference to slice
-var _slice = [].slice;
-var UNKNOWN_FUNCTION = '?';
-
-// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error#Error_types
-var ERROR_TYPES_RE = /^(?:[Uu]ncaught (?:exception: )?)?(?:((?:Eval|Internal|Range|Reference|Syntax|Type|URI|)Error): )?(.*)$/;
-
-function getLocationHref() {
- if (typeof document === 'undefined' || document.location == null) return '';
- return document.location.href;
-}
-
-function getLocationOrigin() {
- if (typeof document === 'undefined' || document.location == null) return '';
-
- // Oh dear IE10...
- if (!document.location.origin) {
- return (
- document.location.protocol +
- '//' +
- document.location.hostname +
- (document.location.port ? ':' + document.location.port : '')
- );
- }
-
- return document.location.origin;
-}
-
-/**
- * TraceKit.report: cross-browser processing of unhandled exceptions
- *
- * Syntax:
- * TraceKit.report.subscribe(function(stackInfo) { ... })
- * TraceKit.report.unsubscribe(function(stackInfo) { ... })
- * TraceKit.report(exception)
- * try { ...code... } catch(ex) { TraceKit.report(ex); }
- *
- * Supports:
- * - Firefox: full stack trace with line numbers, plus column number
- * on top frame; column number is not guaranteed
- * - Opera: full stack trace with line and column numbers
- * - Chrome: full stack trace with line and column numbers
- * - Safari: line and column number for the top frame only; some frames
- * may be missing, and column number is not guaranteed
- * - IE: line and column number for the top frame only; some frames
- * may be missing, and column number is not guaranteed
- *
- * In theory, TraceKit should work on all of the following versions:
- * - IE5.5+ (only 8.0 tested)
- * - Firefox 0.9+ (only 3.5+ tested)
- * - Opera 7+ (only 10.50 tested; versions 9 and earlier may require
- * Exceptions Have Stacktrace to be enabled in opera:config)
- * - Safari 3+ (only 4+ tested)
- * - Chrome 1+ (only 5+ tested)
- * - Konqueror 3.5+ (untested)
- *
- * Requires TraceKit.computeStackTrace.
- *
- * Tries to catch all unhandled exceptions and report them to the
- * subscribed handlers. Please note that TraceKit.report will rethrow the
- * exception. This is REQUIRED in order to get a useful stack trace in IE.
- * If the exception does not reach the top of the browser, you will only
- * get a stack trace from the point where TraceKit.report was called.
- *
- * Handlers receive a stackInfo object as described in the
- * TraceKit.computeStackTrace docs.
- */
-TraceKit.report = (function reportModuleWrapper() {
- var handlers = [],
- lastArgs = null,
- lastException = null,
- lastExceptionStack = null;
-
- /**
- * Add a crash handler.
- * @param {Function} handler
- */
- function subscribe(handler) {
- installGlobalHandler();
- handlers.push(handler);
- }
-
- /**
- * Remove a crash handler.
- * @param {Function} handler
- */
- function unsubscribe(handler) {
- for (var i = handlers.length - 1; i >= 0; --i) {
- if (handlers[i] === handler) {
- handlers.splice(i, 1);
- }
- }
- }
-
- /**
- * Remove all crash handlers.
- */
- function unsubscribeAll() {
- uninstallGlobalHandler();
- handlers = [];
- }
-
- /**
- * Dispatch stack information to all handlers.
- * @param {Object.<string, *>} stack
- */
- function notifyHandlers(stack, isWindowError) {
- var exception = null;
- if (isWindowError && !TraceKit.collectWindowErrors) {
- return;
- }
- for (var i in handlers) {
- if (handlers.hasOwnProperty(i)) {
- try {
- handlers[i].apply(null, [stack].concat(_slice.call(arguments, 2)));
- } catch (inner) {
- exception = inner;
- }
- }
- }
-
- if (exception) {
- throw exception;
- }
- }
-
- var _oldOnerrorHandler, _onErrorHandlerInstalled;
-
- /**
- * Ensures all global unhandled exceptions are recorded.
- * Supported by Gecko and IE.
- * @param {string} msg Error message.
- * @param {string} url URL of script that generated the exception.
- * @param {(number|string)} lineNo The line number at which the error
- * occurred.
- * @param {?(number|string)} colNo The column number at which the error
- * occurred.
- * @param {?Error} ex The actual Error object.
- */
- function traceKitWindowOnError(msg, url, lineNo, colNo, ex) {
- var stack = null;
- // If 'ex' is ErrorEvent, get real Error from inside
- var exception = utils.isErrorEvent(ex) ? ex.error : ex;
- // If 'msg' is ErrorEvent, get real message from inside
- var message = utils.isErrorEvent(msg) ? msg.message : msg;
-
- if (lastExceptionStack) {
- TraceKit.computeStackTrace.augmentStackTraceWithInitialElement(
- lastExceptionStack,
- url,
- lineNo,
- message
- );
- processLastException();
- } else if (exception && utils.isError(exception)) {
- // non-string `exception` arg; attempt to extract stack trace
-
- // New chrome and blink send along a real error object
- // Let's just report that like a normal error.
- // See: https://mikewest.org/2013/08/debugging-runtime-errors-with-window-onerror
- stack = TraceKit.computeStackTrace(exception);
- notifyHandlers(stack, true);
- } else {
- var location = {
- url: url,
- line: lineNo,
- column: colNo
- };
-
- var name = undefined;
- var groups;
-
- if ({}.toString.call(message) === '[object String]') {
- var groups = message.match(ERROR_TYPES_RE);
- if (groups) {
- name = groups[1];
- message = groups[2];
- }
- }
-
- location.func = UNKNOWN_FUNCTION;
-
- stack = {
- name: name,
- message: message,
- url: getLocationHref(),
- stack: [location]
- };
- notifyHandlers(stack, true);
- }
-
- if (_oldOnerrorHandler) {
- return _oldOnerrorHandler.apply(this, arguments);
- }
-
- return false;
- }
-
- function installGlobalHandler() {
- if (_onErrorHandlerInstalled) {
- return;
- }
- _oldOnerrorHandler = _window$1.onerror;
- _window$1.onerror = traceKitWindowOnError;
- _onErrorHandlerInstalled = true;
- }
-
- function uninstallGlobalHandler() {
- if (!_onErrorHandlerInstalled) {
- return;
- }
- _window$1.onerror = _oldOnerrorHandler;
- _onErrorHandlerInstalled = false;
- _oldOnerrorHandler = undefined;
- }
-
- function processLastException() {
- var _lastExceptionStack = lastExceptionStack,
- _lastArgs = lastArgs;
- lastArgs = null;
- lastExceptionStack = null;
- lastException = null;
- notifyHandlers.apply(null, [_lastExceptionStack, false].concat(_lastArgs));
- }
-
- /**
- * Reports an unhandled Error to TraceKit.
- * @param {Error} ex
- * @param {?boolean} rethrow If false, do not re-throw the exception.
- * Only used for window.onerror to not cause an infinite loop of
- * rethrowing.
- */
- function report(ex, rethrow) {
- var args = _slice.call(arguments, 1);
- if (lastExceptionStack) {
- if (lastException === ex) {
- return; // already caught by an inner catch block, ignore
- } else {
- processLastException();
- }
- }
-
- var stack = TraceKit.computeStackTrace(ex);
- lastExceptionStack = stack;
- lastException = ex;
- lastArgs = args;
-
- // If the stack trace is incomplete, wait for 2 seconds for
- // slow slow IE to see if onerror occurs or not before reporting
- // this exception; otherwise, we will end up with an incomplete
- // stack trace
- setTimeout(function() {
- if (lastException === ex) {
- processLastException();
- }
- }, stack.incomplete ? 2000 : 0);
-
- if (rethrow !== false) {
- throw ex; // re-throw to propagate to the top level (and cause window.onerror)
- }
- }
-
- report.subscribe = subscribe;
- report.unsubscribe = unsubscribe;
- report.uninstall = unsubscribeAll;
- return report;
-})();
-
-/**
- * TraceKit.computeStackTrace: cross-browser stack traces in JavaScript
- *
- * Syntax:
- * s = TraceKit.computeStackTrace(exception) // consider using TraceKit.report instead (see below)
- * Returns:
- * s.name - exception name
- * s.message - exception message
- * s.stack[i].url - JavaScript or HTML file URL
- * s.stack[i].func - function name, or empty for anonymous functions (if guessing did not work)
- * s.stack[i].args - arguments passed to the function, if known
- * s.stack[i].line - line number, if known
- * s.stack[i].column - column number, if known
- *
- * Supports:
- * - Firefox: full stack trace with line numbers and unreliable column
- * number on top frame
- * - Opera 10: full stack trace with line and column numbers
- * - Opera 9-: full stack trace with line numbers
- * - Chrome: full stack trace with line and column numbers
- * - Safari: line and column number for the topmost stacktrace element
- * only
- * - IE: no line numbers whatsoever
- *
- * Tries to guess names of anonymous functions by looking for assignments
- * in the source code. In IE and Safari, we have to guess source file names
- * by searching for function bodies inside all page scripts. This will not
- * work for scripts that are loaded cross-domain.
- * Here be dragons: some function names may be guessed incorrectly, and
- * duplicate functions may be mismatched.
- *
- * TraceKit.computeStackTrace should only be used for tracing purposes.
- * Logging of unhandled exceptions should be done with TraceKit.report,
- * which builds on top of TraceKit.computeStackTrace and provides better
- * IE support by utilizing the window.onerror event to retrieve information
- * about the top of the stack.
- *
- * Note: In IE and Safari, no stack trace is recorded on the Error object,
- * so computeStackTrace instead walks its *own* chain of callers.
- * This means that:
- * * in Safari, some methods may be missing from the stack trace;
- * * in IE, the topmost function in the stack trace will always be the
- * caller of computeStackTrace.
- *
- * This is okay for tracing (because you are likely to be calling
- * computeStackTrace from the function you want to be the topmost element
- * of the stack trace anyway), but not okay for logging unhandled
- * exceptions (because your catch block will likely be far away from the
- * inner function that actually caused the exception).
- *
- */
-TraceKit.computeStackTrace = (function computeStackTraceWrapper() {
- // Contents of Exception in various browsers.
- //
- // SAFARI:
- // ex.message = Can't find variable: qq
- // ex.line = 59
- // ex.sourceId = 580238192
- // ex.sourceURL = http://...
- // ex.expressionBeginOffset = 96
- // ex.expressionCaretOffset = 98
- // ex.expressionEndOffset = 98
- // ex.name = ReferenceError
- //
- // FIREFOX:
- // ex.message = qq is not defined
- // ex.fileName = http://...
- // ex.lineNumber = 59
- // ex.columnNumber = 69
- // ex.stack = ...stack trace... (see the example below)
- // ex.name = ReferenceError
- //
- // CHROME:
- // ex.message = qq is not defined
- // ex.name = ReferenceError
- // ex.type = not_defined
- // ex.arguments = ['aa']
- // ex.stack = ...stack trace...
- //
- // INTERNET EXPLORER:
- // ex.message = ...
- // ex.name = ReferenceError
- //
- // OPERA:
- // ex.message = ...message... (see the example below)
- // ex.name = ReferenceError
- // ex.opera#sourceloc = 11 (pretty much useless, duplicates the info in ex.message)
- // ex.stacktrace = n/a; see 'opera:config#UserPrefs|Exceptions Have Stacktrace'
-
- /**
- * Computes stack trace information from the stack property.
- * Chrome and Gecko use this property.
- * @param {Error} ex
- * @return {?Object.<string, *>} Stack trace information.
- */
- function computeStackTraceFromStackProp(ex) {
- if (typeof ex.stack === 'undefined' || !ex.stack) return;
-
- var chrome = /^\s*at (?:(.*?) ?\()?((?:file|https?|blob|chrome-extension|native|eval|webpack|<anonymous>|[a-z]:|\/).*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i;
- var winjs = /^\s*at (?:((?:\[object object\])?.+) )?\(?((?:file|ms-appx(?:-web)|https?|webpack|blob):.*?):(\d+)(?::(\d+))?\)?\s*$/i;
- // NOTE: blob urls are now supposed to always have an origin, therefore it's format
- // which is `blob:http://url/path/with-some-uuid`, is matched by `blob.*?:\/` as well
- var gecko = /^\s*(.*?)(?:\((.*?)\))?(?:^|@)((?:file|https?|blob|chrome|webpack|resource|moz-extension).*?:\/.*?|\[native code\]|[^@]*bundle)(?::(\d+))?(?::(\d+))?\s*$/i;
- // Used to additionally parse URL/line/column from eval frames
- var geckoEval = /(\S+) line (\d+)(?: > eval line \d+)* > eval/i;
- var chromeEval = /\((\S*)(?::(\d+))(?::(\d+))\)/;
- var lines = ex.stack.split('\n');
- var stack = [];
- var submatch;
- var parts;
- var element;
- var reference = /^(.*) is undefined$/.exec(ex.message);
-
- for (var i = 0, j = lines.length; i < j; ++i) {
- if ((parts = chrome.exec(lines[i]))) {
- var isNative = parts[2] && parts[2].indexOf('native') === 0; // start of line
- var isEval = parts[2] && parts[2].indexOf('eval') === 0; // start of line
- if (isEval && (submatch = chromeEval.exec(parts[2]))) {
- // throw out eval line/column and use top-most line/column number
- parts[2] = submatch[1]; // url
- parts[3] = submatch[2]; // line
- parts[4] = submatch[3]; // column
- }
- element = {
- url: !isNative ? parts[2] : null,
- func: parts[1] || UNKNOWN_FUNCTION,
- args: isNative ? [parts[2]] : [],
- line: parts[3] ? +parts[3] : null,
- column: parts[4] ? +parts[4] : null
- };
- } else if ((parts = winjs.exec(lines[i]))) {
- element = {
- url: parts[2],
- func: parts[1] || UNKNOWN_FUNCTION,
- args: [],
- line: +parts[3],
- column: parts[4] ? +parts[4] : null
- };
- } else if ((parts = gecko.exec(lines[i]))) {
- var isEval = parts[3] && parts[3].indexOf(' > eval') > -1;
- if (isEval && (submatch = geckoEval.exec(parts[3]))) {
- // throw out eval line/column and use top-most line number
- parts[3] = submatch[1];
- parts[4] = submatch[2];
- parts[5] = null; // no column when eval
- } else if (i === 0 && !parts[5] && typeof ex.columnNumber !== 'undefined') {
- // FireFox uses this awesome columnNumber property for its top frame
- // Also note, Firefox's column number is 0-based and everything else expects 1-based,
- // so adding 1
- // NOTE: this hack doesn't work if top-most frame is eval
- stack[0].column = ex.columnNumber + 1;
- }
- element = {
- url: parts[3],
- func: parts[1] || UNKNOWN_FUNCTION,
- args: parts[2] ? parts[2].split(',') : [],
- line: parts[4] ? +parts[4] : null,
- column: parts[5] ? +parts[5] : null
- };
- } else {
- continue;
- }
-
- if (!element.func && element.line) {
- element.func = UNKNOWN_FUNCTION;
- }
-
- if (element.url && element.url.substr(0, 5) === 'blob:') {
- // Special case for handling JavaScript loaded into a blob.
- // We use a synchronous AJAX request here as a blob is already in
- // memory - it's not making a network request. This will generate a warning
- // in the browser console, but there has already been an error so that's not
- // that much of an issue.
- var xhr = new XMLHttpRequest();
- xhr.open('GET', element.url, false);
- xhr.send(null);
-
- // If we failed to download the source, skip this patch
- if (xhr.status === 200) {
- var source = xhr.responseText || '';
-
- // We trim the source down to the last 300 characters as sourceMappingURL is always at the end of the file.
- // Why 300? To be in line with: https://github.com/getsentry/sentry/blob/4af29e8f2350e20c28a6933354e4f42437b4ba42/src/sentry/lang/javascript/processor.py#L164-L175
- source = source.slice(-300);
-
- // Now we dig out the source map URL
- var sourceMaps = source.match(/\/\/# sourceMappingURL=(.*)$/);
-
- // If we don't find a source map comment or we find more than one, continue on to the next element.
- if (sourceMaps) {
- var sourceMapAddress = sourceMaps[1];
-
- // Now we check to see if it's a relative URL.
- // If it is, convert it to an absolute one.
- if (sourceMapAddress.charAt(0) === '~') {
- sourceMapAddress = getLocationOrigin() + sourceMapAddress.slice(1);
- }
-
- // Now we strip the '.map' off of the end of the URL and update the
- // element so that Sentry can match the map to the blob.
- element.url = sourceMapAddress.slice(0, -4);
- }
- }
- }
-
- stack.push(element);
- }
-
- if (!stack.length) {
- return null;
- }
-
- return {
- name: ex.name,
- message: ex.message,
- url: getLocationHref(),
- stack: stack
- };
- }
-
- /**
- * Adds information about the first frame to incomplete stack traces.
- * Safari and IE require this to get complete data on the first frame.
- * @param {Object.<string, *>} stackInfo Stack trace information from
- * one of the compute* methods.
- * @param {string} url The URL of the script that caused an error.
- * @param {(number|string)} lineNo The line number of the script that
- * caused an error.
- * @param {string=} message The error generated by the browser, which
- * hopefully contains the name of the object that caused the error.
- * @return {boolean} Whether or not the stack information was
- * augmented.
- */
- function augmentStackTraceWithInitialElement(stackInfo, url, lineNo, message) {
- var initial = {
- url: url,
- line: lineNo
- };
-
- if (initial.url && initial.line) {
- stackInfo.incomplete = false;
-
- if (!initial.func) {
- initial.func = UNKNOWN_FUNCTION;
- }
-
- if (stackInfo.stack.length > 0) {
- if (stackInfo.stack[0].url === initial.url) {
- if (stackInfo.stack[0].line === initial.line) {
- return false; // already in stack trace
- } else if (
- !stackInfo.stack[0].line &&
- stackInfo.stack[0].func === initial.func
- ) {
- stackInfo.stack[0].line = initial.line;
- return false;
- }
- }
- }
-
- stackInfo.stack.unshift(initial);
- stackInfo.partial = true;
- return true;
- } else {
- stackInfo.incomplete = true;
- }
-
- return false;
- }
-
- /**
- * Computes stack trace information by walking the arguments.caller
- * chain at the time the exception occurred. This will cause earlier
- * frames to be missed but is the only way to get any stack trace in
- * Safari and IE. The top frame is restored by
- * {@link augmentStackTraceWithInitialElement}.
- * @param {Error} ex
- * @return {?Object.<string, *>} Stack trace information.
- */
- function computeStackTraceByWalkingCallerChain(ex, depth) {
- var functionName = /function\s+([_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*)?\s*\(/i,
- stack = [],
- funcs = {},
- recursion = false,
- parts,
- item;
-
- for (
- var curr = computeStackTraceByWalkingCallerChain.caller;
- curr && !recursion;
- curr = curr.caller
- ) {
- if (curr === computeStackTrace || curr === TraceKit.report) {
- // console.log('skipping internal function');
- continue;
- }
-
- item = {
- url: null,
- func: UNKNOWN_FUNCTION,
- line: null,
- column: null
- };
-
- if (curr.name) {
- item.func = curr.name;
- } else if ((parts = functionName.exec(curr.toString()))) {
- item.func = parts[1];
- }
-
- if (typeof item.func === 'undefined') {
- try {
- item.func = parts.input.substring(0, parts.input.indexOf('{'));
- } catch (e) {}
- }
-
- if (funcs['' + curr]) {
- recursion = true;
- } else {
- funcs['' + curr] = true;
- }
-
- stack.push(item);
- }
-
- if (depth) {
- // console.log('depth is ' + depth);
- // console.log('stack is ' + stack.length);
- stack.splice(0, depth);
- }
-
- var result = {
- name: ex.name,
- message: ex.message,
- url: getLocationHref(),
- stack: stack
- };
- augmentStackTraceWithInitialElement(
- result,
- ex.sourceURL || ex.fileName,
- ex.line || ex.lineNumber,
- ex.message || ex.description
- );
- return result;
- }
-
- /**
- * Computes a stack trace for an exception.
- * @param {Error} ex
- * @param {(string|number)=} depth
- */
- function computeStackTrace(ex, depth) {
- var stack = null;
- depth = depth == null ? 0 : +depth;
-
- try {
- stack = computeStackTraceFromStackProp(ex);
- if (stack) {
- return stack;
- }
- } catch (e) {
- if (TraceKit.debug) {
- throw e;
- }
- }
-
- try {
- stack = computeStackTraceByWalkingCallerChain(ex, depth + 1);
- if (stack) {
- return stack;
- }
- } catch (e) {
- if (TraceKit.debug) {
- throw e;
- }
- }
- return {
- name: ex.name,
- message: ex.message,
- url: getLocationHref()
- };
- }
-
- computeStackTrace.augmentStackTraceWithInitialElement = augmentStackTraceWithInitialElement;
- computeStackTrace.computeStackTraceFromStackProp = computeStackTraceFromStackProp;
-
- return computeStackTrace;
-})();
-
-var tracekit = TraceKit;
-
-/*
- * JavaScript MD5
- * https://github.com/blueimp/JavaScript-MD5
- *
- * Copyright 2011, Sebastian Tschan
- * https://blueimp.net
- *
- * Licensed under the MIT license:
- * https://opensource.org/licenses/MIT
- *
- * Based on
- * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
- * Digest Algorithm, as defined in RFC 1321.
- * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009
- * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
- * Distributed under the BSD License
- * See http://pajhome.org.uk/crypt/md5 for more info.
- */
-
-/*
-* Add integers, wrapping at 2^32. This uses 16-bit operations internally
-* to work around bugs in some JS interpreters.
-*/
-function safeAdd(x, y) {
- var lsw = (x & 0xffff) + (y & 0xffff);
- var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
- return (msw << 16) | (lsw & 0xffff);
-}
-
-/*
-* Bitwise rotate a 32-bit number to the left.
-*/
-function bitRotateLeft(num, cnt) {
- return (num << cnt) | (num >>> (32 - cnt));
-}
-
-/*
-* These functions implement the four basic operations the algorithm uses.
-*/
-function md5cmn(q, a, b, x, s, t) {
- return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b);
-}
-function md5ff(a, b, c, d, x, s, t) {
- return md5cmn((b & c) | (~b & d), a, b, x, s, t);
-}
-function md5gg(a, b, c, d, x, s, t) {
- return md5cmn((b & d) | (c & ~d), a, b, x, s, t);
-}
-function md5hh(a, b, c, d, x, s, t) {
- return md5cmn(b ^ c ^ d, a, b, x, s, t);
-}
-function md5ii(a, b, c, d, x, s, t) {
- return md5cmn(c ^ (b | ~d), a, b, x, s, t);
-}
-
-/*
-* Calculate the MD5 of an array of little-endian words, and a bit length.
-*/
-function binlMD5(x, len) {
- /* append padding */
- x[len >> 5] |= 0x80 << (len % 32);
- x[(((len + 64) >>> 9) << 4) + 14] = len;
-
- var i;
- var olda;
- var oldb;
- var oldc;
- var oldd;
- var a = 1732584193;
- var b = -271733879;
- var c = -1732584194;
- var d = 271733878;
-
- for (i = 0; i < x.length; i += 16) {
- olda = a;
- oldb = b;
- oldc = c;
- oldd = d;
-
- a = md5ff(a, b, c, d, x[i], 7, -680876936);
- d = md5ff(d, a, b, c, x[i + 1], 12, -389564586);
- c = md5ff(c, d, a, b, x[i + 2], 17, 606105819);
- b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330);
- a = md5ff(a, b, c, d, x[i + 4], 7, -176418897);
- d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426);
- c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341);
- b = md5ff(b, c, d, a, x[i + 7], 22, -45705983);
- a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416);
- d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417);
- c = md5ff(c, d, a, b, x[i + 10], 17, -42063);
- b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162);
- a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682);
- d = md5ff(d, a, b, c, x[i + 13], 12, -40341101);
- c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290);
- b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329);
-
- a = md5gg(a, b, c, d, x[i + 1], 5, -165796510);
- d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632);
- c = md5gg(c, d, a, b, x[i + 11], 14, 643717713);
- b = md5gg(b, c, d, a, x[i], 20, -373897302);
- a = md5gg(a, b, c, d, x[i + 5], 5, -701558691);
- d = md5gg(d, a, b, c, x[i + 10], 9, 38016083);
- c = md5gg(c, d, a, b, x[i + 15], 14, -660478335);
- b = md5gg(b, c, d, a, x[i + 4], 20, -405537848);
- a = md5gg(a, b, c, d, x[i + 9], 5, 568446438);
- d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690);
- c = md5gg(c, d, a, b, x[i + 3], 14, -187363961);
- b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501);
- a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467);
- d = md5gg(d, a, b, c, x[i + 2], 9, -51403784);
- c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473);
- b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734);
-
- a = md5hh(a, b, c, d, x[i + 5], 4, -378558);
- d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463);
- c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562);
- b = md5hh(b, c, d, a, x[i + 14], 23, -35309556);
- a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060);
- d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353);
- c = md5hh(c, d, a, b, x[i + 7], 16, -155497632);
- b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640);
- a = md5hh(a, b, c, d, x[i + 13], 4, 681279174);
- d = md5hh(d, a, b, c, x[i], 11, -358537222);
- c = md5hh(c, d, a, b, x[i + 3], 16, -722521979);
- b = md5hh(b, c, d, a, x[i + 6], 23, 76029189);
- a = md5hh(a, b, c, d, x[i + 9], 4, -640364487);
- d = md5hh(d, a, b, c, x[i + 12], 11, -421815835);
- c = md5hh(c, d, a, b, x[i + 15], 16, 530742520);
- b = md5hh(b, c, d, a, x[i + 2], 23, -995338651);
-
- a = md5ii(a, b, c, d, x[i], 6, -198630844);
- d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415);
- c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905);
- b = md5ii(b, c, d, a, x[i + 5], 21, -57434055);
- a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571);
- d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606);
- c = md5ii(c, d, a, b, x[i + 10], 15, -1051523);
- b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799);
- a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359);
- d = md5ii(d, a, b, c, x[i + 15], 10, -30611744);
- c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380);
- b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649);
- a = md5ii(a, b, c, d, x[i + 4], 6, -145523070);
- d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379);
- c = md5ii(c, d, a, b, x[i + 2], 15, 718787259);
- b = md5ii(b, c, d, a, x[i + 9], 21, -343485551);
-
- a = safeAdd(a, olda);
- b = safeAdd(b, oldb);
- c = safeAdd(c, oldc);
- d = safeAdd(d, oldd);
- }
- return [a, b, c, d];
-}
-
-/*
-* Convert an array of little-endian words to a string
-*/
-function binl2rstr(input) {
- var i;
- var output = '';
- var length32 = input.length * 32;
- for (i = 0; i < length32; i += 8) {
- output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xff);
- }
- return output;
-}
-
-/*
-* Convert a raw string to an array of little-endian words
-* Characters >255 have their high-byte silently ignored.
-*/
-function rstr2binl(input) {
- var i;
- var output = [];
- output[(input.length >> 2) - 1] = undefined;
- for (i = 0; i < output.length; i += 1) {
- output[i] = 0;
- }
- var length8 = input.length * 8;
- for (i = 0; i < length8; i += 8) {
- output[i >> 5] |= (input.charCodeAt(i / 8) & 0xff) << (i % 32);
- }
- return output;
-}
-
-/*
-* Calculate the MD5 of a raw string
-*/
-function rstrMD5(s) {
- return binl2rstr(binlMD5(rstr2binl(s), s.length * 8));
-}
-
-/*
-* Calculate the HMAC-MD5, of a key and some data (raw strings)
-*/
-function rstrHMACMD5(key, data) {
- var i;
- var bkey = rstr2binl(key);
- var ipad = [];
- var opad = [];
- var hash;
- ipad[15] = opad[15] = undefined;
- if (bkey.length > 16) {
- bkey = binlMD5(bkey, key.length * 8);
- }
- for (i = 0; i < 16; i += 1) {
- ipad[i] = bkey[i] ^ 0x36363636;
- opad[i] = bkey[i] ^ 0x5c5c5c5c;
- }
- hash = binlMD5(ipad.concat(rstr2binl(data)), 512 + data.length * 8);
- return binl2rstr(binlMD5(opad.concat(hash), 512 + 128));
-}
-
-/*
-* Convert a raw string to a hex string
-*/
-function rstr2hex(input) {
- var hexTab = '0123456789abcdef';
- var output = '';
- var x;
- var i;
- for (i = 0; i < input.length; i += 1) {
- x = input.charCodeAt(i);
- output += hexTab.charAt((x >>> 4) & 0x0f) + hexTab.charAt(x & 0x0f);
- }
- return output;
-}
-
-/*
-* Encode a string as utf-8
-*/
-function str2rstrUTF8(input) {
- return unescape(encodeURIComponent(input));
-}
-
-/*
-* Take string arguments and return either raw or hex encoded strings
-*/
-function rawMD5(s) {
- return rstrMD5(str2rstrUTF8(s));
-}
-function hexMD5(s) {
- return rstr2hex(rawMD5(s));
-}
-function rawHMACMD5(k, d) {
- return rstrHMACMD5(str2rstrUTF8(k), str2rstrUTF8(d));
-}
-function hexHMACMD5(k, d) {
- return rstr2hex(rawHMACMD5(k, d));
-}
-
-function md5(string, key, raw) {
- if (!key) {
- if (!raw) {
- return hexMD5(string);
- }
- return rawMD5(string);
- }
- if (!raw) {
- return hexHMACMD5(key, string);
- }
- return rawHMACMD5(key, string);
-}
-
-var md5_1 = md5;
-
-function RavenConfigError(message) {
- this.name = 'RavenConfigError';
- this.message = message;
-}
-RavenConfigError.prototype = new Error();
-RavenConfigError.prototype.constructor = RavenConfigError;
-
-var configError = RavenConfigError;
-
-var wrapMethod = function(console, level, callback) {
- var originalConsoleLevel = console[level];
- var originalConsole = console;
-
- if (!(level in console)) {
- return;
- }
-
- var sentryLevel = level === 'warn' ? 'warning' : level;
-
- console[level] = function() {
- var args = [].slice.call(arguments);
-
- var msg = utils.safeJoin(args, ' ');
- var data = {level: sentryLevel, logger: 'console', extra: {arguments: args}};
-
- if (level === 'assert') {
- if (args[0] === false) {
- // Default browsers message
- msg =
- 'Assertion failed: ' + (utils.safeJoin(args.slice(1), ' ') || 'console.assert');
- data.extra.arguments = args.slice(1);
- callback && callback(msg, data);
- }
- } else {
- callback && callback(msg, data);
- }
-
- // this fails for some browsers. :(
- if (originalConsoleLevel) {
- // IE9 doesn't allow calling apply on console functions directly
- // See: https://stackoverflow.com/questions/5472938/does-ie9-support-console-log-and-is-it-a-real-function#answer-5473193
- Function.prototype.apply.call(originalConsoleLevel, originalConsole, args);
- }
- };
-};
-
-var console$1 = {
- wrapMethod: wrapMethod
-};
-
-/*global XDomainRequest:false */
-
-
-
-
-
-
-
-var isErrorEvent$1 = utils.isErrorEvent;
-var isDOMError$1 = utils.isDOMError;
-var isDOMException$1 = utils.isDOMException;
-var isError$1 = utils.isError;
-var isObject$1 = utils.isObject;
-var isPlainObject$1 = utils.isPlainObject;
-var isUndefined$1 = utils.isUndefined;
-var isFunction$1 = utils.isFunction;
-var isString$1 = utils.isString;
-var isArray$1 = utils.isArray;
-var isEmptyObject$1 = utils.isEmptyObject;
-var each$1 = utils.each;
-var objectMerge$1 = utils.objectMerge;
-var truncate$1 = utils.truncate;
-var objectFrozen$1 = utils.objectFrozen;
-var hasKey$1 = utils.hasKey;
-var joinRegExp$1 = utils.joinRegExp;
-var urlencode$1 = utils.urlencode;
-var uuid4$1 = utils.uuid4;
-var htmlTreeAsString$1 = utils.htmlTreeAsString;
-var isSameException$1 = utils.isSameException;
-var isSameStacktrace$1 = utils.isSameStacktrace;
-var parseUrl$1 = utils.parseUrl;
-var fill$1 = utils.fill;
-var supportsFetch$1 = utils.supportsFetch;
-var supportsReferrerPolicy$1 = utils.supportsReferrerPolicy;
-var serializeKeysForMessage$1 = utils.serializeKeysForMessage;
-var serializeException$1 = utils.serializeException;
-var sanitize$1 = utils.sanitize;
-
-var wrapConsoleMethod = console$1.wrapMethod;
-
-var dsnKeys = 'source protocol user pass host port path'.split(' '),
- dsnPattern = /^(?:(\w+):)?\/\/(?:(\w+)(:\w+)?@)?([\w\.-]+)(?::(\d+))?(\/.*)/;
-
-function now() {
- return +new Date();
-}
-
-// This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785)
-var _window$2 =
- typeof window !== 'undefined'
- ? window
- : typeof commonjsGlobal !== 'undefined' ? commonjsGlobal : typeof self !== 'undefined' ? self : {};
-var _document = _window$2.document;
-var _navigator = _window$2.navigator;
-
-function keepOriginalCallback(original, callback) {
- return isFunction$1(callback)
- ? function(data) {
- return callback(data, original);
- }
- : callback;
-}
-
-// First, check for JSON support
-// If there is no JSON, we no-op the core features of Raven
-// since JSON is required to encode the payload
-function Raven() {
- this._hasJSON = !!(typeof JSON === 'object' && JSON.stringify);
- // Raven can run in contexts where there's no document (react-native)
- this._hasDocument = !isUndefined$1(_document);
- this._hasNavigator = !isUndefined$1(_navigator);
- this._lastCapturedException = null;
- this._lastData = null;
- this._lastEventId = null;
- this._globalServer = null;
- this._globalKey = null;
- this._globalProject = null;
- this._globalContext = {};
- this._globalOptions = {
- // SENTRY_RELEASE can be injected by https://github.com/getsentry/sentry-webpack-plugin
- release: _window$2.SENTRY_RELEASE && _window$2.SENTRY_RELEASE.id,
- logger: 'javascript',
- ignoreErrors: [],
- ignoreUrls: [],
- whitelistUrls: [],
- includePaths: [],
- headers: null,
- collectWindowErrors: true,
- captureUnhandledRejections: true,
- maxMessageLength: 0,
- // By default, truncates URL values to 250 chars
- maxUrlLength: 250,
- stackTraceLimit: 50,
- autoBreadcrumbs: true,
- instrument: true,
- sampleRate: 1,
- sanitizeKeys: []
- };
- this._fetchDefaults = {
- method: 'POST',
- keepalive: true,
- // Despite all stars in the sky saying that Edge supports old draft syntax, aka 'never', 'always', 'origin' and 'default
- // https://caniuse.com/#feat=referrer-policy
- // It doesn't. And it throw exception instead of ignoring this parameter...
- // REF: https://github.com/getsentry/raven-js/issues/1233
- referrerPolicy: supportsReferrerPolicy$1() ? 'origin' : ''
- };
- this._ignoreOnError = 0;
- this._isRavenInstalled = false;
- this._originalErrorStackTraceLimit = Error.stackTraceLimit;
- // capture references to window.console *and* all its methods first
- // before the console plugin has a chance to monkey patch
- this._originalConsole = _window$2.console || {};
- this._originalConsoleMethods = {};
- this._plugins = [];
- this._startTime = now();
- this._wrappedBuiltIns = [];
- this._breadcrumbs = [];
- this._lastCapturedEvent = null;
- this._keypressTimeout;
- this._location = _window$2.location;
- this._lastHref = this._location && this._location.href;
- this._resetBackoff();
-
- // eslint-disable-next-line guard-for-in
- for (var method in this._originalConsole) {
- this._originalConsoleMethods[method] = this._originalConsole[method];
- }
-}
-
-/*
- * The core Raven singleton
- *
- * @this {Raven}
- */
-
-Raven.prototype = {
- // Hardcode version string so that raven source can be loaded directly via
- // webpack (using a build step causes webpack #1617). Grunt verifies that
- // this value matches package.json during build.
- // See: https://github.com/getsentry/raven-js/issues/465
- VERSION: '3.26.1',
-
- debug: false,
-
- TraceKit: tracekit, // alias to TraceKit
-
- /*
- * Configure Raven with a DSN and extra options
- *
- * @param {string} dsn The public Sentry DSN
- * @param {object} options Set of global options [optional]
- * @return {Raven}
- */
- config: function(dsn, options) {
- var self = this;
-
- if (self._globalServer) {
- this._logDebug('error', 'Error: Raven has already been configured');
- return self;
- }
- if (!dsn) return self;
-
- var globalOptions = self._globalOptions;
-
- // merge in options
- if (options) {
- each$1(options, function(key, value) {
- // tags and extra are special and need to be put into context
- if (key === 'tags' || key === 'extra' || key === 'user') {
- self._globalContext[key] = value;
- } else {
- globalOptions[key] = value;
- }
- });
- }
-
- self.setDSN(dsn);
-
- // "Script error." is hard coded into browsers for errors that it can't read.
- // this is the result of a script being pulled in from an external domain and CORS.
- globalOptions.ignoreErrors.push(/^Script error\.?$/);
- globalOptions.ignoreErrors.push(/^Javascript error: Script error\.? on line 0$/);
-
- // join regexp rules into one big rule
- globalOptions.ignoreErrors = joinRegExp$1(globalOptions.ignoreErrors);
- globalOptions.ignoreUrls = globalOptions.ignoreUrls.length
- ? joinRegExp$1(globalOptions.ignoreUrls)
- : false;
- globalOptions.whitelistUrls = globalOptions.whitelistUrls.length
- ? joinRegExp$1(globalOptions.whitelistUrls)
- : false;
- globalOptions.includePaths = joinRegExp$1(globalOptions.includePaths);
- globalOptions.maxBreadcrumbs = Math.max(
- 0,
- Math.min(globalOptions.maxBreadcrumbs || 100, 100)
- ); // default and hard limit is 100
-
- var autoBreadcrumbDefaults = {
- xhr: true,
- console: true,
- dom: true,
- location: true,
- sentry: true
- };
-
- var autoBreadcrumbs = globalOptions.autoBreadcrumbs;
- if ({}.toString.call(autoBreadcrumbs) === '[object Object]') {
- autoBreadcrumbs = objectMerge$1(autoBreadcrumbDefaults, autoBreadcrumbs);
- } else if (autoBreadcrumbs !== false) {
- autoBreadcrumbs = autoBreadcrumbDefaults;
- }
- globalOptions.autoBreadcrumbs = autoBreadcrumbs;
-
- var instrumentDefaults = {
- tryCatch: true
- };
-
- var instrument = globalOptions.instrument;
- if ({}.toString.call(instrument) === '[object Object]') {
- instrument = objectMerge$1(instrumentDefaults, instrument);
- } else if (instrument !== false) {
- instrument = instrumentDefaults;
- }
- globalOptions.instrument = instrument;
-
- tracekit.collectWindowErrors = !!globalOptions.collectWindowErrors;
-
- // return for chaining
- return self;
- },
-
- /*
- * Installs a global window.onerror error handler
- * to capture and report uncaught exceptions.
- * At this point, install() is required to be called due
- * to the way TraceKit is set up.
- *
- * @return {Raven}
- */
- install: function() {
- var self = this;
- if (self.isSetup() && !self._isRavenInstalled) {
- tracekit.report.subscribe(function() {
- self._handleOnErrorStackInfo.apply(self, arguments);
- });
-
- if (self._globalOptions.captureUnhandledRejections) {
- self._attachPromiseRejectionHandler();
- }
-
- self._patchFunctionToString();
-
- if (self._globalOptions.instrument && self._globalOptions.instrument.tryCatch) {
- self._instrumentTryCatch();
- }
-
- if (self._globalOptions.autoBreadcrumbs) self._instrumentBreadcrumbs();
-
- // Install all of the plugins
- self._drainPlugins();
-
- self._isRavenInstalled = true;
- }
-
- Error.stackTraceLimit = self._globalOptions.stackTraceLimit;
- return this;
- },
-
- /*
- * Set the DSN (can be called multiple time unlike config)
- *
- * @param {string} dsn The public Sentry DSN
- */
- setDSN: function(dsn) {
- var self = this,
- uri = self._parseDSN(dsn),
- lastSlash = uri.path.lastIndexOf('/'),
- path = uri.path.substr(1, lastSlash);
-
- self._dsn = dsn;
- self._globalKey = uri.user;
- self._globalSecret = uri.pass && uri.pass.substr(1);
- self._globalProject = uri.path.substr(lastSlash + 1);
-
- self._globalServer = self._getGlobalServer(uri);
-
- self._globalEndpoint =
- self._globalServer + '/' + path + 'api/' + self._globalProject + '/store/';
-
- // Reset backoff state since we may be pointing at a
- // new project/server
- this._resetBackoff();
- },
-
- /*
- * Wrap code within a context so Raven can capture errors
- * reliably across domains that is executed immediately.
- *
- * @param {object} options A specific set of options for this context [optional]
- * @param {function} func The callback to be immediately executed within the context
- * @param {array} args An array of arguments to be called with the callback [optional]
- */
- context: function(options, func, args) {
- if (isFunction$1(options)) {
- args = func || [];
- func = options;
- options = {};
- }
-
- return this.wrap(options, func).apply(this, args);
- },
-
- /*
- * Wrap code within a context and returns back a new function to be executed
- *
- * @param {object} options A specific set of options for this context [optional]
- * @param {function} func The function to be wrapped in a new context
- * @param {function} _before A function to call before the try/catch wrapper [optional, private]
- * @return {function} The newly wrapped functions with a context
- */
- wrap: function(options, func, _before) {
- var self = this;
- // 1 argument has been passed, and it's not a function
- // so just return it
- if (isUndefined$1(func) && !isFunction$1(options)) {
- return options;
- }
-
- // options is optional
- if (isFunction$1(options)) {
- func = options;
- options = undefined;
- }
-
- // At this point, we've passed along 2 arguments, and the second one
- // is not a function either, so we'll just return the second argument.
- if (!isFunction$1(func)) {
- return func;
- }
-
- // We don't wanna wrap it twice!
- try {
- if (func.__raven__) {
- return func;
- }
-
- // If this has already been wrapped in the past, return that
- if (func.__raven_wrapper__) {
- return func.__raven_wrapper__;
- }
- } catch (e) {
- // Just accessing custom props in some Selenium environments
- // can cause a "Permission denied" exception (see raven-js#495).
- // Bail on wrapping and return the function as-is (defers to window.onerror).
- return func;
- }
-
- function wrapped() {
- var args = [],
- i = arguments.length,
- deep = !options || (options && options.deep !== false);
-
- if (_before && isFunction$1(_before)) {
- _before.apply(this, arguments);
- }
-
- // Recursively wrap all of a function's arguments that are
- // functions themselves.
- while (i--) args[i] = deep ? self.wrap(options, arguments[i]) : arguments[i];
-
- try {
- // Attempt to invoke user-land function
- // NOTE: If you are a Sentry user, and you are seeing this stack frame, it
- // means Raven caught an error invoking your application code. This is
- // expected behavior and NOT indicative of a bug with Raven.js.
- return func.apply(this, args);
- } catch (e) {
- self._ignoreNextOnError();
- self.captureException(e, options);
- throw e;
- }
- }
-
- // copy over properties of the old function
- for (var property in func) {
- if (hasKey$1(func, property)) {
- wrapped[property] = func[property];
- }
- }
- wrapped.prototype = func.prototype;
-
- func.__raven_wrapper__ = wrapped;
- // Signal that this function has been wrapped/filled already
- // for both debugging and to prevent it to being wrapped/filled twice
- wrapped.__raven__ = true;
- wrapped.__orig__ = func;
-
- return wrapped;
- },
-
- /**
- * Uninstalls the global error handler.
- *
- * @return {Raven}
- */
- uninstall: function() {
- tracekit.report.uninstall();
-
- this._detachPromiseRejectionHandler();
- this._unpatchFunctionToString();
- this._restoreBuiltIns();
- this._restoreConsole();
-
- Error.stackTraceLimit = this._originalErrorStackTraceLimit;
- this._isRavenInstalled = false;
-
- return this;
- },
-
- /**
- * Callback used for `unhandledrejection` event
- *
- * @param {PromiseRejectionEvent} event An object containing
- * promise: the Promise that was rejected
- * reason: the value with which the Promise was rejected
- * @return void
- */
- _promiseRejectionHandler: function(event) {
- this._logDebug('debug', 'Raven caught unhandled promise rejection:', event);
- this.captureException(event.reason, {
- mechanism: {
- type: 'onunhandledrejection',
- handled: false
- }
- });
- },
-
- /**
- * Installs the global promise rejection handler.
- *
- * @return {raven}
- */
- _attachPromiseRejectionHandler: function() {
- this._promiseRejectionHandler = this._promiseRejectionHandler.bind(this);
- _window$2.addEventListener &&
- _window$2.addEventListener('unhandledrejection', this._promiseRejectionHandler);
- return this;
- },
-
- /**
- * Uninstalls the global promise rejection handler.
- *
- * @return {raven}
- */
- _detachPromiseRejectionHandler: function() {
- _window$2.removeEventListener &&
- _window$2.removeEventListener('unhandledrejection', this._promiseRejectionHandler);
- return this;
- },
-
- /**
- * Manually capture an exception and send it over to Sentry
- *
- * @param {error} ex An exception to be logged
- * @param {object} options A specific set of options for this error [optional]
- * @return {Raven}
- */
- captureException: function(ex, options) {
- options = objectMerge$1({trimHeadFrames: 0}, options ? options : {});
-
- if (isErrorEvent$1(ex) && ex.error) {
- // If it is an ErrorEvent with `error` property, extract it to get actual Error
- ex = ex.error;
- } else if (isDOMError$1(ex) || isDOMException$1(ex)) {
- // If it is a DOMError or DOMException (which are legacy APIs, but still supported in some browsers)
- // then we just extract the name and message, as they don't provide anything else
- // https://developer.mozilla.org/en-US/docs/Web/API/DOMError
- // https://developer.mozilla.org/en-US/docs/Web/API/DOMException
- var name = ex.name || (isDOMError$1(ex) ? 'DOMError' : 'DOMException');
- var message = ex.message ? name + ': ' + ex.message : name;
-
- return this.captureMessage(
- message,
- objectMerge$1(options, {
- // neither DOMError or DOMException provide stack trace and we most likely wont get it this way as well
- // but it's barely any overhead so we may at least try
- stacktrace: true,
- trimHeadFrames: options.trimHeadFrames + 1
- })
- );
- } else if (isError$1(ex)) {
- // we have a real Error object
- ex = ex;
- } else if (isPlainObject$1(ex)) {
- // If it is plain Object, serialize it manually and extract options
- // This will allow us to group events based on top-level keys
- // which is much better than creating new group when any key/value change
- options = this._getCaptureExceptionOptionsFromPlainObject(options, ex);
- ex = new Error(options.message);
- } else {
- // If none of previous checks were valid, then it means that
- // it's not a DOMError/DOMException
- // it's not a plain Object
- // it's not a valid ErrorEvent (one with an error property)
- // it's not an Error
- // So bail out and capture it as a simple message:
- return this.captureMessage(
- ex,
- objectMerge$1(options, {
- stacktrace: true, // if we fall back to captureMessage, default to attempting a new trace
- trimHeadFrames: options.trimHeadFrames + 1
- })
- );
- }
-
- // Store the raw exception object for potential debugging and introspection
- this._lastCapturedException = ex;
-
- // TraceKit.report will re-raise any exception passed to it,
- // which means you have to wrap it in try/catch. Instead, we
- // can wrap it here and only re-raise if TraceKit.report
- // raises an exception different from the one we asked to
- // report on.
- try {
- var stack = tracekit.computeStackTrace(ex);
- this._handleStackInfo(stack, options);
- } catch (ex1) {
- if (ex !== ex1) {
- throw ex1;
- }
- }
-
- return this;
- },
-
- _getCaptureExceptionOptionsFromPlainObject: function(currentOptions, ex) {
- var exKeys = Object.keys(ex).sort();
- var options = objectMerge$1(currentOptions, {
- message:
- 'Non-Error exception captured with keys: ' + serializeKeysForMessage$1(exKeys),
- fingerprint: [md5_1(exKeys)],
- extra: currentOptions.extra || {}
- });
- options.extra.__serialized__ = serializeException$1(ex);
-
- return options;
- },
-
- /*
- * Manually send a message to Sentry
- *
- * @param {string} msg A plain message to be captured in Sentry
- * @param {object} options A specific set of options for this message [optional]
- * @return {Raven}
- */
- captureMessage: function(msg, options) {
- // config() automagically converts ignoreErrors from a list to a RegExp so we need to test for an
- // early call; we'll error on the side of logging anything called before configuration since it's
- // probably something you should see:
- if (
- !!this._globalOptions.ignoreErrors.test &&
- this._globalOptions.ignoreErrors.test(msg)
- ) {
- return;
- }
-
- options = options || {};
- msg = msg + ''; // Make sure it's actually a string
-
- var data = objectMerge$1(
- {
- message: msg
- },
- options
- );
-
- var ex;
- // Generate a "synthetic" stack trace from this point.
- // NOTE: If you are a Sentry user, and you are seeing this stack frame, it is NOT indicative
- // of a bug with Raven.js. Sentry generates synthetic traces either by configuration,
- // or if it catches a thrown object without a "stack" property.
- try {
- throw new Error(msg);
- } catch (ex1) {
- ex = ex1;
- }
-
- // null exception name so `Error` isn't prefixed to msg
- ex.name = null;
- var stack = tracekit.computeStackTrace(ex);
-
- // stack[0] is `throw new Error(msg)` call itself, we are interested in the frame that was just before that, stack[1]
- var initialCall = isArray$1(stack.stack) && stack.stack[1];
-
- // if stack[1] is `Raven.captureException`, it means that someone passed a string to it and we redirected that call
- // to be handled by `captureMessage`, thus `initialCall` is the 3rd one, not 2nd
- // initialCall => captureException(string) => captureMessage(string)
- if (initialCall && initialCall.func === 'Raven.captureException') {
- initialCall = stack.stack[2];
- }
-
- var fileurl = (initialCall && initialCall.url) || '';
-
- if (
- !!this._globalOptions.ignoreUrls.test &&
- this._globalOptions.ignoreUrls.test(fileurl)
- ) {
- return;
- }
-
- if (
- !!this._globalOptions.whitelistUrls.test &&
- !this._globalOptions.whitelistUrls.test(fileurl)
- ) {
- return;
- }
-
- if (this._globalOptions.stacktrace || (options && options.stacktrace)) {
- // fingerprint on msg, not stack trace (legacy behavior, could be revisited)
- data.fingerprint = data.fingerprint == null ? msg : data.fingerprint;
-
- options = objectMerge$1(
- {
- trimHeadFrames: 0
- },
- options
- );
- // Since we know this is a synthetic trace, the top frame (this function call)
- // MUST be from Raven.js, so mark it for trimming
- // We add to the trim counter so that callers can choose to trim extra frames, such
- // as utility functions.
- options.trimHeadFrames += 1;
-
- var frames = this._prepareFrames(stack, options);
- data.stacktrace = {
- // Sentry expects frames oldest to newest
- frames: frames.reverse()
- };
- }
-
- // Make sure that fingerprint is always wrapped in an array
- if (data.fingerprint) {
- data.fingerprint = isArray$1(data.fingerprint)
- ? data.fingerprint
- : [data.fingerprint];
- }
-
- // Fire away!
- this._send(data);
-
- return this;
- },
-
- captureBreadcrumb: function(obj) {
- var crumb = objectMerge$1(
- {
- timestamp: now() / 1000
- },
- obj
- );
-
- if (isFunction$1(this._globalOptions.breadcrumbCallback)) {
- var result = this._globalOptions.breadcrumbCallback(crumb);
-
- if (isObject$1(result) && !isEmptyObject$1(result)) {
- crumb = result;
- } else if (result === false) {
- return this;
- }
- }
-
- this._breadcrumbs.push(crumb);
- if (this._breadcrumbs.length > this._globalOptions.maxBreadcrumbs) {
- this._breadcrumbs.shift();
- }
- return this;
- },
-
- addPlugin: function(plugin /*arg1, arg2, ... argN*/) {
- var pluginArgs = [].slice.call(arguments, 1);
-
- this._plugins.push([plugin, pluginArgs]);
- if (this._isRavenInstalled) {
- this._drainPlugins();
- }
-
- return this;
- },
-
- /*
- * Set/clear a user to be sent along with the payload.
- *
- * @param {object} user An object representing user data [optional]
- * @return {Raven}
- */
- setUserContext: function(user) {
- // Intentionally do not merge here since that's an unexpected behavior.
- this._globalContext.user = user;
-
- return this;
- },
-
- /*
- * Merge extra attributes to be sent along with the payload.
- *
- * @param {object} extra An object representing extra data [optional]
- * @return {Raven}
- */
- setExtraContext: function(extra) {
- this._mergeContext('extra', extra);
-
- return this;
- },
-
- /*
- * Merge tags to be sent along with the payload.
- *
- * @param {object} tags An object representing tags [optional]
- * @return {Raven}
- */
- setTagsContext: function(tags) {
- this._mergeContext('tags', tags);
-
- return this;
- },
-
- /*
- * Clear all of the context.
- *
- * @return {Raven}
- */
- clearContext: function() {
- this._globalContext = {};
-
- return this;
- },
-
- /*
- * Get a copy of the current context. This cannot be mutated.
- *
- * @return {object} copy of context
- */
- getContext: function() {
- // lol javascript
- return JSON.parse(stringify_1(this._globalContext));
- },
-
- /*
- * Set environment of application
- *
- * @param {string} environment Typically something like 'production'.
- * @return {Raven}
- */
- setEnvironment: function(environment) {
- this._globalOptions.environment = environment;
-
- return this;
- },
-
- /*
- * Set release version of application
- *
- * @param {string} release Typically something like a git SHA to identify version
- * @return {Raven}
- */
- setRelease: function(release) {
- this._globalOptions.release = release;
-
- return this;
- },
-
- /*
- * Set the dataCallback option
- *
- * @param {function} callback The callback to run which allows the
- * data blob to be mutated before sending
- * @return {Raven}
- */
- setDataCallback: function(callback) {
- var original = this._globalOptions.dataCallback;
- this._globalOptions.dataCallback = keepOriginalCallback(original, callback);
- return this;
- },
-
- /*
- * Set the breadcrumbCallback option
- *
- * @param {function} callback The callback to run which allows filtering
- * or mutating breadcrumbs
- * @return {Raven}
- */
- setBreadcrumbCallback: function(callback) {
- var original = this._globalOptions.breadcrumbCallback;
- this._globalOptions.breadcrumbCallback = keepOriginalCallback(original, callback);
- return this;
- },
-
- /*
- * Set the shouldSendCallback option
- *
- * @param {function} callback The callback to run which allows
- * introspecting the blob before sending
- * @return {Raven}
- */
- setShouldSendCallback: function(callback) {
- var original = this._globalOptions.shouldSendCallback;
- this._globalOptions.shouldSendCallback = keepOriginalCallback(original, callback);
- return this;
- },
-
- /**
- * Override the default HTTP transport mechanism that transmits data
- * to the Sentry server.
- *
- * @param {function} transport Function invoked instead of the default
- * `makeRequest` handler.
- *
- * @return {Raven}
- */
- setTransport: function(transport) {
- this._globalOptions.transport = transport;
-
- return this;
- },
-
- /*
- * Get the latest raw exception that was captured by Raven.
- *
- * @return {error}
- */
- lastException: function() {
- return this._lastCapturedException;
- },
-
- /*
- * Get the last event id
- *
- * @return {string}
- */
- lastEventId: function() {
- return this._lastEventId;
- },
-
- /*
- * Determine if Raven is setup and ready to go.
- *
- * @return {boolean}
- */
- isSetup: function() {
- if (!this._hasJSON) return false; // needs JSON support
- if (!this._globalServer) {
- if (!this.ravenNotConfiguredError) {
- this.ravenNotConfiguredError = true;
- this._logDebug('error', 'Error: Raven has not been configured.');
- }
- return false;
- }
- return true;
- },
-
- afterLoad: function() {
- // TODO: remove window dependence?
-
- // Attempt to initialize Raven on load
- var RavenConfig = _window$2.RavenConfig;
- if (RavenConfig) {
- this.config(RavenConfig.dsn, RavenConfig.config).install();
- }
- },
-
- showReportDialog: function(options) {
- if (
- !_document // doesn't work without a document (React native)
- )
- return;
-
- options = options || {};
-
- var lastEventId = options.eventId || this.lastEventId();
- if (!lastEventId) {
- throw new configError('Missing eventId');
- }
-
- var dsn = options.dsn || this._dsn;
- if (!dsn) {
- throw new configError('Missing DSN');
- }
-
- var encode = encodeURIComponent;
- var qs = '';
- qs += '?eventId=' + encode(lastEventId);
- qs += '&dsn=' + encode(dsn);
-
- var user = options.user || this._globalContext.user;
- if (user) {
- if (user.name) qs += '&name=' + encode(user.name);
- if (user.email) qs += '&email=' + encode(user.email);
- }
-
- var globalServer = this._getGlobalServer(this._parseDSN(dsn));
-
- var script = _document.createElement('script');
- script.async = true;
- script.src = globalServer + '/api/embed/error-page/' + qs;
- (_document.head || _document.body).appendChild(script);
- },
-
- /**** Private functions ****/
- _ignoreNextOnError: function() {
- var self = this;
- this._ignoreOnError += 1;
- setTimeout(function() {
- // onerror should trigger before setTimeout
- self._ignoreOnError -= 1;
- });
- },
-
- _triggerEvent: function(eventType, options) {
- // NOTE: `event` is a native browser thing, so let's avoid conflicting wiht it
- var evt, key;
-
- if (!this._hasDocument) return;
-
- options = options || {};
-
- eventType = 'raven' + eventType.substr(0, 1).toUpperCase() + eventType.substr(1);
-
- if (_document.createEvent) {
- evt = _document.createEvent('HTMLEvents');
- evt.initEvent(eventType, true, true);
- } else {
- evt = _document.createEventObject();
- evt.eventType = eventType;
- }
-
- for (key in options)
- if (hasKey$1(options, key)) {
- evt[key] = options[key];
- }
-
- if (_document.createEvent) {
- // IE9 if standards
- _document.dispatchEvent(evt);
- } else {
- // IE8 regardless of Quirks or Standards
- // IE9 if quirks
- try {
- _document.fireEvent('on' + evt.eventType.toLowerCase(), evt);
- } catch (e) {
- // Do nothing
- }
- }
- },
-
- /**
- * Wraps addEventListener to capture UI breadcrumbs
- * @param evtName the event name (e.g. "click")
- * @returns {Function}
- * @private
- */
- _breadcrumbEventHandler: function(evtName) {
- var self = this;
- return function(evt) {
- // reset keypress timeout; e.g. triggering a 'click' after
- // a 'keypress' will reset the keypress debounce so that a new
- // set of keypresses can be recorded
- self._keypressTimeout = null;
-
- // It's possible this handler might trigger multiple times for the same
- // event (e.g. event propagation through node ancestors). Ignore if we've
- // already captured the event.
- if (self._lastCapturedEvent === evt) return;
-
- self._lastCapturedEvent = evt;
-
- // try/catch both:
- // - accessing evt.target (see getsentry/raven-js#838, #768)
- // - `htmlTreeAsString` because it's complex, and just accessing the DOM incorrectly
- // can throw an exception in some circumstances.
- var target;
- try {
- target = htmlTreeAsString$1(evt.target);
- } catch (e) {
- target = '<unknown>';
- }
-
- self.captureBreadcrumb({
- category: 'ui.' + evtName, // e.g. ui.click, ui.input
- message: target
- });
- };
- },
-
- /**
- * Wraps addEventListener to capture keypress UI events
- * @returns {Function}
- * @private
- */
- _keypressEventHandler: function() {
- var self = this,
- debounceDuration = 1000; // milliseconds
-
- // TODO: if somehow user switches keypress target before
- // debounce timeout is triggered, we will only capture
- // a single breadcrumb from the FIRST target (acceptable?)
- return function(evt) {
- var target;
- try {
- target = evt.target;
- } catch (e) {
- // just accessing event properties can throw an exception in some rare circumstances
- // see: https://github.com/getsentry/raven-js/issues/838
- return;
- }
- var tagName = target && target.tagName;
-
- // only consider keypress events on actual input elements
- // this will disregard keypresses targeting body (e.g. tabbing
- // through elements, hotkeys, etc)
- if (
- !tagName ||
- (tagName !== 'INPUT' && tagName !== 'TEXTAREA' && !target.isContentEditable)
- )
- return;
-
- // record first keypress in a series, but ignore subsequent
- // keypresses until debounce clears
- var timeout = self._keypressTimeout;
- if (!timeout) {
- self._breadcrumbEventHandler('input')(evt);
- }
- clearTimeout(timeout);
- self._keypressTimeout = setTimeout(function() {
- self._keypressTimeout = null;
- }, debounceDuration);
- };
- },
-
- /**
- * Captures a breadcrumb of type "navigation", normalizing input URLs
- * @param to the originating URL
- * @param from the target URL
- * @private
- */
- _captureUrlChange: function(from, to) {
- var parsedLoc = parseUrl$1(this._location.href);
- var parsedTo = parseUrl$1(to);
- var parsedFrom = parseUrl$1(from);
-
- // because onpopstate only tells you the "new" (to) value of location.href, and
- // not the previous (from) value, we need to track the value of the current URL
- // state ourselves
- this._lastHref = to;
-
- // Use only the path component of the URL if the URL matches the current
- // document (almost all the time when using pushState)
- if (parsedLoc.protocol === parsedTo.protocol && parsedLoc.host === parsedTo.host)
- to = parsedTo.relative;
- if (parsedLoc.protocol === parsedFrom.protocol && parsedLoc.host === parsedFrom.host)
- from = parsedFrom.relative;
-
- this.captureBreadcrumb({
- category: 'navigation',
- data: {
- to: to,
- from: from
- }
- });
- },
-
- _patchFunctionToString: function() {
- var self = this;
- self._originalFunctionToString = Function.prototype.toString;
- // eslint-disable-next-line no-extend-native
- Function.prototype.toString = function() {
- if (typeof this === 'function' && this.__raven__) {
- return self._originalFunctionToString.apply(this.__orig__, arguments);
- }
- return self._originalFunctionToString.apply(this, arguments);
- };
- },
-
- _unpatchFunctionToString: function() {
- if (this._originalFunctionToString) {
- // eslint-disable-next-line no-extend-native
- Function.prototype.toString = this._originalFunctionToString;
- }
- },
-
- /**
- * Wrap timer functions and event targets to catch errors and provide
- * better metadata.
- */
- _instrumentTryCatch: function() {
- var self = this;
-
- var wrappedBuiltIns = self._wrappedBuiltIns;
-
- function wrapTimeFn(orig) {
- return function(fn, t) {
- // preserve arity
- // Make a copy of the arguments to prevent deoptimization
- // https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#32-leaking-arguments
- var args = new Array(arguments.length);
- for (var i = 0; i < args.length; ++i) {
- args[i] = arguments[i];
- }
- var originalCallback = args[0];
- if (isFunction$1(originalCallback)) {
- args[0] = self.wrap(
- {
- mechanism: {
- type: 'instrument',
- data: {function: orig.name}
- }
- },
- originalCallback
- );
- }
-
- // IE < 9 doesn't support .call/.apply on setInterval/setTimeout, but it
- // also supports only two arguments and doesn't care what this is, so we
- // can just call the original function directly.
- if (orig.apply) {
- return orig.apply(this, args);
- } else {
- return orig(args[0], args[1]);
- }
- };
- }
-
- var autoBreadcrumbs = this._globalOptions.autoBreadcrumbs;
-
- function wrapEventTarget(global) {
- var proto = _window$2[global] && _window$2[global].prototype;
- if (proto && proto.hasOwnProperty && proto.hasOwnProperty('addEventListener')) {
- fill$1(
- proto,
- 'addEventListener',
- function(orig) {
- return function(evtName, fn, capture, secure) {
- // preserve arity
- try {
- if (fn && fn.handleEvent) {
- fn.handleEvent = self.wrap(
- {
- mechanism: {
- type: 'instrument',
- data: {target: global, function: 'handleEvent', handler: fn.name}
- }
- },
- fn.handleEvent
- );
- }
- } catch (err) {
- // can sometimes get 'Permission denied to access property "handle Event'
- }
-
- // More breadcrumb DOM capture ... done here and not in `_instrumentBreadcrumbs`
- // so that we don't have more than one wrapper function
- var before, clickHandler, keypressHandler;
-
- if (
- autoBreadcrumbs &&
- autoBreadcrumbs.dom &&
- (global === 'EventTarget' || global === 'Node')
- ) {
- // NOTE: generating multiple handlers per addEventListener invocation, should
- // revisit and verify we can just use one (almost certainly)
- clickHandler = self._breadcrumbEventHandler('click');
- keypressHandler = self._keypressEventHandler();
- before = function(evt) {
- // need to intercept every DOM event in `before` argument, in case that
- // same wrapped method is re-used for different events (e.g. mousemove THEN click)
- // see #724
- if (!evt) return;
-
- var eventType;
- try {
- eventType = evt.type;
- } catch (e) {
- // just accessing event properties can throw an exception in some rare circumstances
- // see: https://github.com/getsentry/raven-js/issues/838
- return;
- }
- if (eventType === 'click') return clickHandler(evt);
- else if (eventType === 'keypress') return keypressHandler(evt);
- };
- }
- return orig.call(
- this,
- evtName,
- self.wrap(
- {
- mechanism: {
- type: 'instrument',
- data: {
- target: global,
- function: 'addEventListener',
- handler: fn.name
- }
- }
- },
- fn,
- before
- ),
- capture,
- secure
- );
- };
- },
- wrappedBuiltIns
- );
- fill$1(
- proto,
- 'removeEventListener',
- function(orig) {
- return function(evt, fn, capture, secure) {
- try {
- fn = fn && (fn.__raven_wrapper__ ? fn.__raven_wrapper__ : fn);
- } catch (e) {
- // ignore, accessing __raven_wrapper__ will throw in some Selenium environments
- }
- return orig.call(this, evt, fn, capture, secure);
- };
- },
- wrappedBuiltIns
- );
- }
- }
-
- fill$1(_window$2, 'setTimeout', wrapTimeFn, wrappedBuiltIns);
- fill$1(_window$2, 'setInterval', wrapTimeFn, wrappedBuiltIns);
- if (_window$2.requestAnimationFrame) {
- fill$1(
- _window$2,
- 'requestAnimationFrame',
- function(orig) {
- return function(cb) {
- return orig(
- self.wrap(
- {
- mechanism: {
- type: 'instrument',
- data: {function: 'requestAnimationFrame', handler: orig.name}
- }
- },
- cb
- )
- );
- };
- },
- wrappedBuiltIns
- );
- }
-
- // event targets borrowed from bugsnag-js:
- // https://github.com/bugsnag/bugsnag-js/blob/master/src/bugsnag.js#L666
- var eventTargets = [
- 'EventTarget',
- 'Window',
- 'Node',
- 'ApplicationCache',
- 'AudioTrackList',
- 'ChannelMergerNode',
- 'CryptoOperation',
- 'EventSource',
- 'FileReader',
- 'HTMLUnknownElement',
- 'IDBDatabase',
- 'IDBRequest',
- 'IDBTransaction',
- 'KeyOperation',
- 'MediaController',
- 'MessagePort',
- 'ModalWindow',
- 'Notification',
- 'SVGElementInstance',
- 'Screen',
- 'TextTrack',
- 'TextTrackCue',
- 'TextTrackList',
- 'WebSocket',
- 'WebSocketWorker',
- 'Worker',
- 'XMLHttpRequest',
- 'XMLHttpRequestEventTarget',
- 'XMLHttpRequestUpload'
- ];
- for (var i = 0; i < eventTargets.length; i++) {
- wrapEventTarget(eventTargets[i]);
- }
- },
-
- /**
- * Instrument browser built-ins w/ breadcrumb capturing
- * - XMLHttpRequests
- * - DOM interactions (click/typing)
- * - window.location changes
- * - console
- *
- * Can be disabled or individually configured via the `autoBreadcrumbs` config option
- */
- _instrumentBreadcrumbs: function() {
- var self = this;
- var autoBreadcrumbs = this._globalOptions.autoBreadcrumbs;
-
- var wrappedBuiltIns = self._wrappedBuiltIns;
-
- function wrapProp(prop, xhr) {
- if (prop in xhr && isFunction$1(xhr[prop])) {
- fill$1(xhr, prop, function(orig) {
- return self.wrap(
- {
- mechanism: {
- type: 'instrument',
- data: {function: prop, handler: orig.name}
- }
- },
- orig
- );
- }); // intentionally don't track filled methods on XHR instances
- }
- }
-
- if (autoBreadcrumbs.xhr && 'XMLHttpRequest' in _window$2) {
- var xhrproto = _window$2.XMLHttpRequest && _window$2.XMLHttpRequest.prototype;
- fill$1(
- xhrproto,
- 'open',
- function(origOpen) {
- return function(method, url) {
- // preserve arity
-
- // if Sentry key appears in URL, don't capture
- if (isString$1(url) && url.indexOf(self._globalKey) === -1) {
- this.__raven_xhr = {
- method: method,
- url: url,
- status_code: null
- };
- }
-
- return origOpen.apply(this, arguments);
- };
- },
- wrappedBuiltIns
- );
-
- fill$1(
- xhrproto,
- 'send',
- function(origSend) {
- return function() {
- // preserve arity
- var xhr = this;
-
- function onreadystatechangeHandler() {
- if (xhr.__raven_xhr && xhr.readyState === 4) {
- try {
- // touching statusCode in some platforms throws
- // an exception
- xhr.__raven_xhr.status_code = xhr.status;
- } catch (e) {
- /* do nothing */
- }
-
- self.captureBreadcrumb({
- type: 'http',
- category: 'xhr',
- data: xhr.__raven_xhr
- });
- }
- }
-
- var props = ['onload', 'onerror', 'onprogress'];
- for (var j = 0; j < props.length; j++) {
- wrapProp(props[j], xhr);
- }
-
- if ('onreadystatechange' in xhr && isFunction$1(xhr.onreadystatechange)) {
- fill$1(
- xhr,
- 'onreadystatechange',
- function(orig) {
- return self.wrap(
- {
- mechanism: {
- type: 'instrument',
- data: {
- function: 'onreadystatechange',
- handler: orig.name
- }
- }
- },
- orig,
- onreadystatechangeHandler
- );
- } /* intentionally don't track this instrumentation */
- );
- } else {
- // if onreadystatechange wasn't actually set by the page on this xhr, we
- // are free to set our own and capture the breadcrumb
- xhr.onreadystatechange = onreadystatechangeHandler;
- }
-
- return origSend.apply(this, arguments);
- };
- },
- wrappedBuiltIns
- );
- }
-
- if (autoBreadcrumbs.xhr && supportsFetch$1()) {
- fill$1(
- _window$2,
- 'fetch',
- function(origFetch) {
- return function() {
- // preserve arity
- // Make a copy of the arguments to prevent deoptimization
- // https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#32-leaking-arguments
- var args = new Array(arguments.length);
- for (var i = 0; i < args.length; ++i) {
- args[i] = arguments[i];
- }
-
- var fetchInput = args[0];
- var method = 'GET';
- var url;
-
- if (typeof fetchInput === 'string') {
- url = fetchInput;
- } else if ('Request' in _window$2 && fetchInput instanceof _window$2.Request) {
- url = fetchInput.url;
- if (fetchInput.method) {
- method = fetchInput.method;
- }
- } else {
- url = '' + fetchInput;
- }
-
- // if Sentry key appears in URL, don't capture, as it's our own request
- if (url.indexOf(self._globalKey) !== -1) {
- return origFetch.apply(this, args);
- }
-
- if (args[1] && args[1].method) {
- method = args[1].method;
- }
-
- var fetchData = {
- method: method,
- url: url,
- status_code: null
- };
-
- return origFetch
- .apply(this, args)
- .then(function(response) {
- fetchData.status_code = response.status;
-
- self.captureBreadcrumb({
- type: 'http',
- category: 'fetch',
- data: fetchData
- });
-
- return response;
- })
- ['catch'](function(err) {
- // if there is an error performing the request
- self.captureBreadcrumb({
- type: 'http',
- category: 'fetch',
- data: fetchData,
- level: 'error'
- });
-
- throw err;
- });
- };
- },
- wrappedBuiltIns
- );
- }
-
- // Capture breadcrumbs from any click that is unhandled / bubbled up all the way
- // to the document. Do this before we instrument addEventListener.
- if (autoBreadcrumbs.dom && this._hasDocument) {
- if (_document.addEventListener) {
- _document.addEventListener('click', self._breadcrumbEventHandler('click'), false);
- _document.addEventListener('keypress', self._keypressEventHandler(), false);
- } else if (_document.attachEvent) {
- // IE8 Compatibility
- _document.attachEvent('onclick', self._breadcrumbEventHandler('click'));
- _document.attachEvent('onkeypress', self._keypressEventHandler());
- }
- }
-
- // record navigation (URL) changes
- // NOTE: in Chrome App environment, touching history.pushState, *even inside
- // a try/catch block*, will cause Chrome to output an error to console.error
- // borrowed from: https://github.com/angular/angular.js/pull/13945/files
- var chrome = _window$2.chrome;
- var isChromePackagedApp = chrome && chrome.app && chrome.app.runtime;
- var hasPushAndReplaceState =
- !isChromePackagedApp &&
- _window$2.history &&
- _window$2.history.pushState &&
- _window$2.history.replaceState;
- if (autoBreadcrumbs.location && hasPushAndReplaceState) {
- // TODO: remove onpopstate handler on uninstall()
- var oldOnPopState = _window$2.onpopstate;
- _window$2.onpopstate = function() {
- var currentHref = self._location.href;
- self._captureUrlChange(self._lastHref, currentHref);
-
- if (oldOnPopState) {
- return oldOnPopState.apply(this, arguments);
- }
- };
-
- var historyReplacementFunction = function(origHistFunction) {
- // note history.pushState.length is 0; intentionally not declaring
- // params to preserve 0 arity
- return function(/* state, title, url */) {
- var url = arguments.length > 2 ? arguments[2] : undefined;
-
- // url argument is optional
- if (url) {
- // coerce to string (this is what pushState does)
- self._captureUrlChange(self._lastHref, url + '');
- }
-
- return origHistFunction.apply(this, arguments);
- };
- };
-
- fill$1(_window$2.history, 'pushState', historyReplacementFunction, wrappedBuiltIns);
- fill$1(_window$2.history, 'replaceState', historyReplacementFunction, wrappedBuiltIns);
- }
-
- if (autoBreadcrumbs.console && 'console' in _window$2 && console.log) {
- // console
- var consoleMethodCallback = function(msg, data) {
- self.captureBreadcrumb({
- message: msg,
- level: data.level,
- category: 'console'
- });
- };
-
- each$1(['debug', 'info', 'warn', 'error', 'log'], function(_, level) {
- wrapConsoleMethod(console, level, consoleMethodCallback);
- });
- }
- },
-
- _restoreBuiltIns: function() {
- // restore any wrapped builtins
- var builtin;
- while (this._wrappedBuiltIns.length) {
- builtin = this._wrappedBuiltIns.shift();
-
- var obj = builtin[0],
- name = builtin[1],
- orig = builtin[2];
-
- obj[name] = orig;
- }
- },
-
- _restoreConsole: function() {
- // eslint-disable-next-line guard-for-in
- for (var method in this._originalConsoleMethods) {
- this._originalConsole[method] = this._originalConsoleMethods[method];
- }
- },
-
- _drainPlugins: function() {
- var self = this;
-
- // FIX ME TODO
- each$1(this._plugins, function(_, plugin) {
- var installer = plugin[0];
- var args = plugin[1];
- installer.apply(self, [self].concat(args));
- });
- },
-
- _parseDSN: function(str) {
- var m = dsnPattern.exec(str),
- dsn = {},
- i = 7;
-
- try {
- while (i--) dsn[dsnKeys[i]] = m[i] || '';
- } catch (e) {
- throw new configError('Invalid DSN: ' + str);
- }
-
- if (dsn.pass && !this._globalOptions.allowSecretKey) {
- throw new configError(
- 'Do not specify your secret key in the DSN. See: http://bit.ly/raven-secret-key'
- );
- }
-
- return dsn;
- },
-
- _getGlobalServer: function(uri) {
- // assemble the endpoint from the uri pieces
- var globalServer = '//' + uri.host + (uri.port ? ':' + uri.port : '');
-
- if (uri.protocol) {
- globalServer = uri.protocol + ':' + globalServer;
- }
- return globalServer;
- },
-
- _handleOnErrorStackInfo: function(stackInfo, options) {
- options = options || {};
- options.mechanism = options.mechanism || {
- type: 'onerror',
- handled: false
- };
-
- // if we are intentionally ignoring errors via onerror, bail out
- if (!this._ignoreOnError) {
- this._handleStackInfo(stackInfo, options);
- }
- },
-
- _handleStackInfo: function(stackInfo, options) {
- var frames = this._prepareFrames(stackInfo, options);
-
- this._triggerEvent('handle', {
- stackInfo: stackInfo,
- options: options
- });
-
- this._processException(
- stackInfo.name,
- stackInfo.message,
- stackInfo.url,
- stackInfo.lineno,
- frames,
- options
- );
- },
-
- _prepareFrames: function(stackInfo, options) {
- var self = this;
- var frames = [];
- if (stackInfo.stack && stackInfo.stack.length) {
- each$1(stackInfo.stack, function(i, stack) {
- var frame = self._normalizeFrame(stack, stackInfo.url);
- if (frame) {
- frames.push(frame);
- }
- });
-
- // e.g. frames captured via captureMessage throw
- if (options && options.trimHeadFrames) {
- for (var j = 0; j < options.trimHeadFrames && j < frames.length; j++) {
- frames[j].in_app = false;
- }
- }
- }
- frames = frames.slice(0, this._globalOptions.stackTraceLimit);
- return frames;
- },
-
- _normalizeFrame: function(frame, stackInfoUrl) {
- // normalize the frames data
- var normalized = {
- filename: frame.url,
- lineno: frame.line,
- colno: frame.column,
- function: frame.func || '?'
- };
-
- // Case when we don't have any information about the error
- // E.g. throwing a string or raw object, instead of an `Error` in Firefox
- // Generating synthetic error doesn't add any value here
- //
- // We should probably somehow let a user know that they should fix their code
- if (!frame.url) {
- normalized.filename = stackInfoUrl; // fallback to whole stacks url from onerror handler
- }
-
- normalized.in_app = !// determine if an exception came from outside of our app
- // first we check the global includePaths list.
- (
- (!!this._globalOptions.includePaths.test &&
- !this._globalOptions.includePaths.test(normalized.filename)) ||
- // Now we check for fun, if the function name is Raven or TraceKit
- /(Raven|TraceKit)\./.test(normalized['function']) ||
- // finally, we do a last ditch effort and check for raven.min.js
- /raven\.(min\.)?js$/.test(normalized.filename)
- );
-
- return normalized;
- },
-
- _processException: function(type, message, fileurl, lineno, frames, options) {
- var prefixedMessage = (type ? type + ': ' : '') + (message || '');
- if (
- !!this._globalOptions.ignoreErrors.test &&
- (this._globalOptions.ignoreErrors.test(message) ||
- this._globalOptions.ignoreErrors.test(prefixedMessage))
- ) {
- return;
- }
-
- var stacktrace;
-
- if (frames && frames.length) {
- fileurl = frames[0].filename || fileurl;
- // Sentry expects frames oldest to newest
- // and JS sends them as newest to oldest
- frames.reverse();
- stacktrace = {frames: frames};
- } else if (fileurl) {
- stacktrace = {
- frames: [
- {
- filename: fileurl,
- lineno: lineno,
- in_app: true
- }
- ]
- };
- }
-
- if (
- !!this._globalOptions.ignoreUrls.test &&
- this._globalOptions.ignoreUrls.test(fileurl)
- ) {
- return;
- }
-
- if (
- !!this._globalOptions.whitelistUrls.test &&
- !this._globalOptions.whitelistUrls.test(fileurl)
- ) {
- return;
- }
-
- var data = objectMerge$1(
- {
- // sentry.interfaces.Exception
- exception: {
- values: [
- {
- type: type,
- value: message,
- stacktrace: stacktrace
- }
- ]
- },
- transaction: fileurl
- },
- options
- );
-
- // Move mechanism from options to exception interface
- // We do this, as requiring user to pass `{exception:{mechanism:{ ... }}}` would be
- // too much
- if (!data.exception.mechanism && data.mechanism) {
- data.exception.mechanism = data.mechanism;
- delete data.mechanism;
- }
-
- data.exception.mechanism = objectMerge$1(data.exception.mechanism || {}, {
- type: 'generic',
- handled: true
- });
-
- // Fire away!
- this._send(data);
- },
-
- _trimPacket: function(data) {
- // For now, we only want to truncate the two different messages
- // but this could/should be expanded to just trim everything
- var max = this._globalOptions.maxMessageLength;
- if (data.message) {
- data.message = truncate$1(data.message, max);
- }
- if (data.exception) {
- var exception = data.exception.values[0];
- exception.value = truncate$1(exception.value, max);
- }
-
- var request = data.request;
- if (request) {
- if (request.url) {
- request.url = truncate$1(request.url, this._globalOptions.maxUrlLength);
- }
- if (request.Referer) {
- request.Referer = truncate$1(request.Referer, this._globalOptions.maxUrlLength);
- }
- }
-
- if (data.breadcrumbs && data.breadcrumbs.values)
- this._trimBreadcrumbs(data.breadcrumbs);
-
- return data;
- },
-
- /**
- * Truncate breadcrumb values (right now just URLs)
- */
- _trimBreadcrumbs: function(breadcrumbs) {
- // known breadcrumb properties with urls
- // TODO: also consider arbitrary prop values that start with (https?)?://
- var urlProps = ['to', 'from', 'url'],
- urlProp,
- crumb,
- data;
-
- for (var i = 0; i < breadcrumbs.values.length; ++i) {
- crumb = breadcrumbs.values[i];
- if (
- !crumb.hasOwnProperty('data') ||
- !isObject$1(crumb.data) ||
- objectFrozen$1(crumb.data)
- )
- continue;
-
- data = objectMerge$1({}, crumb.data);
- for (var j = 0; j < urlProps.length; ++j) {
- urlProp = urlProps[j];
- if (data.hasOwnProperty(urlProp) && data[urlProp]) {
- data[urlProp] = truncate$1(data[urlProp], this._globalOptions.maxUrlLength);
- }
- }
- breadcrumbs.values[i].data = data;
- }
- },
-
- _getHttpData: function() {
- if (!this._hasNavigator && !this._hasDocument) return;
- var httpData = {};
-
- if (this._hasNavigator && _navigator.userAgent) {
- httpData.headers = {
- 'User-Agent': _navigator.userAgent
- };
- }
-
- // Check in `window` instead of `document`, as we may be in ServiceWorker environment
- if (_window$2.location && _window$2.location.href) {
- httpData.url = _window$2.location.href;
- }
-
- if (this._hasDocument && _document.referrer) {
- if (!httpData.headers) httpData.headers = {};
- httpData.headers.Referer = _document.referrer;
- }
-
- return httpData;
- },
-
- _resetBackoff: function() {
- this._backoffDuration = 0;
- this._backoffStart = null;
- },
-
- _shouldBackoff: function() {
- return this._backoffDuration && now() - this._backoffStart < this._backoffDuration;
- },
-
- /**
- * Returns true if the in-process data payload matches the signature
- * of the previously-sent data
- *
- * NOTE: This has to be done at this level because TraceKit can generate
- * data from window.onerror WITHOUT an exception object (IE8, IE9,
- * other old browsers). This can take the form of an "exception"
- * data object with a single frame (derived from the onerror args).
- */
- _isRepeatData: function(current) {
- var last = this._lastData;
-
- if (
- !last ||
- current.message !== last.message || // defined for captureMessage
- current.transaction !== last.transaction // defined for captureException/onerror
- )
- return false;
-
- // Stacktrace interface (i.e. from captureMessage)
- if (current.stacktrace || last.stacktrace) {
- return isSameStacktrace$1(current.stacktrace, last.stacktrace);
- } else if (current.exception || last.exception) {
- // Exception interface (i.e. from captureException/onerror)
- return isSameException$1(current.exception, last.exception);
- }
-
- return true;
- },
-
- _setBackoffState: function(request) {
- // If we are already in a backoff state, don't change anything
- if (this._shouldBackoff()) {
- return;
- }
-
- var status = request.status;
-
- // 400 - project_id doesn't exist or some other fatal
- // 401 - invalid/revoked dsn
- // 429 - too many requests
- if (!(status === 400 || status === 401 || status === 429)) return;
-
- var retry;
- try {
- // If Retry-After is not in Access-Control-Expose-Headers, most
- // browsers will throw an exception trying to access it
- if (supportsFetch$1()) {
- retry = request.headers.get('Retry-After');
- } else {
- retry = request.getResponseHeader('Retry-After');
- }
-
- // Retry-After is returned in seconds
- retry = parseInt(retry, 10) * 1000;
- } catch (e) {
- /* eslint no-empty:0 */
- }
-
- this._backoffDuration = retry
- ? // If Sentry server returned a Retry-After value, use it
- retry
- : // Otherwise, double the last backoff duration (starts at 1 sec)
- this._backoffDuration * 2 || 1000;
-
- this._backoffStart = now();
- },
-
- _send: function(data) {
- var globalOptions = this._globalOptions;
-
- var baseData = {
- project: this._globalProject,
- logger: globalOptions.logger,
- platform: 'javascript'
- },
- httpData = this._getHttpData();
-
- if (httpData) {
- baseData.request = httpData;
- }
-
- // HACK: delete `trimHeadFrames` to prevent from appearing in outbound payload
- if (data.trimHeadFrames) delete data.trimHeadFrames;
-
- data = objectMerge$1(baseData, data);
-
- // Merge in the tags and extra separately since objectMerge doesn't handle a deep merge
- data.tags = objectMerge$1(objectMerge$1({}, this._globalContext.tags), data.tags);
- data.extra = objectMerge$1(objectMerge$1({}, this._globalContext.extra), data.extra);
-
- // Send along our own collected metadata with extra
- data.extra['session:duration'] = now() - this._startTime;
-
- if (this._breadcrumbs && this._breadcrumbs.length > 0) {
- // intentionally make shallow copy so that additions
- // to breadcrumbs aren't accidentally sent in this request
- data.breadcrumbs = {
- values: [].slice.call(this._breadcrumbs, 0)
- };
- }
-
- if (this._globalContext.user) {
- // sentry.interfaces.User
- data.user = this._globalContext.user;
- }
-
- // Include the environment if it's defined in globalOptions
- if (globalOptions.environment) data.environment = globalOptions.environment;
-
- // Include the release if it's defined in globalOptions
- if (globalOptions.release) data.release = globalOptions.release;
-
- // Include server_name if it's defined in globalOptions
- if (globalOptions.serverName) data.server_name = globalOptions.serverName;
-
- data = this._sanitizeData(data);
-
- // Cleanup empty properties before sending them to the server
- Object.keys(data).forEach(function(key) {
- if (data[key] == null || data[key] === '' || isEmptyObject$1(data[key])) {
- delete data[key];
- }
- });
-
- if (isFunction$1(globalOptions.dataCallback)) {
- data = globalOptions.dataCallback(data) || data;
- }
-
- // Why??????????
- if (!data || isEmptyObject$1(data)) {
- return;
- }
-
- // Check if the request should be filtered or not
- if (
- isFunction$1(globalOptions.shouldSendCallback) &&
- !globalOptions.shouldSendCallback(data)
- ) {
- return;
- }
-
- // Backoff state: Sentry server previously responded w/ an error (e.g. 429 - too many requests),
- // so drop requests until "cool-off" period has elapsed.
- if (this._shouldBackoff()) {
- this._logDebug('warn', 'Raven dropped error due to backoff: ', data);
- return;
- }
-
- if (typeof globalOptions.sampleRate === 'number') {
- if (Math.random() < globalOptions.sampleRate) {
- this._sendProcessedPayload(data);
- }
- } else {
- this._sendProcessedPayload(data);
- }
- },
-
- _sanitizeData: function(data) {
- return sanitize$1(data, this._globalOptions.sanitizeKeys);
- },
-
- _getUuid: function() {
- return uuid4$1();
- },
-
- _sendProcessedPayload: function(data, callback) {
- var self = this;
- var globalOptions = this._globalOptions;
-
- if (!this.isSetup()) return;
-
- // Try and clean up the packet before sending by truncating long values
- data = this._trimPacket(data);
-
- // ideally duplicate error testing should occur *before* dataCallback/shouldSendCallback,
- // but this would require copying an un-truncated copy of the data packet, which can be
- // arbitrarily deep (extra_data) -- could be worthwhile? will revisit
- if (!this._globalOptions.allowDuplicates && this._isRepeatData(data)) {
- this._logDebug('warn', 'Raven dropped repeat event: ', data);
- return;
- }
-
- // Send along an event_id if not explicitly passed.
- // This event_id can be used to reference the error within Sentry itself.
- // Set lastEventId after we know the error should actually be sent
- this._lastEventId = data.event_id || (data.event_id = this._getUuid());
-
- // Store outbound payload after trim
- this._lastData = data;
-
- this._logDebug('debug', 'Raven about to send:', data);
-
- var auth = {
- sentry_version: '7',
- sentry_client: 'raven-js/' + this.VERSION,
- sentry_key: this._globalKey
- };
-
- if (this._globalSecret) {
- auth.sentry_secret = this._globalSecret;
- }
-
- var exception = data.exception && data.exception.values[0];
-
- // only capture 'sentry' breadcrumb is autoBreadcrumbs is truthy
- if (
- this._globalOptions.autoBreadcrumbs &&
- this._globalOptions.autoBreadcrumbs.sentry
- ) {
- this.captureBreadcrumb({
- category: 'sentry',
- message: exception
- ? (exception.type ? exception.type + ': ' : '') + exception.value
- : data.message,
- event_id: data.event_id,
- level: data.level || 'error' // presume error unless specified
- });
- }
-
- var url = this._globalEndpoint;
- (globalOptions.transport || this._makeRequest).call(this, {
- url: url,
- auth: auth,
- data: data,
- options: globalOptions,
- onSuccess: function success() {
- self._resetBackoff();
-
- self._triggerEvent('success', {
- data: data,
- src: url
- });
- callback && callback();
- },
- onError: function failure(error) {
- self._logDebug('error', 'Raven transport failed to send: ', error);
-
- if (error.request) {
- self._setBackoffState(error.request);
- }
-
- self._triggerEvent('failure', {
- data: data,
- src: url
- });
- error = error || new Error('Raven send failed (no additional details provided)');
- callback && callback(error);
- }
- });
- },
-
- _makeRequest: function(opts) {
- // Auth is intentionally sent as part of query string (NOT as custom HTTP header) to avoid preflight CORS requests
- var url = opts.url + '?' + urlencode$1(opts.auth);
-
- var evaluatedHeaders = null;
- var evaluatedFetchParameters = {};
-
- if (opts.options.headers) {
- evaluatedHeaders = this._evaluateHash(opts.options.headers);
- }
-
- if (opts.options.fetchParameters) {
- evaluatedFetchParameters = this._evaluateHash(opts.options.fetchParameters);
- }
-
- if (supportsFetch$1()) {
- evaluatedFetchParameters.body = stringify_1(opts.data);
-
- var defaultFetchOptions = objectMerge$1({}, this._fetchDefaults);
- var fetchOptions = objectMerge$1(defaultFetchOptions, evaluatedFetchParameters);
-
- if (evaluatedHeaders) {
- fetchOptions.headers = evaluatedHeaders;
- }
-
- return _window$2
- .fetch(url, fetchOptions)
- .then(function(response) {
- if (response.ok) {
- opts.onSuccess && opts.onSuccess();
- } else {
- var error = new Error('Sentry error code: ' + response.status);
- // It's called request only to keep compatibility with XHR interface
- // and not add more redundant checks in setBackoffState method
- error.request = response;
- opts.onError && opts.onError(error);
- }
- })
- ['catch'](function() {
- opts.onError &&
- opts.onError(new Error('Sentry error code: network unavailable'));
- });
- }
-
- var request = _window$2.XMLHttpRequest && new _window$2.XMLHttpRequest();
- if (!request) return;
-
- // if browser doesn't support CORS (e.g. IE7), we are out of luck
- var hasCORS = 'withCredentials' in request || typeof XDomainRequest !== 'undefined';
-
- if (!hasCORS) return;
-
- if ('withCredentials' in request) {
- request.onreadystatechange = function() {
- if (request.readyState !== 4) {
- return;
- } else if (request.status === 200) {
- opts.onSuccess && opts.onSuccess();
- } else if (opts.onError) {
- var err = new Error('Sentry error code: ' + request.status);
- err.request = request;
- opts.onError(err);
- }
- };
- } else {
- request = new XDomainRequest();
- // xdomainrequest cannot go http -> https (or vice versa),
- // so always use protocol relative
- url = url.replace(/^https?:/, '');
-
- // onreadystatechange not supported by XDomainRequest
- if (opts.onSuccess) {
- request.onload = opts.onSuccess;
- }
- if (opts.onError) {
- request.onerror = function() {
- var err = new Error('Sentry error code: XDomainRequest');
- err.request = request;
- opts.onError(err);
- };
- }
- }
-
- request.open('POST', url);
-
- if (evaluatedHeaders) {
- each$1(evaluatedHeaders, function(key, value) {
- request.setRequestHeader(key, value);
- });
- }
-
- request.send(stringify_1(opts.data));
- },
-
- _evaluateHash: function(hash) {
- var evaluated = {};
-
- for (var key in hash) {
- if (hash.hasOwnProperty(key)) {
- var value = hash[key];
- evaluated[key] = typeof value === 'function' ? value() : value;
- }
- }
-
- return evaluated;
- },
-
- _logDebug: function(level) {
- // We allow `Raven.debug` and `Raven.config(DSN, { debug: true })` to not make backward incompatible API change
- if (
- this._originalConsoleMethods[level] &&
- (this.debug || this._globalOptions.debug)
- ) {
- // In IE<10 console methods do not have their own 'apply' method
- Function.prototype.apply.call(
- this._originalConsoleMethods[level],
- this._originalConsole,
- [].slice.call(arguments, 1)
- );
- }
- },
-
- _mergeContext: function(key, context) {
- if (isUndefined$1(context)) {
- delete this._globalContext[key];
- } else {
- this._globalContext[key] = objectMerge$1(this._globalContext[key] || {}, context);
- }
- }
-};
-
-// Deprecations
-Raven.prototype.setUser = Raven.prototype.setUserContext;
-Raven.prototype.setReleaseContext = Raven.prototype.setRelease;
-
-var raven = Raven;
-
-/**
- * Enforces a single instance of the Raven client, and the
- * main entry point for Raven. If you are a consumer of the
- * Raven library, you SHOULD load this file (vs raven.js).
- **/
-
-
-
-// This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785)
-var _window$3 =
- typeof window !== 'undefined'
- ? window
- : typeof commonjsGlobal !== 'undefined' ? commonjsGlobal : typeof self !== 'undefined' ? self : {};
-var _Raven = _window$3.Raven;
-
-var Raven$1 = new raven();
-
-/*
- * Allow multiple versions of Raven to be installed.
- * Strip Raven from the global context and returns the instance.
- *
- * @return {Raven}
- */
-Raven$1.noConflict = function() {
- _window$3.Raven = _Raven;
- return Raven$1;
-};
-
-Raven$1.afterLoad();
-
-var singleton = Raven$1;
-
-/**
- * DISCLAIMER:
- *
- * Expose `Client` constructor for cases where user want to track multiple "sub-applications" in one larger app.
- * It's not meant to be used by a wide audience, so pleaaase make sure that you know what you're doing before using it.
- * Accidentally calling `install` multiple times, may result in an unexpected behavior that's very hard to debug.
- *
- * It's called `Client' to be in-line with Raven Node implementation.
- *
- * HOWTO:
- *
- * import Raven from 'raven-js';
- *
- * const someAppReporter = new Raven.Client();
- * const someOtherAppReporter = new Raven.Client();
- *
- * someAppReporter.config('__DSN__', {
- * ...config goes here
- * });
- *
- * someOtherAppReporter.config('__OTHER_DSN__', {
- * ...config goes here
- * });
- *
- * someAppReporter.captureMessage(...);
- * someAppReporter.captureException(...);
- * someAppReporter.captureBreadcrumb(...);
- *
- * someOtherAppReporter.captureMessage(...);
- * someOtherAppReporter.captureException(...);
- * someOtherAppReporter.captureBreadcrumb(...);
- *
- * It should "just work".
- */
-var Client = raven;
-singleton.Client = Client;
-
-// ==========================================================================
-
-(function () {
- var isLive = window.location.host === 'plyr.io';
-
- // Raven / Sentry
- // For demo site (https://plyr.io) only
- if (isLive) {
- singleton.config('https://d4ad9866ad834437a4754e23937071e4@sentry.io/305555').install();
- }
-
- document.addEventListener('DOMContentLoaded', function () {
- singleton.context(function () {
- if (window.shr) {
- window.shr.setup({
- count: {
- classname: 'button__count'
- }
- });
- }
-
- // Setup tab focus
- var tabClassName = 'tab-focus';
-
- // Remove class on blur
- document.addEventListener('focusout', function (event) {
- event.target.classList.remove(tabClassName);
- });
-
- // Add classname to tabbed elements
- document.addEventListener('keydown', function (event) {
- if (event.keyCode !== 9) {
- return;
- }
-
- // Delay the adding of classname until the focus has changed
- // This event fires before the focusin event
- setTimeout(function () {
- document.activeElement.classList.add(tabClassName);
- }, 0);
- });
-
- // Setup the player
- var player = new Plyr('#player', {
- debug: true,
- title: 'View From A Blue Moon',
- iconUrl: '../dist/plyr.svg',
- keyboard: {
- global: true
- },
- tooltips: {
- controls: true
- },
- /* controls: [
- 'play-large',
- 'restart',
- 'rewind',
- 'play',
- 'fast-forward',
- 'progress',
- 'current-time',
- 'duration',
- 'mute',
- 'volume',
- 'captions',
- 'settings',
- 'pip',
- 'airplay',
- 'fullscreen',
- ], */
- /* i18n: {
- restart: '重新開始',
- rewind: '快退{seektime}秒',
- play: '播放',
- pause: '暫停',
- fastForward: '快進{seektime}秒',
- seek: '尋求',
- played: '發揮',
- buffered: '緩衝的',
- currentTime: '當前時間戳',
- duration: '長短',
- volume: '音量',
- mute: '靜音',
- unmute: '取消靜音',
- enableCaptions: '開啟字幕',
- disableCaptions: '關閉字幕',
- enterFullscreen: '進入全螢幕',
- exitFullscreen: '退出全螢幕',
- frameTitle: '球員為{title}',
- captions: '字幕',
- settings: '設定',
- speed: '速度',
- normal: '正常',
- quality: '質量',
- loop: '循環',
- start: 'Start',
- end: 'End',
- all: 'All',
- reset: '重啟',
- disabled: '殘',
- enabled: '啟用',
- advertisement: '廣告',
- }, */
- captions: {
- active: true
- },
- keys: {
- google: 'AIzaSyDrNwtN3nLH_8rjCmu5Wq3ZCm4MNAVdc0c'
- },
- ads: {
- enabled: true,
- publisherId: '918848828995742'
- }
- });
-
- // Expose for tinkering in the console
- window.player = player;
-
- // Setup type toggle
- var buttons = document.querySelectorAll('[data-source]');
- var types = {
- video: 'video',
- audio: 'audio',
- youtube: 'youtube',
- vimeo: 'vimeo'
- };
- var currentType = window.location.hash.replace('#', '');
- var historySupport = window.history && window.history.pushState;
-
- // Toggle class on an element
- function toggleClass(element, className, state) {
- if (element) {
- element.classList[state ? 'add' : 'remove'](className);
- }
- }
-
- // Set a new source
- function newSource(type, init) {
- // Bail if new type isn't known, it's the current type, or current type is empty (video is default) and new type is video
- if (!(type in types) || !init && type === currentType || !currentType.length && type === types.video) {
- return;
- }
-
- switch (type) {
- case types.video:
- player.source = {
- type: 'video',
- title: 'View From A Blue Moon',
- sources: [{
- src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-576p.mp4',
- type: 'video/mp4',
- size: 576
- }, {
- src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-720p.mp4',
- type: 'video/mp4',
- size: 720
- }, {
- src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-1080p.mp4',
- type: 'video/mp4',
- size: 1080
- }, {
- src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-1440p.mp4',
- type: 'video/mp4',
- size: 1440
- }],
- poster: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg',
- tracks: [{
- kind: 'captions',
- label: 'English',
- srclang: 'en',
- src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt',
- default: true
- }, {
- kind: 'captions',
- label: 'French',
- srclang: 'fr',
- src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt'
- }]
- };
-
- break;
-
- case types.audio:
- player.source = {
- type: 'audio',
- title: 'Kishi Bashi &ndash; &ldquo;It All Began With A Burst&rdquo;',
- sources: [{
- src: 'https://cdn.plyr.io/static/demo/Kishi_Bashi_-_It_All_Began_With_a_Burst.mp3',
- type: 'audio/mp3'
- }, {
- src: 'https://cdn.plyr.io/static/demo/Kishi_Bashi_-_It_All_Began_With_a_Burst.ogg',
- type: 'audio/ogg'
- }]
- };
-
- break;
-
- case types.youtube:
- player.source = {
- type: 'video',
- sources: [{
- src: 'https://youtube.com/watch?v=bTqVqk7FSmY',
- provider: 'youtube'
- }]
- };
-
- break;
-
- case types.vimeo:
- player.source = {
- type: 'video',
- sources: [{
- src: 'https://vimeo.com/76979871',
- provider: 'vimeo'
- }]
- };
-
- break;
-
- default:
- break;
- }
-
- // Set the current type for next time
- currentType = type;
-
- // Remove active classes
- Array.from(buttons).forEach(function (button) {
- return toggleClass(button.parentElement, 'active', false);
- });
-
- // Set active on parent
- toggleClass(document.querySelector('[data-source="' + type + '"]'), 'active', true);
-
- // Show cite
- Array.from(document.querySelectorAll('.plyr__cite')).forEach(function (cite) {
- cite.setAttribute('hidden', '');
- });
- document.querySelector('.plyr__cite--' + type).removeAttribute('hidden');
- }
-
- // Bind to each button
- Array.from(buttons).forEach(function (button) {
- button.addEventListener('click', function () {
- var type = button.getAttribute('data-source');
-
- newSource(type);
-
- if (historySupport) {
- window.history.pushState({ type: type }, '', '#' + type);
- }
- });
- });
-
- // List for backwards/forwards
- window.addEventListener('popstate', function (event) {
- if (event.state && 'type' in event.state) {
- newSource(event.state.type);
- }
- });
-
- // On load
- if (historySupport) {
- var video = !currentType.length;
-
- // If there's no current type set, assume video
- if (video) {
- currentType = types.video;
- }
-
- // Replace current history state
- if (currentType in types) {
- window.history.replaceState({
- type: currentType
- }, '', video ? '' : '#' + currentType);
- }
-
- // If it's not video, load the source
- if (currentType !== types.video) {
- newSource(currentType, true);
- }
- }
- });
- });
-
- // Google analytics
- // For demo site (https://plyr.io) only
- /* eslint-disable */
- if (isLive) {
- (function (i, s, o, g, r, a, m) {
- i.GoogleAnalyticsObject = r;
- i[r] = i[r] || function () {
- (i[r].q = i[r].q || []).push(arguments);
- };
- i[r].l = 1 * new Date();
- a = s.createElement(o);
- m = s.getElementsByTagName(o)[0];
- a.async = 1;
- a.src = g;
- m.parentNode.insertBefore(a, m);
- })(window, document, 'script', 'https://www.google-analytics.com/analytics.js', 'ga');
- window.ga('create', 'UA-40881672-11', 'auto');
- window.ga('send', 'pageview');
- }
- /* eslint-enable */
-})();
+ 'use strict';
+
+ var commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
+
+ function createCommonjsModule(fn, module) {
+ return module = { exports: {} }, fn(module, module.exports), module.exports;
+ }
+
+ var stringify_1 = createCommonjsModule(function (module, exports) {
+ /*
+ json-stringify-safe
+ Like JSON.stringify, but doesn't throw on circular references.
+
+ Originally forked from https://github.com/isaacs/json-stringify-safe
+ version 5.0.1 on 3/8/2017 and modified to handle Errors serialization
+ and IE8 compatibility. Tests for this are in test/vendor.
+
+ ISC license: https://github.com/isaacs/json-stringify-safe/blob/master/LICENSE
+ */
+
+ exports = module.exports = stringify;
+ exports.getSerialize = serializer;
+
+ function indexOf(haystack, needle) {
+ for (var i = 0; i < haystack.length; ++i) {
+ if (haystack[i] === needle) return i;
+ }
+ return -1;
+ }
+
+ function stringify(obj, replacer, spaces, cycleReplacer) {
+ return JSON.stringify(obj, serializer(replacer, cycleReplacer), spaces);
+ }
+
+ // https://github.com/ftlabs/js-abbreviate/blob/fa709e5f139e7770a71827b1893f22418097fbda/index.js#L95-L106
+ function stringifyError(value) {
+ var err = {
+ // These properties are implemented as magical getters and don't show up in for in
+ stack: value.stack,
+ message: value.message,
+ name: value.name
+ };
+
+ for (var i in value) {
+ if (Object.prototype.hasOwnProperty.call(value, i)) {
+ err[i] = value[i];
+ }
+ }
+
+ return err;
+ }
+
+ function serializer(replacer, cycleReplacer) {
+ var stack = [];
+ var keys = [];
+
+ if (cycleReplacer == null) {
+ cycleReplacer = function(key, value) {
+ if (stack[0] === value) {
+ return '[Circular ~]';
+ }
+ return '[Circular ~.' + keys.slice(0, indexOf(stack, value)).join('.') + ']';
+ };
+ }
+
+ return function(key, value) {
+ if (stack.length > 0) {
+ var thisPos = indexOf(stack, this);
+ ~thisPos ? stack.splice(thisPos + 1) : stack.push(this);
+ ~thisPos ? keys.splice(thisPos, Infinity, key) : keys.push(key);
+
+ if (~indexOf(stack, value)) {
+ value = cycleReplacer.call(this, key, value);
+ }
+ } else {
+ stack.push(value);
+ }
+
+ return replacer == null
+ ? value instanceof Error ? stringifyError(value) : value
+ : replacer.call(this, key, value);
+ };
+ }
+ });
+ var stringify_2 = stringify_1.getSerialize;
+
+ var _window =
+ typeof window !== 'undefined'
+ ? window
+ : typeof commonjsGlobal !== 'undefined'
+ ? commonjsGlobal
+ : typeof self !== 'undefined'
+ ? self
+ : {};
+
+ function isObject(what) {
+ return typeof what === 'object' && what !== null;
+ }
+
+ // Yanked from https://git.io/vS8DV re-used under CC0
+ // with some tiny modifications
+ function isError(value) {
+ switch (Object.prototype.toString.call(value)) {
+ case '[object Error]':
+ return true;
+ case '[object Exception]':
+ return true;
+ case '[object DOMException]':
+ return true;
+ default:
+ return value instanceof Error;
+ }
+ }
+
+ function isErrorEvent(value) {
+ return Object.prototype.toString.call(value) === '[object ErrorEvent]';
+ }
+
+ function isDOMError(value) {
+ return Object.prototype.toString.call(value) === '[object DOMError]';
+ }
+
+ function isDOMException(value) {
+ return Object.prototype.toString.call(value) === '[object DOMException]';
+ }
+
+ function isUndefined(what) {
+ return what === void 0;
+ }
+
+ function isFunction(what) {
+ return typeof what === 'function';
+ }
+
+ function isPlainObject(what) {
+ return Object.prototype.toString.call(what) === '[object Object]';
+ }
+
+ function isString(what) {
+ return Object.prototype.toString.call(what) === '[object String]';
+ }
+
+ function isArray(what) {
+ return Object.prototype.toString.call(what) === '[object Array]';
+ }
+
+ function isEmptyObject(what) {
+ if (!isPlainObject(what)) return false;
+
+ for (var _ in what) {
+ if (what.hasOwnProperty(_)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ function supportsErrorEvent() {
+ try {
+ new ErrorEvent(''); // eslint-disable-line no-new
+ return true;
+ } catch (e) {
+ return false;
+ }
+ }
+
+ function supportsDOMError() {
+ try {
+ new DOMError(''); // eslint-disable-line no-new
+ return true;
+ } catch (e) {
+ return false;
+ }
+ }
+
+ function supportsDOMException() {
+ try {
+ new DOMException(''); // eslint-disable-line no-new
+ return true;
+ } catch (e) {
+ return false;
+ }
+ }
+
+ function supportsFetch() {
+ if (!('fetch' in _window)) return false;
+
+ try {
+ new Headers(); // eslint-disable-line no-new
+ new Request(''); // eslint-disable-line no-new
+ new Response(); // eslint-disable-line no-new
+ return true;
+ } catch (e) {
+ return false;
+ }
+ }
+
+ // Despite all stars in the sky saying that Edge supports old draft syntax, aka 'never', 'always', 'origin' and 'default
+ // https://caniuse.com/#feat=referrer-policy
+ // It doesn't. And it throw exception instead of ignoring this parameter...
+ // REF: https://github.com/getsentry/raven-js/issues/1233
+ function supportsReferrerPolicy() {
+ if (!supportsFetch()) return false;
+
+ try {
+ // eslint-disable-next-line no-new
+ new Request('pickleRick', {
+ referrerPolicy: 'origin'
+ });
+ return true;
+ } catch (e) {
+ return false;
+ }
+ }
+
+ function supportsPromiseRejectionEvent() {
+ return typeof PromiseRejectionEvent === 'function';
+ }
+
+ function wrappedCallback(callback) {
+ function dataCallback(data, original) {
+ var normalizedData = callback(data) || data;
+ if (original) {
+ return original(normalizedData) || normalizedData;
+ }
+ return normalizedData;
+ }
+
+ return dataCallback;
+ }
+
+ function each(obj, callback) {
+ var i, j;
+
+ if (isUndefined(obj.length)) {
+ for (i in obj) {
+ if (hasKey(obj, i)) {
+ callback.call(null, i, obj[i]);
+ }
+ }
+ } else {
+ j = obj.length;
+ if (j) {
+ for (i = 0; i < j; i++) {
+ callback.call(null, i, obj[i]);
+ }
+ }
+ }
+ }
+
+ function objectMerge(obj1, obj2) {
+ if (!obj2) {
+ return obj1;
+ }
+ each(obj2, function(key, value) {
+ obj1[key] = value;
+ });
+ return obj1;
+ }
+
+ /**
+ * This function is only used for react-native.
+ * react-native freezes object that have already been sent over the
+ * js bridge. We need this function in order to check if the object is frozen.
+ * So it's ok that objectFrozen returns false if Object.isFrozen is not
+ * supported because it's not relevant for other "platforms". See related issue:
+ * https://github.com/getsentry/react-native-sentry/issues/57
+ */
+ function objectFrozen(obj) {
+ if (!Object.isFrozen) {
+ return false;
+ }
+ return Object.isFrozen(obj);
+ }
+
+ function truncate(str, max) {
+ if (typeof max !== 'number') {
+ throw new Error('2nd argument to `truncate` function should be a number');
+ }
+ if (typeof str !== 'string' || max === 0) {
+ return str;
+ }
+ return str.length <= max ? str : str.substr(0, max) + '\u2026';
+ }
+
+ /**
+ * hasKey, a better form of hasOwnProperty
+ * Example: hasKey(MainHostObject, property) === true/false
+ *
+ * @param {Object} host object to check property
+ * @param {string} key to check
+ */
+ function hasKey(object, key) {
+ return Object.prototype.hasOwnProperty.call(object, key);
+ }
+
+ function joinRegExp(patterns) {
+ // Combine an array of regular expressions and strings into one large regexp
+ // Be mad.
+ var sources = [],
+ i = 0,
+ len = patterns.length,
+ pattern;
+
+ for (; i < len; i++) {
+ pattern = patterns[i];
+ if (isString(pattern)) {
+ // If it's a string, we need to escape it
+ // Taken from: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions
+ sources.push(pattern.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, '\\$1'));
+ } else if (pattern && pattern.source) {
+ // If it's a regexp already, we want to extract the source
+ sources.push(pattern.source);
+ }
+ // Intentionally skip other cases
+ }
+ return new RegExp(sources.join('|'), 'i');
+ }
+
+ function urlencode(o) {
+ var pairs = [];
+ each(o, function(key, value) {
+ pairs.push(encodeURIComponent(key) + '=' + encodeURIComponent(value));
+ });
+ return pairs.join('&');
+ }
+
+ // borrowed from https://tools.ietf.org/html/rfc3986#appendix-B
+ // intentionally using regex and not <a/> href parsing trick because React Native and other
+ // environments where DOM might not be available
+ function parseUrl(url) {
+ if (typeof url !== 'string') return {};
+ var match = url.match(/^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?$/);
+
+ // coerce to undefined values to empty string so we don't get 'undefined'
+ var query = match[6] || '';
+ var fragment = match[8] || '';
+ return {
+ protocol: match[2],
+ host: match[4],
+ path: match[5],
+ relative: match[5] + query + fragment // everything minus origin
+ };
+ }
+ function uuid4() {
+ var crypto = _window.crypto || _window.msCrypto;
+
+ if (!isUndefined(crypto) && crypto.getRandomValues) {
+ // Use window.crypto API if available
+ // eslint-disable-next-line no-undef
+ var arr = new Uint16Array(8);
+ crypto.getRandomValues(arr);
+
+ // set 4 in byte 7
+ arr[3] = (arr[3] & 0xfff) | 0x4000;
+ // set 2 most significant bits of byte 9 to '10'
+ arr[4] = (arr[4] & 0x3fff) | 0x8000;
+
+ var pad = function(num) {
+ var v = num.toString(16);
+ while (v.length < 4) {
+ v = '0' + v;
+ }
+ return v;
+ };
+
+ return (
+ pad(arr[0]) +
+ pad(arr[1]) +
+ pad(arr[2]) +
+ pad(arr[3]) +
+ pad(arr[4]) +
+ pad(arr[5]) +
+ pad(arr[6]) +
+ pad(arr[7])
+ );
+ } else {
+ // http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#2117523
+ return 'xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
+ var r = (Math.random() * 16) | 0,
+ v = c === 'x' ? r : (r & 0x3) | 0x8;
+ return v.toString(16);
+ });
+ }
+ }
+
+ /**
+ * Given a child DOM element, returns a query-selector statement describing that
+ * and its ancestors
+ * e.g. [HTMLElement] => body > div > input#foo.btn[name=baz]
+ * @param elem
+ * @returns {string}
+ */
+ function htmlTreeAsString(elem) {
+ /* eslint no-extra-parens:0*/
+ var MAX_TRAVERSE_HEIGHT = 5,
+ MAX_OUTPUT_LEN = 80,
+ out = [],
+ height = 0,
+ len = 0,
+ separator = ' > ',
+ sepLength = separator.length,
+ nextStr;
+
+ while (elem && height++ < MAX_TRAVERSE_HEIGHT) {
+ nextStr = htmlElementAsString(elem);
+ // bail out if
+ // - nextStr is the 'html' element
+ // - the length of the string that would be created exceeds MAX_OUTPUT_LEN
+ // (ignore this limit if we are on the first iteration)
+ if (
+ nextStr === 'html' ||
+ (height > 1 && len + out.length * sepLength + nextStr.length >= MAX_OUTPUT_LEN)
+ ) {
+ break;
+ }
+
+ out.push(nextStr);
+
+ len += nextStr.length;
+ elem = elem.parentNode;
+ }
+
+ return out.reverse().join(separator);
+ }
+
+ /**
+ * Returns a simple, query-selector representation of a DOM element
+ * e.g. [HTMLElement] => input#foo.btn[name=baz]
+ * @param HTMLElement
+ * @returns {string}
+ */
+ function htmlElementAsString(elem) {
+ var out = [],
+ className,
+ classes,
+ key,
+ attr,
+ i;
+
+ if (!elem || !elem.tagName) {
+ return '';
+ }
+
+ out.push(elem.tagName.toLowerCase());
+ if (elem.id) {
+ out.push('#' + elem.id);
+ }
+
+ className = elem.className;
+ if (className && isString(className)) {
+ classes = className.split(/\s+/);
+ for (i = 0; i < classes.length; i++) {
+ out.push('.' + classes[i]);
+ }
+ }
+ var attrWhitelist = ['type', 'name', 'title', 'alt'];
+ for (i = 0; i < attrWhitelist.length; i++) {
+ key = attrWhitelist[i];
+ attr = elem.getAttribute(key);
+ if (attr) {
+ out.push('[' + key + '="' + attr + '"]');
+ }
+ }
+ return out.join('');
+ }
+
+ /**
+ * Returns true if either a OR b is truthy, but not both
+ */
+ function isOnlyOneTruthy(a, b) {
+ return !!(!!a ^ !!b);
+ }
+
+ /**
+ * Returns true if both parameters are undefined
+ */
+ function isBothUndefined(a, b) {
+ return isUndefined(a) && isUndefined(b);
+ }
+
+ /**
+ * Returns true if the two input exception interfaces have the same content
+ */
+ function isSameException(ex1, ex2) {
+ if (isOnlyOneTruthy(ex1, ex2)) return false;
+
+ ex1 = ex1.values[0];
+ ex2 = ex2.values[0];
+
+ if (ex1.type !== ex2.type || ex1.value !== ex2.value) return false;
+
+ // in case both stacktraces are undefined, we can't decide so default to false
+ if (isBothUndefined(ex1.stacktrace, ex2.stacktrace)) return false;
+
+ return isSameStacktrace(ex1.stacktrace, ex2.stacktrace);
+ }
+
+ /**
+ * Returns true if the two input stack trace interfaces have the same content
+ */
+ function isSameStacktrace(stack1, stack2) {
+ if (isOnlyOneTruthy(stack1, stack2)) return false;
+
+ var frames1 = stack1.frames;
+ var frames2 = stack2.frames;
+
+ // Exit early if stacktrace is malformed
+ if (frames1 === undefined || frames2 === undefined) return false;
+
+ // Exit early if frame count differs
+ if (frames1.length !== frames2.length) return false;
+
+ // Iterate through every frame; bail out if anything differs
+ var a, b;
+ for (var i = 0; i < frames1.length; i++) {
+ a = frames1[i];
+ b = frames2[i];
+ if (
+ a.filename !== b.filename ||
+ a.lineno !== b.lineno ||
+ a.colno !== b.colno ||
+ a['function'] !== b['function']
+ )
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Polyfill a method
+ * @param obj object e.g. `document`
+ * @param name method name present on object e.g. `addEventListener`
+ * @param replacement replacement function
+ * @param track {optional} record instrumentation to an array
+ */
+ function fill(obj, name, replacement, track) {
+ if (obj == null) return;
+ var orig = obj[name];
+ obj[name] = replacement(orig);
+ obj[name].__raven__ = true;
+ obj[name].__orig__ = orig;
+ if (track) {
+ track.push([obj, name, orig]);
+ }
+ }
+
+ /**
+ * Join values in array
+ * @param input array of values to be joined together
+ * @param delimiter string to be placed in-between values
+ * @returns {string}
+ */
+ function safeJoin(input, delimiter) {
+ if (!isArray(input)) return '';
+
+ var output = [];
+
+ for (var i = 0; i < input.length; i++) {
+ try {
+ output.push(String(input[i]));
+ } catch (e) {
+ output.push('[value cannot be serialized]');
+ }
+ }
+
+ return output.join(delimiter);
+ }
+
+ // Default Node.js REPL depth
+ var MAX_SERIALIZE_EXCEPTION_DEPTH = 3;
+ // 50kB, as 100kB is max payload size, so half sounds reasonable
+ var MAX_SERIALIZE_EXCEPTION_SIZE = 50 * 1024;
+ var MAX_SERIALIZE_KEYS_LENGTH = 40;
+
+ function utf8Length(value) {
+ return ~-encodeURI(value).split(/%..|./).length;
+ }
+
+ function jsonSize(value) {
+ return utf8Length(JSON.stringify(value));
+ }
+
+ function serializeValue(value) {
+ if (typeof value === 'string') {
+ var maxLength = 40;
+ return truncate(value, maxLength);
+ } else if (
+ typeof value === 'number' ||
+ typeof value === 'boolean' ||
+ typeof value === 'undefined'
+ ) {
+ return value;
+ }
+
+ var type = Object.prototype.toString.call(value);
+
+ // Node.js REPL notation
+ if (type === '[object Object]') return '[Object]';
+ if (type === '[object Array]') return '[Array]';
+ if (type === '[object Function]')
+ return value.name ? '[Function: ' + value.name + ']' : '[Function]';
+
+ return value;
+ }
+
+ function serializeObject(value, depth) {
+ if (depth === 0) return serializeValue(value);
+
+ if (isPlainObject(value)) {
+ return Object.keys(value).reduce(function(acc, key) {
+ acc[key] = serializeObject(value[key], depth - 1);
+ return acc;
+ }, {});
+ } else if (Array.isArray(value)) {
+ return value.map(function(val) {
+ return serializeObject(val, depth - 1);
+ });
+ }
+
+ return serializeValue(value);
+ }
+
+ function serializeException(ex, depth, maxSize) {
+ if (!isPlainObject(ex)) return ex;
+
+ depth = typeof depth !== 'number' ? MAX_SERIALIZE_EXCEPTION_DEPTH : depth;
+ maxSize = typeof depth !== 'number' ? MAX_SERIALIZE_EXCEPTION_SIZE : maxSize;
+
+ var serialized = serializeObject(ex, depth);
+
+ if (jsonSize(stringify_1(serialized)) > maxSize) {
+ return serializeException(ex, depth - 1);
+ }
+
+ return serialized;
+ }
+
+ function serializeKeysForMessage(keys, maxLength) {
+ if (typeof keys === 'number' || typeof keys === 'string') return keys.toString();
+ if (!Array.isArray(keys)) return '';
+
+ keys = keys.filter(function(key) {
+ return typeof key === 'string';
+ });
+ if (keys.length === 0) return '[object has no keys]';
+
+ maxLength = typeof maxLength !== 'number' ? MAX_SERIALIZE_KEYS_LENGTH : maxLength;
+ if (keys[0].length >= maxLength) return keys[0];
+
+ for (var usedKeys = keys.length; usedKeys > 0; usedKeys--) {
+ var serialized = keys.slice(0, usedKeys).join(', ');
+ if (serialized.length > maxLength) continue;
+ if (usedKeys === keys.length) return serialized;
+ return serialized + '\u2026';
+ }
+
+ return '';
+ }
+
+ function sanitize(input, sanitizeKeys) {
+ if (!isArray(sanitizeKeys) || (isArray(sanitizeKeys) && sanitizeKeys.length === 0))
+ return input;
+
+ var sanitizeRegExp = joinRegExp(sanitizeKeys);
+ var sanitizeMask = '********';
+ var safeInput;
+
+ try {
+ safeInput = JSON.parse(stringify_1(input));
+ } catch (o_O) {
+ return input;
+ }
+
+ function sanitizeWorker(workerInput) {
+ if (isArray(workerInput)) {
+ return workerInput.map(function(val) {
+ return sanitizeWorker(val);
+ });
+ }
+
+ if (isPlainObject(workerInput)) {
+ return Object.keys(workerInput).reduce(function(acc, k) {
+ if (sanitizeRegExp.test(k)) {
+ acc[k] = sanitizeMask;
+ } else {
+ acc[k] = sanitizeWorker(workerInput[k]);
+ }
+ return acc;
+ }, {});
+ }
+
+ return workerInput;
+ }
+
+ return sanitizeWorker(safeInput);
+ }
+
+ var utils = {
+ isObject: isObject,
+ isError: isError,
+ isErrorEvent: isErrorEvent,
+ isDOMError: isDOMError,
+ isDOMException: isDOMException,
+ isUndefined: isUndefined,
+ isFunction: isFunction,
+ isPlainObject: isPlainObject,
+ isString: isString,
+ isArray: isArray,
+ isEmptyObject: isEmptyObject,
+ supportsErrorEvent: supportsErrorEvent,
+ supportsDOMError: supportsDOMError,
+ supportsDOMException: supportsDOMException,
+ supportsFetch: supportsFetch,
+ supportsReferrerPolicy: supportsReferrerPolicy,
+ supportsPromiseRejectionEvent: supportsPromiseRejectionEvent,
+ wrappedCallback: wrappedCallback,
+ each: each,
+ objectMerge: objectMerge,
+ truncate: truncate,
+ objectFrozen: objectFrozen,
+ hasKey: hasKey,
+ joinRegExp: joinRegExp,
+ urlencode: urlencode,
+ uuid4: uuid4,
+ htmlTreeAsString: htmlTreeAsString,
+ htmlElementAsString: htmlElementAsString,
+ isSameException: isSameException,
+ isSameStacktrace: isSameStacktrace,
+ parseUrl: parseUrl,
+ fill: fill,
+ safeJoin: safeJoin,
+ serializeException: serializeException,
+ serializeKeysForMessage: serializeKeysForMessage,
+ sanitize: sanitize
+ };
+
+ /*
+ TraceKit - Cross brower stack traces
+
+ This was originally forked from github.com/occ/TraceKit, but has since been
+ largely re-written and is now maintained as part of raven-js. Tests for
+ this are in test/vendor.
+
+ MIT license
+ */
+
+ var TraceKit = {
+ collectWindowErrors: true,
+ debug: false
+ };
+
+ // This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785)
+ var _window$1 =
+ typeof window !== 'undefined'
+ ? window
+ : typeof commonjsGlobal !== 'undefined' ? commonjsGlobal : typeof self !== 'undefined' ? self : {};
+
+ // global reference to slice
+ var _slice = [].slice;
+ var UNKNOWN_FUNCTION = '?';
+
+ // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error#Error_types
+ var ERROR_TYPES_RE = /^(?:[Uu]ncaught (?:exception: )?)?(?:((?:Eval|Internal|Range|Reference|Syntax|Type|URI|)Error): )?(.*)$/;
+
+ function getLocationHref() {
+ if (typeof document === 'undefined' || document.location == null) return '';
+ return document.location.href;
+ }
+
+ function getLocationOrigin() {
+ if (typeof document === 'undefined' || document.location == null) return '';
+
+ // Oh dear IE10...
+ if (!document.location.origin) {
+ return (
+ document.location.protocol +
+ '//' +
+ document.location.hostname +
+ (document.location.port ? ':' + document.location.port : '')
+ );
+ }
+
+ return document.location.origin;
+ }
+
+ /**
+ * TraceKit.report: cross-browser processing of unhandled exceptions
+ *
+ * Syntax:
+ * TraceKit.report.subscribe(function(stackInfo) { ... })
+ * TraceKit.report.unsubscribe(function(stackInfo) { ... })
+ * TraceKit.report(exception)
+ * try { ...code... } catch(ex) { TraceKit.report(ex); }
+ *
+ * Supports:
+ * - Firefox: full stack trace with line numbers, plus column number
+ * on top frame; column number is not guaranteed
+ * - Opera: full stack trace with line and column numbers
+ * - Chrome: full stack trace with line and column numbers
+ * - Safari: line and column number for the top frame only; some frames
+ * may be missing, and column number is not guaranteed
+ * - IE: line and column number for the top frame only; some frames
+ * may be missing, and column number is not guaranteed
+ *
+ * In theory, TraceKit should work on all of the following versions:
+ * - IE5.5+ (only 8.0 tested)
+ * - Firefox 0.9+ (only 3.5+ tested)
+ * - Opera 7+ (only 10.50 tested; versions 9 and earlier may require
+ * Exceptions Have Stacktrace to be enabled in opera:config)
+ * - Safari 3+ (only 4+ tested)
+ * - Chrome 1+ (only 5+ tested)
+ * - Konqueror 3.5+ (untested)
+ *
+ * Requires TraceKit.computeStackTrace.
+ *
+ * Tries to catch all unhandled exceptions and report them to the
+ * subscribed handlers. Please note that TraceKit.report will rethrow the
+ * exception. This is REQUIRED in order to get a useful stack trace in IE.
+ * If the exception does not reach the top of the browser, you will only
+ * get a stack trace from the point where TraceKit.report was called.
+ *
+ * Handlers receive a stackInfo object as described in the
+ * TraceKit.computeStackTrace docs.
+ */
+ TraceKit.report = (function reportModuleWrapper() {
+ var handlers = [],
+ lastArgs = null,
+ lastException = null,
+ lastExceptionStack = null;
+
+ /**
+ * Add a crash handler.
+ * @param {Function} handler
+ */
+ function subscribe(handler) {
+ installGlobalHandler();
+ handlers.push(handler);
+ }
+
+ /**
+ * Remove a crash handler.
+ * @param {Function} handler
+ */
+ function unsubscribe(handler) {
+ for (var i = handlers.length - 1; i >= 0; --i) {
+ if (handlers[i] === handler) {
+ handlers.splice(i, 1);
+ }
+ }
+ }
+
+ /**
+ * Remove all crash handlers.
+ */
+ function unsubscribeAll() {
+ uninstallGlobalHandler();
+ handlers = [];
+ }
+
+ /**
+ * Dispatch stack information to all handlers.
+ * @param {Object.<string, *>} stack
+ */
+ function notifyHandlers(stack, isWindowError) {
+ var exception = null;
+ if (isWindowError && !TraceKit.collectWindowErrors) {
+ return;
+ }
+ for (var i in handlers) {
+ if (handlers.hasOwnProperty(i)) {
+ try {
+ handlers[i].apply(null, [stack].concat(_slice.call(arguments, 2)));
+ } catch (inner) {
+ exception = inner;
+ }
+ }
+ }
+
+ if (exception) {
+ throw exception;
+ }
+ }
+
+ var _oldOnerrorHandler, _onErrorHandlerInstalled;
+
+ /**
+ * Ensures all global unhandled exceptions are recorded.
+ * Supported by Gecko and IE.
+ * @param {string} msg Error message.
+ * @param {string} url URL of script that generated the exception.
+ * @param {(number|string)} lineNo The line number at which the error
+ * occurred.
+ * @param {?(number|string)} colNo The column number at which the error
+ * occurred.
+ * @param {?Error} ex The actual Error object.
+ */
+ function traceKitWindowOnError(msg, url, lineNo, colNo, ex) {
+ var stack = null;
+ // If 'ex' is ErrorEvent, get real Error from inside
+ var exception = utils.isErrorEvent(ex) ? ex.error : ex;
+ // If 'msg' is ErrorEvent, get real message from inside
+ var message = utils.isErrorEvent(msg) ? msg.message : msg;
+
+ if (lastExceptionStack) {
+ TraceKit.computeStackTrace.augmentStackTraceWithInitialElement(
+ lastExceptionStack,
+ url,
+ lineNo,
+ message
+ );
+ processLastException();
+ } else if (exception && utils.isError(exception)) {
+ // non-string `exception` arg; attempt to extract stack trace
+
+ // New chrome and blink send along a real error object
+ // Let's just report that like a normal error.
+ // See: https://mikewest.org/2013/08/debugging-runtime-errors-with-window-onerror
+ stack = TraceKit.computeStackTrace(exception);
+ notifyHandlers(stack, true);
+ } else {
+ var location = {
+ url: url,
+ line: lineNo,
+ column: colNo
+ };
+
+ var name = undefined;
+ var groups;
+
+ if ({}.toString.call(message) === '[object String]') {
+ var groups = message.match(ERROR_TYPES_RE);
+ if (groups) {
+ name = groups[1];
+ message = groups[2];
+ }
+ }
+
+ location.func = UNKNOWN_FUNCTION;
+
+ stack = {
+ name: name,
+ message: message,
+ url: getLocationHref(),
+ stack: [location]
+ };
+ notifyHandlers(stack, true);
+ }
+
+ if (_oldOnerrorHandler) {
+ return _oldOnerrorHandler.apply(this, arguments);
+ }
+
+ return false;
+ }
+
+ function installGlobalHandler() {
+ if (_onErrorHandlerInstalled) {
+ return;
+ }
+ _oldOnerrorHandler = _window$1.onerror;
+ _window$1.onerror = traceKitWindowOnError;
+ _onErrorHandlerInstalled = true;
+ }
+
+ function uninstallGlobalHandler() {
+ if (!_onErrorHandlerInstalled) {
+ return;
+ }
+ _window$1.onerror = _oldOnerrorHandler;
+ _onErrorHandlerInstalled = false;
+ _oldOnerrorHandler = undefined;
+ }
+
+ function processLastException() {
+ var _lastExceptionStack = lastExceptionStack,
+ _lastArgs = lastArgs;
+ lastArgs = null;
+ lastExceptionStack = null;
+ lastException = null;
+ notifyHandlers.apply(null, [_lastExceptionStack, false].concat(_lastArgs));
+ }
+
+ /**
+ * Reports an unhandled Error to TraceKit.
+ * @param {Error} ex
+ * @param {?boolean} rethrow If false, do not re-throw the exception.
+ * Only used for window.onerror to not cause an infinite loop of
+ * rethrowing.
+ */
+ function report(ex, rethrow) {
+ var args = _slice.call(arguments, 1);
+ if (lastExceptionStack) {
+ if (lastException === ex) {
+ return; // already caught by an inner catch block, ignore
+ } else {
+ processLastException();
+ }
+ }
+
+ var stack = TraceKit.computeStackTrace(ex);
+ lastExceptionStack = stack;
+ lastException = ex;
+ lastArgs = args;
+
+ // If the stack trace is incomplete, wait for 2 seconds for
+ // slow slow IE to see if onerror occurs or not before reporting
+ // this exception; otherwise, we will end up with an incomplete
+ // stack trace
+ setTimeout(function() {
+ if (lastException === ex) {
+ processLastException();
+ }
+ }, stack.incomplete ? 2000 : 0);
+
+ if (rethrow !== false) {
+ throw ex; // re-throw to propagate to the top level (and cause window.onerror)
+ }
+ }
+
+ report.subscribe = subscribe;
+ report.unsubscribe = unsubscribe;
+ report.uninstall = unsubscribeAll;
+ return report;
+ })();
+
+ /**
+ * TraceKit.computeStackTrace: cross-browser stack traces in JavaScript
+ *
+ * Syntax:
+ * s = TraceKit.computeStackTrace(exception) // consider using TraceKit.report instead (see below)
+ * Returns:
+ * s.name - exception name
+ * s.message - exception message
+ * s.stack[i].url - JavaScript or HTML file URL
+ * s.stack[i].func - function name, or empty for anonymous functions (if guessing did not work)
+ * s.stack[i].args - arguments passed to the function, if known
+ * s.stack[i].line - line number, if known
+ * s.stack[i].column - column number, if known
+ *
+ * Supports:
+ * - Firefox: full stack trace with line numbers and unreliable column
+ * number on top frame
+ * - Opera 10: full stack trace with line and column numbers
+ * - Opera 9-: full stack trace with line numbers
+ * - Chrome: full stack trace with line and column numbers
+ * - Safari: line and column number for the topmost stacktrace element
+ * only
+ * - IE: no line numbers whatsoever
+ *
+ * Tries to guess names of anonymous functions by looking for assignments
+ * in the source code. In IE and Safari, we have to guess source file names
+ * by searching for function bodies inside all page scripts. This will not
+ * work for scripts that are loaded cross-domain.
+ * Here be dragons: some function names may be guessed incorrectly, and
+ * duplicate functions may be mismatched.
+ *
+ * TraceKit.computeStackTrace should only be used for tracing purposes.
+ * Logging of unhandled exceptions should be done with TraceKit.report,
+ * which builds on top of TraceKit.computeStackTrace and provides better
+ * IE support by utilizing the window.onerror event to retrieve information
+ * about the top of the stack.
+ *
+ * Note: In IE and Safari, no stack trace is recorded on the Error object,
+ * so computeStackTrace instead walks its *own* chain of callers.
+ * This means that:
+ * * in Safari, some methods may be missing from the stack trace;
+ * * in IE, the topmost function in the stack trace will always be the
+ * caller of computeStackTrace.
+ *
+ * This is okay for tracing (because you are likely to be calling
+ * computeStackTrace from the function you want to be the topmost element
+ * of the stack trace anyway), but not okay for logging unhandled
+ * exceptions (because your catch block will likely be far away from the
+ * inner function that actually caused the exception).
+ *
+ */
+ TraceKit.computeStackTrace = (function computeStackTraceWrapper() {
+ // Contents of Exception in various browsers.
+ //
+ // SAFARI:
+ // ex.message = Can't find variable: qq
+ // ex.line = 59
+ // ex.sourceId = 580238192
+ // ex.sourceURL = http://...
+ // ex.expressionBeginOffset = 96
+ // ex.expressionCaretOffset = 98
+ // ex.expressionEndOffset = 98
+ // ex.name = ReferenceError
+ //
+ // FIREFOX:
+ // ex.message = qq is not defined
+ // ex.fileName = http://...
+ // ex.lineNumber = 59
+ // ex.columnNumber = 69
+ // ex.stack = ...stack trace... (see the example below)
+ // ex.name = ReferenceError
+ //
+ // CHROME:
+ // ex.message = qq is not defined
+ // ex.name = ReferenceError
+ // ex.type = not_defined
+ // ex.arguments = ['aa']
+ // ex.stack = ...stack trace...
+ //
+ // INTERNET EXPLORER:
+ // ex.message = ...
+ // ex.name = ReferenceError
+ //
+ // OPERA:
+ // ex.message = ...message... (see the example below)
+ // ex.name = ReferenceError
+ // ex.opera#sourceloc = 11 (pretty much useless, duplicates the info in ex.message)
+ // ex.stacktrace = n/a; see 'opera:config#UserPrefs|Exceptions Have Stacktrace'
+
+ /**
+ * Computes stack trace information from the stack property.
+ * Chrome and Gecko use this property.
+ * @param {Error} ex
+ * @return {?Object.<string, *>} Stack trace information.
+ */
+ function computeStackTraceFromStackProp(ex) {
+ if (typeof ex.stack === 'undefined' || !ex.stack) return;
+
+ var chrome = /^\s*at (?:(.*?) ?\()?((?:file|https?|blob|chrome-extension|native|eval|webpack|<anonymous>|[a-z]:|\/).*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i;
+ var winjs = /^\s*at (?:((?:\[object object\])?.+) )?\(?((?:file|ms-appx(?:-web)|https?|webpack|blob):.*?):(\d+)(?::(\d+))?\)?\s*$/i;
+ // NOTE: blob urls are now supposed to always have an origin, therefore it's format
+ // which is `blob:http://url/path/with-some-uuid`, is matched by `blob.*?:\/` as well
+ var gecko = /^\s*(.*?)(?:\((.*?)\))?(?:^|@)((?:file|https?|blob|chrome|webpack|resource|moz-extension).*?:\/.*?|\[native code\]|[^@]*bundle)(?::(\d+))?(?::(\d+))?\s*$/i;
+ // Used to additionally parse URL/line/column from eval frames
+ var geckoEval = /(\S+) line (\d+)(?: > eval line \d+)* > eval/i;
+ var chromeEval = /\((\S*)(?::(\d+))(?::(\d+))\)/;
+ var lines = ex.stack.split('\n');
+ var stack = [];
+ var submatch;
+ var parts;
+ var element;
+ var reference = /^(.*) is undefined$/.exec(ex.message);
+
+ for (var i = 0, j = lines.length; i < j; ++i) {
+ if ((parts = chrome.exec(lines[i]))) {
+ var isNative = parts[2] && parts[2].indexOf('native') === 0; // start of line
+ var isEval = parts[2] && parts[2].indexOf('eval') === 0; // start of line
+ if (isEval && (submatch = chromeEval.exec(parts[2]))) {
+ // throw out eval line/column and use top-most line/column number
+ parts[2] = submatch[1]; // url
+ parts[3] = submatch[2]; // line
+ parts[4] = submatch[3]; // column
+ }
+ element = {
+ url: !isNative ? parts[2] : null,
+ func: parts[1] || UNKNOWN_FUNCTION,
+ args: isNative ? [parts[2]] : [],
+ line: parts[3] ? +parts[3] : null,
+ column: parts[4] ? +parts[4] : null
+ };
+ } else if ((parts = winjs.exec(lines[i]))) {
+ element = {
+ url: parts[2],
+ func: parts[1] || UNKNOWN_FUNCTION,
+ args: [],
+ line: +parts[3],
+ column: parts[4] ? +parts[4] : null
+ };
+ } else if ((parts = gecko.exec(lines[i]))) {
+ var isEval = parts[3] && parts[3].indexOf(' > eval') > -1;
+ if (isEval && (submatch = geckoEval.exec(parts[3]))) {
+ // throw out eval line/column and use top-most line number
+ parts[3] = submatch[1];
+ parts[4] = submatch[2];
+ parts[5] = null; // no column when eval
+ } else if (i === 0 && !parts[5] && typeof ex.columnNumber !== 'undefined') {
+ // FireFox uses this awesome columnNumber property for its top frame
+ // Also note, Firefox's column number is 0-based and everything else expects 1-based,
+ // so adding 1
+ // NOTE: this hack doesn't work if top-most frame is eval
+ stack[0].column = ex.columnNumber + 1;
+ }
+ element = {
+ url: parts[3],
+ func: parts[1] || UNKNOWN_FUNCTION,
+ args: parts[2] ? parts[2].split(',') : [],
+ line: parts[4] ? +parts[4] : null,
+ column: parts[5] ? +parts[5] : null
+ };
+ } else {
+ continue;
+ }
+
+ if (!element.func && element.line) {
+ element.func = UNKNOWN_FUNCTION;
+ }
+
+ if (element.url && element.url.substr(0, 5) === 'blob:') {
+ // Special case for handling JavaScript loaded into a blob.
+ // We use a synchronous AJAX request here as a blob is already in
+ // memory - it's not making a network request. This will generate a warning
+ // in the browser console, but there has already been an error so that's not
+ // that much of an issue.
+ var xhr = new XMLHttpRequest();
+ xhr.open('GET', element.url, false);
+ xhr.send(null);
+
+ // If we failed to download the source, skip this patch
+ if (xhr.status === 200) {
+ var source = xhr.responseText || '';
+
+ // We trim the source down to the last 300 characters as sourceMappingURL is always at the end of the file.
+ // Why 300? To be in line with: https://github.com/getsentry/sentry/blob/4af29e8f2350e20c28a6933354e4f42437b4ba42/src/sentry/lang/javascript/processor.py#L164-L175
+ source = source.slice(-300);
+
+ // Now we dig out the source map URL
+ var sourceMaps = source.match(/\/\/# sourceMappingURL=(.*)$/);
+
+ // If we don't find a source map comment or we find more than one, continue on to the next element.
+ if (sourceMaps) {
+ var sourceMapAddress = sourceMaps[1];
+
+ // Now we check to see if it's a relative URL.
+ // If it is, convert it to an absolute one.
+ if (sourceMapAddress.charAt(0) === '~') {
+ sourceMapAddress = getLocationOrigin() + sourceMapAddress.slice(1);
+ }
+
+ // Now we strip the '.map' off of the end of the URL and update the
+ // element so that Sentry can match the map to the blob.
+ element.url = sourceMapAddress.slice(0, -4);
+ }
+ }
+ }
+
+ stack.push(element);
+ }
+
+ if (!stack.length) {
+ return null;
+ }
+
+ return {
+ name: ex.name,
+ message: ex.message,
+ url: getLocationHref(),
+ stack: stack
+ };
+ }
+
+ /**
+ * Adds information about the first frame to incomplete stack traces.
+ * Safari and IE require this to get complete data on the first frame.
+ * @param {Object.<string, *>} stackInfo Stack trace information from
+ * one of the compute* methods.
+ * @param {string} url The URL of the script that caused an error.
+ * @param {(number|string)} lineNo The line number of the script that
+ * caused an error.
+ * @param {string=} message The error generated by the browser, which
+ * hopefully contains the name of the object that caused the error.
+ * @return {boolean} Whether or not the stack information was
+ * augmented.
+ */
+ function augmentStackTraceWithInitialElement(stackInfo, url, lineNo, message) {
+ var initial = {
+ url: url,
+ line: lineNo
+ };
+
+ if (initial.url && initial.line) {
+ stackInfo.incomplete = false;
+
+ if (!initial.func) {
+ initial.func = UNKNOWN_FUNCTION;
+ }
+
+ if (stackInfo.stack.length > 0) {
+ if (stackInfo.stack[0].url === initial.url) {
+ if (stackInfo.stack[0].line === initial.line) {
+ return false; // already in stack trace
+ } else if (
+ !stackInfo.stack[0].line &&
+ stackInfo.stack[0].func === initial.func
+ ) {
+ stackInfo.stack[0].line = initial.line;
+ return false;
+ }
+ }
+ }
+
+ stackInfo.stack.unshift(initial);
+ stackInfo.partial = true;
+ return true;
+ } else {
+ stackInfo.incomplete = true;
+ }
+
+ return false;
+ }
+
+ /**
+ * Computes stack trace information by walking the arguments.caller
+ * chain at the time the exception occurred. This will cause earlier
+ * frames to be missed but is the only way to get any stack trace in
+ * Safari and IE. The top frame is restored by
+ * {@link augmentStackTraceWithInitialElement}.
+ * @param {Error} ex
+ * @return {?Object.<string, *>} Stack trace information.
+ */
+ function computeStackTraceByWalkingCallerChain(ex, depth) {
+ var functionName = /function\s+([_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*)?\s*\(/i,
+ stack = [],
+ funcs = {},
+ recursion = false,
+ parts,
+ item;
+
+ for (
+ var curr = computeStackTraceByWalkingCallerChain.caller;
+ curr && !recursion;
+ curr = curr.caller
+ ) {
+ if (curr === computeStackTrace || curr === TraceKit.report) {
+ // console.log('skipping internal function');
+ continue;
+ }
+
+ item = {
+ url: null,
+ func: UNKNOWN_FUNCTION,
+ line: null,
+ column: null
+ };
+
+ if (curr.name) {
+ item.func = curr.name;
+ } else if ((parts = functionName.exec(curr.toString()))) {
+ item.func = parts[1];
+ }
+
+ if (typeof item.func === 'undefined') {
+ try {
+ item.func = parts.input.substring(0, parts.input.indexOf('{'));
+ } catch (e) {}
+ }
+
+ if (funcs['' + curr]) {
+ recursion = true;
+ } else {
+ funcs['' + curr] = true;
+ }
+
+ stack.push(item);
+ }
+
+ if (depth) {
+ // console.log('depth is ' + depth);
+ // console.log('stack is ' + stack.length);
+ stack.splice(0, depth);
+ }
+
+ var result = {
+ name: ex.name,
+ message: ex.message,
+ url: getLocationHref(),
+ stack: stack
+ };
+ augmentStackTraceWithInitialElement(
+ result,
+ ex.sourceURL || ex.fileName,
+ ex.line || ex.lineNumber,
+ ex.message || ex.description
+ );
+ return result;
+ }
+
+ /**
+ * Computes a stack trace for an exception.
+ * @param {Error} ex
+ * @param {(string|number)=} depth
+ */
+ function computeStackTrace(ex, depth) {
+ var stack = null;
+ depth = depth == null ? 0 : +depth;
+
+ try {
+ stack = computeStackTraceFromStackProp(ex);
+ if (stack) {
+ return stack;
+ }
+ } catch (e) {
+ if (TraceKit.debug) {
+ throw e;
+ }
+ }
+
+ try {
+ stack = computeStackTraceByWalkingCallerChain(ex, depth + 1);
+ if (stack) {
+ return stack;
+ }
+ } catch (e) {
+ if (TraceKit.debug) {
+ throw e;
+ }
+ }
+ return {
+ name: ex.name,
+ message: ex.message,
+ url: getLocationHref()
+ };
+ }
+
+ computeStackTrace.augmentStackTraceWithInitialElement = augmentStackTraceWithInitialElement;
+ computeStackTrace.computeStackTraceFromStackProp = computeStackTraceFromStackProp;
+
+ return computeStackTrace;
+ })();
+
+ var tracekit = TraceKit;
+
+ /*
+ * JavaScript MD5
+ * https://github.com/blueimp/JavaScript-MD5
+ *
+ * Copyright 2011, Sebastian Tschan
+ * https://blueimp.net
+ *
+ * Licensed under the MIT license:
+ * https://opensource.org/licenses/MIT
+ *
+ * Based on
+ * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
+ * Digest Algorithm, as defined in RFC 1321.
+ * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009
+ * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
+ * Distributed under the BSD License
+ * See http://pajhome.org.uk/crypt/md5 for more info.
+ */
+
+ /*
+ * Add integers, wrapping at 2^32. This uses 16-bit operations internally
+ * to work around bugs in some JS interpreters.
+ */
+ function safeAdd(x, y) {
+ var lsw = (x & 0xffff) + (y & 0xffff);
+ var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
+ return (msw << 16) | (lsw & 0xffff);
+ }
+
+ /*
+ * Bitwise rotate a 32-bit number to the left.
+ */
+ function bitRotateLeft(num, cnt) {
+ return (num << cnt) | (num >>> (32 - cnt));
+ }
+
+ /*
+ * These functions implement the four basic operations the algorithm uses.
+ */
+ function md5cmn(q, a, b, x, s, t) {
+ return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b);
+ }
+ function md5ff(a, b, c, d, x, s, t) {
+ return md5cmn((b & c) | (~b & d), a, b, x, s, t);
+ }
+ function md5gg(a, b, c, d, x, s, t) {
+ return md5cmn((b & d) | (c & ~d), a, b, x, s, t);
+ }
+ function md5hh(a, b, c, d, x, s, t) {
+ return md5cmn(b ^ c ^ d, a, b, x, s, t);
+ }
+ function md5ii(a, b, c, d, x, s, t) {
+ return md5cmn(c ^ (b | ~d), a, b, x, s, t);
+ }
+
+ /*
+ * Calculate the MD5 of an array of little-endian words, and a bit length.
+ */
+ function binlMD5(x, len) {
+ /* append padding */
+ x[len >> 5] |= 0x80 << (len % 32);
+ x[(((len + 64) >>> 9) << 4) + 14] = len;
+
+ var i;
+ var olda;
+ var oldb;
+ var oldc;
+ var oldd;
+ var a = 1732584193;
+ var b = -271733879;
+ var c = -1732584194;
+ var d = 271733878;
+
+ for (i = 0; i < x.length; i += 16) {
+ olda = a;
+ oldb = b;
+ oldc = c;
+ oldd = d;
+
+ a = md5ff(a, b, c, d, x[i], 7, -680876936);
+ d = md5ff(d, a, b, c, x[i + 1], 12, -389564586);
+ c = md5ff(c, d, a, b, x[i + 2], 17, 606105819);
+ b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330);
+ a = md5ff(a, b, c, d, x[i + 4], 7, -176418897);
+ d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426);
+ c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341);
+ b = md5ff(b, c, d, a, x[i + 7], 22, -45705983);
+ a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416);
+ d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417);
+ c = md5ff(c, d, a, b, x[i + 10], 17, -42063);
+ b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162);
+ a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682);
+ d = md5ff(d, a, b, c, x[i + 13], 12, -40341101);
+ c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290);
+ b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329);
+
+ a = md5gg(a, b, c, d, x[i + 1], 5, -165796510);
+ d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632);
+ c = md5gg(c, d, a, b, x[i + 11], 14, 643717713);
+ b = md5gg(b, c, d, a, x[i], 20, -373897302);
+ a = md5gg(a, b, c, d, x[i + 5], 5, -701558691);
+ d = md5gg(d, a, b, c, x[i + 10], 9, 38016083);
+ c = md5gg(c, d, a, b, x[i + 15], 14, -660478335);
+ b = md5gg(b, c, d, a, x[i + 4], 20, -405537848);
+ a = md5gg(a, b, c, d, x[i + 9], 5, 568446438);
+ d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690);
+ c = md5gg(c, d, a, b, x[i + 3], 14, -187363961);
+ b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501);
+ a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467);
+ d = md5gg(d, a, b, c, x[i + 2], 9, -51403784);
+ c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473);
+ b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734);
+
+ a = md5hh(a, b, c, d, x[i + 5], 4, -378558);
+ d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463);
+ c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562);
+ b = md5hh(b, c, d, a, x[i + 14], 23, -35309556);
+ a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060);
+ d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353);
+ c = md5hh(c, d, a, b, x[i + 7], 16, -155497632);
+ b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640);
+ a = md5hh(a, b, c, d, x[i + 13], 4, 681279174);
+ d = md5hh(d, a, b, c, x[i], 11, -358537222);
+ c = md5hh(c, d, a, b, x[i + 3], 16, -722521979);
+ b = md5hh(b, c, d, a, x[i + 6], 23, 76029189);
+ a = md5hh(a, b, c, d, x[i + 9], 4, -640364487);
+ d = md5hh(d, a, b, c, x[i + 12], 11, -421815835);
+ c = md5hh(c, d, a, b, x[i + 15], 16, 530742520);
+ b = md5hh(b, c, d, a, x[i + 2], 23, -995338651);
+
+ a = md5ii(a, b, c, d, x[i], 6, -198630844);
+ d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415);
+ c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905);
+ b = md5ii(b, c, d, a, x[i + 5], 21, -57434055);
+ a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571);
+ d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606);
+ c = md5ii(c, d, a, b, x[i + 10], 15, -1051523);
+ b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799);
+ a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359);
+ d = md5ii(d, a, b, c, x[i + 15], 10, -30611744);
+ c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380);
+ b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649);
+ a = md5ii(a, b, c, d, x[i + 4], 6, -145523070);
+ d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379);
+ c = md5ii(c, d, a, b, x[i + 2], 15, 718787259);
+ b = md5ii(b, c, d, a, x[i + 9], 21, -343485551);
+
+ a = safeAdd(a, olda);
+ b = safeAdd(b, oldb);
+ c = safeAdd(c, oldc);
+ d = safeAdd(d, oldd);
+ }
+ return [a, b, c, d];
+ }
+
+ /*
+ * Convert an array of little-endian words to a string
+ */
+ function binl2rstr(input) {
+ var i;
+ var output = '';
+ var length32 = input.length * 32;
+ for (i = 0; i < length32; i += 8) {
+ output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xff);
+ }
+ return output;
+ }
+
+ /*
+ * Convert a raw string to an array of little-endian words
+ * Characters >255 have their high-byte silently ignored.
+ */
+ function rstr2binl(input) {
+ var i;
+ var output = [];
+ output[(input.length >> 2) - 1] = undefined;
+ for (i = 0; i < output.length; i += 1) {
+ output[i] = 0;
+ }
+ var length8 = input.length * 8;
+ for (i = 0; i < length8; i += 8) {
+ output[i >> 5] |= (input.charCodeAt(i / 8) & 0xff) << (i % 32);
+ }
+ return output;
+ }
+
+ /*
+ * Calculate the MD5 of a raw string
+ */
+ function rstrMD5(s) {
+ return binl2rstr(binlMD5(rstr2binl(s), s.length * 8));
+ }
+
+ /*
+ * Calculate the HMAC-MD5, of a key and some data (raw strings)
+ */
+ function rstrHMACMD5(key, data) {
+ var i;
+ var bkey = rstr2binl(key);
+ var ipad = [];
+ var opad = [];
+ var hash;
+ ipad[15] = opad[15] = undefined;
+ if (bkey.length > 16) {
+ bkey = binlMD5(bkey, key.length * 8);
+ }
+ for (i = 0; i < 16; i += 1) {
+ ipad[i] = bkey[i] ^ 0x36363636;
+ opad[i] = bkey[i] ^ 0x5c5c5c5c;
+ }
+ hash = binlMD5(ipad.concat(rstr2binl(data)), 512 + data.length * 8);
+ return binl2rstr(binlMD5(opad.concat(hash), 512 + 128));
+ }
+
+ /*
+ * Convert a raw string to a hex string
+ */
+ function rstr2hex(input) {
+ var hexTab = '0123456789abcdef';
+ var output = '';
+ var x;
+ var i;
+ for (i = 0; i < input.length; i += 1) {
+ x = input.charCodeAt(i);
+ output += hexTab.charAt((x >>> 4) & 0x0f) + hexTab.charAt(x & 0x0f);
+ }
+ return output;
+ }
+
+ /*
+ * Encode a string as utf-8
+ */
+ function str2rstrUTF8(input) {
+ return unescape(encodeURIComponent(input));
+ }
+
+ /*
+ * Take string arguments and return either raw or hex encoded strings
+ */
+ function rawMD5(s) {
+ return rstrMD5(str2rstrUTF8(s));
+ }
+ function hexMD5(s) {
+ return rstr2hex(rawMD5(s));
+ }
+ function rawHMACMD5(k, d) {
+ return rstrHMACMD5(str2rstrUTF8(k), str2rstrUTF8(d));
+ }
+ function hexHMACMD5(k, d) {
+ return rstr2hex(rawHMACMD5(k, d));
+ }
+
+ function md5(string, key, raw) {
+ if (!key) {
+ if (!raw) {
+ return hexMD5(string);
+ }
+ return rawMD5(string);
+ }
+ if (!raw) {
+ return hexHMACMD5(key, string);
+ }
+ return rawHMACMD5(key, string);
+ }
+
+ var md5_1 = md5;
+
+ function RavenConfigError(message) {
+ this.name = 'RavenConfigError';
+ this.message = message;
+ }
+ RavenConfigError.prototype = new Error();
+ RavenConfigError.prototype.constructor = RavenConfigError;
+
+ var configError = RavenConfigError;
+
+ var wrapMethod = function(console, level, callback) {
+ var originalConsoleLevel = console[level];
+ var originalConsole = console;
+
+ if (!(level in console)) {
+ return;
+ }
+
+ var sentryLevel = level === 'warn' ? 'warning' : level;
+
+ console[level] = function() {
+ var args = [].slice.call(arguments);
+
+ var msg = utils.safeJoin(args, ' ');
+ var data = {level: sentryLevel, logger: 'console', extra: {arguments: args}};
+
+ if (level === 'assert') {
+ if (args[0] === false) {
+ // Default browsers message
+ msg =
+ 'Assertion failed: ' + (utils.safeJoin(args.slice(1), ' ') || 'console.assert');
+ data.extra.arguments = args.slice(1);
+ callback && callback(msg, data);
+ }
+ } else {
+ callback && callback(msg, data);
+ }
+
+ // this fails for some browsers. :(
+ if (originalConsoleLevel) {
+ // IE9 doesn't allow calling apply on console functions directly
+ // See: https://stackoverflow.com/questions/5472938/does-ie9-support-console-log-and-is-it-a-real-function#answer-5473193
+ Function.prototype.apply.call(originalConsoleLevel, originalConsole, args);
+ }
+ };
+ };
+
+ var console$1 = {
+ wrapMethod: wrapMethod
+ };
+
+ /*global XDomainRequest:false */
+
+
+
+
+
+
+
+ var isErrorEvent$1 = utils.isErrorEvent;
+ var isDOMError$1 = utils.isDOMError;
+ var isDOMException$1 = utils.isDOMException;
+ var isError$1 = utils.isError;
+ var isObject$1 = utils.isObject;
+ var isPlainObject$1 = utils.isPlainObject;
+ var isUndefined$1 = utils.isUndefined;
+ var isFunction$1 = utils.isFunction;
+ var isString$1 = utils.isString;
+ var isArray$1 = utils.isArray;
+ var isEmptyObject$1 = utils.isEmptyObject;
+ var each$1 = utils.each;
+ var objectMerge$1 = utils.objectMerge;
+ var truncate$1 = utils.truncate;
+ var objectFrozen$1 = utils.objectFrozen;
+ var hasKey$1 = utils.hasKey;
+ var joinRegExp$1 = utils.joinRegExp;
+ var urlencode$1 = utils.urlencode;
+ var uuid4$1 = utils.uuid4;
+ var htmlTreeAsString$1 = utils.htmlTreeAsString;
+ var isSameException$1 = utils.isSameException;
+ var isSameStacktrace$1 = utils.isSameStacktrace;
+ var parseUrl$1 = utils.parseUrl;
+ var fill$1 = utils.fill;
+ var supportsFetch$1 = utils.supportsFetch;
+ var supportsReferrerPolicy$1 = utils.supportsReferrerPolicy;
+ var serializeKeysForMessage$1 = utils.serializeKeysForMessage;
+ var serializeException$1 = utils.serializeException;
+ var sanitize$1 = utils.sanitize;
+
+ var wrapConsoleMethod = console$1.wrapMethod;
+
+ var dsnKeys = 'source protocol user pass host port path'.split(' '),
+ dsnPattern = /^(?:(\w+):)?\/\/(?:(\w+)(:\w+)?@)?([\w\.-]+)(?::(\d+))?(\/.*)/;
+
+ function now() {
+ return +new Date();
+ }
+
+ // This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785)
+ var _window$2 =
+ typeof window !== 'undefined'
+ ? window
+ : typeof commonjsGlobal !== 'undefined' ? commonjsGlobal : typeof self !== 'undefined' ? self : {};
+ var _document = _window$2.document;
+ var _navigator = _window$2.navigator;
+
+ function keepOriginalCallback(original, callback) {
+ return isFunction$1(callback)
+ ? function(data) {
+ return callback(data, original);
+ }
+ : callback;
+ }
+
+ // First, check for JSON support
+ // If there is no JSON, we no-op the core features of Raven
+ // since JSON is required to encode the payload
+ function Raven() {
+ this._hasJSON = !!(typeof JSON === 'object' && JSON.stringify);
+ // Raven can run in contexts where there's no document (react-native)
+ this._hasDocument = !isUndefined$1(_document);
+ this._hasNavigator = !isUndefined$1(_navigator);
+ this._lastCapturedException = null;
+ this._lastData = null;
+ this._lastEventId = null;
+ this._globalServer = null;
+ this._globalKey = null;
+ this._globalProject = null;
+ this._globalContext = {};
+ this._globalOptions = {
+ // SENTRY_RELEASE can be injected by https://github.com/getsentry/sentry-webpack-plugin
+ release: _window$2.SENTRY_RELEASE && _window$2.SENTRY_RELEASE.id,
+ logger: 'javascript',
+ ignoreErrors: [],
+ ignoreUrls: [],
+ whitelistUrls: [],
+ includePaths: [],
+ headers: null,
+ collectWindowErrors: true,
+ captureUnhandledRejections: true,
+ maxMessageLength: 0,
+ // By default, truncates URL values to 250 chars
+ maxUrlLength: 250,
+ stackTraceLimit: 50,
+ autoBreadcrumbs: true,
+ instrument: true,
+ sampleRate: 1,
+ sanitizeKeys: []
+ };
+ this._fetchDefaults = {
+ method: 'POST',
+ keepalive: true,
+ // Despite all stars in the sky saying that Edge supports old draft syntax, aka 'never', 'always', 'origin' and 'default
+ // https://caniuse.com/#feat=referrer-policy
+ // It doesn't. And it throw exception instead of ignoring this parameter...
+ // REF: https://github.com/getsentry/raven-js/issues/1233
+ referrerPolicy: supportsReferrerPolicy$1() ? 'origin' : ''
+ };
+ this._ignoreOnError = 0;
+ this._isRavenInstalled = false;
+ this._originalErrorStackTraceLimit = Error.stackTraceLimit;
+ // capture references to window.console *and* all its methods first
+ // before the console plugin has a chance to monkey patch
+ this._originalConsole = _window$2.console || {};
+ this._originalConsoleMethods = {};
+ this._plugins = [];
+ this._startTime = now();
+ this._wrappedBuiltIns = [];
+ this._breadcrumbs = [];
+ this._lastCapturedEvent = null;
+ this._keypressTimeout;
+ this._location = _window$2.location;
+ this._lastHref = this._location && this._location.href;
+ this._resetBackoff();
+
+ // eslint-disable-next-line guard-for-in
+ for (var method in this._originalConsole) {
+ this._originalConsoleMethods[method] = this._originalConsole[method];
+ }
+ }
+
+ /*
+ * The core Raven singleton
+ *
+ * @this {Raven}
+ */
+
+ Raven.prototype = {
+ // Hardcode version string so that raven source can be loaded directly via
+ // webpack (using a build step causes webpack #1617). Grunt verifies that
+ // this value matches package.json during build.
+ // See: https://github.com/getsentry/raven-js/issues/465
+ VERSION: '3.26.2',
+
+ debug: false,
+
+ TraceKit: tracekit, // alias to TraceKit
+
+ /*
+ * Configure Raven with a DSN and extra options
+ *
+ * @param {string} dsn The public Sentry DSN
+ * @param {object} options Set of global options [optional]
+ * @return {Raven}
+ */
+ config: function(dsn, options) {
+ var self = this;
+
+ if (self._globalServer) {
+ this._logDebug('error', 'Error: Raven has already been configured');
+ return self;
+ }
+ if (!dsn) return self;
+
+ var globalOptions = self._globalOptions;
+
+ // merge in options
+ if (options) {
+ each$1(options, function(key, value) {
+ // tags and extra are special and need to be put into context
+ if (key === 'tags' || key === 'extra' || key === 'user') {
+ self._globalContext[key] = value;
+ } else {
+ globalOptions[key] = value;
+ }
+ });
+ }
+
+ self.setDSN(dsn);
+
+ // "Script error." is hard coded into browsers for errors that it can't read.
+ // this is the result of a script being pulled in from an external domain and CORS.
+ globalOptions.ignoreErrors.push(/^Script error\.?$/);
+ globalOptions.ignoreErrors.push(/^Javascript error: Script error\.? on line 0$/);
+
+ // join regexp rules into one big rule
+ globalOptions.ignoreErrors = joinRegExp$1(globalOptions.ignoreErrors);
+ globalOptions.ignoreUrls = globalOptions.ignoreUrls.length
+ ? joinRegExp$1(globalOptions.ignoreUrls)
+ : false;
+ globalOptions.whitelistUrls = globalOptions.whitelistUrls.length
+ ? joinRegExp$1(globalOptions.whitelistUrls)
+ : false;
+ globalOptions.includePaths = joinRegExp$1(globalOptions.includePaths);
+ globalOptions.maxBreadcrumbs = Math.max(
+ 0,
+ Math.min(globalOptions.maxBreadcrumbs || 100, 100)
+ ); // default and hard limit is 100
+
+ var autoBreadcrumbDefaults = {
+ xhr: true,
+ console: true,
+ dom: true,
+ location: true,
+ sentry: true
+ };
+
+ var autoBreadcrumbs = globalOptions.autoBreadcrumbs;
+ if ({}.toString.call(autoBreadcrumbs) === '[object Object]') {
+ autoBreadcrumbs = objectMerge$1(autoBreadcrumbDefaults, autoBreadcrumbs);
+ } else if (autoBreadcrumbs !== false) {
+ autoBreadcrumbs = autoBreadcrumbDefaults;
+ }
+ globalOptions.autoBreadcrumbs = autoBreadcrumbs;
+
+ var instrumentDefaults = {
+ tryCatch: true
+ };
+
+ var instrument = globalOptions.instrument;
+ if ({}.toString.call(instrument) === '[object Object]') {
+ instrument = objectMerge$1(instrumentDefaults, instrument);
+ } else if (instrument !== false) {
+ instrument = instrumentDefaults;
+ }
+ globalOptions.instrument = instrument;
+
+ tracekit.collectWindowErrors = !!globalOptions.collectWindowErrors;
+
+ // return for chaining
+ return self;
+ },
+
+ /*
+ * Installs a global window.onerror error handler
+ * to capture and report uncaught exceptions.
+ * At this point, install() is required to be called due
+ * to the way TraceKit is set up.
+ *
+ * @return {Raven}
+ */
+ install: function() {
+ var self = this;
+ if (self.isSetup() && !self._isRavenInstalled) {
+ tracekit.report.subscribe(function() {
+ self._handleOnErrorStackInfo.apply(self, arguments);
+ });
+
+ if (self._globalOptions.captureUnhandledRejections) {
+ self._attachPromiseRejectionHandler();
+ }
+
+ self._patchFunctionToString();
+
+ if (self._globalOptions.instrument && self._globalOptions.instrument.tryCatch) {
+ self._instrumentTryCatch();
+ }
+
+ if (self._globalOptions.autoBreadcrumbs) self._instrumentBreadcrumbs();
+
+ // Install all of the plugins
+ self._drainPlugins();
+
+ self._isRavenInstalled = true;
+ }
+
+ Error.stackTraceLimit = self._globalOptions.stackTraceLimit;
+ return this;
+ },
+
+ /*
+ * Set the DSN (can be called multiple time unlike config)
+ *
+ * @param {string} dsn The public Sentry DSN
+ */
+ setDSN: function(dsn) {
+ var self = this,
+ uri = self._parseDSN(dsn),
+ lastSlash = uri.path.lastIndexOf('/'),
+ path = uri.path.substr(1, lastSlash);
+
+ self._dsn = dsn;
+ self._globalKey = uri.user;
+ self._globalSecret = uri.pass && uri.pass.substr(1);
+ self._globalProject = uri.path.substr(lastSlash + 1);
+
+ self._globalServer = self._getGlobalServer(uri);
+
+ self._globalEndpoint =
+ self._globalServer + '/' + path + 'api/' + self._globalProject + '/store/';
+
+ // Reset backoff state since we may be pointing at a
+ // new project/server
+ this._resetBackoff();
+ },
+
+ /*
+ * Wrap code within a context so Raven can capture errors
+ * reliably across domains that is executed immediately.
+ *
+ * @param {object} options A specific set of options for this context [optional]
+ * @param {function} func The callback to be immediately executed within the context
+ * @param {array} args An array of arguments to be called with the callback [optional]
+ */
+ context: function(options, func, args) {
+ if (isFunction$1(options)) {
+ args = func || [];
+ func = options;
+ options = {};
+ }
+
+ return this.wrap(options, func).apply(this, args);
+ },
+
+ /*
+ * Wrap code within a context and returns back a new function to be executed
+ *
+ * @param {object} options A specific set of options for this context [optional]
+ * @param {function} func The function to be wrapped in a new context
+ * @param {function} _before A function to call before the try/catch wrapper [optional, private]
+ * @return {function} The newly wrapped functions with a context
+ */
+ wrap: function(options, func, _before) {
+ var self = this;
+ // 1 argument has been passed, and it's not a function
+ // so just return it
+ if (isUndefined$1(func) && !isFunction$1(options)) {
+ return options;
+ }
+
+ // options is optional
+ if (isFunction$1(options)) {
+ func = options;
+ options = undefined;
+ }
+
+ // At this point, we've passed along 2 arguments, and the second one
+ // is not a function either, so we'll just return the second argument.
+ if (!isFunction$1(func)) {
+ return func;
+ }
+
+ // We don't wanna wrap it twice!
+ try {
+ if (func.__raven__) {
+ return func;
+ }
+
+ // If this has already been wrapped in the past, return that
+ if (func.__raven_wrapper__) {
+ return func.__raven_wrapper__;
+ }
+ } catch (e) {
+ // Just accessing custom props in some Selenium environments
+ // can cause a "Permission denied" exception (see raven-js#495).
+ // Bail on wrapping and return the function as-is (defers to window.onerror).
+ return func;
+ }
+
+ function wrapped() {
+ var args = [],
+ i = arguments.length,
+ deep = !options || (options && options.deep !== false);
+
+ if (_before && isFunction$1(_before)) {
+ _before.apply(this, arguments);
+ }
+
+ // Recursively wrap all of a function's arguments that are
+ // functions themselves.
+ while (i--) args[i] = deep ? self.wrap(options, arguments[i]) : arguments[i];
+
+ try {
+ // Attempt to invoke user-land function
+ // NOTE: If you are a Sentry user, and you are seeing this stack frame, it
+ // means Raven caught an error invoking your application code. This is
+ // expected behavior and NOT indicative of a bug with Raven.js.
+ return func.apply(this, args);
+ } catch (e) {
+ self._ignoreNextOnError();
+ self.captureException(e, options);
+ throw e;
+ }
+ }
+
+ // copy over properties of the old function
+ for (var property in func) {
+ if (hasKey$1(func, property)) {
+ wrapped[property] = func[property];
+ }
+ }
+ wrapped.prototype = func.prototype;
+
+ func.__raven_wrapper__ = wrapped;
+ // Signal that this function has been wrapped/filled already
+ // for both debugging and to prevent it to being wrapped/filled twice
+ wrapped.__raven__ = true;
+ wrapped.__orig__ = func;
+
+ return wrapped;
+ },
+
+ /**
+ * Uninstalls the global error handler.
+ *
+ * @return {Raven}
+ */
+ uninstall: function() {
+ tracekit.report.uninstall();
+
+ this._detachPromiseRejectionHandler();
+ this._unpatchFunctionToString();
+ this._restoreBuiltIns();
+ this._restoreConsole();
+
+ Error.stackTraceLimit = this._originalErrorStackTraceLimit;
+ this._isRavenInstalled = false;
+
+ return this;
+ },
+
+ /**
+ * Callback used for `unhandledrejection` event
+ *
+ * @param {PromiseRejectionEvent} event An object containing
+ * promise: the Promise that was rejected
+ * reason: the value with which the Promise was rejected
+ * @return void
+ */
+ _promiseRejectionHandler: function(event) {
+ this._logDebug('debug', 'Raven caught unhandled promise rejection:', event);
+ this.captureException(event.reason, {
+ mechanism: {
+ type: 'onunhandledrejection',
+ handled: false
+ }
+ });
+ },
+
+ /**
+ * Installs the global promise rejection handler.
+ *
+ * @return {raven}
+ */
+ _attachPromiseRejectionHandler: function() {
+ this._promiseRejectionHandler = this._promiseRejectionHandler.bind(this);
+ _window$2.addEventListener &&
+ _window$2.addEventListener('unhandledrejection', this._promiseRejectionHandler);
+ return this;
+ },
+
+ /**
+ * Uninstalls the global promise rejection handler.
+ *
+ * @return {raven}
+ */
+ _detachPromiseRejectionHandler: function() {
+ _window$2.removeEventListener &&
+ _window$2.removeEventListener('unhandledrejection', this._promiseRejectionHandler);
+ return this;
+ },
+
+ /**
+ * Manually capture an exception and send it over to Sentry
+ *
+ * @param {error} ex An exception to be logged
+ * @param {object} options A specific set of options for this error [optional]
+ * @return {Raven}
+ */
+ captureException: function(ex, options) {
+ options = objectMerge$1({trimHeadFrames: 0}, options ? options : {});
+
+ if (isErrorEvent$1(ex) && ex.error) {
+ // If it is an ErrorEvent with `error` property, extract it to get actual Error
+ ex = ex.error;
+ } else if (isDOMError$1(ex) || isDOMException$1(ex)) {
+ // If it is a DOMError or DOMException (which are legacy APIs, but still supported in some browsers)
+ // then we just extract the name and message, as they don't provide anything else
+ // https://developer.mozilla.org/en-US/docs/Web/API/DOMError
+ // https://developer.mozilla.org/en-US/docs/Web/API/DOMException
+ var name = ex.name || (isDOMError$1(ex) ? 'DOMError' : 'DOMException');
+ var message = ex.message ? name + ': ' + ex.message : name;
+
+ return this.captureMessage(
+ message,
+ objectMerge$1(options, {
+ // neither DOMError or DOMException provide stack trace and we most likely wont get it this way as well
+ // but it's barely any overhead so we may at least try
+ stacktrace: true,
+ trimHeadFrames: options.trimHeadFrames + 1
+ })
+ );
+ } else if (isError$1(ex)) {
+ // we have a real Error object
+ ex = ex;
+ } else if (isPlainObject$1(ex)) {
+ // If it is plain Object, serialize it manually and extract options
+ // This will allow us to group events based on top-level keys
+ // which is much better than creating new group when any key/value change
+ options = this._getCaptureExceptionOptionsFromPlainObject(options, ex);
+ ex = new Error(options.message);
+ } else {
+ // If none of previous checks were valid, then it means that
+ // it's not a DOMError/DOMException
+ // it's not a plain Object
+ // it's not a valid ErrorEvent (one with an error property)
+ // it's not an Error
+ // So bail out and capture it as a simple message:
+ return this.captureMessage(
+ ex,
+ objectMerge$1(options, {
+ stacktrace: true, // if we fall back to captureMessage, default to attempting a new trace
+ trimHeadFrames: options.trimHeadFrames + 1
+ })
+ );
+ }
+
+ // Store the raw exception object for potential debugging and introspection
+ this._lastCapturedException = ex;
+
+ // TraceKit.report will re-raise any exception passed to it,
+ // which means you have to wrap it in try/catch. Instead, we
+ // can wrap it here and only re-raise if TraceKit.report
+ // raises an exception different from the one we asked to
+ // report on.
+ try {
+ var stack = tracekit.computeStackTrace(ex);
+ this._handleStackInfo(stack, options);
+ } catch (ex1) {
+ if (ex !== ex1) {
+ throw ex1;
+ }
+ }
+
+ return this;
+ },
+
+ _getCaptureExceptionOptionsFromPlainObject: function(currentOptions, ex) {
+ var exKeys = Object.keys(ex).sort();
+ var options = objectMerge$1(currentOptions, {
+ message:
+ 'Non-Error exception captured with keys: ' + serializeKeysForMessage$1(exKeys),
+ fingerprint: [md5_1(exKeys)],
+ extra: currentOptions.extra || {}
+ });
+ options.extra.__serialized__ = serializeException$1(ex);
+
+ return options;
+ },
+
+ /*
+ * Manually send a message to Sentry
+ *
+ * @param {string} msg A plain message to be captured in Sentry
+ * @param {object} options A specific set of options for this message [optional]
+ * @return {Raven}
+ */
+ captureMessage: function(msg, options) {
+ // config() automagically converts ignoreErrors from a list to a RegExp so we need to test for an
+ // early call; we'll error on the side of logging anything called before configuration since it's
+ // probably something you should see:
+ if (
+ !!this._globalOptions.ignoreErrors.test &&
+ this._globalOptions.ignoreErrors.test(msg)
+ ) {
+ return;
+ }
+
+ options = options || {};
+ msg = msg + ''; // Make sure it's actually a string
+
+ var data = objectMerge$1(
+ {
+ message: msg
+ },
+ options
+ );
+
+ var ex;
+ // Generate a "synthetic" stack trace from this point.
+ // NOTE: If you are a Sentry user, and you are seeing this stack frame, it is NOT indicative
+ // of a bug with Raven.js. Sentry generates synthetic traces either by configuration,
+ // or if it catches a thrown object without a "stack" property.
+ try {
+ throw new Error(msg);
+ } catch (ex1) {
+ ex = ex1;
+ }
+
+ // null exception name so `Error` isn't prefixed to msg
+ ex.name = null;
+ var stack = tracekit.computeStackTrace(ex);
+
+ // stack[0] is `throw new Error(msg)` call itself, we are interested in the frame that was just before that, stack[1]
+ var initialCall = isArray$1(stack.stack) && stack.stack[1];
+
+ // if stack[1] is `Raven.captureException`, it means that someone passed a string to it and we redirected that call
+ // to be handled by `captureMessage`, thus `initialCall` is the 3rd one, not 2nd
+ // initialCall => captureException(string) => captureMessage(string)
+ if (initialCall && initialCall.func === 'Raven.captureException') {
+ initialCall = stack.stack[2];
+ }
+
+ var fileurl = (initialCall && initialCall.url) || '';
+
+ if (
+ !!this._globalOptions.ignoreUrls.test &&
+ this._globalOptions.ignoreUrls.test(fileurl)
+ ) {
+ return;
+ }
+
+ if (
+ !!this._globalOptions.whitelistUrls.test &&
+ !this._globalOptions.whitelistUrls.test(fileurl)
+ ) {
+ return;
+ }
+
+ if (this._globalOptions.stacktrace || (options && options.stacktrace)) {
+ // fingerprint on msg, not stack trace (legacy behavior, could be revisited)
+ data.fingerprint = data.fingerprint == null ? msg : data.fingerprint;
+
+ options = objectMerge$1(
+ {
+ trimHeadFrames: 0
+ },
+ options
+ );
+ // Since we know this is a synthetic trace, the top frame (this function call)
+ // MUST be from Raven.js, so mark it for trimming
+ // We add to the trim counter so that callers can choose to trim extra frames, such
+ // as utility functions.
+ options.trimHeadFrames += 1;
+
+ var frames = this._prepareFrames(stack, options);
+ data.stacktrace = {
+ // Sentry expects frames oldest to newest
+ frames: frames.reverse()
+ };
+ }
+
+ // Make sure that fingerprint is always wrapped in an array
+ if (data.fingerprint) {
+ data.fingerprint = isArray$1(data.fingerprint)
+ ? data.fingerprint
+ : [data.fingerprint];
+ }
+
+ // Fire away!
+ this._send(data);
+
+ return this;
+ },
+
+ captureBreadcrumb: function(obj) {
+ var crumb = objectMerge$1(
+ {
+ timestamp: now() / 1000
+ },
+ obj
+ );
+
+ if (isFunction$1(this._globalOptions.breadcrumbCallback)) {
+ var result = this._globalOptions.breadcrumbCallback(crumb);
+
+ if (isObject$1(result) && !isEmptyObject$1(result)) {
+ crumb = result;
+ } else if (result === false) {
+ return this;
+ }
+ }
+
+ this._breadcrumbs.push(crumb);
+ if (this._breadcrumbs.length > this._globalOptions.maxBreadcrumbs) {
+ this._breadcrumbs.shift();
+ }
+ return this;
+ },
+
+ addPlugin: function(plugin /*arg1, arg2, ... argN*/) {
+ var pluginArgs = [].slice.call(arguments, 1);
+
+ this._plugins.push([plugin, pluginArgs]);
+ if (this._isRavenInstalled) {
+ this._drainPlugins();
+ }
+
+ return this;
+ },
+
+ /*
+ * Set/clear a user to be sent along with the payload.
+ *
+ * @param {object} user An object representing user data [optional]
+ * @return {Raven}
+ */
+ setUserContext: function(user) {
+ // Intentionally do not merge here since that's an unexpected behavior.
+ this._globalContext.user = user;
+
+ return this;
+ },
+
+ /*
+ * Merge extra attributes to be sent along with the payload.
+ *
+ * @param {object} extra An object representing extra data [optional]
+ * @return {Raven}
+ */
+ setExtraContext: function(extra) {
+ this._mergeContext('extra', extra);
+
+ return this;
+ },
+
+ /*
+ * Merge tags to be sent along with the payload.
+ *
+ * @param {object} tags An object representing tags [optional]
+ * @return {Raven}
+ */
+ setTagsContext: function(tags) {
+ this._mergeContext('tags', tags);
+
+ return this;
+ },
+
+ /*
+ * Clear all of the context.
+ *
+ * @return {Raven}
+ */
+ clearContext: function() {
+ this._globalContext = {};
+
+ return this;
+ },
+
+ /*
+ * Get a copy of the current context. This cannot be mutated.
+ *
+ * @return {object} copy of context
+ */
+ getContext: function() {
+ // lol javascript
+ return JSON.parse(stringify_1(this._globalContext));
+ },
+
+ /*
+ * Set environment of application
+ *
+ * @param {string} environment Typically something like 'production'.
+ * @return {Raven}
+ */
+ setEnvironment: function(environment) {
+ this._globalOptions.environment = environment;
+
+ return this;
+ },
+
+ /*
+ * Set release version of application
+ *
+ * @param {string} release Typically something like a git SHA to identify version
+ * @return {Raven}
+ */
+ setRelease: function(release) {
+ this._globalOptions.release = release;
+
+ return this;
+ },
+
+ /*
+ * Set the dataCallback option
+ *
+ * @param {function} callback The callback to run which allows the
+ * data blob to be mutated before sending
+ * @return {Raven}
+ */
+ setDataCallback: function(callback) {
+ var original = this._globalOptions.dataCallback;
+ this._globalOptions.dataCallback = keepOriginalCallback(original, callback);
+ return this;
+ },
+
+ /*
+ * Set the breadcrumbCallback option
+ *
+ * @param {function} callback The callback to run which allows filtering
+ * or mutating breadcrumbs
+ * @return {Raven}
+ */
+ setBreadcrumbCallback: function(callback) {
+ var original = this._globalOptions.breadcrumbCallback;
+ this._globalOptions.breadcrumbCallback = keepOriginalCallback(original, callback);
+ return this;
+ },
+
+ /*
+ * Set the shouldSendCallback option
+ *
+ * @param {function} callback The callback to run which allows
+ * introspecting the blob before sending
+ * @return {Raven}
+ */
+ setShouldSendCallback: function(callback) {
+ var original = this._globalOptions.shouldSendCallback;
+ this._globalOptions.shouldSendCallback = keepOriginalCallback(original, callback);
+ return this;
+ },
+
+ /**
+ * Override the default HTTP transport mechanism that transmits data
+ * to the Sentry server.
+ *
+ * @param {function} transport Function invoked instead of the default
+ * `makeRequest` handler.
+ *
+ * @return {Raven}
+ */
+ setTransport: function(transport) {
+ this._globalOptions.transport = transport;
+
+ return this;
+ },
+
+ /*
+ * Get the latest raw exception that was captured by Raven.
+ *
+ * @return {error}
+ */
+ lastException: function() {
+ return this._lastCapturedException;
+ },
+
+ /*
+ * Get the last event id
+ *
+ * @return {string}
+ */
+ lastEventId: function() {
+ return this._lastEventId;
+ },
+
+ /*
+ * Determine if Raven is setup and ready to go.
+ *
+ * @return {boolean}
+ */
+ isSetup: function() {
+ if (!this._hasJSON) return false; // needs JSON support
+ if (!this._globalServer) {
+ if (!this.ravenNotConfiguredError) {
+ this.ravenNotConfiguredError = true;
+ this._logDebug('error', 'Error: Raven has not been configured.');
+ }
+ return false;
+ }
+ return true;
+ },
+
+ afterLoad: function() {
+ // TODO: remove window dependence?
+
+ // Attempt to initialize Raven on load
+ var RavenConfig = _window$2.RavenConfig;
+ if (RavenConfig) {
+ this.config(RavenConfig.dsn, RavenConfig.config).install();
+ }
+ },
+
+ showReportDialog: function(options) {
+ if (
+ !_document // doesn't work without a document (React native)
+ )
+ return;
+
+ options = options || {};
+
+ var lastEventId = options.eventId || this.lastEventId();
+ if (!lastEventId) {
+ throw new configError('Missing eventId');
+ }
+
+ var dsn = options.dsn || this._dsn;
+ if (!dsn) {
+ throw new configError('Missing DSN');
+ }
+
+ var encode = encodeURIComponent;
+ var qs = '';
+ qs += '?eventId=' + encode(lastEventId);
+ qs += '&dsn=' + encode(dsn);
+
+ var user = options.user || this._globalContext.user;
+ if (user) {
+ if (user.name) qs += '&name=' + encode(user.name);
+ if (user.email) qs += '&email=' + encode(user.email);
+ }
+
+ var globalServer = this._getGlobalServer(this._parseDSN(dsn));
+
+ var script = _document.createElement('script');
+ script.async = true;
+ script.src = globalServer + '/api/embed/error-page/' + qs;
+ (_document.head || _document.body).appendChild(script);
+ },
+
+ /**** Private functions ****/
+ _ignoreNextOnError: function() {
+ var self = this;
+ this._ignoreOnError += 1;
+ setTimeout(function() {
+ // onerror should trigger before setTimeout
+ self._ignoreOnError -= 1;
+ });
+ },
+
+ _triggerEvent: function(eventType, options) {
+ // NOTE: `event` is a native browser thing, so let's avoid conflicting wiht it
+ var evt, key;
+
+ if (!this._hasDocument) return;
+
+ options = options || {};
+
+ eventType = 'raven' + eventType.substr(0, 1).toUpperCase() + eventType.substr(1);
+
+ if (_document.createEvent) {
+ evt = _document.createEvent('HTMLEvents');
+ evt.initEvent(eventType, true, true);
+ } else {
+ evt = _document.createEventObject();
+ evt.eventType = eventType;
+ }
+
+ for (key in options)
+ if (hasKey$1(options, key)) {
+ evt[key] = options[key];
+ }
+
+ if (_document.createEvent) {
+ // IE9 if standards
+ _document.dispatchEvent(evt);
+ } else {
+ // IE8 regardless of Quirks or Standards
+ // IE9 if quirks
+ try {
+ _document.fireEvent('on' + evt.eventType.toLowerCase(), evt);
+ } catch (e) {
+ // Do nothing
+ }
+ }
+ },
+
+ /**
+ * Wraps addEventListener to capture UI breadcrumbs
+ * @param evtName the event name (e.g. "click")
+ * @returns {Function}
+ * @private
+ */
+ _breadcrumbEventHandler: function(evtName) {
+ var self = this;
+ return function(evt) {
+ // reset keypress timeout; e.g. triggering a 'click' after
+ // a 'keypress' will reset the keypress debounce so that a new
+ // set of keypresses can be recorded
+ self._keypressTimeout = null;
+
+ // It's possible this handler might trigger multiple times for the same
+ // event (e.g. event propagation through node ancestors). Ignore if we've
+ // already captured the event.
+ if (self._lastCapturedEvent === evt) return;
+
+ self._lastCapturedEvent = evt;
+
+ // try/catch both:
+ // - accessing evt.target (see getsentry/raven-js#838, #768)
+ // - `htmlTreeAsString` because it's complex, and just accessing the DOM incorrectly
+ // can throw an exception in some circumstances.
+ var target;
+ try {
+ target = htmlTreeAsString$1(evt.target);
+ } catch (e) {
+ target = '<unknown>';
+ }
+
+ self.captureBreadcrumb({
+ category: 'ui.' + evtName, // e.g. ui.click, ui.input
+ message: target
+ });
+ };
+ },
+
+ /**
+ * Wraps addEventListener to capture keypress UI events
+ * @returns {Function}
+ * @private
+ */
+ _keypressEventHandler: function() {
+ var self = this,
+ debounceDuration = 1000; // milliseconds
+
+ // TODO: if somehow user switches keypress target before
+ // debounce timeout is triggered, we will only capture
+ // a single breadcrumb from the FIRST target (acceptable?)
+ return function(evt) {
+ var target;
+ try {
+ target = evt.target;
+ } catch (e) {
+ // just accessing event properties can throw an exception in some rare circumstances
+ // see: https://github.com/getsentry/raven-js/issues/838
+ return;
+ }
+ var tagName = target && target.tagName;
+
+ // only consider keypress events on actual input elements
+ // this will disregard keypresses targeting body (e.g. tabbing
+ // through elements, hotkeys, etc)
+ if (
+ !tagName ||
+ (tagName !== 'INPUT' && tagName !== 'TEXTAREA' && !target.isContentEditable)
+ )
+ return;
+
+ // record first keypress in a series, but ignore subsequent
+ // keypresses until debounce clears
+ var timeout = self._keypressTimeout;
+ if (!timeout) {
+ self._breadcrumbEventHandler('input')(evt);
+ }
+ clearTimeout(timeout);
+ self._keypressTimeout = setTimeout(function() {
+ self._keypressTimeout = null;
+ }, debounceDuration);
+ };
+ },
+
+ /**
+ * Captures a breadcrumb of type "navigation", normalizing input URLs
+ * @param to the originating URL
+ * @param from the target URL
+ * @private
+ */
+ _captureUrlChange: function(from, to) {
+ var parsedLoc = parseUrl$1(this._location.href);
+ var parsedTo = parseUrl$1(to);
+ var parsedFrom = parseUrl$1(from);
+
+ // because onpopstate only tells you the "new" (to) value of location.href, and
+ // not the previous (from) value, we need to track the value of the current URL
+ // state ourselves
+ this._lastHref = to;
+
+ // Use only the path component of the URL if the URL matches the current
+ // document (almost all the time when using pushState)
+ if (parsedLoc.protocol === parsedTo.protocol && parsedLoc.host === parsedTo.host)
+ to = parsedTo.relative;
+ if (parsedLoc.protocol === parsedFrom.protocol && parsedLoc.host === parsedFrom.host)
+ from = parsedFrom.relative;
+
+ this.captureBreadcrumb({
+ category: 'navigation',
+ data: {
+ to: to,
+ from: from
+ }
+ });
+ },
+
+ _patchFunctionToString: function() {
+ var self = this;
+ self._originalFunctionToString = Function.prototype.toString;
+ // eslint-disable-next-line no-extend-native
+ Function.prototype.toString = function() {
+ if (typeof this === 'function' && this.__raven__) {
+ return self._originalFunctionToString.apply(this.__orig__, arguments);
+ }
+ return self._originalFunctionToString.apply(this, arguments);
+ };
+ },
+
+ _unpatchFunctionToString: function() {
+ if (this._originalFunctionToString) {
+ // eslint-disable-next-line no-extend-native
+ Function.prototype.toString = this._originalFunctionToString;
+ }
+ },
+
+ /**
+ * Wrap timer functions and event targets to catch errors and provide
+ * better metadata.
+ */
+ _instrumentTryCatch: function() {
+ var self = this;
+
+ var wrappedBuiltIns = self._wrappedBuiltIns;
+
+ function wrapTimeFn(orig) {
+ return function(fn, t) {
+ // preserve arity
+ // Make a copy of the arguments to prevent deoptimization
+ // https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#32-leaking-arguments
+ var args = new Array(arguments.length);
+ for (var i = 0; i < args.length; ++i) {
+ args[i] = arguments[i];
+ }
+ var originalCallback = args[0];
+ if (isFunction$1(originalCallback)) {
+ args[0] = self.wrap(
+ {
+ mechanism: {
+ type: 'instrument',
+ data: {function: orig.name || '<anonymous>'}
+ }
+ },
+ originalCallback
+ );
+ }
+
+ // IE < 9 doesn't support .call/.apply on setInterval/setTimeout, but it
+ // also supports only two arguments and doesn't care what this is, so we
+ // can just call the original function directly.
+ if (orig.apply) {
+ return orig.apply(this, args);
+ } else {
+ return orig(args[0], args[1]);
+ }
+ };
+ }
+
+ var autoBreadcrumbs = this._globalOptions.autoBreadcrumbs;
+
+ function wrapEventTarget(global) {
+ var proto = _window$2[global] && _window$2[global].prototype;
+ if (proto && proto.hasOwnProperty && proto.hasOwnProperty('addEventListener')) {
+ fill$1(
+ proto,
+ 'addEventListener',
+ function(orig) {
+ return function(evtName, fn, capture, secure) {
+ // preserve arity
+ try {
+ if (fn && fn.handleEvent) {
+ fn.handleEvent = self.wrap(
+ {
+ mechanism: {
+ type: 'instrument',
+ data: {
+ target: global,
+ function: 'handleEvent',
+ handler: (fn && fn.name) || '<anonymous>'
+ }
+ }
+ },
+ fn.handleEvent
+ );
+ }
+ } catch (err) {
+ // can sometimes get 'Permission denied to access property "handle Event'
+ }
+
+ // More breadcrumb DOM capture ... done here and not in `_instrumentBreadcrumbs`
+ // so that we don't have more than one wrapper function
+ var before, clickHandler, keypressHandler;
+
+ if (
+ autoBreadcrumbs &&
+ autoBreadcrumbs.dom &&
+ (global === 'EventTarget' || global === 'Node')
+ ) {
+ // NOTE: generating multiple handlers per addEventListener invocation, should
+ // revisit and verify we can just use one (almost certainly)
+ clickHandler = self._breadcrumbEventHandler('click');
+ keypressHandler = self._keypressEventHandler();
+ before = function(evt) {
+ // need to intercept every DOM event in `before` argument, in case that
+ // same wrapped method is re-used for different events (e.g. mousemove THEN click)
+ // see #724
+ if (!evt) return;
+
+ var eventType;
+ try {
+ eventType = evt.type;
+ } catch (e) {
+ // just accessing event properties can throw an exception in some rare circumstances
+ // see: https://github.com/getsentry/raven-js/issues/838
+ return;
+ }
+ if (eventType === 'click') return clickHandler(evt);
+ else if (eventType === 'keypress') return keypressHandler(evt);
+ };
+ }
+ return orig.call(
+ this,
+ evtName,
+ self.wrap(
+ {
+ mechanism: {
+ type: 'instrument',
+ data: {
+ target: global,
+ function: 'addEventListener',
+ handler: (fn && fn.name) || '<anonymous>'
+ }
+ }
+ },
+ fn,
+ before
+ ),
+ capture,
+ secure
+ );
+ };
+ },
+ wrappedBuiltIns
+ );
+ fill$1(
+ proto,
+ 'removeEventListener',
+ function(orig) {
+ return function(evt, fn, capture, secure) {
+ try {
+ fn = fn && (fn.__raven_wrapper__ ? fn.__raven_wrapper__ : fn);
+ } catch (e) {
+ // ignore, accessing __raven_wrapper__ will throw in some Selenium environments
+ }
+ return orig.call(this, evt, fn, capture, secure);
+ };
+ },
+ wrappedBuiltIns
+ );
+ }
+ }
+
+ fill$1(_window$2, 'setTimeout', wrapTimeFn, wrappedBuiltIns);
+ fill$1(_window$2, 'setInterval', wrapTimeFn, wrappedBuiltIns);
+ if (_window$2.requestAnimationFrame) {
+ fill$1(
+ _window$2,
+ 'requestAnimationFrame',
+ function(orig) {
+ return function(cb) {
+ return orig(
+ self.wrap(
+ {
+ mechanism: {
+ type: 'instrument',
+ data: {
+ function: 'requestAnimationFrame',
+ handler: (orig && orig.name) || '<anonymous>'
+ }
+ }
+ },
+ cb
+ )
+ );
+ };
+ },
+ wrappedBuiltIns
+ );
+ }
+
+ // event targets borrowed from bugsnag-js:
+ // https://github.com/bugsnag/bugsnag-js/blob/master/src/bugsnag.js#L666
+ var eventTargets = [
+ 'EventTarget',
+ 'Window',
+ 'Node',
+ 'ApplicationCache',
+ 'AudioTrackList',
+ 'ChannelMergerNode',
+ 'CryptoOperation',
+ 'EventSource',
+ 'FileReader',
+ 'HTMLUnknownElement',
+ 'IDBDatabase',
+ 'IDBRequest',
+ 'IDBTransaction',
+ 'KeyOperation',
+ 'MediaController',
+ 'MessagePort',
+ 'ModalWindow',
+ 'Notification',
+ 'SVGElementInstance',
+ 'Screen',
+ 'TextTrack',
+ 'TextTrackCue',
+ 'TextTrackList',
+ 'WebSocket',
+ 'WebSocketWorker',
+ 'Worker',
+ 'XMLHttpRequest',
+ 'XMLHttpRequestEventTarget',
+ 'XMLHttpRequestUpload'
+ ];
+ for (var i = 0; i < eventTargets.length; i++) {
+ wrapEventTarget(eventTargets[i]);
+ }
+ },
+
+ /**
+ * Instrument browser built-ins w/ breadcrumb capturing
+ * - XMLHttpRequests
+ * - DOM interactions (click/typing)
+ * - window.location changes
+ * - console
+ *
+ * Can be disabled or individually configured via the `autoBreadcrumbs` config option
+ */
+ _instrumentBreadcrumbs: function() {
+ var self = this;
+ var autoBreadcrumbs = this._globalOptions.autoBreadcrumbs;
+
+ var wrappedBuiltIns = self._wrappedBuiltIns;
+
+ function wrapProp(prop, xhr) {
+ if (prop in xhr && isFunction$1(xhr[prop])) {
+ fill$1(xhr, prop, function(orig) {
+ return self.wrap(
+ {
+ mechanism: {
+ type: 'instrument',
+ data: {function: prop, handler: (orig && orig.name) || '<anonymous>'}
+ }
+ },
+ orig
+ );
+ }); // intentionally don't track filled methods on XHR instances
+ }
+ }
+
+ if (autoBreadcrumbs.xhr && 'XMLHttpRequest' in _window$2) {
+ var xhrproto = _window$2.XMLHttpRequest && _window$2.XMLHttpRequest.prototype;
+ fill$1(
+ xhrproto,
+ 'open',
+ function(origOpen) {
+ return function(method, url) {
+ // preserve arity
+
+ // if Sentry key appears in URL, don't capture
+ if (isString$1(url) && url.indexOf(self._globalKey) === -1) {
+ this.__raven_xhr = {
+ method: method,
+ url: url,
+ status_code: null
+ };
+ }
+
+ return origOpen.apply(this, arguments);
+ };
+ },
+ wrappedBuiltIns
+ );
+
+ fill$1(
+ xhrproto,
+ 'send',
+ function(origSend) {
+ return function() {
+ // preserve arity
+ var xhr = this;
+
+ function onreadystatechangeHandler() {
+ if (xhr.__raven_xhr && xhr.readyState === 4) {
+ try {
+ // touching statusCode in some platforms throws
+ // an exception
+ xhr.__raven_xhr.status_code = xhr.status;
+ } catch (e) {
+ /* do nothing */
+ }
+
+ self.captureBreadcrumb({
+ type: 'http',
+ category: 'xhr',
+ data: xhr.__raven_xhr
+ });
+ }
+ }
+
+ var props = ['onload', 'onerror', 'onprogress'];
+ for (var j = 0; j < props.length; j++) {
+ wrapProp(props[j], xhr);
+ }
+
+ if ('onreadystatechange' in xhr && isFunction$1(xhr.onreadystatechange)) {
+ fill$1(
+ xhr,
+ 'onreadystatechange',
+ function(orig) {
+ return self.wrap(
+ {
+ mechanism: {
+ type: 'instrument',
+ data: {
+ function: 'onreadystatechange',
+ handler: (orig && orig.name) || '<anonymous>'
+ }
+ }
+ },
+ orig,
+ onreadystatechangeHandler
+ );
+ } /* intentionally don't track this instrumentation */
+ );
+ } else {
+ // if onreadystatechange wasn't actually set by the page on this xhr, we
+ // are free to set our own and capture the breadcrumb
+ xhr.onreadystatechange = onreadystatechangeHandler;
+ }
+
+ return origSend.apply(this, arguments);
+ };
+ },
+ wrappedBuiltIns
+ );
+ }
+
+ if (autoBreadcrumbs.xhr && supportsFetch$1()) {
+ fill$1(
+ _window$2,
+ 'fetch',
+ function(origFetch) {
+ return function() {
+ // preserve arity
+ // Make a copy of the arguments to prevent deoptimization
+ // https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#32-leaking-arguments
+ var args = new Array(arguments.length);
+ for (var i = 0; i < args.length; ++i) {
+ args[i] = arguments[i];
+ }
+
+ var fetchInput = args[0];
+ var method = 'GET';
+ var url;
+
+ if (typeof fetchInput === 'string') {
+ url = fetchInput;
+ } else if ('Request' in _window$2 && fetchInput instanceof _window$2.Request) {
+ url = fetchInput.url;
+ if (fetchInput.method) {
+ method = fetchInput.method;
+ }
+ } else {
+ url = '' + fetchInput;
+ }
+
+ // if Sentry key appears in URL, don't capture, as it's our own request
+ if (url.indexOf(self._globalKey) !== -1) {
+ return origFetch.apply(this, args);
+ }
+
+ if (args[1] && args[1].method) {
+ method = args[1].method;
+ }
+
+ var fetchData = {
+ method: method,
+ url: url,
+ status_code: null
+ };
+
+ return origFetch
+ .apply(this, args)
+ .then(function(response) {
+ fetchData.status_code = response.status;
+
+ self.captureBreadcrumb({
+ type: 'http',
+ category: 'fetch',
+ data: fetchData
+ });
+
+ return response;
+ })
+ ['catch'](function(err) {
+ // if there is an error performing the request
+ self.captureBreadcrumb({
+ type: 'http',
+ category: 'fetch',
+ data: fetchData,
+ level: 'error'
+ });
+
+ throw err;
+ });
+ };
+ },
+ wrappedBuiltIns
+ );
+ }
+
+ // Capture breadcrumbs from any click that is unhandled / bubbled up all the way
+ // to the document. Do this before we instrument addEventListener.
+ if (autoBreadcrumbs.dom && this._hasDocument) {
+ if (_document.addEventListener) {
+ _document.addEventListener('click', self._breadcrumbEventHandler('click'), false);
+ _document.addEventListener('keypress', self._keypressEventHandler(), false);
+ } else if (_document.attachEvent) {
+ // IE8 Compatibility
+ _document.attachEvent('onclick', self._breadcrumbEventHandler('click'));
+ _document.attachEvent('onkeypress', self._keypressEventHandler());
+ }
+ }
+
+ // record navigation (URL) changes
+ // NOTE: in Chrome App environment, touching history.pushState, *even inside
+ // a try/catch block*, will cause Chrome to output an error to console.error
+ // borrowed from: https://github.com/angular/angular.js/pull/13945/files
+ var chrome = _window$2.chrome;
+ var isChromePackagedApp = chrome && chrome.app && chrome.app.runtime;
+ var hasPushAndReplaceState =
+ !isChromePackagedApp &&
+ _window$2.history &&
+ _window$2.history.pushState &&
+ _window$2.history.replaceState;
+ if (autoBreadcrumbs.location && hasPushAndReplaceState) {
+ // TODO: remove onpopstate handler on uninstall()
+ var oldOnPopState = _window$2.onpopstate;
+ _window$2.onpopstate = function() {
+ var currentHref = self._location.href;
+ self._captureUrlChange(self._lastHref, currentHref);
+
+ if (oldOnPopState) {
+ return oldOnPopState.apply(this, arguments);
+ }
+ };
+
+ var historyReplacementFunction = function(origHistFunction) {
+ // note history.pushState.length is 0; intentionally not declaring
+ // params to preserve 0 arity
+ return function(/* state, title, url */) {
+ var url = arguments.length > 2 ? arguments[2] : undefined;
+
+ // url argument is optional
+ if (url) {
+ // coerce to string (this is what pushState does)
+ self._captureUrlChange(self._lastHref, url + '');
+ }
+
+ return origHistFunction.apply(this, arguments);
+ };
+ };
+
+ fill$1(_window$2.history, 'pushState', historyReplacementFunction, wrappedBuiltIns);
+ fill$1(_window$2.history, 'replaceState', historyReplacementFunction, wrappedBuiltIns);
+ }
+
+ if (autoBreadcrumbs.console && 'console' in _window$2 && console.log) {
+ // console
+ var consoleMethodCallback = function(msg, data) {
+ self.captureBreadcrumb({
+ message: msg,
+ level: data.level,
+ category: 'console'
+ });
+ };
+
+ each$1(['debug', 'info', 'warn', 'error', 'log'], function(_, level) {
+ wrapConsoleMethod(console, level, consoleMethodCallback);
+ });
+ }
+ },
+
+ _restoreBuiltIns: function() {
+ // restore any wrapped builtins
+ var builtin;
+ while (this._wrappedBuiltIns.length) {
+ builtin = this._wrappedBuiltIns.shift();
+
+ var obj = builtin[0],
+ name = builtin[1],
+ orig = builtin[2];
+
+ obj[name] = orig;
+ }
+ },
+
+ _restoreConsole: function() {
+ // eslint-disable-next-line guard-for-in
+ for (var method in this._originalConsoleMethods) {
+ this._originalConsole[method] = this._originalConsoleMethods[method];
+ }
+ },
+
+ _drainPlugins: function() {
+ var self = this;
+
+ // FIX ME TODO
+ each$1(this._plugins, function(_, plugin) {
+ var installer = plugin[0];
+ var args = plugin[1];
+ installer.apply(self, [self].concat(args));
+ });
+ },
+
+ _parseDSN: function(str) {
+ var m = dsnPattern.exec(str),
+ dsn = {},
+ i = 7;
+
+ try {
+ while (i--) dsn[dsnKeys[i]] = m[i] || '';
+ } catch (e) {
+ throw new configError('Invalid DSN: ' + str);
+ }
+
+ if (dsn.pass && !this._globalOptions.allowSecretKey) {
+ throw new configError(
+ 'Do not specify your secret key in the DSN. See: http://bit.ly/raven-secret-key'
+ );
+ }
+
+ return dsn;
+ },
+
+ _getGlobalServer: function(uri) {
+ // assemble the endpoint from the uri pieces
+ var globalServer = '//' + uri.host + (uri.port ? ':' + uri.port : '');
+
+ if (uri.protocol) {
+ globalServer = uri.protocol + ':' + globalServer;
+ }
+ return globalServer;
+ },
+
+ _handleOnErrorStackInfo: function(stackInfo, options) {
+ options = options || {};
+ options.mechanism = options.mechanism || {
+ type: 'onerror',
+ handled: false
+ };
+
+ // if we are intentionally ignoring errors via onerror, bail out
+ if (!this._ignoreOnError) {
+ this._handleStackInfo(stackInfo, options);
+ }
+ },
+
+ _handleStackInfo: function(stackInfo, options) {
+ var frames = this._prepareFrames(stackInfo, options);
+
+ this._triggerEvent('handle', {
+ stackInfo: stackInfo,
+ options: options
+ });
+
+ this._processException(
+ stackInfo.name,
+ stackInfo.message,
+ stackInfo.url,
+ stackInfo.lineno,
+ frames,
+ options
+ );
+ },
+
+ _prepareFrames: function(stackInfo, options) {
+ var self = this;
+ var frames = [];
+ if (stackInfo.stack && stackInfo.stack.length) {
+ each$1(stackInfo.stack, function(i, stack) {
+ var frame = self._normalizeFrame(stack, stackInfo.url);
+ if (frame) {
+ frames.push(frame);
+ }
+ });
+
+ // e.g. frames captured via captureMessage throw
+ if (options && options.trimHeadFrames) {
+ for (var j = 0; j < options.trimHeadFrames && j < frames.length; j++) {
+ frames[j].in_app = false;
+ }
+ }
+ }
+ frames = frames.slice(0, this._globalOptions.stackTraceLimit);
+ return frames;
+ },
+
+ _normalizeFrame: function(frame, stackInfoUrl) {
+ // normalize the frames data
+ var normalized = {
+ filename: frame.url,
+ lineno: frame.line,
+ colno: frame.column,
+ function: frame.func || '?'
+ };
+
+ // Case when we don't have any information about the error
+ // E.g. throwing a string or raw object, instead of an `Error` in Firefox
+ // Generating synthetic error doesn't add any value here
+ //
+ // We should probably somehow let a user know that they should fix their code
+ if (!frame.url) {
+ normalized.filename = stackInfoUrl; // fallback to whole stacks url from onerror handler
+ }
+
+ normalized.in_app = !// determine if an exception came from outside of our app
+ // first we check the global includePaths list.
+ (
+ (!!this._globalOptions.includePaths.test &&
+ !this._globalOptions.includePaths.test(normalized.filename)) ||
+ // Now we check for fun, if the function name is Raven or TraceKit
+ /(Raven|TraceKit)\./.test(normalized['function']) ||
+ // finally, we do a last ditch effort and check for raven.min.js
+ /raven\.(min\.)?js$/.test(normalized.filename)
+ );
+
+ return normalized;
+ },
+
+ _processException: function(type, message, fileurl, lineno, frames, options) {
+ var prefixedMessage = (type ? type + ': ' : '') + (message || '');
+ if (
+ !!this._globalOptions.ignoreErrors.test &&
+ (this._globalOptions.ignoreErrors.test(message) ||
+ this._globalOptions.ignoreErrors.test(prefixedMessage))
+ ) {
+ return;
+ }
+
+ var stacktrace;
+
+ if (frames && frames.length) {
+ fileurl = frames[0].filename || fileurl;
+ // Sentry expects frames oldest to newest
+ // and JS sends them as newest to oldest
+ frames.reverse();
+ stacktrace = {frames: frames};
+ } else if (fileurl) {
+ stacktrace = {
+ frames: [
+ {
+ filename: fileurl,
+ lineno: lineno,
+ in_app: true
+ }
+ ]
+ };
+ }
+
+ if (
+ !!this._globalOptions.ignoreUrls.test &&
+ this._globalOptions.ignoreUrls.test(fileurl)
+ ) {
+ return;
+ }
+
+ if (
+ !!this._globalOptions.whitelistUrls.test &&
+ !this._globalOptions.whitelistUrls.test(fileurl)
+ ) {
+ return;
+ }
+
+ var data = objectMerge$1(
+ {
+ // sentry.interfaces.Exception
+ exception: {
+ values: [
+ {
+ type: type,
+ value: message,
+ stacktrace: stacktrace
+ }
+ ]
+ },
+ transaction: fileurl
+ },
+ options
+ );
+
+ // Move mechanism from options to exception interface
+ // We do this, as requiring user to pass `{exception:{mechanism:{ ... }}}` would be
+ // too much
+ if (!data.exception.mechanism && data.mechanism) {
+ data.exception.mechanism = data.mechanism;
+ delete data.mechanism;
+ }
+
+ data.exception.mechanism = objectMerge$1(
+ {
+ type: 'generic',
+ handled: true
+ },
+ data.exception.mechanism || {}
+ );
+
+ // Fire away!
+ this._send(data);
+ },
+
+ _trimPacket: function(data) {
+ // For now, we only want to truncate the two different messages
+ // but this could/should be expanded to just trim everything
+ var max = this._globalOptions.maxMessageLength;
+ if (data.message) {
+ data.message = truncate$1(data.message, max);
+ }
+ if (data.exception) {
+ var exception = data.exception.values[0];
+ exception.value = truncate$1(exception.value, max);
+ }
+
+ var request = data.request;
+ if (request) {
+ if (request.url) {
+ request.url = truncate$1(request.url, this._globalOptions.maxUrlLength);
+ }
+ if (request.Referer) {
+ request.Referer = truncate$1(request.Referer, this._globalOptions.maxUrlLength);
+ }
+ }
+
+ if (data.breadcrumbs && data.breadcrumbs.values)
+ this._trimBreadcrumbs(data.breadcrumbs);
+
+ return data;
+ },
+
+ /**
+ * Truncate breadcrumb values (right now just URLs)
+ */
+ _trimBreadcrumbs: function(breadcrumbs) {
+ // known breadcrumb properties with urls
+ // TODO: also consider arbitrary prop values that start with (https?)?://
+ var urlProps = ['to', 'from', 'url'],
+ urlProp,
+ crumb,
+ data;
+
+ for (var i = 0; i < breadcrumbs.values.length; ++i) {
+ crumb = breadcrumbs.values[i];
+ if (
+ !crumb.hasOwnProperty('data') ||
+ !isObject$1(crumb.data) ||
+ objectFrozen$1(crumb.data)
+ )
+ continue;
+
+ data = objectMerge$1({}, crumb.data);
+ for (var j = 0; j < urlProps.length; ++j) {
+ urlProp = urlProps[j];
+ if (data.hasOwnProperty(urlProp) && data[urlProp]) {
+ data[urlProp] = truncate$1(data[urlProp], this._globalOptions.maxUrlLength);
+ }
+ }
+ breadcrumbs.values[i].data = data;
+ }
+ },
+
+ _getHttpData: function() {
+ if (!this._hasNavigator && !this._hasDocument) return;
+ var httpData = {};
+
+ if (this._hasNavigator && _navigator.userAgent) {
+ httpData.headers = {
+ 'User-Agent': _navigator.userAgent
+ };
+ }
+
+ // Check in `window` instead of `document`, as we may be in ServiceWorker environment
+ if (_window$2.location && _window$2.location.href) {
+ httpData.url = _window$2.location.href;
+ }
+
+ if (this._hasDocument && _document.referrer) {
+ if (!httpData.headers) httpData.headers = {};
+ httpData.headers.Referer = _document.referrer;
+ }
+
+ return httpData;
+ },
+
+ _resetBackoff: function() {
+ this._backoffDuration = 0;
+ this._backoffStart = null;
+ },
+
+ _shouldBackoff: function() {
+ return this._backoffDuration && now() - this._backoffStart < this._backoffDuration;
+ },
+
+ /**
+ * Returns true if the in-process data payload matches the signature
+ * of the previously-sent data
+ *
+ * NOTE: This has to be done at this level because TraceKit can generate
+ * data from window.onerror WITHOUT an exception object (IE8, IE9,
+ * other old browsers). This can take the form of an "exception"
+ * data object with a single frame (derived from the onerror args).
+ */
+ _isRepeatData: function(current) {
+ var last = this._lastData;
+
+ if (
+ !last ||
+ current.message !== last.message || // defined for captureMessage
+ current.transaction !== last.transaction // defined for captureException/onerror
+ )
+ return false;
+
+ // Stacktrace interface (i.e. from captureMessage)
+ if (current.stacktrace || last.stacktrace) {
+ return isSameStacktrace$1(current.stacktrace, last.stacktrace);
+ } else if (current.exception || last.exception) {
+ // Exception interface (i.e. from captureException/onerror)
+ return isSameException$1(current.exception, last.exception);
+ }
+
+ return true;
+ },
+
+ _setBackoffState: function(request) {
+ // If we are already in a backoff state, don't change anything
+ if (this._shouldBackoff()) {
+ return;
+ }
+
+ var status = request.status;
+
+ // 400 - project_id doesn't exist or some other fatal
+ // 401 - invalid/revoked dsn
+ // 429 - too many requests
+ if (!(status === 400 || status === 401 || status === 429)) return;
+
+ var retry;
+ try {
+ // If Retry-After is not in Access-Control-Expose-Headers, most
+ // browsers will throw an exception trying to access it
+ if (supportsFetch$1()) {
+ retry = request.headers.get('Retry-After');
+ } else {
+ retry = request.getResponseHeader('Retry-After');
+ }
+
+ // Retry-After is returned in seconds
+ retry = parseInt(retry, 10) * 1000;
+ } catch (e) {
+ /* eslint no-empty:0 */
+ }
+
+ this._backoffDuration = retry
+ ? // If Sentry server returned a Retry-After value, use it
+ retry
+ : // Otherwise, double the last backoff duration (starts at 1 sec)
+ this._backoffDuration * 2 || 1000;
+
+ this._backoffStart = now();
+ },
+
+ _send: function(data) {
+ var globalOptions = this._globalOptions;
+
+ var baseData = {
+ project: this._globalProject,
+ logger: globalOptions.logger,
+ platform: 'javascript'
+ },
+ httpData = this._getHttpData();
+
+ if (httpData) {
+ baseData.request = httpData;
+ }
+
+ // HACK: delete `trimHeadFrames` to prevent from appearing in outbound payload
+ if (data.trimHeadFrames) delete data.trimHeadFrames;
+
+ data = objectMerge$1(baseData, data);
+
+ // Merge in the tags and extra separately since objectMerge doesn't handle a deep merge
+ data.tags = objectMerge$1(objectMerge$1({}, this._globalContext.tags), data.tags);
+ data.extra = objectMerge$1(objectMerge$1({}, this._globalContext.extra), data.extra);
+
+ // Send along our own collected metadata with extra
+ data.extra['session:duration'] = now() - this._startTime;
+
+ if (this._breadcrumbs && this._breadcrumbs.length > 0) {
+ // intentionally make shallow copy so that additions
+ // to breadcrumbs aren't accidentally sent in this request
+ data.breadcrumbs = {
+ values: [].slice.call(this._breadcrumbs, 0)
+ };
+ }
+
+ if (this._globalContext.user) {
+ // sentry.interfaces.User
+ data.user = this._globalContext.user;
+ }
+
+ // Include the environment if it's defined in globalOptions
+ if (globalOptions.environment) data.environment = globalOptions.environment;
+
+ // Include the release if it's defined in globalOptions
+ if (globalOptions.release) data.release = globalOptions.release;
+
+ // Include server_name if it's defined in globalOptions
+ if (globalOptions.serverName) data.server_name = globalOptions.serverName;
+
+ data = this._sanitizeData(data);
+
+ // Cleanup empty properties before sending them to the server
+ Object.keys(data).forEach(function(key) {
+ if (data[key] == null || data[key] === '' || isEmptyObject$1(data[key])) {
+ delete data[key];
+ }
+ });
+
+ if (isFunction$1(globalOptions.dataCallback)) {
+ data = globalOptions.dataCallback(data) || data;
+ }
+
+ // Why??????????
+ if (!data || isEmptyObject$1(data)) {
+ return;
+ }
+
+ // Check if the request should be filtered or not
+ if (
+ isFunction$1(globalOptions.shouldSendCallback) &&
+ !globalOptions.shouldSendCallback(data)
+ ) {
+ return;
+ }
+
+ // Backoff state: Sentry server previously responded w/ an error (e.g. 429 - too many requests),
+ // so drop requests until "cool-off" period has elapsed.
+ if (this._shouldBackoff()) {
+ this._logDebug('warn', 'Raven dropped error due to backoff: ', data);
+ return;
+ }
+
+ if (typeof globalOptions.sampleRate === 'number') {
+ if (Math.random() < globalOptions.sampleRate) {
+ this._sendProcessedPayload(data);
+ }
+ } else {
+ this._sendProcessedPayload(data);
+ }
+ },
+
+ _sanitizeData: function(data) {
+ return sanitize$1(data, this._globalOptions.sanitizeKeys);
+ },
+
+ _getUuid: function() {
+ return uuid4$1();
+ },
+
+ _sendProcessedPayload: function(data, callback) {
+ var self = this;
+ var globalOptions = this._globalOptions;
+
+ if (!this.isSetup()) return;
+
+ // Try and clean up the packet before sending by truncating long values
+ data = this._trimPacket(data);
+
+ // ideally duplicate error testing should occur *before* dataCallback/shouldSendCallback,
+ // but this would require copying an un-truncated copy of the data packet, which can be
+ // arbitrarily deep (extra_data) -- could be worthwhile? will revisit
+ if (!this._globalOptions.allowDuplicates && this._isRepeatData(data)) {
+ this._logDebug('warn', 'Raven dropped repeat event: ', data);
+ return;
+ }
+
+ // Send along an event_id if not explicitly passed.
+ // This event_id can be used to reference the error within Sentry itself.
+ // Set lastEventId after we know the error should actually be sent
+ this._lastEventId = data.event_id || (data.event_id = this._getUuid());
+
+ // Store outbound payload after trim
+ this._lastData = data;
+
+ this._logDebug('debug', 'Raven about to send:', data);
+
+ var auth = {
+ sentry_version: '7',
+ sentry_client: 'raven-js/' + this.VERSION,
+ sentry_key: this._globalKey
+ };
+
+ if (this._globalSecret) {
+ auth.sentry_secret = this._globalSecret;
+ }
+
+ var exception = data.exception && data.exception.values[0];
+
+ // only capture 'sentry' breadcrumb is autoBreadcrumbs is truthy
+ if (
+ this._globalOptions.autoBreadcrumbs &&
+ this._globalOptions.autoBreadcrumbs.sentry
+ ) {
+ this.captureBreadcrumb({
+ category: 'sentry',
+ message: exception
+ ? (exception.type ? exception.type + ': ' : '') + exception.value
+ : data.message,
+ event_id: data.event_id,
+ level: data.level || 'error' // presume error unless specified
+ });
+ }
+
+ var url = this._globalEndpoint;
+ (globalOptions.transport || this._makeRequest).call(this, {
+ url: url,
+ auth: auth,
+ data: data,
+ options: globalOptions,
+ onSuccess: function success() {
+ self._resetBackoff();
+
+ self._triggerEvent('success', {
+ data: data,
+ src: url
+ });
+ callback && callback();
+ },
+ onError: function failure(error) {
+ self._logDebug('error', 'Raven transport failed to send: ', error);
+
+ if (error.request) {
+ self._setBackoffState(error.request);
+ }
+
+ self._triggerEvent('failure', {
+ data: data,
+ src: url
+ });
+ error = error || new Error('Raven send failed (no additional details provided)');
+ callback && callback(error);
+ }
+ });
+ },
+
+ _makeRequest: function(opts) {
+ // Auth is intentionally sent as part of query string (NOT as custom HTTP header) to avoid preflight CORS requests
+ var url = opts.url + '?' + urlencode$1(opts.auth);
+
+ var evaluatedHeaders = null;
+ var evaluatedFetchParameters = {};
+
+ if (opts.options.headers) {
+ evaluatedHeaders = this._evaluateHash(opts.options.headers);
+ }
+
+ if (opts.options.fetchParameters) {
+ evaluatedFetchParameters = this._evaluateHash(opts.options.fetchParameters);
+ }
+
+ if (supportsFetch$1()) {
+ evaluatedFetchParameters.body = stringify_1(opts.data);
+
+ var defaultFetchOptions = objectMerge$1({}, this._fetchDefaults);
+ var fetchOptions = objectMerge$1(defaultFetchOptions, evaluatedFetchParameters);
+
+ if (evaluatedHeaders) {
+ fetchOptions.headers = evaluatedHeaders;
+ }
+
+ return _window$2
+ .fetch(url, fetchOptions)
+ .then(function(response) {
+ if (response.ok) {
+ opts.onSuccess && opts.onSuccess();
+ } else {
+ var error = new Error('Sentry error code: ' + response.status);
+ // It's called request only to keep compatibility with XHR interface
+ // and not add more redundant checks in setBackoffState method
+ error.request = response;
+ opts.onError && opts.onError(error);
+ }
+ })
+ ['catch'](function() {
+ opts.onError &&
+ opts.onError(new Error('Sentry error code: network unavailable'));
+ });
+ }
+
+ var request = _window$2.XMLHttpRequest && new _window$2.XMLHttpRequest();
+ if (!request) return;
+
+ // if browser doesn't support CORS (e.g. IE7), we are out of luck
+ var hasCORS = 'withCredentials' in request || typeof XDomainRequest !== 'undefined';
+
+ if (!hasCORS) return;
+
+ if ('withCredentials' in request) {
+ request.onreadystatechange = function() {
+ if (request.readyState !== 4) {
+ return;
+ } else if (request.status === 200) {
+ opts.onSuccess && opts.onSuccess();
+ } else if (opts.onError) {
+ var err = new Error('Sentry error code: ' + request.status);
+ err.request = request;
+ opts.onError(err);
+ }
+ };
+ } else {
+ request = new XDomainRequest();
+ // xdomainrequest cannot go http -> https (or vice versa),
+ // so always use protocol relative
+ url = url.replace(/^https?:/, '');
+
+ // onreadystatechange not supported by XDomainRequest
+ if (opts.onSuccess) {
+ request.onload = opts.onSuccess;
+ }
+ if (opts.onError) {
+ request.onerror = function() {
+ var err = new Error('Sentry error code: XDomainRequest');
+ err.request = request;
+ opts.onError(err);
+ };
+ }
+ }
+
+ request.open('POST', url);
+
+ if (evaluatedHeaders) {
+ each$1(evaluatedHeaders, function(key, value) {
+ request.setRequestHeader(key, value);
+ });
+ }
+
+ request.send(stringify_1(opts.data));
+ },
+
+ _evaluateHash: function(hash) {
+ var evaluated = {};
+
+ for (var key in hash) {
+ if (hash.hasOwnProperty(key)) {
+ var value = hash[key];
+ evaluated[key] = typeof value === 'function' ? value() : value;
+ }
+ }
+
+ return evaluated;
+ },
+
+ _logDebug: function(level) {
+ // We allow `Raven.debug` and `Raven.config(DSN, { debug: true })` to not make backward incompatible API change
+ if (
+ this._originalConsoleMethods[level] &&
+ (this.debug || this._globalOptions.debug)
+ ) {
+ // In IE<10 console methods do not have their own 'apply' method
+ Function.prototype.apply.call(
+ this._originalConsoleMethods[level],
+ this._originalConsole,
+ [].slice.call(arguments, 1)
+ );
+ }
+ },
+
+ _mergeContext: function(key, context) {
+ if (isUndefined$1(context)) {
+ delete this._globalContext[key];
+ } else {
+ this._globalContext[key] = objectMerge$1(this._globalContext[key] || {}, context);
+ }
+ }
+ };
+
+ // Deprecations
+ Raven.prototype.setUser = Raven.prototype.setUserContext;
+ Raven.prototype.setReleaseContext = Raven.prototype.setRelease;
+
+ var raven = Raven;
+
+ /**
+ * Enforces a single instance of the Raven client, and the
+ * main entry point for Raven. If you are a consumer of the
+ * Raven library, you SHOULD load this file (vs raven.js).
+ **/
+
+
+
+ // This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785)
+ var _window$3 =
+ typeof window !== 'undefined'
+ ? window
+ : typeof commonjsGlobal !== 'undefined' ? commonjsGlobal : typeof self !== 'undefined' ? self : {};
+ var _Raven = _window$3.Raven;
+
+ var Raven$1 = new raven();
+
+ /*
+ * Allow multiple versions of Raven to be installed.
+ * Strip Raven from the global context and returns the instance.
+ *
+ * @return {Raven}
+ */
+ Raven$1.noConflict = function() {
+ _window$3.Raven = _Raven;
+ return Raven$1;
+ };
+
+ Raven$1.afterLoad();
+
+ var singleton = Raven$1;
+
+ /**
+ * DISCLAIMER:
+ *
+ * Expose `Client` constructor for cases where user want to track multiple "sub-applications" in one larger app.
+ * It's not meant to be used by a wide audience, so pleaaase make sure that you know what you're doing before using it.
+ * Accidentally calling `install` multiple times, may result in an unexpected behavior that's very hard to debug.
+ *
+ * It's called `Client' to be in-line with Raven Node implementation.
+ *
+ * HOWTO:
+ *
+ * import Raven from 'raven-js';
+ *
+ * const someAppReporter = new Raven.Client();
+ * const someOtherAppReporter = new Raven.Client();
+ *
+ * someAppReporter.config('__DSN__', {
+ * ...config goes here
+ * });
+ *
+ * someOtherAppReporter.config('__OTHER_DSN__', {
+ * ...config goes here
+ * });
+ *
+ * someAppReporter.captureMessage(...);
+ * someAppReporter.captureException(...);
+ * someAppReporter.captureBreadcrumb(...);
+ *
+ * someOtherAppReporter.captureMessage(...);
+ * someOtherAppReporter.captureException(...);
+ * someOtherAppReporter.captureBreadcrumb(...);
+ *
+ * It should "just work".
+ */
+ var Client = raven;
+ singleton.Client = Client;
+
+ // ==========================================================================
+
+ (function () {
+ var isLive = window.location.host === 'plyr.io';
+
+ // Raven / Sentry
+ // For demo site (https://plyr.io) only
+ if (isLive) {
+ singleton.config('https://d4ad9866ad834437a4754e23937071e4@sentry.io/305555').install();
+ }
+
+ document.addEventListener('DOMContentLoaded', function () {
+ singleton.context(function () {
+ if (window.shr) {
+ window.shr.setup({
+ count: {
+ classname: 'button__count'
+ }
+ });
+ }
+
+ // Setup tab focus
+ var tabClassName = 'tab-focus';
+
+ // Remove class on blur
+ document.addEventListener('focusout', function (event) {
+ event.target.classList.remove(tabClassName);
+ });
+
+ // Add classname to tabbed elements
+ document.addEventListener('keydown', function (event) {
+ if (event.keyCode !== 9) {
+ return;
+ }
+
+ // Delay the adding of classname until the focus has changed
+ // This event fires before the focusin event
+ setTimeout(function () {
+ document.activeElement.classList.add(tabClassName);
+ }, 0);
+ });
+
+ // Setup the player
+ var player = new Plyr('#player', {
+ debug: true,
+ title: 'View From A Blue Moon',
+ iconUrl: '../dist/plyr.svg',
+ keyboard: {
+ global: true
+ },
+ tooltips: {
+ controls: true
+ },
+ /* controls: [
+ 'play-large',
+ 'restart',
+ 'rewind',
+ 'play',
+ 'fast-forward',
+ 'progress',
+ 'current-time',
+ 'duration',
+ 'mute',
+ 'volume',
+ 'captions',
+ 'settings',
+ 'pip',
+ 'airplay',
+ 'fullscreen',
+ ], */
+ /* i18n: {
+ restart: '重新開始',
+ rewind: '快退{seektime}秒',
+ play: '播放',
+ pause: '暫停',
+ fastForward: '快進{seektime}秒',
+ seek: '尋求',
+ played: '發揮',
+ buffered: '緩衝的',
+ currentTime: '當前時間戳',
+ duration: '長短',
+ volume: '音量',
+ mute: '靜音',
+ unmute: '取消靜音',
+ enableCaptions: '開啟字幕',
+ disableCaptions: '關閉字幕',
+ enterFullscreen: '進入全螢幕',
+ exitFullscreen: '退出全螢幕',
+ frameTitle: '球員為{title}',
+ captions: '字幕',
+ settings: '設定',
+ speed: '速度',
+ normal: '正常',
+ quality: '質量',
+ loop: '循環',
+ start: 'Start',
+ end: 'End',
+ all: 'All',
+ reset: '重啟',
+ disabled: '殘',
+ enabled: '啟用',
+ advertisement: '廣告',
+ }, */
+ captions: {
+ active: true
+ },
+ keys: {
+ google: 'AIzaSyDrNwtN3nLH_8rjCmu5Wq3ZCm4MNAVdc0c'
+ },
+ ads: {
+ enabled: true,
+ publisherId: '918848828995742'
+ }
+ });
+
+ // Expose for tinkering in the console
+ window.player = player;
+
+ // Setup type toggle
+ var buttons = document.querySelectorAll('[data-source]');
+ var types = {
+ video: 'video',
+ audio: 'audio',
+ youtube: 'youtube',
+ vimeo: 'vimeo'
+ };
+ var currentType = window.location.hash.replace('#', '');
+ var historySupport = window.history && window.history.pushState;
+
+ // Toggle class on an element
+ function toggleClass(element, className, state) {
+ if (element) {
+ element.classList[state ? 'add' : 'remove'](className);
+ }
+ }
+
+ // Set a new source
+ function newSource(type, init) {
+ // Bail if new type isn't known, it's the current type, or current type is empty (video is default) and new type is video
+ if (!(type in types) || !init && type === currentType || !currentType.length && type === types.video) {
+ return;
+ }
+
+ switch (type) {
+ case types.video:
+ player.source = {
+ type: 'video',
+ title: 'View From A Blue Moon',
+ sources: [{
+ src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-576p.mp4',
+ type: 'video/mp4',
+ size: 576
+ }, {
+ src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-720p.mp4',
+ type: 'video/mp4',
+ size: 720
+ }, {
+ src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-1080p.mp4',
+ type: 'video/mp4',
+ size: 1080
+ }, {
+ src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-1440p.mp4',
+ type: 'video/mp4',
+ size: 1440
+ }],
+ poster: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg',
+ tracks: [{
+ kind: 'captions',
+ label: 'English',
+ srclang: 'en',
+ src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt',
+ default: true
+ }, {
+ kind: 'captions',
+ label: 'French',
+ srclang: 'fr',
+ src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt'
+ }]
+ };
+
+ break;
+
+ case types.audio:
+ player.source = {
+ type: 'audio',
+ title: 'Kishi Bashi &ndash; &ldquo;It All Began With A Burst&rdquo;',
+ sources: [{
+ src: 'https://cdn.plyr.io/static/demo/Kishi_Bashi_-_It_All_Began_With_a_Burst.mp3',
+ type: 'audio/mp3'
+ }, {
+ src: 'https://cdn.plyr.io/static/demo/Kishi_Bashi_-_It_All_Began_With_a_Burst.ogg',
+ type: 'audio/ogg'
+ }]
+ };
+
+ break;
+
+ case types.youtube:
+ player.source = {
+ type: 'video',
+ sources: [{
+ src: 'https://youtube.com/watch?v=bTqVqk7FSmY',
+ provider: 'youtube'
+ }]
+ };
+
+ break;
+
+ case types.vimeo:
+ player.source = {
+ type: 'video',
+ sources: [{
+ src: 'https://vimeo.com/76979871',
+ provider: 'vimeo'
+ }]
+ };
+
+ break;
+
+ default:
+ break;
+ }
+
+ // Set the current type for next time
+ currentType = type;
+
+ // Remove active classes
+ Array.from(buttons).forEach(function (button) {
+ return toggleClass(button.parentElement, 'active', false);
+ });
+
+ // Set active on parent
+ toggleClass(document.querySelector('[data-source="' + type + '"]'), 'active', true);
+
+ // Show cite
+ Array.from(document.querySelectorAll('.plyr__cite')).forEach(function (cite) {
+ cite.setAttribute('hidden', '');
+ });
+ document.querySelector('.plyr__cite--' + type).removeAttribute('hidden');
+ }
+
+ // Bind to each button
+ Array.from(buttons).forEach(function (button) {
+ button.addEventListener('click', function () {
+ var type = button.getAttribute('data-source');
+
+ newSource(type);
+
+ if (historySupport) {
+ window.history.pushState({ type: type }, '', '#' + type);
+ }
+ });
+ });
+
+ // List for backwards/forwards
+ window.addEventListener('popstate', function (event) {
+ if (event.state && 'type' in event.state) {
+ newSource(event.state.type);
+ }
+ });
+
+ // On load
+ if (historySupport) {
+ var video = !currentType.length;
+
+ // If there's no current type set, assume video
+ if (video) {
+ currentType = types.video;
+ }
+
+ // Replace current history state
+ if (currentType in types) {
+ window.history.replaceState({
+ type: currentType
+ }, '', video ? '' : '#' + currentType);
+ }
+
+ // If it's not video, load the source
+ if (currentType !== types.video) {
+ newSource(currentType, true);
+ }
+ }
+ });
+ });
+
+ // Google analytics
+ // For demo site (https://plyr.io) only
+ /* eslint-disable */
+ if (isLive) {
+ (function (i, s, o, g, r, a, m) {
+ i.GoogleAnalyticsObject = r;
+ i[r] = i[r] || function () {
+ (i[r].q = i[r].q || []).push(arguments);
+ };
+ i[r].l = 1 * new Date();
+ a = s.createElement(o);
+ m = s.getElementsByTagName(o)[0];
+ a.async = 1;
+ a.src = g;
+ m.parentNode.insertBefore(a, m);
+ })(window, document, 'script', 'https://www.google-analytics.com/analytics.js', 'ga');
+ window.ga('create', 'UA-40881672-11', 'auto');
+ window.ga('send', 'pageview');
+ }
+ /* eslint-enable */
+ })();
}());
diff --git a/demo/dist/demo.js.map b/demo/dist/demo.js.map
index dfa9b3a3..e7a86a63 100644
--- a/demo/dist/demo.js.map
+++ b/demo/dist/demo.js.map
@@ -1 +1 @@
-{"version":3,"sources":["../../../node_modules/raven-js/vendor/json-stringify-safe/stringify.js","../../../node_modules/raven-js/src/utils.js","../../../node_modules/raven-js/vendor/TraceKit/tracekit.js","../../../node_modules/raven-js/vendor/md5/md5.js","../../../node_modules/raven-js/src/configError.js","../../../node_modules/raven-js/src/console.js","../../../node_modules/raven-js/src/raven.js","../../../node_modules/raven-js/src/singleton.js","demo.js"],"names":["global","stringify","_window","isErrorEvent","isDOMError","isDOMException","isError","isObject","isPlainObject","isUndefined","isFunction","isString","isArray","isEmptyObject","each","objectMerge","truncate","objectFrozen","hasKey","joinRegExp","urlencode","uuid4","htmlTreeAsString","isSameException","isSameStacktrace","parseUrl","fill","supportsFetch","supportsReferrerPolicy","serializeKeysForMessage","serializeException","sanitize","require$$0","TraceKit","md5","RavenConfigError","Raven","RavenConstructor","isLive","window","location","host","config","install","addEventListener","context","shr","setup","tabClassName","target","classList","remove","event","keyCode","activeElement","add","player","Plyr","buttons","document","querySelectorAll","types","currentType","hash","replace","historySupport","history","pushState","toggleClass","element","className","state","newSource","type","init","length","video","source","audio","youtube","vimeo","from","forEach","button","parentElement","querySelector","setAttribute","removeAttribute","getAttribute","replaceState","i","s","o","g","r","a","m","GoogleAnalyticsObject","q","push","arguments","l","Date","createElement","getElementsByTagName","async","src","parentNode","insertBefore","ga"],"mappings":"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","file":"demo.js","sourcesContent":["/*\n json-stringify-safe\n Like JSON.stringify, but doesn't throw on circular references.\n\n Originally forked from https://github.com/isaacs/json-stringify-safe\n version 5.0.1 on 3/8/2017 and modified to handle Errors serialization\n and IE8 compatibility. Tests for this are in test/vendor.\n\n ISC license: https://github.com/isaacs/json-stringify-safe/blob/master/LICENSE\n*/\n\nexports = module.exports = stringify;\nexports.getSerialize = serializer;\n\nfunction indexOf(haystack, needle) {\n for (var i = 0; i < haystack.length; ++i) {\n if (haystack[i] === needle) return i;\n }\n return -1;\n}\n\nfunction stringify(obj, replacer, spaces, cycleReplacer) {\n return JSON.stringify(obj, serializer(replacer, cycleReplacer), spaces);\n}\n\n// https://github.com/ftlabs/js-abbreviate/blob/fa709e5f139e7770a71827b1893f22418097fbda/index.js#L95-L106\nfunction stringifyError(value) {\n var err = {\n // These properties are implemented as magical getters and don't show up in for in\n stack: value.stack,\n message: value.message,\n name: value.name\n };\n\n for (var i in value) {\n if (Object.prototype.hasOwnProperty.call(value, i)) {\n err[i] = value[i];\n }\n }\n\n return err;\n}\n\nfunction serializer(replacer, cycleReplacer) {\n var stack = [];\n var keys = [];\n\n if (cycleReplacer == null) {\n cycleReplacer = function(key, value) {\n if (stack[0] === value) {\n return '[Circular ~]';\n }\n return '[Circular ~.' + keys.slice(0, indexOf(stack, value)).join('.') + ']';\n };\n }\n\n return function(key, value) {\n if (stack.length > 0) {\n var thisPos = indexOf(stack, this);\n ~thisPos ? stack.splice(thisPos + 1) : stack.push(this);\n ~thisPos ? keys.splice(thisPos, Infinity, key) : keys.push(key);\n\n if (~indexOf(stack, value)) {\n value = cycleReplacer.call(this, key, value);\n }\n } else {\n stack.push(value);\n }\n\n return replacer == null\n ? value instanceof Error ? stringifyError(value) : value\n : replacer.call(this, key, value);\n };\n}\n","var stringify = require('../vendor/json-stringify-safe/stringify');\n\nvar _window =\n typeof window !== 'undefined'\n ? window\n : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\nfunction isObject(what) {\n return typeof what === 'object' && what !== null;\n}\n\n// Yanked from https://git.io/vS8DV re-used under CC0\n// with some tiny modifications\nfunction isError(value) {\n switch (Object.prototype.toString.call(value)) {\n case '[object Error]':\n return true;\n case '[object Exception]':\n return true;\n case '[object DOMException]':\n return true;\n default:\n return value instanceof Error;\n }\n}\n\nfunction isErrorEvent(value) {\n return Object.prototype.toString.call(value) === '[object ErrorEvent]';\n}\n\nfunction isDOMError(value) {\n return Object.prototype.toString.call(value) === '[object DOMError]';\n}\n\nfunction isDOMException(value) {\n return Object.prototype.toString.call(value) === '[object DOMException]';\n}\n\nfunction isUndefined(what) {\n return what === void 0;\n}\n\nfunction isFunction(what) {\n return typeof what === 'function';\n}\n\nfunction isPlainObject(what) {\n return Object.prototype.toString.call(what) === '[object Object]';\n}\n\nfunction isString(what) {\n return Object.prototype.toString.call(what) === '[object String]';\n}\n\nfunction isArray(what) {\n return Object.prototype.toString.call(what) === '[object Array]';\n}\n\nfunction isEmptyObject(what) {\n if (!isPlainObject(what)) return false;\n\n for (var _ in what) {\n if (what.hasOwnProperty(_)) {\n return false;\n }\n }\n return true;\n}\n\nfunction supportsErrorEvent() {\n try {\n new ErrorEvent(''); // eslint-disable-line no-new\n return true;\n } catch (e) {\n return false;\n }\n}\n\nfunction supportsDOMError() {\n try {\n new DOMError(''); // eslint-disable-line no-new\n return true;\n } catch (e) {\n return false;\n }\n}\n\nfunction supportsDOMException() {\n try {\n new DOMException(''); // eslint-disable-line no-new\n return true;\n } catch (e) {\n return false;\n }\n}\n\nfunction supportsFetch() {\n if (!('fetch' in _window)) return false;\n\n try {\n new Headers(); // eslint-disable-line no-new\n new Request(''); // eslint-disable-line no-new\n new Response(); // eslint-disable-line no-new\n return true;\n } catch (e) {\n return false;\n }\n}\n\n// Despite all stars in the sky saying that Edge supports old draft syntax, aka 'never', 'always', 'origin' and 'default\n// https://caniuse.com/#feat=referrer-policy\n// It doesn't. And it throw exception instead of ignoring this parameter...\n// REF: https://github.com/getsentry/raven-js/issues/1233\nfunction supportsReferrerPolicy() {\n if (!supportsFetch()) return false;\n\n try {\n // eslint-disable-next-line no-new\n new Request('pickleRick', {\n referrerPolicy: 'origin'\n });\n return true;\n } catch (e) {\n return false;\n }\n}\n\nfunction supportsPromiseRejectionEvent() {\n return typeof PromiseRejectionEvent === 'function';\n}\n\nfunction wrappedCallback(callback) {\n function dataCallback(data, original) {\n var normalizedData = callback(data) || data;\n if (original) {\n return original(normalizedData) || normalizedData;\n }\n return normalizedData;\n }\n\n return dataCallback;\n}\n\nfunction each(obj, callback) {\n var i, j;\n\n if (isUndefined(obj.length)) {\n for (i in obj) {\n if (hasKey(obj, i)) {\n callback.call(null, i, obj[i]);\n }\n }\n } else {\n j = obj.length;\n if (j) {\n for (i = 0; i < j; i++) {\n callback.call(null, i, obj[i]);\n }\n }\n }\n}\n\nfunction objectMerge(obj1, obj2) {\n if (!obj2) {\n return obj1;\n }\n each(obj2, function(key, value) {\n obj1[key] = value;\n });\n return obj1;\n}\n\n/**\n * This function is only used for react-native.\n * react-native freezes object that have already been sent over the\n * js bridge. We need this function in order to check if the object is frozen.\n * So it's ok that objectFrozen returns false if Object.isFrozen is not\n * supported because it's not relevant for other \"platforms\". See related issue:\n * https://github.com/getsentry/react-native-sentry/issues/57\n */\nfunction objectFrozen(obj) {\n if (!Object.isFrozen) {\n return false;\n }\n return Object.isFrozen(obj);\n}\n\nfunction truncate(str, max) {\n if (typeof max !== 'number') {\n throw new Error('2nd argument to `truncate` function should be a number');\n }\n if (typeof str !== 'string' || max === 0) {\n return str;\n }\n return str.length <= max ? str : str.substr(0, max) + '\\u2026';\n}\n\n/**\n * hasKey, a better form of hasOwnProperty\n * Example: hasKey(MainHostObject, property) === true/false\n *\n * @param {Object} host object to check property\n * @param {string} key to check\n */\nfunction hasKey(object, key) {\n return Object.prototype.hasOwnProperty.call(object, key);\n}\n\nfunction joinRegExp(patterns) {\n // Combine an array of regular expressions and strings into one large regexp\n // Be mad.\n var sources = [],\n i = 0,\n len = patterns.length,\n pattern;\n\n for (; i < len; i++) {\n pattern = patterns[i];\n if (isString(pattern)) {\n // If it's a string, we need to escape it\n // Taken from: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions\n sources.push(pattern.replace(/([.*+?^=!:${}()|\\[\\]\\/\\\\])/g, '\\\\$1'));\n } else if (pattern && pattern.source) {\n // If it's a regexp already, we want to extract the source\n sources.push(pattern.source);\n }\n // Intentionally skip other cases\n }\n return new RegExp(sources.join('|'), 'i');\n}\n\nfunction urlencode(o) {\n var pairs = [];\n each(o, function(key, value) {\n pairs.push(encodeURIComponent(key) + '=' + encodeURIComponent(value));\n });\n return pairs.join('&');\n}\n\n// borrowed from https://tools.ietf.org/html/rfc3986#appendix-B\n// intentionally using regex and not <a/> href parsing trick because React Native and other\n// environments where DOM might not be available\nfunction parseUrl(url) {\n if (typeof url !== 'string') return {};\n var match = url.match(/^(([^:\\/?#]+):)?(\\/\\/([^\\/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?$/);\n\n // coerce to undefined values to empty string so we don't get 'undefined'\n var query = match[6] || '';\n var fragment = match[8] || '';\n return {\n protocol: match[2],\n host: match[4],\n path: match[5],\n relative: match[5] + query + fragment // everything minus origin\n };\n}\nfunction uuid4() {\n var crypto = _window.crypto || _window.msCrypto;\n\n if (!isUndefined(crypto) && crypto.getRandomValues) {\n // Use window.crypto API if available\n // eslint-disable-next-line no-undef\n var arr = new Uint16Array(8);\n crypto.getRandomValues(arr);\n\n // set 4 in byte 7\n arr[3] = (arr[3] & 0xfff) | 0x4000;\n // set 2 most significant bits of byte 9 to '10'\n arr[4] = (arr[4] & 0x3fff) | 0x8000;\n\n var pad = function(num) {\n var v = num.toString(16);\n while (v.length < 4) {\n v = '0' + v;\n }\n return v;\n };\n\n return (\n pad(arr[0]) +\n pad(arr[1]) +\n pad(arr[2]) +\n pad(arr[3]) +\n pad(arr[4]) +\n pad(arr[5]) +\n pad(arr[6]) +\n pad(arr[7])\n );\n } else {\n // http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#2117523\n return 'xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n var r = (Math.random() * 16) | 0,\n v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n}\n\n/**\n * Given a child DOM element, returns a query-selector statement describing that\n * and its ancestors\n * e.g. [HTMLElement] => body > div > input#foo.btn[name=baz]\n * @param elem\n * @returns {string}\n */\nfunction htmlTreeAsString(elem) {\n /* eslint no-extra-parens:0*/\n var MAX_TRAVERSE_HEIGHT = 5,\n MAX_OUTPUT_LEN = 80,\n out = [],\n height = 0,\n len = 0,\n separator = ' > ',\n sepLength = separator.length,\n nextStr;\n\n while (elem && height++ < MAX_TRAVERSE_HEIGHT) {\n nextStr = htmlElementAsString(elem);\n // bail out if\n // - nextStr is the 'html' element\n // - the length of the string that would be created exceeds MAX_OUTPUT_LEN\n // (ignore this limit if we are on the first iteration)\n if (\n nextStr === 'html' ||\n (height > 1 && len + out.length * sepLength + nextStr.length >= MAX_OUTPUT_LEN)\n ) {\n break;\n }\n\n out.push(nextStr);\n\n len += nextStr.length;\n elem = elem.parentNode;\n }\n\n return out.reverse().join(separator);\n}\n\n/**\n * Returns a simple, query-selector representation of a DOM element\n * e.g. [HTMLElement] => input#foo.btn[name=baz]\n * @param HTMLElement\n * @returns {string}\n */\nfunction htmlElementAsString(elem) {\n var out = [],\n className,\n classes,\n key,\n attr,\n i;\n\n if (!elem || !elem.tagName) {\n return '';\n }\n\n out.push(elem.tagName.toLowerCase());\n if (elem.id) {\n out.push('#' + elem.id);\n }\n\n className = elem.className;\n if (className && isString(className)) {\n classes = className.split(/\\s+/);\n for (i = 0; i < classes.length; i++) {\n out.push('.' + classes[i]);\n }\n }\n var attrWhitelist = ['type', 'name', 'title', 'alt'];\n for (i = 0; i < attrWhitelist.length; i++) {\n key = attrWhitelist[i];\n attr = elem.getAttribute(key);\n if (attr) {\n out.push('[' + key + '=\"' + attr + '\"]');\n }\n }\n return out.join('');\n}\n\n/**\n * Returns true if either a OR b is truthy, but not both\n */\nfunction isOnlyOneTruthy(a, b) {\n return !!(!!a ^ !!b);\n}\n\n/**\n * Returns true if both parameters are undefined\n */\nfunction isBothUndefined(a, b) {\n return isUndefined(a) && isUndefined(b);\n}\n\n/**\n * Returns true if the two input exception interfaces have the same content\n */\nfunction isSameException(ex1, ex2) {\n if (isOnlyOneTruthy(ex1, ex2)) return false;\n\n ex1 = ex1.values[0];\n ex2 = ex2.values[0];\n\n if (ex1.type !== ex2.type || ex1.value !== ex2.value) return false;\n\n // in case both stacktraces are undefined, we can't decide so default to false\n if (isBothUndefined(ex1.stacktrace, ex2.stacktrace)) return false;\n\n return isSameStacktrace(ex1.stacktrace, ex2.stacktrace);\n}\n\n/**\n * Returns true if the two input stack trace interfaces have the same content\n */\nfunction isSameStacktrace(stack1, stack2) {\n if (isOnlyOneTruthy(stack1, stack2)) return false;\n\n var frames1 = stack1.frames;\n var frames2 = stack2.frames;\n\n // Exit early if frame count differs\n if (frames1.length !== frames2.length) return false;\n\n // Iterate through every frame; bail out if anything differs\n var a, b;\n for (var i = 0; i < frames1.length; i++) {\n a = frames1[i];\n b = frames2[i];\n if (\n a.filename !== b.filename ||\n a.lineno !== b.lineno ||\n a.colno !== b.colno ||\n a['function'] !== b['function']\n )\n return false;\n }\n return true;\n}\n\n/**\n * Polyfill a method\n * @param obj object e.g. `document`\n * @param name method name present on object e.g. `addEventListener`\n * @param replacement replacement function\n * @param track {optional} record instrumentation to an array\n */\nfunction fill(obj, name, replacement, track) {\n if (obj == null) return;\n var orig = obj[name];\n obj[name] = replacement(orig);\n obj[name].__raven__ = true;\n obj[name].__orig__ = orig;\n if (track) {\n track.push([obj, name, orig]);\n }\n}\n\n/**\n * Join values in array\n * @param input array of values to be joined together\n * @param delimiter string to be placed in-between values\n * @returns {string}\n */\nfunction safeJoin(input, delimiter) {\n if (!isArray(input)) return '';\n\n var output = [];\n\n for (var i = 0; i < input.length; i++) {\n try {\n output.push(String(input[i]));\n } catch (e) {\n output.push('[value cannot be serialized]');\n }\n }\n\n return output.join(delimiter);\n}\n\n// Default Node.js REPL depth\nvar MAX_SERIALIZE_EXCEPTION_DEPTH = 3;\n// 50kB, as 100kB is max payload size, so half sounds reasonable\nvar MAX_SERIALIZE_EXCEPTION_SIZE = 50 * 1024;\nvar MAX_SERIALIZE_KEYS_LENGTH = 40;\n\nfunction utf8Length(value) {\n return ~-encodeURI(value).split(/%..|./).length;\n}\n\nfunction jsonSize(value) {\n return utf8Length(JSON.stringify(value));\n}\n\nfunction serializeValue(value) {\n if (typeof value === 'string') {\n var maxLength = 40;\n return truncate(value, maxLength);\n } else if (\n typeof value === 'number' ||\n typeof value === 'boolean' ||\n typeof value === 'undefined'\n ) {\n return value;\n }\n\n var type = Object.prototype.toString.call(value);\n\n // Node.js REPL notation\n if (type === '[object Object]') return '[Object]';\n if (type === '[object Array]') return '[Array]';\n if (type === '[object Function]')\n return value.name ? '[Function: ' + value.name + ']' : '[Function]';\n\n return value;\n}\n\nfunction serializeObject(value, depth) {\n if (depth === 0) return serializeValue(value);\n\n if (isPlainObject(value)) {\n return Object.keys(value).reduce(function(acc, key) {\n acc[key] = serializeObject(value[key], depth - 1);\n return acc;\n }, {});\n } else if (Array.isArray(value)) {\n return value.map(function(val) {\n return serializeObject(val, depth - 1);\n });\n }\n\n return serializeValue(value);\n}\n\nfunction serializeException(ex, depth, maxSize) {\n if (!isPlainObject(ex)) return ex;\n\n depth = typeof depth !== 'number' ? MAX_SERIALIZE_EXCEPTION_DEPTH : depth;\n maxSize = typeof depth !== 'number' ? MAX_SERIALIZE_EXCEPTION_SIZE : maxSize;\n\n var serialized = serializeObject(ex, depth);\n\n if (jsonSize(stringify(serialized)) > maxSize) {\n return serializeException(ex, depth - 1);\n }\n\n return serialized;\n}\n\nfunction serializeKeysForMessage(keys, maxLength) {\n if (typeof keys === 'number' || typeof keys === 'string') return keys.toString();\n if (!Array.isArray(keys)) return '';\n\n keys = keys.filter(function(key) {\n return typeof key === 'string';\n });\n if (keys.length === 0) return '[object has no keys]';\n\n maxLength = typeof maxLength !== 'number' ? MAX_SERIALIZE_KEYS_LENGTH : maxLength;\n if (keys[0].length >= maxLength) return keys[0];\n\n for (var usedKeys = keys.length; usedKeys > 0; usedKeys--) {\n var serialized = keys.slice(0, usedKeys).join(', ');\n if (serialized.length > maxLength) continue;\n if (usedKeys === keys.length) return serialized;\n return serialized + '\\u2026';\n }\n\n return '';\n}\n\nfunction sanitize(input, sanitizeKeys) {\n if (!isArray(sanitizeKeys) || (isArray(sanitizeKeys) && sanitizeKeys.length === 0))\n return input;\n\n var sanitizeRegExp = joinRegExp(sanitizeKeys);\n var sanitizeMask = '********';\n var safeInput;\n\n try {\n safeInput = JSON.parse(stringify(input));\n } catch (o_O) {\n return input;\n }\n\n function sanitizeWorker(workerInput) {\n if (isArray(workerInput)) {\n return workerInput.map(function(val) {\n return sanitizeWorker(val);\n });\n }\n\n if (isPlainObject(workerInput)) {\n return Object.keys(workerInput).reduce(function(acc, k) {\n if (sanitizeRegExp.test(k)) {\n acc[k] = sanitizeMask;\n } else {\n acc[k] = sanitizeWorker(workerInput[k]);\n }\n return acc;\n }, {});\n }\n\n return workerInput;\n }\n\n return sanitizeWorker(safeInput);\n}\n\nmodule.exports = {\n isObject: isObject,\n isError: isError,\n isErrorEvent: isErrorEvent,\n isDOMError: isDOMError,\n isDOMException: isDOMException,\n isUndefined: isUndefined,\n isFunction: isFunction,\n isPlainObject: isPlainObject,\n isString: isString,\n isArray: isArray,\n isEmptyObject: isEmptyObject,\n supportsErrorEvent: supportsErrorEvent,\n supportsDOMError: supportsDOMError,\n supportsDOMException: supportsDOMException,\n supportsFetch: supportsFetch,\n supportsReferrerPolicy: supportsReferrerPolicy,\n supportsPromiseRejectionEvent: supportsPromiseRejectionEvent,\n wrappedCallback: wrappedCallback,\n each: each,\n objectMerge: objectMerge,\n truncate: truncate,\n objectFrozen: objectFrozen,\n hasKey: hasKey,\n joinRegExp: joinRegExp,\n urlencode: urlencode,\n uuid4: uuid4,\n htmlTreeAsString: htmlTreeAsString,\n htmlElementAsString: htmlElementAsString,\n isSameException: isSameException,\n isSameStacktrace: isSameStacktrace,\n parseUrl: parseUrl,\n fill: fill,\n safeJoin: safeJoin,\n serializeException: serializeException,\n serializeKeysForMessage: serializeKeysForMessage,\n sanitize: sanitize\n};\n","var utils = require('../../src/utils');\n\n/*\n TraceKit - Cross brower stack traces\n\n This was originally forked from github.com/occ/TraceKit, but has since been\n largely re-written and is now maintained as part of raven-js. Tests for\n this are in test/vendor.\n\n MIT license\n*/\n\nvar TraceKit = {\n collectWindowErrors: true,\n debug: false\n};\n\n// This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785)\nvar _window =\n typeof window !== 'undefined'\n ? window\n : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\n// global reference to slice\nvar _slice = [].slice;\nvar UNKNOWN_FUNCTION = '?';\n\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error#Error_types\nvar ERROR_TYPES_RE = /^(?:[Uu]ncaught (?:exception: )?)?(?:((?:Eval|Internal|Range|Reference|Syntax|Type|URI|)Error): )?(.*)$/;\n\nfunction getLocationHref() {\n if (typeof document === 'undefined' || document.location == null) return '';\n return document.location.href;\n}\n\nfunction getLocationOrigin() {\n if (typeof document === 'undefined' || document.location == null) return '';\n\n // Oh dear IE10...\n if (!document.location.origin) {\n return (\n document.location.protocol +\n '//' +\n document.location.hostname +\n (document.location.port ? ':' + document.location.port : '')\n );\n }\n\n return document.location.origin;\n}\n\n/**\n * TraceKit.report: cross-browser processing of unhandled exceptions\n *\n * Syntax:\n * TraceKit.report.subscribe(function(stackInfo) { ... })\n * TraceKit.report.unsubscribe(function(stackInfo) { ... })\n * TraceKit.report(exception)\n * try { ...code... } catch(ex) { TraceKit.report(ex); }\n *\n * Supports:\n * - Firefox: full stack trace with line numbers, plus column number\n * on top frame; column number is not guaranteed\n * - Opera: full stack trace with line and column numbers\n * - Chrome: full stack trace with line and column numbers\n * - Safari: line and column number for the top frame only; some frames\n * may be missing, and column number is not guaranteed\n * - IE: line and column number for the top frame only; some frames\n * may be missing, and column number is not guaranteed\n *\n * In theory, TraceKit should work on all of the following versions:\n * - IE5.5+ (only 8.0 tested)\n * - Firefox 0.9+ (only 3.5+ tested)\n * - Opera 7+ (only 10.50 tested; versions 9 and earlier may require\n * Exceptions Have Stacktrace to be enabled in opera:config)\n * - Safari 3+ (only 4+ tested)\n * - Chrome 1+ (only 5+ tested)\n * - Konqueror 3.5+ (untested)\n *\n * Requires TraceKit.computeStackTrace.\n *\n * Tries to catch all unhandled exceptions and report them to the\n * subscribed handlers. Please note that TraceKit.report will rethrow the\n * exception. This is REQUIRED in order to get a useful stack trace in IE.\n * If the exception does not reach the top of the browser, you will only\n * get a stack trace from the point where TraceKit.report was called.\n *\n * Handlers receive a stackInfo object as described in the\n * TraceKit.computeStackTrace docs.\n */\nTraceKit.report = (function reportModuleWrapper() {\n var handlers = [],\n lastArgs = null,\n lastException = null,\n lastExceptionStack = null;\n\n /**\n * Add a crash handler.\n * @param {Function} handler\n */\n function subscribe(handler) {\n installGlobalHandler();\n handlers.push(handler);\n }\n\n /**\n * Remove a crash handler.\n * @param {Function} handler\n */\n function unsubscribe(handler) {\n for (var i = handlers.length - 1; i >= 0; --i) {\n if (handlers[i] === handler) {\n handlers.splice(i, 1);\n }\n }\n }\n\n /**\n * Remove all crash handlers.\n */\n function unsubscribeAll() {\n uninstallGlobalHandler();\n handlers = [];\n }\n\n /**\n * Dispatch stack information to all handlers.\n * @param {Object.<string, *>} stack\n */\n function notifyHandlers(stack, isWindowError) {\n var exception = null;\n if (isWindowError && !TraceKit.collectWindowErrors) {\n return;\n }\n for (var i in handlers) {\n if (handlers.hasOwnProperty(i)) {\n try {\n handlers[i].apply(null, [stack].concat(_slice.call(arguments, 2)));\n } catch (inner) {\n exception = inner;\n }\n }\n }\n\n if (exception) {\n throw exception;\n }\n }\n\n var _oldOnerrorHandler, _onErrorHandlerInstalled;\n\n /**\n * Ensures all global unhandled exceptions are recorded.\n * Supported by Gecko and IE.\n * @param {string} msg Error message.\n * @param {string} url URL of script that generated the exception.\n * @param {(number|string)} lineNo The line number at which the error\n * occurred.\n * @param {?(number|string)} colNo The column number at which the error\n * occurred.\n * @param {?Error} ex The actual Error object.\n */\n function traceKitWindowOnError(msg, url, lineNo, colNo, ex) {\n var stack = null;\n // If 'ex' is ErrorEvent, get real Error from inside\n var exception = utils.isErrorEvent(ex) ? ex.error : ex;\n // If 'msg' is ErrorEvent, get real message from inside\n var message = utils.isErrorEvent(msg) ? msg.message : msg;\n\n if (lastExceptionStack) {\n TraceKit.computeStackTrace.augmentStackTraceWithInitialElement(\n lastExceptionStack,\n url,\n lineNo,\n message\n );\n processLastException();\n } else if (exception && utils.isError(exception)) {\n // non-string `exception` arg; attempt to extract stack trace\n\n // New chrome and blink send along a real error object\n // Let's just report that like a normal error.\n // See: https://mikewest.org/2013/08/debugging-runtime-errors-with-window-onerror\n stack = TraceKit.computeStackTrace(exception);\n notifyHandlers(stack, true);\n } else {\n var location = {\n url: url,\n line: lineNo,\n column: colNo\n };\n\n var name = undefined;\n var groups;\n\n if ({}.toString.call(message) === '[object String]') {\n var groups = message.match(ERROR_TYPES_RE);\n if (groups) {\n name = groups[1];\n message = groups[2];\n }\n }\n\n location.func = UNKNOWN_FUNCTION;\n\n stack = {\n name: name,\n message: message,\n url: getLocationHref(),\n stack: [location]\n };\n notifyHandlers(stack, true);\n }\n\n if (_oldOnerrorHandler) {\n return _oldOnerrorHandler.apply(this, arguments);\n }\n\n return false;\n }\n\n function installGlobalHandler() {\n if (_onErrorHandlerInstalled) {\n return;\n }\n _oldOnerrorHandler = _window.onerror;\n _window.onerror = traceKitWindowOnError;\n _onErrorHandlerInstalled = true;\n }\n\n function uninstallGlobalHandler() {\n if (!_onErrorHandlerInstalled) {\n return;\n }\n _window.onerror = _oldOnerrorHandler;\n _onErrorHandlerInstalled = false;\n _oldOnerrorHandler = undefined;\n }\n\n function processLastException() {\n var _lastExceptionStack = lastExceptionStack,\n _lastArgs = lastArgs;\n lastArgs = null;\n lastExceptionStack = null;\n lastException = null;\n notifyHandlers.apply(null, [_lastExceptionStack, false].concat(_lastArgs));\n }\n\n /**\n * Reports an unhandled Error to TraceKit.\n * @param {Error} ex\n * @param {?boolean} rethrow If false, do not re-throw the exception.\n * Only used for window.onerror to not cause an infinite loop of\n * rethrowing.\n */\n function report(ex, rethrow) {\n var args = _slice.call(arguments, 1);\n if (lastExceptionStack) {\n if (lastException === ex) {\n return; // already caught by an inner catch block, ignore\n } else {\n processLastException();\n }\n }\n\n var stack = TraceKit.computeStackTrace(ex);\n lastExceptionStack = stack;\n lastException = ex;\n lastArgs = args;\n\n // If the stack trace is incomplete, wait for 2 seconds for\n // slow slow IE to see if onerror occurs or not before reporting\n // this exception; otherwise, we will end up with an incomplete\n // stack trace\n setTimeout(function() {\n if (lastException === ex) {\n processLastException();\n }\n }, stack.incomplete ? 2000 : 0);\n\n if (rethrow !== false) {\n throw ex; // re-throw to propagate to the top level (and cause window.onerror)\n }\n }\n\n report.subscribe = subscribe;\n report.unsubscribe = unsubscribe;\n report.uninstall = unsubscribeAll;\n return report;\n})();\n\n/**\n * TraceKit.computeStackTrace: cross-browser stack traces in JavaScript\n *\n * Syntax:\n * s = TraceKit.computeStackTrace(exception) // consider using TraceKit.report instead (see below)\n * Returns:\n * s.name - exception name\n * s.message - exception message\n * s.stack[i].url - JavaScript or HTML file URL\n * s.stack[i].func - function name, or empty for anonymous functions (if guessing did not work)\n * s.stack[i].args - arguments passed to the function, if known\n * s.stack[i].line - line number, if known\n * s.stack[i].column - column number, if known\n *\n * Supports:\n * - Firefox: full stack trace with line numbers and unreliable column\n * number on top frame\n * - Opera 10: full stack trace with line and column numbers\n * - Opera 9-: full stack trace with line numbers\n * - Chrome: full stack trace with line and column numbers\n * - Safari: line and column number for the topmost stacktrace element\n * only\n * - IE: no line numbers whatsoever\n *\n * Tries to guess names of anonymous functions by looking for assignments\n * in the source code. In IE and Safari, we have to guess source file names\n * by searching for function bodies inside all page scripts. This will not\n * work for scripts that are loaded cross-domain.\n * Here be dragons: some function names may be guessed incorrectly, and\n * duplicate functions may be mismatched.\n *\n * TraceKit.computeStackTrace should only be used for tracing purposes.\n * Logging of unhandled exceptions should be done with TraceKit.report,\n * which builds on top of TraceKit.computeStackTrace and provides better\n * IE support by utilizing the window.onerror event to retrieve information\n * about the top of the stack.\n *\n * Note: In IE and Safari, no stack trace is recorded on the Error object,\n * so computeStackTrace instead walks its *own* chain of callers.\n * This means that:\n * * in Safari, some methods may be missing from the stack trace;\n * * in IE, the topmost function in the stack trace will always be the\n * caller of computeStackTrace.\n *\n * This is okay for tracing (because you are likely to be calling\n * computeStackTrace from the function you want to be the topmost element\n * of the stack trace anyway), but not okay for logging unhandled\n * exceptions (because your catch block will likely be far away from the\n * inner function that actually caused the exception).\n *\n */\nTraceKit.computeStackTrace = (function computeStackTraceWrapper() {\n // Contents of Exception in various browsers.\n //\n // SAFARI:\n // ex.message = Can't find variable: qq\n // ex.line = 59\n // ex.sourceId = 580238192\n // ex.sourceURL = http://...\n // ex.expressionBeginOffset = 96\n // ex.expressionCaretOffset = 98\n // ex.expressionEndOffset = 98\n // ex.name = ReferenceError\n //\n // FIREFOX:\n // ex.message = qq is not defined\n // ex.fileName = http://...\n // ex.lineNumber = 59\n // ex.columnNumber = 69\n // ex.stack = ...stack trace... (see the example below)\n // ex.name = ReferenceError\n //\n // CHROME:\n // ex.message = qq is not defined\n // ex.name = ReferenceError\n // ex.type = not_defined\n // ex.arguments = ['aa']\n // ex.stack = ...stack trace...\n //\n // INTERNET EXPLORER:\n // ex.message = ...\n // ex.name = ReferenceError\n //\n // OPERA:\n // ex.message = ...message... (see the example below)\n // ex.name = ReferenceError\n // ex.opera#sourceloc = 11 (pretty much useless, duplicates the info in ex.message)\n // ex.stacktrace = n/a; see 'opera:config#UserPrefs|Exceptions Have Stacktrace'\n\n /**\n * Computes stack trace information from the stack property.\n * Chrome and Gecko use this property.\n * @param {Error} ex\n * @return {?Object.<string, *>} Stack trace information.\n */\n function computeStackTraceFromStackProp(ex) {\n if (typeof ex.stack === 'undefined' || !ex.stack) return;\n\n var chrome = /^\\s*at (?:(.*?) ?\\()?((?:file|https?|blob|chrome-extension|native|eval|webpack|<anonymous>|[a-z]:|\\/).*?)(?::(\\d+))?(?::(\\d+))?\\)?\\s*$/i;\n var winjs = /^\\s*at (?:((?:\\[object object\\])?.+) )?\\(?((?:file|ms-appx(?:-web)|https?|webpack|blob):.*?):(\\d+)(?::(\\d+))?\\)?\\s*$/i;\n // NOTE: blob urls are now supposed to always have an origin, therefore it's format\n // which is `blob:http://url/path/with-some-uuid`, is matched by `blob.*?:\\/` as well\n var gecko = /^\\s*(.*?)(?:\\((.*?)\\))?(?:^|@)((?:file|https?|blob|chrome|webpack|resource|moz-extension).*?:\\/.*?|\\[native code\\]|[^@]*bundle)(?::(\\d+))?(?::(\\d+))?\\s*$/i;\n // Used to additionally parse URL/line/column from eval frames\n var geckoEval = /(\\S+) line (\\d+)(?: > eval line \\d+)* > eval/i;\n var chromeEval = /\\((\\S*)(?::(\\d+))(?::(\\d+))\\)/;\n var lines = ex.stack.split('\\n');\n var stack = [];\n var submatch;\n var parts;\n var element;\n var reference = /^(.*) is undefined$/.exec(ex.message);\n\n for (var i = 0, j = lines.length; i < j; ++i) {\n if ((parts = chrome.exec(lines[i]))) {\n var isNative = parts[2] && parts[2].indexOf('native') === 0; // start of line\n var isEval = parts[2] && parts[2].indexOf('eval') === 0; // start of line\n if (isEval && (submatch = chromeEval.exec(parts[2]))) {\n // throw out eval line/column and use top-most line/column number\n parts[2] = submatch[1]; // url\n parts[3] = submatch[2]; // line\n parts[4] = submatch[3]; // column\n }\n element = {\n url: !isNative ? parts[2] : null,\n func: parts[1] || UNKNOWN_FUNCTION,\n args: isNative ? [parts[2]] : [],\n line: parts[3] ? +parts[3] : null,\n column: parts[4] ? +parts[4] : null\n };\n } else if ((parts = winjs.exec(lines[i]))) {\n element = {\n url: parts[2],\n func: parts[1] || UNKNOWN_FUNCTION,\n args: [],\n line: +parts[3],\n column: parts[4] ? +parts[4] : null\n };\n } else if ((parts = gecko.exec(lines[i]))) {\n var isEval = parts[3] && parts[3].indexOf(' > eval') > -1;\n if (isEval && (submatch = geckoEval.exec(parts[3]))) {\n // throw out eval line/column and use top-most line number\n parts[3] = submatch[1];\n parts[4] = submatch[2];\n parts[5] = null; // no column when eval\n } else if (i === 0 && !parts[5] && typeof ex.columnNumber !== 'undefined') {\n // FireFox uses this awesome columnNumber property for its top frame\n // Also note, Firefox's column number is 0-based and everything else expects 1-based,\n // so adding 1\n // NOTE: this hack doesn't work if top-most frame is eval\n stack[0].column = ex.columnNumber + 1;\n }\n element = {\n url: parts[3],\n func: parts[1] || UNKNOWN_FUNCTION,\n args: parts[2] ? parts[2].split(',') : [],\n line: parts[4] ? +parts[4] : null,\n column: parts[5] ? +parts[5] : null\n };\n } else {\n continue;\n }\n\n if (!element.func && element.line) {\n element.func = UNKNOWN_FUNCTION;\n }\n\n if (element.url && element.url.substr(0, 5) === 'blob:') {\n // Special case for handling JavaScript loaded into a blob.\n // We use a synchronous AJAX request here as a blob is already in\n // memory - it's not making a network request. This will generate a warning\n // in the browser console, but there has already been an error so that's not\n // that much of an issue.\n var xhr = new XMLHttpRequest();\n xhr.open('GET', element.url, false);\n xhr.send(null);\n\n // If we failed to download the source, skip this patch\n if (xhr.status === 200) {\n var source = xhr.responseText || '';\n\n // We trim the source down to the last 300 characters as sourceMappingURL is always at the end of the file.\n // Why 300? To be in line with: https://github.com/getsentry/sentry/blob/4af29e8f2350e20c28a6933354e4f42437b4ba42/src/sentry/lang/javascript/processor.py#L164-L175\n source = source.slice(-300);\n\n // Now we dig out the source map URL\n var sourceMaps = source.match(/\\/\\/# sourceMappingURL=(.*)$/);\n\n // If we don't find a source map comment or we find more than one, continue on to the next element.\n if (sourceMaps) {\n var sourceMapAddress = sourceMaps[1];\n\n // Now we check to see if it's a relative URL.\n // If it is, convert it to an absolute one.\n if (sourceMapAddress.charAt(0) === '~') {\n sourceMapAddress = getLocationOrigin() + sourceMapAddress.slice(1);\n }\n\n // Now we strip the '.map' off of the end of the URL and update the\n // element so that Sentry can match the map to the blob.\n element.url = sourceMapAddress.slice(0, -4);\n }\n }\n }\n\n stack.push(element);\n }\n\n if (!stack.length) {\n return null;\n }\n\n return {\n name: ex.name,\n message: ex.message,\n url: getLocationHref(),\n stack: stack\n };\n }\n\n /**\n * Adds information about the first frame to incomplete stack traces.\n * Safari and IE require this to get complete data on the first frame.\n * @param {Object.<string, *>} stackInfo Stack trace information from\n * one of the compute* methods.\n * @param {string} url The URL of the script that caused an error.\n * @param {(number|string)} lineNo The line number of the script that\n * caused an error.\n * @param {string=} message The error generated by the browser, which\n * hopefully contains the name of the object that caused the error.\n * @return {boolean} Whether or not the stack information was\n * augmented.\n */\n function augmentStackTraceWithInitialElement(stackInfo, url, lineNo, message) {\n var initial = {\n url: url,\n line: lineNo\n };\n\n if (initial.url && initial.line) {\n stackInfo.incomplete = false;\n\n if (!initial.func) {\n initial.func = UNKNOWN_FUNCTION;\n }\n\n if (stackInfo.stack.length > 0) {\n if (stackInfo.stack[0].url === initial.url) {\n if (stackInfo.stack[0].line === initial.line) {\n return false; // already in stack trace\n } else if (\n !stackInfo.stack[0].line &&\n stackInfo.stack[0].func === initial.func\n ) {\n stackInfo.stack[0].line = initial.line;\n return false;\n }\n }\n }\n\n stackInfo.stack.unshift(initial);\n stackInfo.partial = true;\n return true;\n } else {\n stackInfo.incomplete = true;\n }\n\n return false;\n }\n\n /**\n * Computes stack trace information by walking the arguments.caller\n * chain at the time the exception occurred. This will cause earlier\n * frames to be missed but is the only way to get any stack trace in\n * Safari and IE. The top frame is restored by\n * {@link augmentStackTraceWithInitialElement}.\n * @param {Error} ex\n * @return {?Object.<string, *>} Stack trace information.\n */\n function computeStackTraceByWalkingCallerChain(ex, depth) {\n var functionName = /function\\s+([_$a-zA-Z\\xA0-\\uFFFF][_$a-zA-Z0-9\\xA0-\\uFFFF]*)?\\s*\\(/i,\n stack = [],\n funcs = {},\n recursion = false,\n parts,\n item,\n source;\n\n for (\n var curr = computeStackTraceByWalkingCallerChain.caller;\n curr && !recursion;\n curr = curr.caller\n ) {\n if (curr === computeStackTrace || curr === TraceKit.report) {\n // console.log('skipping internal function');\n continue;\n }\n\n item = {\n url: null,\n func: UNKNOWN_FUNCTION,\n line: null,\n column: null\n };\n\n if (curr.name) {\n item.func = curr.name;\n } else if ((parts = functionName.exec(curr.toString()))) {\n item.func = parts[1];\n }\n\n if (typeof item.func === 'undefined') {\n try {\n item.func = parts.input.substring(0, parts.input.indexOf('{'));\n } catch (e) {}\n }\n\n if (funcs['' + curr]) {\n recursion = true;\n } else {\n funcs['' + curr] = true;\n }\n\n stack.push(item);\n }\n\n if (depth) {\n // console.log('depth is ' + depth);\n // console.log('stack is ' + stack.length);\n stack.splice(0, depth);\n }\n\n var result = {\n name: ex.name,\n message: ex.message,\n url: getLocationHref(),\n stack: stack\n };\n augmentStackTraceWithInitialElement(\n result,\n ex.sourceURL || ex.fileName,\n ex.line || ex.lineNumber,\n ex.message || ex.description\n );\n return result;\n }\n\n /**\n * Computes a stack trace for an exception.\n * @param {Error} ex\n * @param {(string|number)=} depth\n */\n function computeStackTrace(ex, depth) {\n var stack = null;\n depth = depth == null ? 0 : +depth;\n\n try {\n stack = computeStackTraceFromStackProp(ex);\n if (stack) {\n return stack;\n }\n } catch (e) {\n if (TraceKit.debug) {\n throw e;\n }\n }\n\n try {\n stack = computeStackTraceByWalkingCallerChain(ex, depth + 1);\n if (stack) {\n return stack;\n }\n } catch (e) {\n if (TraceKit.debug) {\n throw e;\n }\n }\n return {\n name: ex.name,\n message: ex.message,\n url: getLocationHref()\n };\n }\n\n computeStackTrace.augmentStackTraceWithInitialElement = augmentStackTraceWithInitialElement;\n computeStackTrace.computeStackTraceFromStackProp = computeStackTraceFromStackProp;\n\n return computeStackTrace;\n})();\n\nmodule.exports = TraceKit;\n","/*\n * JavaScript MD5\n * https://github.com/blueimp/JavaScript-MD5\n *\n * Copyright 2011, Sebastian Tschan\n * https://blueimp.net\n *\n * Licensed under the MIT license:\n * https://opensource.org/licenses/MIT\n *\n * Based on\n * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message\n * Digest Algorithm, as defined in RFC 1321.\n * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009\n * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet\n * Distributed under the BSD License\n * See http://pajhome.org.uk/crypt/md5 for more info.\n */\n\n/*\n* Add integers, wrapping at 2^32. This uses 16-bit operations internally\n* to work around bugs in some JS interpreters.\n*/\nfunction safeAdd(x, y) {\n var lsw = (x & 0xffff) + (y & 0xffff);\n var msw = (x >> 16) + (y >> 16) + (lsw >> 16);\n return (msw << 16) | (lsw & 0xffff);\n}\n\n/*\n* Bitwise rotate a 32-bit number to the left.\n*/\nfunction bitRotateLeft(num, cnt) {\n return (num << cnt) | (num >>> (32 - cnt));\n}\n\n/*\n* These functions implement the four basic operations the algorithm uses.\n*/\nfunction md5cmn(q, a, b, x, s, t) {\n return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b);\n}\nfunction md5ff(a, b, c, d, x, s, t) {\n return md5cmn((b & c) | (~b & d), a, b, x, s, t);\n}\nfunction md5gg(a, b, c, d, x, s, t) {\n return md5cmn((b & d) | (c & ~d), a, b, x, s, t);\n}\nfunction md5hh(a, b, c, d, x, s, t) {\n return md5cmn(b ^ c ^ d, a, b, x, s, t);\n}\nfunction md5ii(a, b, c, d, x, s, t) {\n return md5cmn(c ^ (b | ~d), a, b, x, s, t);\n}\n\n/*\n* Calculate the MD5 of an array of little-endian words, and a bit length.\n*/\nfunction binlMD5(x, len) {\n /* append padding */\n x[len >> 5] |= 0x80 << (len % 32);\n x[(((len + 64) >>> 9) << 4) + 14] = len;\n\n var i;\n var olda;\n var oldb;\n var oldc;\n var oldd;\n var a = 1732584193;\n var b = -271733879;\n var c = -1732584194;\n var d = 271733878;\n\n for (i = 0; i < x.length; i += 16) {\n olda = a;\n oldb = b;\n oldc = c;\n oldd = d;\n\n a = md5ff(a, b, c, d, x[i], 7, -680876936);\n d = md5ff(d, a, b, c, x[i + 1], 12, -389564586);\n c = md5ff(c, d, a, b, x[i + 2], 17, 606105819);\n b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330);\n a = md5ff(a, b, c, d, x[i + 4], 7, -176418897);\n d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426);\n c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341);\n b = md5ff(b, c, d, a, x[i + 7], 22, -45705983);\n a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416);\n d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417);\n c = md5ff(c, d, a, b, x[i + 10], 17, -42063);\n b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162);\n a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682);\n d = md5ff(d, a, b, c, x[i + 13], 12, -40341101);\n c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290);\n b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329);\n\n a = md5gg(a, b, c, d, x[i + 1], 5, -165796510);\n d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632);\n c = md5gg(c, d, a, b, x[i + 11], 14, 643717713);\n b = md5gg(b, c, d, a, x[i], 20, -373897302);\n a = md5gg(a, b, c, d, x[i + 5], 5, -701558691);\n d = md5gg(d, a, b, c, x[i + 10], 9, 38016083);\n c = md5gg(c, d, a, b, x[i + 15], 14, -660478335);\n b = md5gg(b, c, d, a, x[i + 4], 20, -405537848);\n a = md5gg(a, b, c, d, x[i + 9], 5, 568446438);\n d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690);\n c = md5gg(c, d, a, b, x[i + 3], 14, -187363961);\n b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501);\n a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467);\n d = md5gg(d, a, b, c, x[i + 2], 9, -51403784);\n c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473);\n b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734);\n\n a = md5hh(a, b, c, d, x[i + 5], 4, -378558);\n d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463);\n c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562);\n b = md5hh(b, c, d, a, x[i + 14], 23, -35309556);\n a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060);\n d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353);\n c = md5hh(c, d, a, b, x[i + 7], 16, -155497632);\n b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640);\n a = md5hh(a, b, c, d, x[i + 13], 4, 681279174);\n d = md5hh(d, a, b, c, x[i], 11, -358537222);\n c = md5hh(c, d, a, b, x[i + 3], 16, -722521979);\n b = md5hh(b, c, d, a, x[i + 6], 23, 76029189);\n a = md5hh(a, b, c, d, x[i + 9], 4, -640364487);\n d = md5hh(d, a, b, c, x[i + 12], 11, -421815835);\n c = md5hh(c, d, a, b, x[i + 15], 16, 530742520);\n b = md5hh(b, c, d, a, x[i + 2], 23, -995338651);\n\n a = md5ii(a, b, c, d, x[i], 6, -198630844);\n d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415);\n c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905);\n b = md5ii(b, c, d, a, x[i + 5], 21, -57434055);\n a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571);\n d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606);\n c = md5ii(c, d, a, b, x[i + 10], 15, -1051523);\n b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799);\n a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359);\n d = md5ii(d, a, b, c, x[i + 15], 10, -30611744);\n c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380);\n b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649);\n a = md5ii(a, b, c, d, x[i + 4], 6, -145523070);\n d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379);\n c = md5ii(c, d, a, b, x[i + 2], 15, 718787259);\n b = md5ii(b, c, d, a, x[i + 9], 21, -343485551);\n\n a = safeAdd(a, olda);\n b = safeAdd(b, oldb);\n c = safeAdd(c, oldc);\n d = safeAdd(d, oldd);\n }\n return [a, b, c, d];\n}\n\n/*\n* Convert an array of little-endian words to a string\n*/\nfunction binl2rstr(input) {\n var i;\n var output = '';\n var length32 = input.length * 32;\n for (i = 0; i < length32; i += 8) {\n output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xff);\n }\n return output;\n}\n\n/*\n* Convert a raw string to an array of little-endian words\n* Characters >255 have their high-byte silently ignored.\n*/\nfunction rstr2binl(input) {\n var i;\n var output = [];\n output[(input.length >> 2) - 1] = undefined;\n for (i = 0; i < output.length; i += 1) {\n output[i] = 0;\n }\n var length8 = input.length * 8;\n for (i = 0; i < length8; i += 8) {\n output[i >> 5] |= (input.charCodeAt(i / 8) & 0xff) << (i % 32);\n }\n return output;\n}\n\n/*\n* Calculate the MD5 of a raw string\n*/\nfunction rstrMD5(s) {\n return binl2rstr(binlMD5(rstr2binl(s), s.length * 8));\n}\n\n/*\n* Calculate the HMAC-MD5, of a key and some data (raw strings)\n*/\nfunction rstrHMACMD5(key, data) {\n var i;\n var bkey = rstr2binl(key);\n var ipad = [];\n var opad = [];\n var hash;\n ipad[15] = opad[15] = undefined;\n if (bkey.length > 16) {\n bkey = binlMD5(bkey, key.length * 8);\n }\n for (i = 0; i < 16; i += 1) {\n ipad[i] = bkey[i] ^ 0x36363636;\n opad[i] = bkey[i] ^ 0x5c5c5c5c;\n }\n hash = binlMD5(ipad.concat(rstr2binl(data)), 512 + data.length * 8);\n return binl2rstr(binlMD5(opad.concat(hash), 512 + 128));\n}\n\n/*\n* Convert a raw string to a hex string\n*/\nfunction rstr2hex(input) {\n var hexTab = '0123456789abcdef';\n var output = '';\n var x;\n var i;\n for (i = 0; i < input.length; i += 1) {\n x = input.charCodeAt(i);\n output += hexTab.charAt((x >>> 4) & 0x0f) + hexTab.charAt(x & 0x0f);\n }\n return output;\n}\n\n/*\n* Encode a string as utf-8\n*/\nfunction str2rstrUTF8(input) {\n return unescape(encodeURIComponent(input));\n}\n\n/*\n* Take string arguments and return either raw or hex encoded strings\n*/\nfunction rawMD5(s) {\n return rstrMD5(str2rstrUTF8(s));\n}\nfunction hexMD5(s) {\n return rstr2hex(rawMD5(s));\n}\nfunction rawHMACMD5(k, d) {\n return rstrHMACMD5(str2rstrUTF8(k), str2rstrUTF8(d));\n}\nfunction hexHMACMD5(k, d) {\n return rstr2hex(rawHMACMD5(k, d));\n}\n\nfunction md5(string, key, raw) {\n if (!key) {\n if (!raw) {\n return hexMD5(string);\n }\n return rawMD5(string);\n }\n if (!raw) {\n return hexHMACMD5(key, string);\n }\n return rawHMACMD5(key, string);\n}\n\nmodule.exports = md5;\n","function RavenConfigError(message) {\n this.name = 'RavenConfigError';\n this.message = message;\n}\nRavenConfigError.prototype = new Error();\nRavenConfigError.prototype.constructor = RavenConfigError;\n\nmodule.exports = RavenConfigError;\n","var utils = require('./utils');\n\nvar wrapMethod = function(console, level, callback) {\n var originalConsoleLevel = console[level];\n var originalConsole = console;\n\n if (!(level in console)) {\n return;\n }\n\n var sentryLevel = level === 'warn' ? 'warning' : level;\n\n console[level] = function() {\n var args = [].slice.call(arguments);\n\n var msg = utils.safeJoin(args, ' ');\n var data = {level: sentryLevel, logger: 'console', extra: {arguments: args}};\n\n if (level === 'assert') {\n if (args[0] === false) {\n // Default browsers message\n msg =\n 'Assertion failed: ' + (utils.safeJoin(args.slice(1), ' ') || 'console.assert');\n data.extra.arguments = args.slice(1);\n callback && callback(msg, data);\n }\n } else {\n callback && callback(msg, data);\n }\n\n // this fails for some browsers. :(\n if (originalConsoleLevel) {\n // IE9 doesn't allow calling apply on console functions directly\n // See: https://stackoverflow.com/questions/5472938/does-ie9-support-console-log-and-is-it-a-real-function#answer-5473193\n Function.prototype.apply.call(originalConsoleLevel, originalConsole, args);\n }\n };\n};\n\nmodule.exports = {\n wrapMethod: wrapMethod\n};\n","/*global XDomainRequest:false */\n\nvar TraceKit = require('../vendor/TraceKit/tracekit');\nvar stringify = require('../vendor/json-stringify-safe/stringify');\nvar md5 = require('../vendor/md5/md5');\nvar RavenConfigError = require('./configError');\n\nvar utils = require('./utils');\nvar isErrorEvent = utils.isErrorEvent;\nvar isDOMError = utils.isDOMError;\nvar isDOMException = utils.isDOMException;\nvar isError = utils.isError;\nvar isObject = utils.isObject;\nvar isPlainObject = utils.isPlainObject;\nvar isUndefined = utils.isUndefined;\nvar isFunction = utils.isFunction;\nvar isString = utils.isString;\nvar isArray = utils.isArray;\nvar isEmptyObject = utils.isEmptyObject;\nvar each = utils.each;\nvar objectMerge = utils.objectMerge;\nvar truncate = utils.truncate;\nvar objectFrozen = utils.objectFrozen;\nvar hasKey = utils.hasKey;\nvar joinRegExp = utils.joinRegExp;\nvar urlencode = utils.urlencode;\nvar uuid4 = utils.uuid4;\nvar htmlTreeAsString = utils.htmlTreeAsString;\nvar isSameException = utils.isSameException;\nvar isSameStacktrace = utils.isSameStacktrace;\nvar parseUrl = utils.parseUrl;\nvar fill = utils.fill;\nvar supportsFetch = utils.supportsFetch;\nvar supportsReferrerPolicy = utils.supportsReferrerPolicy;\nvar serializeKeysForMessage = utils.serializeKeysForMessage;\nvar serializeException = utils.serializeException;\nvar sanitize = utils.sanitize;\n\nvar wrapConsoleMethod = require('./console').wrapMethod;\n\nvar dsnKeys = 'source protocol user pass host port path'.split(' '),\n dsnPattern = /^(?:(\\w+):)?\\/\\/(?:(\\w+)(:\\w+)?@)?([\\w\\.-]+)(?::(\\d+))?(\\/.*)/;\n\nfunction now() {\n return +new Date();\n}\n\n// This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785)\nvar _window =\n typeof window !== 'undefined'\n ? window\n : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\nvar _document = _window.document;\nvar _navigator = _window.navigator;\n\nfunction keepOriginalCallback(original, callback) {\n return isFunction(callback)\n ? function(data) {\n return callback(data, original);\n }\n : callback;\n}\n\n// First, check for JSON support\n// If there is no JSON, we no-op the core features of Raven\n// since JSON is required to encode the payload\nfunction Raven() {\n this._hasJSON = !!(typeof JSON === 'object' && JSON.stringify);\n // Raven can run in contexts where there's no document (react-native)\n this._hasDocument = !isUndefined(_document);\n this._hasNavigator = !isUndefined(_navigator);\n this._lastCapturedException = null;\n this._lastData = null;\n this._lastEventId = null;\n this._globalServer = null;\n this._globalKey = null;\n this._globalProject = null;\n this._globalContext = {};\n this._globalOptions = {\n // SENTRY_RELEASE can be injected by https://github.com/getsentry/sentry-webpack-plugin\n release: _window.SENTRY_RELEASE && _window.SENTRY_RELEASE.id,\n logger: 'javascript',\n ignoreErrors: [],\n ignoreUrls: [],\n whitelistUrls: [],\n includePaths: [],\n headers: null,\n collectWindowErrors: true,\n captureUnhandledRejections: true,\n maxMessageLength: 0,\n // By default, truncates URL values to 250 chars\n maxUrlLength: 250,\n stackTraceLimit: 50,\n autoBreadcrumbs: true,\n instrument: true,\n sampleRate: 1,\n sanitizeKeys: []\n };\n this._fetchDefaults = {\n method: 'POST',\n keepalive: true,\n // Despite all stars in the sky saying that Edge supports old draft syntax, aka 'never', 'always', 'origin' and 'default\n // https://caniuse.com/#feat=referrer-policy\n // It doesn't. And it throw exception instead of ignoring this parameter...\n // REF: https://github.com/getsentry/raven-js/issues/1233\n referrerPolicy: supportsReferrerPolicy() ? 'origin' : ''\n };\n this._ignoreOnError = 0;\n this._isRavenInstalled = false;\n this._originalErrorStackTraceLimit = Error.stackTraceLimit;\n // capture references to window.console *and* all its methods first\n // before the console plugin has a chance to monkey patch\n this._originalConsole = _window.console || {};\n this._originalConsoleMethods = {};\n this._plugins = [];\n this._startTime = now();\n this._wrappedBuiltIns = [];\n this._breadcrumbs = [];\n this._lastCapturedEvent = null;\n this._keypressTimeout;\n this._location = _window.location;\n this._lastHref = this._location && this._location.href;\n this._resetBackoff();\n\n // eslint-disable-next-line guard-for-in\n for (var method in this._originalConsole) {\n this._originalConsoleMethods[method] = this._originalConsole[method];\n }\n}\n\n/*\n * The core Raven singleton\n *\n * @this {Raven}\n */\n\nRaven.prototype = {\n // Hardcode version string so that raven source can be loaded directly via\n // webpack (using a build step causes webpack #1617). Grunt verifies that\n // this value matches package.json during build.\n // See: https://github.com/getsentry/raven-js/issues/465\n VERSION: '3.26.1',\n\n debug: false,\n\n TraceKit: TraceKit, // alias to TraceKit\n\n /*\n * Configure Raven with a DSN and extra options\n *\n * @param {string} dsn The public Sentry DSN\n * @param {object} options Set of global options [optional]\n * @return {Raven}\n */\n config: function(dsn, options) {\n var self = this;\n\n if (self._globalServer) {\n this._logDebug('error', 'Error: Raven has already been configured');\n return self;\n }\n if (!dsn) return self;\n\n var globalOptions = self._globalOptions;\n\n // merge in options\n if (options) {\n each(options, function(key, value) {\n // tags and extra are special and need to be put into context\n if (key === 'tags' || key === 'extra' || key === 'user') {\n self._globalContext[key] = value;\n } else {\n globalOptions[key] = value;\n }\n });\n }\n\n self.setDSN(dsn);\n\n // \"Script error.\" is hard coded into browsers for errors that it can't read.\n // this is the result of a script being pulled in from an external domain and CORS.\n globalOptions.ignoreErrors.push(/^Script error\\.?$/);\n globalOptions.ignoreErrors.push(/^Javascript error: Script error\\.? on line 0$/);\n\n // join regexp rules into one big rule\n globalOptions.ignoreErrors = joinRegExp(globalOptions.ignoreErrors);\n globalOptions.ignoreUrls = globalOptions.ignoreUrls.length\n ? joinRegExp(globalOptions.ignoreUrls)\n : false;\n globalOptions.whitelistUrls = globalOptions.whitelistUrls.length\n ? joinRegExp(globalOptions.whitelistUrls)\n : false;\n globalOptions.includePaths = joinRegExp(globalOptions.includePaths);\n globalOptions.maxBreadcrumbs = Math.max(\n 0,\n Math.min(globalOptions.maxBreadcrumbs || 100, 100)\n ); // default and hard limit is 100\n\n var autoBreadcrumbDefaults = {\n xhr: true,\n console: true,\n dom: true,\n location: true,\n sentry: true\n };\n\n var autoBreadcrumbs = globalOptions.autoBreadcrumbs;\n if ({}.toString.call(autoBreadcrumbs) === '[object Object]') {\n autoBreadcrumbs = objectMerge(autoBreadcrumbDefaults, autoBreadcrumbs);\n } else if (autoBreadcrumbs !== false) {\n autoBreadcrumbs = autoBreadcrumbDefaults;\n }\n globalOptions.autoBreadcrumbs = autoBreadcrumbs;\n\n var instrumentDefaults = {\n tryCatch: true\n };\n\n var instrument = globalOptions.instrument;\n if ({}.toString.call(instrument) === '[object Object]') {\n instrument = objectMerge(instrumentDefaults, instrument);\n } else if (instrument !== false) {\n instrument = instrumentDefaults;\n }\n globalOptions.instrument = instrument;\n\n TraceKit.collectWindowErrors = !!globalOptions.collectWindowErrors;\n\n // return for chaining\n return self;\n },\n\n /*\n * Installs a global window.onerror error handler\n * to capture and report uncaught exceptions.\n * At this point, install() is required to be called due\n * to the way TraceKit is set up.\n *\n * @return {Raven}\n */\n install: function() {\n var self = this;\n if (self.isSetup() && !self._isRavenInstalled) {\n TraceKit.report.subscribe(function() {\n self._handleOnErrorStackInfo.apply(self, arguments);\n });\n\n if (self._globalOptions.captureUnhandledRejections) {\n self._attachPromiseRejectionHandler();\n }\n\n self._patchFunctionToString();\n\n if (self._globalOptions.instrument && self._globalOptions.instrument.tryCatch) {\n self._instrumentTryCatch();\n }\n\n if (self._globalOptions.autoBreadcrumbs) self._instrumentBreadcrumbs();\n\n // Install all of the plugins\n self._drainPlugins();\n\n self._isRavenInstalled = true;\n }\n\n Error.stackTraceLimit = self._globalOptions.stackTraceLimit;\n return this;\n },\n\n /*\n * Set the DSN (can be called multiple time unlike config)\n *\n * @param {string} dsn The public Sentry DSN\n */\n setDSN: function(dsn) {\n var self = this,\n uri = self._parseDSN(dsn),\n lastSlash = uri.path.lastIndexOf('/'),\n path = uri.path.substr(1, lastSlash);\n\n self._dsn = dsn;\n self._globalKey = uri.user;\n self._globalSecret = uri.pass && uri.pass.substr(1);\n self._globalProject = uri.path.substr(lastSlash + 1);\n\n self._globalServer = self._getGlobalServer(uri);\n\n self._globalEndpoint =\n self._globalServer + '/' + path + 'api/' + self._globalProject + '/store/';\n\n // Reset backoff state since we may be pointing at a\n // new project/server\n this._resetBackoff();\n },\n\n /*\n * Wrap code within a context so Raven can capture errors\n * reliably across domains that is executed immediately.\n *\n * @param {object} options A specific set of options for this context [optional]\n * @param {function} func The callback to be immediately executed within the context\n * @param {array} args An array of arguments to be called with the callback [optional]\n */\n context: function(options, func, args) {\n if (isFunction(options)) {\n args = func || [];\n func = options;\n options = {};\n }\n\n return this.wrap(options, func).apply(this, args);\n },\n\n /*\n * Wrap code within a context and returns back a new function to be executed\n *\n * @param {object} options A specific set of options for this context [optional]\n * @param {function} func The function to be wrapped in a new context\n * @param {function} _before A function to call before the try/catch wrapper [optional, private]\n * @return {function} The newly wrapped functions with a context\n */\n wrap: function(options, func, _before) {\n var self = this;\n // 1 argument has been passed, and it's not a function\n // so just return it\n if (isUndefined(func) && !isFunction(options)) {\n return options;\n }\n\n // options is optional\n if (isFunction(options)) {\n func = options;\n options = undefined;\n }\n\n // At this point, we've passed along 2 arguments, and the second one\n // is not a function either, so we'll just return the second argument.\n if (!isFunction(func)) {\n return func;\n }\n\n // We don't wanna wrap it twice!\n try {\n if (func.__raven__) {\n return func;\n }\n\n // If this has already been wrapped in the past, return that\n if (func.__raven_wrapper__) {\n return func.__raven_wrapper__;\n }\n } catch (e) {\n // Just accessing custom props in some Selenium environments\n // can cause a \"Permission denied\" exception (see raven-js#495).\n // Bail on wrapping and return the function as-is (defers to window.onerror).\n return func;\n }\n\n function wrapped() {\n var args = [],\n i = arguments.length,\n deep = !options || (options && options.deep !== false);\n\n if (_before && isFunction(_before)) {\n _before.apply(this, arguments);\n }\n\n // Recursively wrap all of a function's arguments that are\n // functions themselves.\n while (i--) args[i] = deep ? self.wrap(options, arguments[i]) : arguments[i];\n\n try {\n // Attempt to invoke user-land function\n // NOTE: If you are a Sentry user, and you are seeing this stack frame, it\n // means Raven caught an error invoking your application code. This is\n // expected behavior and NOT indicative of a bug with Raven.js.\n return func.apply(this, args);\n } catch (e) {\n self._ignoreNextOnError();\n self.captureException(e, options);\n throw e;\n }\n }\n\n // copy over properties of the old function\n for (var property in func) {\n if (hasKey(func, property)) {\n wrapped[property] = func[property];\n }\n }\n wrapped.prototype = func.prototype;\n\n func.__raven_wrapper__ = wrapped;\n // Signal that this function has been wrapped/filled already\n // for both debugging and to prevent it to being wrapped/filled twice\n wrapped.__raven__ = true;\n wrapped.__orig__ = func;\n\n return wrapped;\n },\n\n /**\n * Uninstalls the global error handler.\n *\n * @return {Raven}\n */\n uninstall: function() {\n TraceKit.report.uninstall();\n\n this._detachPromiseRejectionHandler();\n this._unpatchFunctionToString();\n this._restoreBuiltIns();\n this._restoreConsole();\n\n Error.stackTraceLimit = this._originalErrorStackTraceLimit;\n this._isRavenInstalled = false;\n\n return this;\n },\n\n /**\n * Callback used for `unhandledrejection` event\n *\n * @param {PromiseRejectionEvent} event An object containing\n * promise: the Promise that was rejected\n * reason: the value with which the Promise was rejected\n * @return void\n */\n _promiseRejectionHandler: function(event) {\n this._logDebug('debug', 'Raven caught unhandled promise rejection:', event);\n this.captureException(event.reason, {\n mechanism: {\n type: 'onunhandledrejection',\n handled: false\n }\n });\n },\n\n /**\n * Installs the global promise rejection handler.\n *\n * @return {raven}\n */\n _attachPromiseRejectionHandler: function() {\n this._promiseRejectionHandler = this._promiseRejectionHandler.bind(this);\n _window.addEventListener &&\n _window.addEventListener('unhandledrejection', this._promiseRejectionHandler);\n return this;\n },\n\n /**\n * Uninstalls the global promise rejection handler.\n *\n * @return {raven}\n */\n _detachPromiseRejectionHandler: function() {\n _window.removeEventListener &&\n _window.removeEventListener('unhandledrejection', this._promiseRejectionHandler);\n return this;\n },\n\n /**\n * Manually capture an exception and send it over to Sentry\n *\n * @param {error} ex An exception to be logged\n * @param {object} options A specific set of options for this error [optional]\n * @return {Raven}\n */\n captureException: function(ex, options) {\n options = objectMerge({trimHeadFrames: 0}, options ? options : {});\n\n if (isErrorEvent(ex) && ex.error) {\n // If it is an ErrorEvent with `error` property, extract it to get actual Error\n ex = ex.error;\n } else if (isDOMError(ex) || isDOMException(ex)) {\n // If it is a DOMError or DOMException (which are legacy APIs, but still supported in some browsers)\n // then we just extract the name and message, as they don't provide anything else\n // https://developer.mozilla.org/en-US/docs/Web/API/DOMError\n // https://developer.mozilla.org/en-US/docs/Web/API/DOMException\n var name = ex.name || (isDOMError(ex) ? 'DOMError' : 'DOMException');\n var message = ex.message ? name + ': ' + ex.message : name;\n\n return this.captureMessage(\n message,\n objectMerge(options, {\n // neither DOMError or DOMException provide stack trace and we most likely wont get it this way as well\n // but it's barely any overhead so we may at least try\n stacktrace: true,\n trimHeadFrames: options.trimHeadFrames + 1\n })\n );\n } else if (isError(ex)) {\n // we have a real Error object\n ex = ex;\n } else if (isPlainObject(ex)) {\n // If it is plain Object, serialize it manually and extract options\n // This will allow us to group events based on top-level keys\n // which is much better than creating new group when any key/value change\n options = this._getCaptureExceptionOptionsFromPlainObject(options, ex);\n ex = new Error(options.message);\n } else {\n // If none of previous checks were valid, then it means that\n // it's not a DOMError/DOMException\n // it's not a plain Object\n // it's not a valid ErrorEvent (one with an error property)\n // it's not an Error\n // So bail out and capture it as a simple message:\n return this.captureMessage(\n ex,\n objectMerge(options, {\n stacktrace: true, // if we fall back to captureMessage, default to attempting a new trace\n trimHeadFrames: options.trimHeadFrames + 1\n })\n );\n }\n\n // Store the raw exception object for potential debugging and introspection\n this._lastCapturedException = ex;\n\n // TraceKit.report will re-raise any exception passed to it,\n // which means you have to wrap it in try/catch. Instead, we\n // can wrap it here and only re-raise if TraceKit.report\n // raises an exception different from the one we asked to\n // report on.\n try {\n var stack = TraceKit.computeStackTrace(ex);\n this._handleStackInfo(stack, options);\n } catch (ex1) {\n if (ex !== ex1) {\n throw ex1;\n }\n }\n\n return this;\n },\n\n _getCaptureExceptionOptionsFromPlainObject: function(currentOptions, ex) {\n var exKeys = Object.keys(ex).sort();\n var options = objectMerge(currentOptions, {\n message:\n 'Non-Error exception captured with keys: ' + serializeKeysForMessage(exKeys),\n fingerprint: [md5(exKeys)],\n extra: currentOptions.extra || {}\n });\n options.extra.__serialized__ = serializeException(ex);\n\n return options;\n },\n\n /*\n * Manually send a message to Sentry\n *\n * @param {string} msg A plain message to be captured in Sentry\n * @param {object} options A specific set of options for this message [optional]\n * @return {Raven}\n */\n captureMessage: function(msg, options) {\n // config() automagically converts ignoreErrors from a list to a RegExp so we need to test for an\n // early call; we'll error on the side of logging anything called before configuration since it's\n // probably something you should see:\n if (\n !!this._globalOptions.ignoreErrors.test &&\n this._globalOptions.ignoreErrors.test(msg)\n ) {\n return;\n }\n\n options = options || {};\n msg = msg + ''; // Make sure it's actually a string\n\n var data = objectMerge(\n {\n message: msg\n },\n options\n );\n\n var ex;\n // Generate a \"synthetic\" stack trace from this point.\n // NOTE: If you are a Sentry user, and you are seeing this stack frame, it is NOT indicative\n // of a bug with Raven.js. Sentry generates synthetic traces either by configuration,\n // or if it catches a thrown object without a \"stack\" property.\n try {\n throw new Error(msg);\n } catch (ex1) {\n ex = ex1;\n }\n\n // null exception name so `Error` isn't prefixed to msg\n ex.name = null;\n var stack = TraceKit.computeStackTrace(ex);\n\n // stack[0] is `throw new Error(msg)` call itself, we are interested in the frame that was just before that, stack[1]\n var initialCall = isArray(stack.stack) && stack.stack[1];\n\n // if stack[1] is `Raven.captureException`, it means that someone passed a string to it and we redirected that call\n // to be handled by `captureMessage`, thus `initialCall` is the 3rd one, not 2nd\n // initialCall => captureException(string) => captureMessage(string)\n if (initialCall && initialCall.func === 'Raven.captureException') {\n initialCall = stack.stack[2];\n }\n\n var fileurl = (initialCall && initialCall.url) || '';\n\n if (\n !!this._globalOptions.ignoreUrls.test &&\n this._globalOptions.ignoreUrls.test(fileurl)\n ) {\n return;\n }\n\n if (\n !!this._globalOptions.whitelistUrls.test &&\n !this._globalOptions.whitelistUrls.test(fileurl)\n ) {\n return;\n }\n\n if (this._globalOptions.stacktrace || (options && options.stacktrace)) {\n // fingerprint on msg, not stack trace (legacy behavior, could be revisited)\n data.fingerprint = data.fingerprint == null ? msg : data.fingerprint;\n\n options = objectMerge(\n {\n trimHeadFrames: 0\n },\n options\n );\n // Since we know this is a synthetic trace, the top frame (this function call)\n // MUST be from Raven.js, so mark it for trimming\n // We add to the trim counter so that callers can choose to trim extra frames, such\n // as utility functions.\n options.trimHeadFrames += 1;\n\n var frames = this._prepareFrames(stack, options);\n data.stacktrace = {\n // Sentry expects frames oldest to newest\n frames: frames.reverse()\n };\n }\n\n // Make sure that fingerprint is always wrapped in an array\n if (data.fingerprint) {\n data.fingerprint = isArray(data.fingerprint)\n ? data.fingerprint\n : [data.fingerprint];\n }\n\n // Fire away!\n this._send(data);\n\n return this;\n },\n\n captureBreadcrumb: function(obj) {\n var crumb = objectMerge(\n {\n timestamp: now() / 1000\n },\n obj\n );\n\n if (isFunction(this._globalOptions.breadcrumbCallback)) {\n var result = this._globalOptions.breadcrumbCallback(crumb);\n\n if (isObject(result) && !isEmptyObject(result)) {\n crumb = result;\n } else if (result === false) {\n return this;\n }\n }\n\n this._breadcrumbs.push(crumb);\n if (this._breadcrumbs.length > this._globalOptions.maxBreadcrumbs) {\n this._breadcrumbs.shift();\n }\n return this;\n },\n\n addPlugin: function(plugin /*arg1, arg2, ... argN*/) {\n var pluginArgs = [].slice.call(arguments, 1);\n\n this._plugins.push([plugin, pluginArgs]);\n if (this._isRavenInstalled) {\n this._drainPlugins();\n }\n\n return this;\n },\n\n /*\n * Set/clear a user to be sent along with the payload.\n *\n * @param {object} user An object representing user data [optional]\n * @return {Raven}\n */\n setUserContext: function(user) {\n // Intentionally do not merge here since that's an unexpected behavior.\n this._globalContext.user = user;\n\n return this;\n },\n\n /*\n * Merge extra attributes to be sent along with the payload.\n *\n * @param {object} extra An object representing extra data [optional]\n * @return {Raven}\n */\n setExtraContext: function(extra) {\n this._mergeContext('extra', extra);\n\n return this;\n },\n\n /*\n * Merge tags to be sent along with the payload.\n *\n * @param {object} tags An object representing tags [optional]\n * @return {Raven}\n */\n setTagsContext: function(tags) {\n this._mergeContext('tags', tags);\n\n return this;\n },\n\n /*\n * Clear all of the context.\n *\n * @return {Raven}\n */\n clearContext: function() {\n this._globalContext = {};\n\n return this;\n },\n\n /*\n * Get a copy of the current context. This cannot be mutated.\n *\n * @return {object} copy of context\n */\n getContext: function() {\n // lol javascript\n return JSON.parse(stringify(this._globalContext));\n },\n\n /*\n * Set environment of application\n *\n * @param {string} environment Typically something like 'production'.\n * @return {Raven}\n */\n setEnvironment: function(environment) {\n this._globalOptions.environment = environment;\n\n return this;\n },\n\n /*\n * Set release version of application\n *\n * @param {string} release Typically something like a git SHA to identify version\n * @return {Raven}\n */\n setRelease: function(release) {\n this._globalOptions.release = release;\n\n return this;\n },\n\n /*\n * Set the dataCallback option\n *\n * @param {function} callback The callback to run which allows the\n * data blob to be mutated before sending\n * @return {Raven}\n */\n setDataCallback: function(callback) {\n var original = this._globalOptions.dataCallback;\n this._globalOptions.dataCallback = keepOriginalCallback(original, callback);\n return this;\n },\n\n /*\n * Set the breadcrumbCallback option\n *\n * @param {function} callback The callback to run which allows filtering\n * or mutating breadcrumbs\n * @return {Raven}\n */\n setBreadcrumbCallback: function(callback) {\n var original = this._globalOptions.breadcrumbCallback;\n this._globalOptions.breadcrumbCallback = keepOriginalCallback(original, callback);\n return this;\n },\n\n /*\n * Set the shouldSendCallback option\n *\n * @param {function} callback The callback to run which allows\n * introspecting the blob before sending\n * @return {Raven}\n */\n setShouldSendCallback: function(callback) {\n var original = this._globalOptions.shouldSendCallback;\n this._globalOptions.shouldSendCallback = keepOriginalCallback(original, callback);\n return this;\n },\n\n /**\n * Override the default HTTP transport mechanism that transmits data\n * to the Sentry server.\n *\n * @param {function} transport Function invoked instead of the default\n * `makeRequest` handler.\n *\n * @return {Raven}\n */\n setTransport: function(transport) {\n this._globalOptions.transport = transport;\n\n return this;\n },\n\n /*\n * Get the latest raw exception that was captured by Raven.\n *\n * @return {error}\n */\n lastException: function() {\n return this._lastCapturedException;\n },\n\n /*\n * Get the last event id\n *\n * @return {string}\n */\n lastEventId: function() {\n return this._lastEventId;\n },\n\n /*\n * Determine if Raven is setup and ready to go.\n *\n * @return {boolean}\n */\n isSetup: function() {\n if (!this._hasJSON) return false; // needs JSON support\n if (!this._globalServer) {\n if (!this.ravenNotConfiguredError) {\n this.ravenNotConfiguredError = true;\n this._logDebug('error', 'Error: Raven has not been configured.');\n }\n return false;\n }\n return true;\n },\n\n afterLoad: function() {\n // TODO: remove window dependence?\n\n // Attempt to initialize Raven on load\n var RavenConfig = _window.RavenConfig;\n if (RavenConfig) {\n this.config(RavenConfig.dsn, RavenConfig.config).install();\n }\n },\n\n showReportDialog: function(options) {\n if (\n !_document // doesn't work without a document (React native)\n )\n return;\n\n options = options || {};\n\n var lastEventId = options.eventId || this.lastEventId();\n if (!lastEventId) {\n throw new RavenConfigError('Missing eventId');\n }\n\n var dsn = options.dsn || this._dsn;\n if (!dsn) {\n throw new RavenConfigError('Missing DSN');\n }\n\n var encode = encodeURIComponent;\n var qs = '';\n qs += '?eventId=' + encode(lastEventId);\n qs += '&dsn=' + encode(dsn);\n\n var user = options.user || this._globalContext.user;\n if (user) {\n if (user.name) qs += '&name=' + encode(user.name);\n if (user.email) qs += '&email=' + encode(user.email);\n }\n\n var globalServer = this._getGlobalServer(this._parseDSN(dsn));\n\n var script = _document.createElement('script');\n script.async = true;\n script.src = globalServer + '/api/embed/error-page/' + qs;\n (_document.head || _document.body).appendChild(script);\n },\n\n /**** Private functions ****/\n _ignoreNextOnError: function() {\n var self = this;\n this._ignoreOnError += 1;\n setTimeout(function() {\n // onerror should trigger before setTimeout\n self._ignoreOnError -= 1;\n });\n },\n\n _triggerEvent: function(eventType, options) {\n // NOTE: `event` is a native browser thing, so let's avoid conflicting wiht it\n var evt, key;\n\n if (!this._hasDocument) return;\n\n options = options || {};\n\n eventType = 'raven' + eventType.substr(0, 1).toUpperCase() + eventType.substr(1);\n\n if (_document.createEvent) {\n evt = _document.createEvent('HTMLEvents');\n evt.initEvent(eventType, true, true);\n } else {\n evt = _document.createEventObject();\n evt.eventType = eventType;\n }\n\n for (key in options)\n if (hasKey(options, key)) {\n evt[key] = options[key];\n }\n\n if (_document.createEvent) {\n // IE9 if standards\n _document.dispatchEvent(evt);\n } else {\n // IE8 regardless of Quirks or Standards\n // IE9 if quirks\n try {\n _document.fireEvent('on' + evt.eventType.toLowerCase(), evt);\n } catch (e) {\n // Do nothing\n }\n }\n },\n\n /**\n * Wraps addEventListener to capture UI breadcrumbs\n * @param evtName the event name (e.g. \"click\")\n * @returns {Function}\n * @private\n */\n _breadcrumbEventHandler: function(evtName) {\n var self = this;\n return function(evt) {\n // reset keypress timeout; e.g. triggering a 'click' after\n // a 'keypress' will reset the keypress debounce so that a new\n // set of keypresses can be recorded\n self._keypressTimeout = null;\n\n // It's possible this handler might trigger multiple times for the same\n // event (e.g. event propagation through node ancestors). Ignore if we've\n // already captured the event.\n if (self._lastCapturedEvent === evt) return;\n\n self._lastCapturedEvent = evt;\n\n // try/catch both:\n // - accessing evt.target (see getsentry/raven-js#838, #768)\n // - `htmlTreeAsString` because it's complex, and just accessing the DOM incorrectly\n // can throw an exception in some circumstances.\n var target;\n try {\n target = htmlTreeAsString(evt.target);\n } catch (e) {\n target = '<unknown>';\n }\n\n self.captureBreadcrumb({\n category: 'ui.' + evtName, // e.g. ui.click, ui.input\n message: target\n });\n };\n },\n\n /**\n * Wraps addEventListener to capture keypress UI events\n * @returns {Function}\n * @private\n */\n _keypressEventHandler: function() {\n var self = this,\n debounceDuration = 1000; // milliseconds\n\n // TODO: if somehow user switches keypress target before\n // debounce timeout is triggered, we will only capture\n // a single breadcrumb from the FIRST target (acceptable?)\n return function(evt) {\n var target;\n try {\n target = evt.target;\n } catch (e) {\n // just accessing event properties can throw an exception in some rare circumstances\n // see: https://github.com/getsentry/raven-js/issues/838\n return;\n }\n var tagName = target && target.tagName;\n\n // only consider keypress events on actual input elements\n // this will disregard keypresses targeting body (e.g. tabbing\n // through elements, hotkeys, etc)\n if (\n !tagName ||\n (tagName !== 'INPUT' && tagName !== 'TEXTAREA' && !target.isContentEditable)\n )\n return;\n\n // record first keypress in a series, but ignore subsequent\n // keypresses until debounce clears\n var timeout = self._keypressTimeout;\n if (!timeout) {\n self._breadcrumbEventHandler('input')(evt);\n }\n clearTimeout(timeout);\n self._keypressTimeout = setTimeout(function() {\n self._keypressTimeout = null;\n }, debounceDuration);\n };\n },\n\n /**\n * Captures a breadcrumb of type \"navigation\", normalizing input URLs\n * @param to the originating URL\n * @param from the target URL\n * @private\n */\n _captureUrlChange: function(from, to) {\n var parsedLoc = parseUrl(this._location.href);\n var parsedTo = parseUrl(to);\n var parsedFrom = parseUrl(from);\n\n // because onpopstate only tells you the \"new\" (to) value of location.href, and\n // not the previous (from) value, we need to track the value of the current URL\n // state ourselves\n this._lastHref = to;\n\n // Use only the path component of the URL if the URL matches the current\n // document (almost all the time when using pushState)\n if (parsedLoc.protocol === parsedTo.protocol && parsedLoc.host === parsedTo.host)\n to = parsedTo.relative;\n if (parsedLoc.protocol === parsedFrom.protocol && parsedLoc.host === parsedFrom.host)\n from = parsedFrom.relative;\n\n this.captureBreadcrumb({\n category: 'navigation',\n data: {\n to: to,\n from: from\n }\n });\n },\n\n _patchFunctionToString: function() {\n var self = this;\n self._originalFunctionToString = Function.prototype.toString;\n // eslint-disable-next-line no-extend-native\n Function.prototype.toString = function() {\n if (typeof this === 'function' && this.__raven__) {\n return self._originalFunctionToString.apply(this.__orig__, arguments);\n }\n return self._originalFunctionToString.apply(this, arguments);\n };\n },\n\n _unpatchFunctionToString: function() {\n if (this._originalFunctionToString) {\n // eslint-disable-next-line no-extend-native\n Function.prototype.toString = this._originalFunctionToString;\n }\n },\n\n /**\n * Wrap timer functions and event targets to catch errors and provide\n * better metadata.\n */\n _instrumentTryCatch: function() {\n var self = this;\n\n var wrappedBuiltIns = self._wrappedBuiltIns;\n\n function wrapTimeFn(orig) {\n return function(fn, t) {\n // preserve arity\n // Make a copy of the arguments to prevent deoptimization\n // https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#32-leaking-arguments\n var args = new Array(arguments.length);\n for (var i = 0; i < args.length; ++i) {\n args[i] = arguments[i];\n }\n var originalCallback = args[0];\n if (isFunction(originalCallback)) {\n args[0] = self.wrap(\n {\n mechanism: {\n type: 'instrument',\n data: {function: orig.name}\n }\n },\n originalCallback\n );\n }\n\n // IE < 9 doesn't support .call/.apply on setInterval/setTimeout, but it\n // also supports only two arguments and doesn't care what this is, so we\n // can just call the original function directly.\n if (orig.apply) {\n return orig.apply(this, args);\n } else {\n return orig(args[0], args[1]);\n }\n };\n }\n\n var autoBreadcrumbs = this._globalOptions.autoBreadcrumbs;\n\n function wrapEventTarget(global) {\n var proto = _window[global] && _window[global].prototype;\n if (proto && proto.hasOwnProperty && proto.hasOwnProperty('addEventListener')) {\n fill(\n proto,\n 'addEventListener',\n function(orig) {\n return function(evtName, fn, capture, secure) {\n // preserve arity\n try {\n if (fn && fn.handleEvent) {\n fn.handleEvent = self.wrap(\n {\n mechanism: {\n type: 'instrument',\n data: {target: global, function: 'handleEvent', handler: fn.name}\n }\n },\n fn.handleEvent\n );\n }\n } catch (err) {\n // can sometimes get 'Permission denied to access property \"handle Event'\n }\n\n // More breadcrumb DOM capture ... done here and not in `_instrumentBreadcrumbs`\n // so that we don't have more than one wrapper function\n var before, clickHandler, keypressHandler;\n\n if (\n autoBreadcrumbs &&\n autoBreadcrumbs.dom &&\n (global === 'EventTarget' || global === 'Node')\n ) {\n // NOTE: generating multiple handlers per addEventListener invocation, should\n // revisit and verify we can just use one (almost certainly)\n clickHandler = self._breadcrumbEventHandler('click');\n keypressHandler = self._keypressEventHandler();\n before = function(evt) {\n // need to intercept every DOM event in `before` argument, in case that\n // same wrapped method is re-used for different events (e.g. mousemove THEN click)\n // see #724\n if (!evt) return;\n\n var eventType;\n try {\n eventType = evt.type;\n } catch (e) {\n // just accessing event properties can throw an exception in some rare circumstances\n // see: https://github.com/getsentry/raven-js/issues/838\n return;\n }\n if (eventType === 'click') return clickHandler(evt);\n else if (eventType === 'keypress') return keypressHandler(evt);\n };\n }\n return orig.call(\n this,\n evtName,\n self.wrap(\n {\n mechanism: {\n type: 'instrument',\n data: {\n target: global,\n function: 'addEventListener',\n handler: fn.name\n }\n }\n },\n fn,\n before\n ),\n capture,\n secure\n );\n };\n },\n wrappedBuiltIns\n );\n fill(\n proto,\n 'removeEventListener',\n function(orig) {\n return function(evt, fn, capture, secure) {\n try {\n fn = fn && (fn.__raven_wrapper__ ? fn.__raven_wrapper__ : fn);\n } catch (e) {\n // ignore, accessing __raven_wrapper__ will throw in some Selenium environments\n }\n return orig.call(this, evt, fn, capture, secure);\n };\n },\n wrappedBuiltIns\n );\n }\n }\n\n fill(_window, 'setTimeout', wrapTimeFn, wrappedBuiltIns);\n fill(_window, 'setInterval', wrapTimeFn, wrappedBuiltIns);\n if (_window.requestAnimationFrame) {\n fill(\n _window,\n 'requestAnimationFrame',\n function(orig) {\n return function(cb) {\n return orig(\n self.wrap(\n {\n mechanism: {\n type: 'instrument',\n data: {function: 'requestAnimationFrame', handler: orig.name}\n }\n },\n cb\n )\n );\n };\n },\n wrappedBuiltIns\n );\n }\n\n // event targets borrowed from bugsnag-js:\n // https://github.com/bugsnag/bugsnag-js/blob/master/src/bugsnag.js#L666\n var eventTargets = [\n 'EventTarget',\n 'Window',\n 'Node',\n 'ApplicationCache',\n 'AudioTrackList',\n 'ChannelMergerNode',\n 'CryptoOperation',\n 'EventSource',\n 'FileReader',\n 'HTMLUnknownElement',\n 'IDBDatabase',\n 'IDBRequest',\n 'IDBTransaction',\n 'KeyOperation',\n 'MediaController',\n 'MessagePort',\n 'ModalWindow',\n 'Notification',\n 'SVGElementInstance',\n 'Screen',\n 'TextTrack',\n 'TextTrackCue',\n 'TextTrackList',\n 'WebSocket',\n 'WebSocketWorker',\n 'Worker',\n 'XMLHttpRequest',\n 'XMLHttpRequestEventTarget',\n 'XMLHttpRequestUpload'\n ];\n for (var i = 0; i < eventTargets.length; i++) {\n wrapEventTarget(eventTargets[i]);\n }\n },\n\n /**\n * Instrument browser built-ins w/ breadcrumb capturing\n * - XMLHttpRequests\n * - DOM interactions (click/typing)\n * - window.location changes\n * - console\n *\n * Can be disabled or individually configured via the `autoBreadcrumbs` config option\n */\n _instrumentBreadcrumbs: function() {\n var self = this;\n var autoBreadcrumbs = this._globalOptions.autoBreadcrumbs;\n\n var wrappedBuiltIns = self._wrappedBuiltIns;\n\n function wrapProp(prop, xhr) {\n if (prop in xhr && isFunction(xhr[prop])) {\n fill(xhr, prop, function(orig) {\n return self.wrap(\n {\n mechanism: {\n type: 'instrument',\n data: {function: prop, handler: orig.name}\n }\n },\n orig\n );\n }); // intentionally don't track filled methods on XHR instances\n }\n }\n\n if (autoBreadcrumbs.xhr && 'XMLHttpRequest' in _window) {\n var xhrproto = _window.XMLHttpRequest && _window.XMLHttpRequest.prototype;\n fill(\n xhrproto,\n 'open',\n function(origOpen) {\n return function(method, url) {\n // preserve arity\n\n // if Sentry key appears in URL, don't capture\n if (isString(url) && url.indexOf(self._globalKey) === -1) {\n this.__raven_xhr = {\n method: method,\n url: url,\n status_code: null\n };\n }\n\n return origOpen.apply(this, arguments);\n };\n },\n wrappedBuiltIns\n );\n\n fill(\n xhrproto,\n 'send',\n function(origSend) {\n return function() {\n // preserve arity\n var xhr = this;\n\n function onreadystatechangeHandler() {\n if (xhr.__raven_xhr && xhr.readyState === 4) {\n try {\n // touching statusCode in some platforms throws\n // an exception\n xhr.__raven_xhr.status_code = xhr.status;\n } catch (e) {\n /* do nothing */\n }\n\n self.captureBreadcrumb({\n type: 'http',\n category: 'xhr',\n data: xhr.__raven_xhr\n });\n }\n }\n\n var props = ['onload', 'onerror', 'onprogress'];\n for (var j = 0; j < props.length; j++) {\n wrapProp(props[j], xhr);\n }\n\n if ('onreadystatechange' in xhr && isFunction(xhr.onreadystatechange)) {\n fill(\n xhr,\n 'onreadystatechange',\n function(orig) {\n return self.wrap(\n {\n mechanism: {\n type: 'instrument',\n data: {\n function: 'onreadystatechange',\n handler: orig.name\n }\n }\n },\n orig,\n onreadystatechangeHandler\n );\n } /* intentionally don't track this instrumentation */\n );\n } else {\n // if onreadystatechange wasn't actually set by the page on this xhr, we\n // are free to set our own and capture the breadcrumb\n xhr.onreadystatechange = onreadystatechangeHandler;\n }\n\n return origSend.apply(this, arguments);\n };\n },\n wrappedBuiltIns\n );\n }\n\n if (autoBreadcrumbs.xhr && supportsFetch()) {\n fill(\n _window,\n 'fetch',\n function(origFetch) {\n return function() {\n // preserve arity\n // Make a copy of the arguments to prevent deoptimization\n // https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#32-leaking-arguments\n var args = new Array(arguments.length);\n for (var i = 0; i < args.length; ++i) {\n args[i] = arguments[i];\n }\n\n var fetchInput = args[0];\n var method = 'GET';\n var url;\n\n if (typeof fetchInput === 'string') {\n url = fetchInput;\n } else if ('Request' in _window && fetchInput instanceof _window.Request) {\n url = fetchInput.url;\n if (fetchInput.method) {\n method = fetchInput.method;\n }\n } else {\n url = '' + fetchInput;\n }\n\n // if Sentry key appears in URL, don't capture, as it's our own request\n if (url.indexOf(self._globalKey) !== -1) {\n return origFetch.apply(this, args);\n }\n\n if (args[1] && args[1].method) {\n method = args[1].method;\n }\n\n var fetchData = {\n method: method,\n url: url,\n status_code: null\n };\n\n return origFetch\n .apply(this, args)\n .then(function(response) {\n fetchData.status_code = response.status;\n\n self.captureBreadcrumb({\n type: 'http',\n category: 'fetch',\n data: fetchData\n });\n\n return response;\n })\n ['catch'](function(err) {\n // if there is an error performing the request\n self.captureBreadcrumb({\n type: 'http',\n category: 'fetch',\n data: fetchData,\n level: 'error'\n });\n\n throw err;\n });\n };\n },\n wrappedBuiltIns\n );\n }\n\n // Capture breadcrumbs from any click that is unhandled / bubbled up all the way\n // to the document. Do this before we instrument addEventListener.\n if (autoBreadcrumbs.dom && this._hasDocument) {\n if (_document.addEventListener) {\n _document.addEventListener('click', self._breadcrumbEventHandler('click'), false);\n _document.addEventListener('keypress', self._keypressEventHandler(), false);\n } else if (_document.attachEvent) {\n // IE8 Compatibility\n _document.attachEvent('onclick', self._breadcrumbEventHandler('click'));\n _document.attachEvent('onkeypress', self._keypressEventHandler());\n }\n }\n\n // record navigation (URL) changes\n // NOTE: in Chrome App environment, touching history.pushState, *even inside\n // a try/catch block*, will cause Chrome to output an error to console.error\n // borrowed from: https://github.com/angular/angular.js/pull/13945/files\n var chrome = _window.chrome;\n var isChromePackagedApp = chrome && chrome.app && chrome.app.runtime;\n var hasPushAndReplaceState =\n !isChromePackagedApp &&\n _window.history &&\n _window.history.pushState &&\n _window.history.replaceState;\n if (autoBreadcrumbs.location && hasPushAndReplaceState) {\n // TODO: remove onpopstate handler on uninstall()\n var oldOnPopState = _window.onpopstate;\n _window.onpopstate = function() {\n var currentHref = self._location.href;\n self._captureUrlChange(self._lastHref, currentHref);\n\n if (oldOnPopState) {\n return oldOnPopState.apply(this, arguments);\n }\n };\n\n var historyReplacementFunction = function(origHistFunction) {\n // note history.pushState.length is 0; intentionally not declaring\n // params to preserve 0 arity\n return function(/* state, title, url */) {\n var url = arguments.length > 2 ? arguments[2] : undefined;\n\n // url argument is optional\n if (url) {\n // coerce to string (this is what pushState does)\n self._captureUrlChange(self._lastHref, url + '');\n }\n\n return origHistFunction.apply(this, arguments);\n };\n };\n\n fill(_window.history, 'pushState', historyReplacementFunction, wrappedBuiltIns);\n fill(_window.history, 'replaceState', historyReplacementFunction, wrappedBuiltIns);\n }\n\n if (autoBreadcrumbs.console && 'console' in _window && console.log) {\n // console\n var consoleMethodCallback = function(msg, data) {\n self.captureBreadcrumb({\n message: msg,\n level: data.level,\n category: 'console'\n });\n };\n\n each(['debug', 'info', 'warn', 'error', 'log'], function(_, level) {\n wrapConsoleMethod(console, level, consoleMethodCallback);\n });\n }\n },\n\n _restoreBuiltIns: function() {\n // restore any wrapped builtins\n var builtin;\n while (this._wrappedBuiltIns.length) {\n builtin = this._wrappedBuiltIns.shift();\n\n var obj = builtin[0],\n name = builtin[1],\n orig = builtin[2];\n\n obj[name] = orig;\n }\n },\n\n _restoreConsole: function() {\n // eslint-disable-next-line guard-for-in\n for (var method in this._originalConsoleMethods) {\n this._originalConsole[method] = this._originalConsoleMethods[method];\n }\n },\n\n _drainPlugins: function() {\n var self = this;\n\n // FIX ME TODO\n each(this._plugins, function(_, plugin) {\n var installer = plugin[0];\n var args = plugin[1];\n installer.apply(self, [self].concat(args));\n });\n },\n\n _parseDSN: function(str) {\n var m = dsnPattern.exec(str),\n dsn = {},\n i = 7;\n\n try {\n while (i--) dsn[dsnKeys[i]] = m[i] || '';\n } catch (e) {\n throw new RavenConfigError('Invalid DSN: ' + str);\n }\n\n if (dsn.pass && !this._globalOptions.allowSecretKey) {\n throw new RavenConfigError(\n 'Do not specify your secret key in the DSN. See: http://bit.ly/raven-secret-key'\n );\n }\n\n return dsn;\n },\n\n _getGlobalServer: function(uri) {\n // assemble the endpoint from the uri pieces\n var globalServer = '//' + uri.host + (uri.port ? ':' + uri.port : '');\n\n if (uri.protocol) {\n globalServer = uri.protocol + ':' + globalServer;\n }\n return globalServer;\n },\n\n _handleOnErrorStackInfo: function(stackInfo, options) {\n options = options || {};\n options.mechanism = options.mechanism || {\n type: 'onerror',\n handled: false\n };\n\n // if we are intentionally ignoring errors via onerror, bail out\n if (!this._ignoreOnError) {\n this._handleStackInfo(stackInfo, options);\n }\n },\n\n _handleStackInfo: function(stackInfo, options) {\n var frames = this._prepareFrames(stackInfo, options);\n\n this._triggerEvent('handle', {\n stackInfo: stackInfo,\n options: options\n });\n\n this._processException(\n stackInfo.name,\n stackInfo.message,\n stackInfo.url,\n stackInfo.lineno,\n frames,\n options\n );\n },\n\n _prepareFrames: function(stackInfo, options) {\n var self = this;\n var frames = [];\n if (stackInfo.stack && stackInfo.stack.length) {\n each(stackInfo.stack, function(i, stack) {\n var frame = self._normalizeFrame(stack, stackInfo.url);\n if (frame) {\n frames.push(frame);\n }\n });\n\n // e.g. frames captured via captureMessage throw\n if (options && options.trimHeadFrames) {\n for (var j = 0; j < options.trimHeadFrames && j < frames.length; j++) {\n frames[j].in_app = false;\n }\n }\n }\n frames = frames.slice(0, this._globalOptions.stackTraceLimit);\n return frames;\n },\n\n _normalizeFrame: function(frame, stackInfoUrl) {\n // normalize the frames data\n var normalized = {\n filename: frame.url,\n lineno: frame.line,\n colno: frame.column,\n function: frame.func || '?'\n };\n\n // Case when we don't have any information about the error\n // E.g. throwing a string or raw object, instead of an `Error` in Firefox\n // Generating synthetic error doesn't add any value here\n //\n // We should probably somehow let a user know that they should fix their code\n if (!frame.url) {\n normalized.filename = stackInfoUrl; // fallback to whole stacks url from onerror handler\n }\n\n normalized.in_app = !// determine if an exception came from outside of our app\n // first we check the global includePaths list.\n (\n (!!this._globalOptions.includePaths.test &&\n !this._globalOptions.includePaths.test(normalized.filename)) ||\n // Now we check for fun, if the function name is Raven or TraceKit\n /(Raven|TraceKit)\\./.test(normalized['function']) ||\n // finally, we do a last ditch effort and check for raven.min.js\n /raven\\.(min\\.)?js$/.test(normalized.filename)\n );\n\n return normalized;\n },\n\n _processException: function(type, message, fileurl, lineno, frames, options) {\n var prefixedMessage = (type ? type + ': ' : '') + (message || '');\n if (\n !!this._globalOptions.ignoreErrors.test &&\n (this._globalOptions.ignoreErrors.test(message) ||\n this._globalOptions.ignoreErrors.test(prefixedMessage))\n ) {\n return;\n }\n\n var stacktrace;\n\n if (frames && frames.length) {\n fileurl = frames[0].filename || fileurl;\n // Sentry expects frames oldest to newest\n // and JS sends them as newest to oldest\n frames.reverse();\n stacktrace = {frames: frames};\n } else if (fileurl) {\n stacktrace = {\n frames: [\n {\n filename: fileurl,\n lineno: lineno,\n in_app: true\n }\n ]\n };\n }\n\n if (\n !!this._globalOptions.ignoreUrls.test &&\n this._globalOptions.ignoreUrls.test(fileurl)\n ) {\n return;\n }\n\n if (\n !!this._globalOptions.whitelistUrls.test &&\n !this._globalOptions.whitelistUrls.test(fileurl)\n ) {\n return;\n }\n\n var data = objectMerge(\n {\n // sentry.interfaces.Exception\n exception: {\n values: [\n {\n type: type,\n value: message,\n stacktrace: stacktrace\n }\n ]\n },\n transaction: fileurl\n },\n options\n );\n\n // Move mechanism from options to exception interface\n // We do this, as requiring user to pass `{exception:{mechanism:{ ... }}}` would be\n // too much\n if (!data.exception.mechanism && data.mechanism) {\n data.exception.mechanism = data.mechanism;\n delete data.mechanism;\n }\n\n data.exception.mechanism = objectMerge(data.exception.mechanism || {}, {\n type: 'generic',\n handled: true\n });\n\n // Fire away!\n this._send(data);\n },\n\n _trimPacket: function(data) {\n // For now, we only want to truncate the two different messages\n // but this could/should be expanded to just trim everything\n var max = this._globalOptions.maxMessageLength;\n if (data.message) {\n data.message = truncate(data.message, max);\n }\n if (data.exception) {\n var exception = data.exception.values[0];\n exception.value = truncate(exception.value, max);\n }\n\n var request = data.request;\n if (request) {\n if (request.url) {\n request.url = truncate(request.url, this._globalOptions.maxUrlLength);\n }\n if (request.Referer) {\n request.Referer = truncate(request.Referer, this._globalOptions.maxUrlLength);\n }\n }\n\n if (data.breadcrumbs && data.breadcrumbs.values)\n this._trimBreadcrumbs(data.breadcrumbs);\n\n return data;\n },\n\n /**\n * Truncate breadcrumb values (right now just URLs)\n */\n _trimBreadcrumbs: function(breadcrumbs) {\n // known breadcrumb properties with urls\n // TODO: also consider arbitrary prop values that start with (https?)?://\n var urlProps = ['to', 'from', 'url'],\n urlProp,\n crumb,\n data;\n\n for (var i = 0; i < breadcrumbs.values.length; ++i) {\n crumb = breadcrumbs.values[i];\n if (\n !crumb.hasOwnProperty('data') ||\n !isObject(crumb.data) ||\n objectFrozen(crumb.data)\n )\n continue;\n\n data = objectMerge({}, crumb.data);\n for (var j = 0; j < urlProps.length; ++j) {\n urlProp = urlProps[j];\n if (data.hasOwnProperty(urlProp) && data[urlProp]) {\n data[urlProp] = truncate(data[urlProp], this._globalOptions.maxUrlLength);\n }\n }\n breadcrumbs.values[i].data = data;\n }\n },\n\n _getHttpData: function() {\n if (!this._hasNavigator && !this._hasDocument) return;\n var httpData = {};\n\n if (this._hasNavigator && _navigator.userAgent) {\n httpData.headers = {\n 'User-Agent': _navigator.userAgent\n };\n }\n\n // Check in `window` instead of `document`, as we may be in ServiceWorker environment\n if (_window.location && _window.location.href) {\n httpData.url = _window.location.href;\n }\n\n if (this._hasDocument && _document.referrer) {\n if (!httpData.headers) httpData.headers = {};\n httpData.headers.Referer = _document.referrer;\n }\n\n return httpData;\n },\n\n _resetBackoff: function() {\n this._backoffDuration = 0;\n this._backoffStart = null;\n },\n\n _shouldBackoff: function() {\n return this._backoffDuration && now() - this._backoffStart < this._backoffDuration;\n },\n\n /**\n * Returns true if the in-process data payload matches the signature\n * of the previously-sent data\n *\n * NOTE: This has to be done at this level because TraceKit can generate\n * data from window.onerror WITHOUT an exception object (IE8, IE9,\n * other old browsers). This can take the form of an \"exception\"\n * data object with a single frame (derived from the onerror args).\n */\n _isRepeatData: function(current) {\n var last = this._lastData;\n\n if (\n !last ||\n current.message !== last.message || // defined for captureMessage\n current.transaction !== last.transaction // defined for captureException/onerror\n )\n return false;\n\n // Stacktrace interface (i.e. from captureMessage)\n if (current.stacktrace || last.stacktrace) {\n return isSameStacktrace(current.stacktrace, last.stacktrace);\n } else if (current.exception || last.exception) {\n // Exception interface (i.e. from captureException/onerror)\n return isSameException(current.exception, last.exception);\n }\n\n return true;\n },\n\n _setBackoffState: function(request) {\n // If we are already in a backoff state, don't change anything\n if (this._shouldBackoff()) {\n return;\n }\n\n var status = request.status;\n\n // 400 - project_id doesn't exist or some other fatal\n // 401 - invalid/revoked dsn\n // 429 - too many requests\n if (!(status === 400 || status === 401 || status === 429)) return;\n\n var retry;\n try {\n // If Retry-After is not in Access-Control-Expose-Headers, most\n // browsers will throw an exception trying to access it\n if (supportsFetch()) {\n retry = request.headers.get('Retry-After');\n } else {\n retry = request.getResponseHeader('Retry-After');\n }\n\n // Retry-After is returned in seconds\n retry = parseInt(retry, 10) * 1000;\n } catch (e) {\n /* eslint no-empty:0 */\n }\n\n this._backoffDuration = retry\n ? // If Sentry server returned a Retry-After value, use it\n retry\n : // Otherwise, double the last backoff duration (starts at 1 sec)\n this._backoffDuration * 2 || 1000;\n\n this._backoffStart = now();\n },\n\n _send: function(data) {\n var globalOptions = this._globalOptions;\n\n var baseData = {\n project: this._globalProject,\n logger: globalOptions.logger,\n platform: 'javascript'\n },\n httpData = this._getHttpData();\n\n if (httpData) {\n baseData.request = httpData;\n }\n\n // HACK: delete `trimHeadFrames` to prevent from appearing in outbound payload\n if (data.trimHeadFrames) delete data.trimHeadFrames;\n\n data = objectMerge(baseData, data);\n\n // Merge in the tags and extra separately since objectMerge doesn't handle a deep merge\n data.tags = objectMerge(objectMerge({}, this._globalContext.tags), data.tags);\n data.extra = objectMerge(objectMerge({}, this._globalContext.extra), data.extra);\n\n // Send along our own collected metadata with extra\n data.extra['session:duration'] = now() - this._startTime;\n\n if (this._breadcrumbs && this._breadcrumbs.length > 0) {\n // intentionally make shallow copy so that additions\n // to breadcrumbs aren't accidentally sent in this request\n data.breadcrumbs = {\n values: [].slice.call(this._breadcrumbs, 0)\n };\n }\n\n if (this._globalContext.user) {\n // sentry.interfaces.User\n data.user = this._globalContext.user;\n }\n\n // Include the environment if it's defined in globalOptions\n if (globalOptions.environment) data.environment = globalOptions.environment;\n\n // Include the release if it's defined in globalOptions\n if (globalOptions.release) data.release = globalOptions.release;\n\n // Include server_name if it's defined in globalOptions\n if (globalOptions.serverName) data.server_name = globalOptions.serverName;\n\n data = this._sanitizeData(data);\n\n // Cleanup empty properties before sending them to the server\n Object.keys(data).forEach(function(key) {\n if (data[key] == null || data[key] === '' || isEmptyObject(data[key])) {\n delete data[key];\n }\n });\n\n if (isFunction(globalOptions.dataCallback)) {\n data = globalOptions.dataCallback(data) || data;\n }\n\n // Why??????????\n if (!data || isEmptyObject(data)) {\n return;\n }\n\n // Check if the request should be filtered or not\n if (\n isFunction(globalOptions.shouldSendCallback) &&\n !globalOptions.shouldSendCallback(data)\n ) {\n return;\n }\n\n // Backoff state: Sentry server previously responded w/ an error (e.g. 429 - too many requests),\n // so drop requests until \"cool-off\" period has elapsed.\n if (this._shouldBackoff()) {\n this._logDebug('warn', 'Raven dropped error due to backoff: ', data);\n return;\n }\n\n if (typeof globalOptions.sampleRate === 'number') {\n if (Math.random() < globalOptions.sampleRate) {\n this._sendProcessedPayload(data);\n }\n } else {\n this._sendProcessedPayload(data);\n }\n },\n\n _sanitizeData: function(data) {\n return sanitize(data, this._globalOptions.sanitizeKeys);\n },\n\n _getUuid: function() {\n return uuid4();\n },\n\n _sendProcessedPayload: function(data, callback) {\n var self = this;\n var globalOptions = this._globalOptions;\n\n if (!this.isSetup()) return;\n\n // Try and clean up the packet before sending by truncating long values\n data = this._trimPacket(data);\n\n // ideally duplicate error testing should occur *before* dataCallback/shouldSendCallback,\n // but this would require copying an un-truncated copy of the data packet, which can be\n // arbitrarily deep (extra_data) -- could be worthwhile? will revisit\n if (!this._globalOptions.allowDuplicates && this._isRepeatData(data)) {\n this._logDebug('warn', 'Raven dropped repeat event: ', data);\n return;\n }\n\n // Send along an event_id if not explicitly passed.\n // This event_id can be used to reference the error within Sentry itself.\n // Set lastEventId after we know the error should actually be sent\n this._lastEventId = data.event_id || (data.event_id = this._getUuid());\n\n // Store outbound payload after trim\n this._lastData = data;\n\n this._logDebug('debug', 'Raven about to send:', data);\n\n var auth = {\n sentry_version: '7',\n sentry_client: 'raven-js/' + this.VERSION,\n sentry_key: this._globalKey\n };\n\n if (this._globalSecret) {\n auth.sentry_secret = this._globalSecret;\n }\n\n var exception = data.exception && data.exception.values[0];\n\n // only capture 'sentry' breadcrumb is autoBreadcrumbs is truthy\n if (\n this._globalOptions.autoBreadcrumbs &&\n this._globalOptions.autoBreadcrumbs.sentry\n ) {\n this.captureBreadcrumb({\n category: 'sentry',\n message: exception\n ? (exception.type ? exception.type + ': ' : '') + exception.value\n : data.message,\n event_id: data.event_id,\n level: data.level || 'error' // presume error unless specified\n });\n }\n\n var url = this._globalEndpoint;\n (globalOptions.transport || this._makeRequest).call(this, {\n url: url,\n auth: auth,\n data: data,\n options: globalOptions,\n onSuccess: function success() {\n self._resetBackoff();\n\n self._triggerEvent('success', {\n data: data,\n src: url\n });\n callback && callback();\n },\n onError: function failure(error) {\n self._logDebug('error', 'Raven transport failed to send: ', error);\n\n if (error.request) {\n self._setBackoffState(error.request);\n }\n\n self._triggerEvent('failure', {\n data: data,\n src: url\n });\n error = error || new Error('Raven send failed (no additional details provided)');\n callback && callback(error);\n }\n });\n },\n\n _makeRequest: function(opts) {\n // Auth is intentionally sent as part of query string (NOT as custom HTTP header) to avoid preflight CORS requests\n var url = opts.url + '?' + urlencode(opts.auth);\n\n var evaluatedHeaders = null;\n var evaluatedFetchParameters = {};\n\n if (opts.options.headers) {\n evaluatedHeaders = this._evaluateHash(opts.options.headers);\n }\n\n if (opts.options.fetchParameters) {\n evaluatedFetchParameters = this._evaluateHash(opts.options.fetchParameters);\n }\n\n if (supportsFetch()) {\n evaluatedFetchParameters.body = stringify(opts.data);\n\n var defaultFetchOptions = objectMerge({}, this._fetchDefaults);\n var fetchOptions = objectMerge(defaultFetchOptions, evaluatedFetchParameters);\n\n if (evaluatedHeaders) {\n fetchOptions.headers = evaluatedHeaders;\n }\n\n return _window\n .fetch(url, fetchOptions)\n .then(function(response) {\n if (response.ok) {\n opts.onSuccess && opts.onSuccess();\n } else {\n var error = new Error('Sentry error code: ' + response.status);\n // It's called request only to keep compatibility with XHR interface\n // and not add more redundant checks in setBackoffState method\n error.request = response;\n opts.onError && opts.onError(error);\n }\n })\n ['catch'](function() {\n opts.onError &&\n opts.onError(new Error('Sentry error code: network unavailable'));\n });\n }\n\n var request = _window.XMLHttpRequest && new _window.XMLHttpRequest();\n if (!request) return;\n\n // if browser doesn't support CORS (e.g. IE7), we are out of luck\n var hasCORS = 'withCredentials' in request || typeof XDomainRequest !== 'undefined';\n\n if (!hasCORS) return;\n\n if ('withCredentials' in request) {\n request.onreadystatechange = function() {\n if (request.readyState !== 4) {\n return;\n } else if (request.status === 200) {\n opts.onSuccess && opts.onSuccess();\n } else if (opts.onError) {\n var err = new Error('Sentry error code: ' + request.status);\n err.request = request;\n opts.onError(err);\n }\n };\n } else {\n request = new XDomainRequest();\n // xdomainrequest cannot go http -> https (or vice versa),\n // so always use protocol relative\n url = url.replace(/^https?:/, '');\n\n // onreadystatechange not supported by XDomainRequest\n if (opts.onSuccess) {\n request.onload = opts.onSuccess;\n }\n if (opts.onError) {\n request.onerror = function() {\n var err = new Error('Sentry error code: XDomainRequest');\n err.request = request;\n opts.onError(err);\n };\n }\n }\n\n request.open('POST', url);\n\n if (evaluatedHeaders) {\n each(evaluatedHeaders, function(key, value) {\n request.setRequestHeader(key, value);\n });\n }\n\n request.send(stringify(opts.data));\n },\n\n _evaluateHash: function(hash) {\n var evaluated = {};\n\n for (var key in hash) {\n if (hash.hasOwnProperty(key)) {\n var value = hash[key];\n evaluated[key] = typeof value === 'function' ? value() : value;\n }\n }\n\n return evaluated;\n },\n\n _logDebug: function(level) {\n // We allow `Raven.debug` and `Raven.config(DSN, { debug: true })` to not make backward incompatible API change\n if (\n this._originalConsoleMethods[level] &&\n (this.debug || this._globalOptions.debug)\n ) {\n // In IE<10 console methods do not have their own 'apply' method\n Function.prototype.apply.call(\n this._originalConsoleMethods[level],\n this._originalConsole,\n [].slice.call(arguments, 1)\n );\n }\n },\n\n _mergeContext: function(key, context) {\n if (isUndefined(context)) {\n delete this._globalContext[key];\n } else {\n this._globalContext[key] = objectMerge(this._globalContext[key] || {}, context);\n }\n }\n};\n\n// Deprecations\nRaven.prototype.setUser = Raven.prototype.setUserContext;\nRaven.prototype.setReleaseContext = Raven.prototype.setRelease;\n\nmodule.exports = Raven;\n","/**\n * Enforces a single instance of the Raven client, and the\n * main entry point for Raven. If you are a consumer of the\n * Raven library, you SHOULD load this file (vs raven.js).\n **/\n\nvar RavenConstructor = require('./raven');\n\n// This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785)\nvar _window =\n typeof window !== 'undefined'\n ? window\n : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\nvar _Raven = _window.Raven;\n\nvar Raven = new RavenConstructor();\n\n/*\n * Allow multiple versions of Raven to be installed.\n * Strip Raven from the global context and returns the instance.\n *\n * @return {Raven}\n */\nRaven.noConflict = function() {\n _window.Raven = _Raven;\n return Raven;\n};\n\nRaven.afterLoad();\n\nmodule.exports = Raven;\n\n/**\n * DISCLAIMER:\n *\n * Expose `Client` constructor for cases where user want to track multiple \"sub-applications\" in one larger app.\n * It's not meant to be used by a wide audience, so pleaaase make sure that you know what you're doing before using it.\n * Accidentally calling `install` multiple times, may result in an unexpected behavior that's very hard to debug.\n *\n * It's called `Client' to be in-line with Raven Node implementation.\n *\n * HOWTO:\n *\n * import Raven from 'raven-js';\n *\n * const someAppReporter = new Raven.Client();\n * const someOtherAppReporter = new Raven.Client();\n *\n * someAppReporter.config('__DSN__', {\n * ...config goes here\n * });\n *\n * someOtherAppReporter.config('__OTHER_DSN__', {\n * ...config goes here\n * });\n *\n * someAppReporter.captureMessage(...);\n * someAppReporter.captureException(...);\n * someAppReporter.captureBreadcrumb(...);\n *\n * someOtherAppReporter.captureMessage(...);\n * someOtherAppReporter.captureException(...);\n * someOtherAppReporter.captureBreadcrumb(...);\n *\n * It should \"just work\".\n */\nmodule.exports.Client = RavenConstructor;\n","// ==========================================================================\n// Plyr.io demo\n// This code is purely for the https://plyr.io website\n// Please see readme.md in the root or github.com/sampotts/plyr\n// ==========================================================================\n\nimport Raven from 'raven-js';\n\n(() => {\n const isLive = window.location.host === 'plyr.io';\n\n // Raven / Sentry\n // For demo site (https://plyr.io) only\n if (isLive) {\n Raven.config('https://d4ad9866ad834437a4754e23937071e4@sentry.io/305555').install();\n }\n\n document.addEventListener('DOMContentLoaded', () => {\n Raven.context(() => {\n if (window.shr) {\n window.shr.setup({\n count: {\n classname: 'button__count',\n },\n });\n }\n\n // Setup tab focus\n const tabClassName = 'tab-focus';\n\n // Remove class on blur\n document.addEventListener('focusout', event => {\n event.target.classList.remove(tabClassName);\n });\n\n // Add classname to tabbed elements\n document.addEventListener('keydown', event => {\n if (event.keyCode !== 9) {\n return;\n }\n\n // Delay the adding of classname until the focus has changed\n // This event fires before the focusin event\n setTimeout(() => {\n document.activeElement.classList.add(tabClassName);\n }, 0);\n });\n\n // Setup the player\n const player = new Plyr('#player', {\n debug: true,\n title: 'View From A Blue Moon',\n iconUrl: '../dist/plyr.svg',\n keyboard: {\n global: true,\n },\n tooltips: {\n controls: true,\n },\n /* controls: [\n 'play-large',\n 'restart',\n 'rewind',\n 'play',\n 'fast-forward',\n 'progress',\n 'current-time',\n 'duration',\n 'mute',\n 'volume',\n 'captions',\n 'settings',\n 'pip',\n 'airplay',\n 'fullscreen',\n ], */\n /* i18n: {\n restart: '重新開始',\n rewind: '快退{seektime}秒',\n play: '播放',\n pause: '暫停',\n fastForward: '快進{seektime}秒',\n seek: '尋求',\n played: '發揮',\n buffered: '緩衝的',\n currentTime: '當前時間戳',\n duration: '長短',\n volume: '音量',\n mute: '靜音',\n unmute: '取消靜音',\n enableCaptions: '開啟字幕',\n disableCaptions: '關閉字幕',\n enterFullscreen: '進入全螢幕',\n exitFullscreen: '退出全螢幕',\n frameTitle: '球員為{title}',\n captions: '字幕',\n settings: '設定',\n speed: '速度',\n normal: '正常',\n quality: '質量',\n loop: '循環',\n start: 'Start',\n end: 'End',\n all: 'All',\n reset: '重啟',\n disabled: '殘',\n enabled: '啟用',\n advertisement: '廣告',\n }, */\n captions: {\n active: true,\n },\n keys: {\n google: 'AIzaSyDrNwtN3nLH_8rjCmu5Wq3ZCm4MNAVdc0c',\n },\n ads: {\n enabled: true,\n publisherId: '918848828995742',\n },\n });\n\n // Expose for tinkering in the console\n window.player = player;\n\n // Setup type toggle\n const buttons = document.querySelectorAll('[data-source]');\n const types = {\n video: 'video',\n audio: 'audio',\n youtube: 'youtube',\n vimeo: 'vimeo',\n };\n let currentType = window.location.hash.replace('#', '');\n const historySupport = window.history && window.history.pushState;\n\n // Toggle class on an element\n function toggleClass(element, className, state) {\n if (element) {\n element.classList[state ? 'add' : 'remove'](className);\n }\n }\n\n // Set a new source\n function newSource(type, init) {\n // Bail if new type isn't known, it's the current type, or current type is empty (video is default) and new type is video\n if (!(type in types) || (!init && type === currentType) || (!currentType.length && type === types.video)) {\n return;\n }\n\n switch (type) {\n case types.video:\n player.source = {\n type: 'video',\n title: 'View From A Blue Moon',\n sources: [\n {\n src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-576p.mp4',\n type: 'video/mp4',\n size: 576,\n },\n {\n src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-720p.mp4',\n type: 'video/mp4',\n size: 720,\n },\n {\n src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-1080p.mp4',\n type: 'video/mp4',\n size: 1080,\n },\n {\n src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-1440p.mp4',\n type: 'video/mp4',\n size: 1440,\n },\n ],\n poster: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg',\n tracks: [\n {\n kind: 'captions',\n label: 'English',\n srclang: 'en',\n src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt',\n default: true,\n },\n {\n kind: 'captions',\n label: 'French',\n srclang: 'fr',\n src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt',\n },\n ],\n };\n\n break;\n\n case types.audio:\n player.source = {\n type: 'audio',\n title: 'Kishi Bashi &ndash; &ldquo;It All Began With A Burst&rdquo;',\n sources: [\n {\n src: 'https://cdn.plyr.io/static/demo/Kishi_Bashi_-_It_All_Began_With_a_Burst.mp3',\n type: 'audio/mp3',\n },\n {\n src: 'https://cdn.plyr.io/static/demo/Kishi_Bashi_-_It_All_Began_With_a_Burst.ogg',\n type: 'audio/ogg',\n },\n ],\n };\n\n break;\n\n case types.youtube:\n player.source = {\n type: 'video',\n sources: [{\n src: 'https://youtube.com/watch?v=bTqVqk7FSmY',\n provider: 'youtube',\n }],\n };\n\n break;\n\n case types.vimeo:\n player.source = {\n type: 'video',\n sources: [{\n src: 'https://vimeo.com/76979871',\n provider: 'vimeo',\n }],\n };\n\n break;\n\n default:\n break;\n }\n\n // Set the current type for next time\n currentType = type;\n\n // Remove active classes\n Array.from(buttons).forEach(button => toggleClass(button.parentElement, 'active', false));\n\n // Set active on parent\n toggleClass(document.querySelector(`[data-source=\"${type}\"]`), 'active', true);\n\n // Show cite\n Array.from(document.querySelectorAll('.plyr__cite')).forEach(cite => {\n cite.setAttribute('hidden', '');\n });\n document.querySelector(`.plyr__cite--${type}`).removeAttribute('hidden');\n }\n\n // Bind to each button\n Array.from(buttons).forEach(button => {\n button.addEventListener('click', () => {\n const type = button.getAttribute('data-source');\n\n newSource(type);\n\n if (historySupport) {\n window.history.pushState({ type }, '', `#${type}`);\n }\n });\n });\n\n // List for backwards/forwards\n window.addEventListener('popstate', event => {\n if (event.state && 'type' in event.state) {\n newSource(event.state.type);\n }\n });\n\n // On load\n if (historySupport) {\n const video = !currentType.length;\n\n // If there's no current type set, assume video\n if (video) {\n currentType = types.video;\n }\n\n // Replace current history state\n if (currentType in types) {\n window.history.replaceState(\n {\n type: currentType,\n },\n '',\n video ? '' : `#${currentType}`,\n );\n }\n\n // If it's not video, load the source\n if (currentType !== types.video) {\n newSource(currentType, true);\n }\n }\n });\n });\n\n // Google analytics\n // For demo site (https://plyr.io) only\n /* eslint-disable */\n if (isLive) {\n (function(i, s, o, g, r, a, m) {\n i.GoogleAnalyticsObject = r;\n i[r] =\n i[r] ||\n function() {\n (i[r].q = i[r].q || []).push(arguments);\n };\n i[r].l = 1 * new Date();\n a = s.createElement(o);\n m = s.getElementsByTagName(o)[0];\n a.async = 1;\n a.src = g;\n m.parentNode.insertBefore(a, m);\n })(window, document, 'script', 'https://www.google-analytics.com/analytics.js', 'ga');\n window.ga('create', 'UA-40881672-11', 'auto');\n window.ga('send', 'pageview');\n }\n /* eslint-enable */\n})();\n"]} \ No newline at end of file
+{"version":3,"sources":["node_modules/raven-js/vendor/json-stringify-safe/stringify.js","node_modules/raven-js/src/utils.js","node_modules/raven-js/vendor/TraceKit/tracekit.js","node_modules/raven-js/vendor/md5/md5.js","node_modules/raven-js/src/configError.js","node_modules/raven-js/src/console.js","node_modules/raven-js/src/raven.js","node_modules/raven-js/src/singleton.js","demo/src/js/demo.js"],"names":["global","stringify","_window","isErrorEvent","isDOMError","isDOMException","isError","isObject","isPlainObject","isUndefined","isFunction","isString","isArray","isEmptyObject","each","objectMerge","truncate","objectFrozen","hasKey","joinRegExp","urlencode","uuid4","htmlTreeAsString","isSameException","isSameStacktrace","parseUrl","fill","supportsFetch","supportsReferrerPolicy","serializeKeysForMessage","serializeException","sanitize","require$$0","TraceKit","md5","RavenConfigError","Raven","RavenConstructor","isLive","window","location","host","config","install","document","addEventListener","context","shr","setup","count","classname","tabClassName","event","target","classList","remove","keyCode","setTimeout","activeElement","add","player","Plyr","debug","title","iconUrl","keyboard","tooltips","controls","captions","active","keys","google","ads","enabled","publisherId","buttons","querySelectorAll","types","video","audio","youtube","vimeo","currentType","hash","replace","historySupport","history","pushState","toggleClass","element","className","state","newSource","type","init","length","source","sources","src","size","poster","tracks","kind","label","srclang","default","provider","Array","from","forEach","button","parentElement","querySelector","cite","setAttribute","removeAttribute","getAttribute","replaceState","i","s","o","g","r","a","m","GoogleAnalyticsObject","q","push","arguments","l","Date","createElement","getElementsByTagName","async","parentNode","insertBefore","ga"],"mappings":";;;;;;;;;;CAAA;;;;;;;;;;;CAWA,OAAO,GAAG,cAAc,GAAG,SAAS,CAAC;CACrC,oBAAoB,GAAG,UAAU,CAAC;;CAElC,SAAS,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE;GACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;KACxC,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC;GACD,OAAO,CAAC,CAAC,CAAC;EACX;;CAED,SAAS,SAAS,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE;GACvD,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,UAAU,CAAC,QAAQ,EAAE,aAAa,CAAC,EAAE,MAAM,CAAC,CAAC;EACzE;;;CAGD,SAAS,cAAc,CAAC,KAAK,EAAE;GAC7B,IAAI,GAAG,GAAG;;KAER,KAAK,EAAE,KAAK,CAAC,KAAK;KAClB,OAAO,EAAE,KAAK,CAAC,OAAO;KACtB,IAAI,EAAE,KAAK,CAAC,IAAI;IACjB,CAAC;;GAEF,KAAK,IAAI,CAAC,IAAI,KAAK,EAAE;KACnB,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE;OAClD,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;MACnB;IACF;;GAED,OAAO,GAAG,CAAC;EACZ;;CAED,SAAS,UAAU,CAAC,QAAQ,EAAE,aAAa,EAAE;GAC3C,IAAI,KAAK,GAAG,EAAE,CAAC;GACf,IAAI,IAAI,GAAG,EAAE,CAAC;;GAEd,IAAI,aAAa,IAAI,IAAI,EAAE;KACzB,aAAa,GAAG,SAAS,GAAG,EAAE,KAAK,EAAE;OACnC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE;SACtB,OAAO,cAAc,CAAC;QACvB;OACD,OAAO,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;MAC9E,CAAC;IACH;;GAED,OAAO,SAAS,GAAG,EAAE,KAAK,EAAE;KAC1B,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;OACpB,IAAI,OAAO,GAAG,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;OACnC,CAAC,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;OACxD,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;;OAEhE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE;SAC1B,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QAC9C;MACF,MAAM;OACL,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;MACnB;;KAED,OAAO,QAAQ,IAAI,IAAI;SACnB,KAAK,YAAY,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,KAAK;SACtD,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;IACrC,CAAC;EACH;;;;CCvED,IAAI,OAAO;GACT,OAAO,MAAM,KAAK,WAAW;OACzB,MAAM;OACN,OAAOA,cAAM,KAAK,WAAW;SAC3BA,cAAM;SACN,OAAO,IAAI,KAAK,WAAW;WACzB,IAAI;WACJ,EAAE,CAAC;;CAEb,SAAS,QAAQ,CAAC,IAAI,EAAE;GACtB,OAAO,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,CAAC;EAClD;;;;CAID,SAAS,OAAO,CAAC,KAAK,EAAE;GACtB,QAAQ,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;KAC3C,KAAK,gBAAgB;OACnB,OAAO,IAAI,CAAC;KACd,KAAK,oBAAoB;OACvB,OAAO,IAAI,CAAC;KACd,KAAK,uBAAuB;OAC1B,OAAO,IAAI,CAAC;KACd;OACE,OAAO,KAAK,YAAY,KAAK,CAAC;IACjC;EACF;;CAED,SAAS,YAAY,CAAC,KAAK,EAAE;GAC3B,OAAO,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,qBAAqB,CAAC;EACxE;;CAED,SAAS,UAAU,CAAC,KAAK,EAAE;GACzB,OAAO,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,mBAAmB,CAAC;EACtE;;CAED,SAAS,cAAc,CAAC,KAAK,EAAE;GAC7B,OAAO,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,uBAAuB,CAAC;EAC1E;;CAED,SAAS,WAAW,CAAC,IAAI,EAAE;GACzB,OAAO,IAAI,KAAK,KAAK,CAAC,CAAC;EACxB;;CAED,SAAS,UAAU,CAAC,IAAI,EAAE;GACxB,OAAO,OAAO,IAAI,KAAK,UAAU,CAAC;EACnC;;CAED,SAAS,aAAa,CAAC,IAAI,EAAE;GAC3B,OAAO,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,iBAAiB,CAAC;EACnE;;CAED,SAAS,QAAQ,CAAC,IAAI,EAAE;GACtB,OAAO,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,iBAAiB,CAAC;EACnE;;CAED,SAAS,OAAO,CAAC,IAAI,EAAE;GACrB,OAAO,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,gBAAgB,CAAC;EAClE;;CAED,SAAS,aAAa,CAAC,IAAI,EAAE;GAC3B,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,OAAO,KAAK,CAAC;;GAEvC,KAAK,IAAI,CAAC,IAAI,IAAI,EAAE;KAClB,IAAI,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE;OAC1B,OAAO,KAAK,CAAC;MACd;IACF;GACD,OAAO,IAAI,CAAC;EACb;;CAED,SAAS,kBAAkB,GAAG;GAC5B,IAAI;KACF,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;KACnB,OAAO,IAAI,CAAC;IACb,CAAC,OAAO,CAAC,EAAE;KACV,OAAO,KAAK,CAAC;IACd;EACF;;CAED,SAAS,gBAAgB,GAAG;GAC1B,IAAI;KACF,IAAI,QAAQ,CAAC,EAAE,CAAC,CAAC;KACjB,OAAO,IAAI,CAAC;IACb,CAAC,OAAO,CAAC,EAAE;KACV,OAAO,KAAK,CAAC;IACd;EACF;;CAED,SAAS,oBAAoB,GAAG;GAC9B,IAAI;KACF,IAAI,YAAY,CAAC,EAAE,CAAC,CAAC;KACrB,OAAO,IAAI,CAAC;IACb,CAAC,OAAO,CAAC,EAAE;KACV,OAAO,KAAK,CAAC;IACd;EACF;;CAED,SAAS,aAAa,GAAG;GACvB,IAAI,EAAE,OAAO,IAAI,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;;GAExC,IAAI;KACF,IAAI,OAAO,EAAE,CAAC;KACd,IAAI,OAAO,CAAC,EAAE,CAAC,CAAC;KAChB,IAAI,QAAQ,EAAE,CAAC;KACf,OAAO,IAAI,CAAC;IACb,CAAC,OAAO,CAAC,EAAE;KACV,OAAO,KAAK,CAAC;IACd;EACF;;;;;;CAMD,SAAS,sBAAsB,GAAG;GAChC,IAAI,CAAC,aAAa,EAAE,EAAE,OAAO,KAAK,CAAC;;GAEnC,IAAI;;KAEF,IAAI,OAAO,CAAC,YAAY,EAAE;OACxB,cAAc,EAAE,QAAQ;MACzB,CAAC,CAAC;KACH,OAAO,IAAI,CAAC;IACb,CAAC,OAAO,CAAC,EAAE;KACV,OAAO,KAAK,CAAC;IACd;EACF;;CAED,SAAS,6BAA6B,GAAG;GACvC,OAAO,OAAO,qBAAqB,KAAK,UAAU,CAAC;EACpD;;CAED,SAAS,eAAe,CAAC,QAAQ,EAAE;GACjC,SAAS,YAAY,CAAC,IAAI,EAAE,QAAQ,EAAE;KACpC,IAAI,cAAc,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;KAC5C,IAAI,QAAQ,EAAE;OACZ,OAAO,QAAQ,CAAC,cAAc,CAAC,IAAI,cAAc,CAAC;MACnD;KACD,OAAO,cAAc,CAAC;IACvB;;GAED,OAAO,YAAY,CAAC;EACrB;;CAED,SAAS,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE;GAC3B,IAAI,CAAC,EAAE,CAAC,CAAC;;GAET,IAAI,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;KAC3B,KAAK,CAAC,IAAI,GAAG,EAAE;OACb,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE;SAClB,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAChC;MACF;IACF,MAAM;KACL,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC;KACf,IAAI,CAAC,EAAE;OACL,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;SACtB,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAChC;MACF;IACF;EACF;;CAED,SAAS,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE;GAC/B,IAAI,CAAC,IAAI,EAAE;KACT,OAAO,IAAI,CAAC;IACb;GACD,IAAI,CAAC,IAAI,EAAE,SAAS,GAAG,EAAE,KAAK,EAAE;KAC9B,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACnB,CAAC,CAAC;GACH,OAAO,IAAI,CAAC;EACb;;;;;;;;;;CAUD,SAAS,YAAY,CAAC,GAAG,EAAE;GACzB,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;KACpB,OAAO,KAAK,CAAC;IACd;GACD,OAAO,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;EAC7B;;CAED,SAAS,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE;GAC1B,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;KAC3B,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;IAC3E;GACD,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,CAAC,EAAE;KACxC,OAAO,GAAG,CAAC;IACZ;GACD,OAAO,GAAG,CAAC,MAAM,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,QAAQ,CAAC;EAChE;;;;;;;;;CASD,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,EAAE;GAC3B,OAAO,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;EAC1D;;CAED,SAAS,UAAU,CAAC,QAAQ,EAAE;;;GAG5B,IAAI,OAAO,GAAG,EAAE;KACd,CAAC,GAAG,CAAC;KACL,GAAG,GAAG,QAAQ,CAAC,MAAM;KACrB,OAAO,CAAC;;GAEV,OAAO,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE;KACnB,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;KACtB,IAAI,QAAQ,CAAC,OAAO,CAAC,EAAE;;;OAGrB,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,6BAA6B,EAAE,MAAM,CAAC,CAAC,CAAC;MACtE,MAAM,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,EAAE;;OAEpC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;MAC9B;;IAEF;GACD,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;EAC3C;;CAED,SAAS,SAAS,CAAC,CAAC,EAAE;GACpB,IAAI,KAAK,GAAG,EAAE,CAAC;GACf,IAAI,CAAC,CAAC,EAAE,SAAS,GAAG,EAAE,KAAK,EAAE;KAC3B,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC;IACvE,CAAC,CAAC;GACH,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;EACxB;;;;;CAKD,SAAS,QAAQ,CAAC,GAAG,EAAE;GACrB,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,OAAO,EAAE,CAAC;GACvC,IAAI,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,gEAAgE,CAAC,CAAC;;;GAGxF,IAAI,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;GAC3B,IAAI,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;GAC9B,OAAO;KACL,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;KAClB,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;KACd,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;KACd,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,QAAQ;IACtC,CAAC;EACH;CACD,SAAS,KAAK,GAAG;GACf,IAAI,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,QAAQ,CAAC;;GAEhD,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,eAAe,EAAE;;;KAGlD,IAAI,GAAG,GAAG,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC;KAC7B,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;;;KAG5B,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,MAAM,CAAC;;KAEnC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,MAAM,CAAC;;KAEpC,IAAI,GAAG,GAAG,SAAS,GAAG,EAAE;OACtB,IAAI,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;OACzB,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;SACnB,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;QACb;OACD,OAAO,CAAC,CAAC;MACV,CAAC;;KAEF;OACE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;OACX,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;OACX,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;OACX,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;OACX,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;OACX,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;OACX,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;OACX,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;OACX;IACH,MAAM;;KAEL,OAAO,kCAAkC,CAAC,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE;OACrE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC;SAC9B,CAAC,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,IAAI,GAAG,CAAC;OACtC,OAAO,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;MACvB,CAAC,CAAC;IACJ;EACF;;;;;;;;;CASD,SAAS,gBAAgB,CAAC,IAAI,EAAE;;GAE9B,IAAI,mBAAmB,GAAG,CAAC;KACzB,cAAc,GAAG,EAAE;KACnB,GAAG,GAAG,EAAE;KACR,MAAM,GAAG,CAAC;KACV,GAAG,GAAG,CAAC;KACP,SAAS,GAAG,KAAK;KACjB,SAAS,GAAG,SAAS,CAAC,MAAM;KAC5B,OAAO,CAAC;;GAEV,OAAO,IAAI,IAAI,MAAM,EAAE,GAAG,mBAAmB,EAAE;KAC7C,OAAO,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;;;;;KAKpC;OACE,OAAO,KAAK,MAAM;QACjB,MAAM,GAAG,CAAC,IAAI,GAAG,GAAG,GAAG,CAAC,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,IAAI,cAAc,CAAC;OAC/E;OACA,MAAM;MACP;;KAED,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;;KAElB,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;KACtB,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC;IACxB;;GAED,OAAO,GAAG,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;EACtC;;;;;;;;CAQD,SAAS,mBAAmB,CAAC,IAAI,EAAE;GACjC,IAAI,GAAG,GAAG,EAAE;KACV,SAAS;KACT,OAAO;KACP,GAAG;KACH,IAAI;KACJ,CAAC,CAAC;;GAEJ,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;KAC1B,OAAO,EAAE,CAAC;IACX;;GAED,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;GACrC,IAAI,IAAI,CAAC,EAAE,EAAE;KACX,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC;IACzB;;GAED,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;GAC3B,IAAI,SAAS,IAAI,QAAQ,CAAC,SAAS,CAAC,EAAE;KACpC,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;KACjC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;OACnC,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;MAC5B;IACF;GACD,IAAI,aAAa,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;GACrD,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;KACzC,GAAG,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;KACvB,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;KAC9B,IAAI,IAAI,EAAE;OACR,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC;MAC1C;IACF;GACD,OAAO,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;EACrB;;;;;CAKD,SAAS,eAAe,CAAC,CAAC,EAAE,CAAC,EAAE;GAC7B,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;EACtB;;;;;CAKD,SAAS,eAAe,CAAC,CAAC,EAAE,CAAC,EAAE;GAC7B,OAAO,WAAW,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC;EACzC;;;;;CAKD,SAAS,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE;GACjC,IAAI,eAAe,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,OAAO,KAAK,CAAC;;GAE5C,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;GACpB,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;;GAEpB,IAAI,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,KAAK,KAAK,GAAG,CAAC,KAAK,EAAE,OAAO,KAAK,CAAC;;;GAGnE,IAAI,eAAe,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,UAAU,CAAC,EAAE,OAAO,KAAK,CAAC;;GAElE,OAAO,gBAAgB,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC;EACzD;;;;;CAKD,SAAS,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE;GACxC,IAAI,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,KAAK,CAAC;;GAElD,IAAI,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC;GAC5B,IAAI,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC;;;GAG5B,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,SAAS,EAAE,OAAO,KAAK,CAAC;;;GAGjE,IAAI,OAAO,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,OAAO,KAAK,CAAC;;;GAGpD,IAAI,CAAC,EAAE,CAAC,CAAC;GACT,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;KACvC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;KACf,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;KACf;OACE,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,QAAQ;OACzB,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;OACrB,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK;OACnB,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC;;OAE/B,OAAO,KAAK,CAAC;IAChB;GACD,OAAO,IAAI,CAAC;EACb;;;;;;;;;CASD,SAAS,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE;GAC3C,IAAI,GAAG,IAAI,IAAI,EAAE,OAAO;GACxB,IAAI,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC;GACrB,GAAG,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;GAC9B,GAAG,CAAC,IAAI,CAAC,CAAC,SAAS,GAAG,IAAI,CAAC;GAC3B,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC;GAC1B,IAAI,KAAK,EAAE;KACT,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IAC/B;EACF;;;;;;;;CAQD,SAAS,QAAQ,CAAC,KAAK,EAAE,SAAS,EAAE;GAClC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC;;GAE/B,IAAI,MAAM,GAAG,EAAE,CAAC;;GAEhB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;KACrC,IAAI;OACF,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;MAC/B,CAAC,OAAO,CAAC,EAAE;OACV,MAAM,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;MAC7C;IACF;;GAED,OAAO,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;EAC/B;;;CAGD,IAAI,6BAA6B,GAAG,CAAC,CAAC;;CAEtC,IAAI,4BAA4B,GAAG,EAAE,GAAG,IAAI,CAAC;CAC7C,IAAI,yBAAyB,GAAG,EAAE,CAAC;;CAEnC,SAAS,UAAU,CAAC,KAAK,EAAE;GACzB,OAAO,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;EACjD;;CAED,SAAS,QAAQ,CAAC,KAAK,EAAE;GACvB,OAAO,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;EAC1C;;CAED,SAAS,cAAc,CAAC,KAAK,EAAE;GAC7B,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;KAC7B,IAAI,SAAS,GAAG,EAAE,CAAC;KACnB,OAAO,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IACnC,MAAM;KACL,OAAO,KAAK,KAAK,QAAQ;KACzB,OAAO,KAAK,KAAK,SAAS;KAC1B,OAAO,KAAK,KAAK,WAAW;KAC5B;KACA,OAAO,KAAK,CAAC;IACd;;GAED,IAAI,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;;;GAGjD,IAAI,IAAI,KAAK,iBAAiB,EAAE,OAAO,UAAU,CAAC;GAClD,IAAI,IAAI,KAAK,gBAAgB,EAAE,OAAO,SAAS,CAAC;GAChD,IAAI,IAAI,KAAK,mBAAmB;KAC9B,OAAO,KAAK,CAAC,IAAI,GAAG,aAAa,GAAG,KAAK,CAAC,IAAI,GAAG,GAAG,GAAG,YAAY,CAAC;;GAEtE,OAAO,KAAK,CAAC;EACd;;CAED,SAAS,eAAe,CAAC,KAAK,EAAE,KAAK,EAAE;GACrC,IAAI,KAAK,KAAK,CAAC,EAAE,OAAO,cAAc,CAAC,KAAK,CAAC,CAAC;;GAE9C,IAAI,aAAa,CAAC,KAAK,CAAC,EAAE;KACxB,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,SAAS,GAAG,EAAE,GAAG,EAAE;OAClD,GAAG,CAAC,GAAG,CAAC,GAAG,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;OAClD,OAAO,GAAG,CAAC;MACZ,EAAE,EAAE,CAAC,CAAC;IACR,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;KAC/B,OAAO,KAAK,CAAC,GAAG,CAAC,SAAS,GAAG,EAAE;OAC7B,OAAO,eAAe,CAAC,GAAG,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;MACxC,CAAC,CAAC;IACJ;;GAED,OAAO,cAAc,CAAC,KAAK,CAAC,CAAC;EAC9B;;CAED,SAAS,kBAAkB,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE;GAC9C,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC;;GAElC,KAAK,GAAG,OAAO,KAAK,KAAK,QAAQ,GAAG,6BAA6B,GAAG,KAAK,CAAC;GAC1E,OAAO,GAAG,OAAO,KAAK,KAAK,QAAQ,GAAG,4BAA4B,GAAG,OAAO,CAAC;;GAE7E,IAAI,UAAU,GAAG,eAAe,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;;GAE5C,IAAI,QAAQ,CAACC,WAAS,CAAC,UAAU,CAAC,CAAC,GAAG,OAAO,EAAE;KAC7C,OAAO,kBAAkB,CAAC,EAAE,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;IAC1C;;GAED,OAAO,UAAU,CAAC;EACnB;;CAED,SAAS,uBAAuB,CAAC,IAAI,EAAE,SAAS,EAAE;GAChD,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC;GACjF,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC;;GAEpC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,EAAE;KAC/B,OAAO,OAAO,GAAG,KAAK,QAAQ,CAAC;IAChC,CAAC,CAAC;GACH,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,OAAO,sBAAsB,CAAC;;GAErD,SAAS,GAAG,OAAO,SAAS,KAAK,QAAQ,GAAG,yBAAyB,GAAG,SAAS,CAAC;GAClF,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,SAAS,EAAE,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC;;GAEhD,KAAK,IAAI,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,QAAQ,GAAG,CAAC,EAAE,QAAQ,EAAE,EAAE;KACzD,IAAI,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;KACpD,IAAI,UAAU,CAAC,MAAM,GAAG,SAAS,EAAE,SAAS;KAC5C,IAAI,QAAQ,KAAK,IAAI,CAAC,MAAM,EAAE,OAAO,UAAU,CAAC;KAChD,OAAO,UAAU,GAAG,QAAQ,CAAC;IAC9B;;GAED,OAAO,EAAE,CAAC;EACX;;CAED,SAAS,QAAQ,CAAC,KAAK,EAAE,YAAY,EAAE;GACrC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK,OAAO,CAAC,YAAY,CAAC,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,CAAC;KAChF,OAAO,KAAK,CAAC;;GAEf,IAAI,cAAc,GAAG,UAAU,CAAC,YAAY,CAAC,CAAC;GAC9C,IAAI,YAAY,GAAG,UAAU,CAAC;GAC9B,IAAI,SAAS,CAAC;;GAEd,IAAI;KACF,SAAS,GAAG,IAAI,CAAC,KAAK,CAACA,WAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IAC1C,CAAC,OAAO,GAAG,EAAE;KACZ,OAAO,KAAK,CAAC;IACd;;GAED,SAAS,cAAc,CAAC,WAAW,EAAE;KACnC,IAAI,OAAO,CAAC,WAAW,CAAC,EAAE;OACxB,OAAO,WAAW,CAAC,GAAG,CAAC,SAAS,GAAG,EAAE;SACnC,OAAO,cAAc,CAAC,GAAG,CAAC,CAAC;QAC5B,CAAC,CAAC;MACJ;;KAED,IAAI,aAAa,CAAC,WAAW,CAAC,EAAE;OAC9B,OAAO,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,SAAS,GAAG,EAAE,CAAC,EAAE;SACtD,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;WAC1B,GAAG,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC;UACvB,MAAM;WACL,GAAG,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;UACzC;SACD,OAAO,GAAG,CAAC;QACZ,EAAE,EAAE,CAAC,CAAC;MACR;;KAED,OAAO,WAAW,CAAC;IACpB;;GAED,OAAO,cAAc,CAAC,SAAS,CAAC,CAAC;EAClC;;CAED,SAAc,GAAG;GACf,QAAQ,EAAE,QAAQ;GAClB,OAAO,EAAE,OAAO;GAChB,YAAY,EAAE,YAAY;GAC1B,UAAU,EAAE,UAAU;GACtB,cAAc,EAAE,cAAc;GAC9B,WAAW,EAAE,WAAW;GACxB,UAAU,EAAE,UAAU;GACtB,aAAa,EAAE,aAAa;GAC5B,QAAQ,EAAE,QAAQ;GAClB,OAAO,EAAE,OAAO;GAChB,aAAa,EAAE,aAAa;GAC5B,kBAAkB,EAAE,kBAAkB;GACtC,gBAAgB,EAAE,gBAAgB;GAClC,oBAAoB,EAAE,oBAAoB;GAC1C,aAAa,EAAE,aAAa;GAC5B,sBAAsB,EAAE,sBAAsB;GAC9C,6BAA6B,EAAE,6BAA6B;GAC5D,eAAe,EAAE,eAAe;GAChC,IAAI,EAAE,IAAI;GACV,WAAW,EAAE,WAAW;GACxB,QAAQ,EAAE,QAAQ;GAClB,YAAY,EAAE,YAAY;GAC1B,MAAM,EAAE,MAAM;GACd,UAAU,EAAE,UAAU;GACtB,SAAS,EAAE,SAAS;GACpB,KAAK,EAAE,KAAK;GACZ,gBAAgB,EAAE,gBAAgB;GAClC,mBAAmB,EAAE,mBAAmB;GACxC,eAAe,EAAE,eAAe;GAChC,gBAAgB,EAAE,gBAAgB;GAClC,QAAQ,EAAE,QAAQ;GAClB,IAAI,EAAE,IAAI;GACV,QAAQ,EAAE,QAAQ;GAClB,kBAAkB,EAAE,kBAAkB;GACtC,uBAAuB,EAAE,uBAAuB;GAChD,QAAQ,EAAE,QAAQ;EACnB,CAAC;;CCzoBF;;;;;;;;;;CAUA,IAAI,QAAQ,GAAG;GACb,mBAAmB,EAAE,IAAI;GACzB,KAAK,EAAE,KAAK;EACb,CAAC;;;CAGF,IAAIC,SAAO;GACT,OAAO,MAAM,KAAK,WAAW;OACzB,MAAM;OACN,OAAOF,cAAM,KAAK,WAAW,GAAGA,cAAM,GAAG,OAAO,IAAI,KAAK,WAAW,GAAG,IAAI,GAAG,EAAE,CAAC;;;CAGvF,IAAI,MAAM,GAAG,EAAE,CAAC,KAAK,CAAC;CACtB,IAAI,gBAAgB,GAAG,GAAG,CAAC;;;CAG3B,IAAI,cAAc,GAAG,yGAAyG,CAAC;;CAE/H,SAAS,eAAe,GAAG;GACzB,IAAI,OAAO,QAAQ,KAAK,WAAW,IAAI,QAAQ,CAAC,QAAQ,IAAI,IAAI,EAAE,OAAO,EAAE,CAAC;GAC5E,OAAO,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC;EAC/B;;CAED,SAAS,iBAAiB,GAAG;GAC3B,IAAI,OAAO,QAAQ,KAAK,WAAW,IAAI,QAAQ,CAAC,QAAQ,IAAI,IAAI,EAAE,OAAO,EAAE,CAAC;;;GAG5E,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE;KAC7B;OACE,QAAQ,CAAC,QAAQ,CAAC,QAAQ;OAC1B,IAAI;OACJ,QAAQ,CAAC,QAAQ,CAAC,QAAQ;QACzB,QAAQ,CAAC,QAAQ,CAAC,IAAI,GAAG,GAAG,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,GAAG,EAAE,CAAC;OAC5D;IACH;;GAED,OAAO,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;EACjC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyCD,QAAQ,CAAC,MAAM,GAAG,CAAC,SAAS,mBAAmB,GAAG;GAChD,IAAI,QAAQ,GAAG,EAAE;KACf,QAAQ,GAAG,IAAI;KACf,aAAa,GAAG,IAAI;KACpB,kBAAkB,GAAG,IAAI,CAAC;;;;;;GAM5B,SAAS,SAAS,CAAC,OAAO,EAAE;KAC1B,oBAAoB,EAAE,CAAC;KACvB,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACxB;;;;;;GAMD,SAAS,WAAW,CAAC,OAAO,EAAE;KAC5B,KAAK,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE;OAC7C,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,OAAO,EAAE;SAC3B,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACvB;MACF;IACF;;;;;GAKD,SAAS,cAAc,GAAG;KACxB,sBAAsB,EAAE,CAAC;KACzB,QAAQ,GAAG,EAAE,CAAC;IACf;;;;;;GAMD,SAAS,cAAc,CAAC,KAAK,EAAE,aAAa,EAAE;KAC5C,IAAI,SAAS,GAAG,IAAI,CAAC;KACrB,IAAI,aAAa,IAAI,CAAC,QAAQ,CAAC,mBAAmB,EAAE;OAClD,OAAO;MACR;KACD,KAAK,IAAI,CAAC,IAAI,QAAQ,EAAE;OACtB,IAAI,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE;SAC9B,IAAI;WACF,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;UACpE,CAAC,OAAO,KAAK,EAAE;WACd,SAAS,GAAG,KAAK,CAAC;UACnB;QACF;MACF;;KAED,IAAI,SAAS,EAAE;OACb,MAAM,SAAS,CAAC;MACjB;IACF;;GAED,IAAI,kBAAkB,EAAE,wBAAwB,CAAC;;;;;;;;;;;;;GAajD,SAAS,qBAAqB,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE;KAC1D,IAAI,KAAK,GAAG,IAAI,CAAC;;KAEjB,IAAI,SAAS,GAAG,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,GAAG,EAAE,CAAC;;KAEvD,IAAI,OAAO,GAAG,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,OAAO,GAAG,GAAG,CAAC;;KAE1D,IAAI,kBAAkB,EAAE;OACtB,QAAQ,CAAC,iBAAiB,CAAC,mCAAmC;SAC5D,kBAAkB;SAClB,GAAG;SACH,MAAM;SACN,OAAO;QACR,CAAC;OACF,oBAAoB,EAAE,CAAC;MACxB,MAAM,IAAI,SAAS,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE;;;;;;OAMhD,KAAK,GAAG,QAAQ,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;OAC9C,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;MAC7B,MAAM;OACL,IAAI,QAAQ,GAAG;SACb,GAAG,EAAE,GAAG;SACR,IAAI,EAAE,MAAM;SACZ,MAAM,EAAE,KAAK;QACd,CAAC;;OAEF,IAAI,IAAI,GAAG,SAAS,CAAC;OACrB,IAAI,MAAM,CAAC;;OAEX,IAAI,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,iBAAiB,EAAE;SACnD,IAAI,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;SAC3C,IAAI,MAAM,EAAE;WACV,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;WACjB,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;UACrB;QACF;;OAED,QAAQ,CAAC,IAAI,GAAG,gBAAgB,CAAC;;OAEjC,KAAK,GAAG;SACN,IAAI,EAAE,IAAI;SACV,OAAO,EAAE,OAAO;SAChB,GAAG,EAAE,eAAe,EAAE;SACtB,KAAK,EAAE,CAAC,QAAQ,CAAC;QAClB,CAAC;OACF,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;MAC7B;;KAED,IAAI,kBAAkB,EAAE;OACtB,OAAO,kBAAkB,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;MAClD;;KAED,OAAO,KAAK,CAAC;IACd;;GAED,SAAS,oBAAoB,GAAG;KAC9B,IAAI,wBAAwB,EAAE;OAC5B,OAAO;MACR;KACD,kBAAkB,GAAGE,SAAO,CAAC,OAAO,CAAC;KACrCA,SAAO,CAAC,OAAO,GAAG,qBAAqB,CAAC;KACxC,wBAAwB,GAAG,IAAI,CAAC;IACjC;;GAED,SAAS,sBAAsB,GAAG;KAChC,IAAI,CAAC,wBAAwB,EAAE;OAC7B,OAAO;MACR;KACDA,SAAO,CAAC,OAAO,GAAG,kBAAkB,CAAC;KACrC,wBAAwB,GAAG,KAAK,CAAC;KACjC,kBAAkB,GAAG,SAAS,CAAC;IAChC;;GAED,SAAS,oBAAoB,GAAG;KAC9B,IAAI,mBAAmB,GAAG,kBAAkB;OAC1C,SAAS,GAAG,QAAQ,CAAC;KACvB,QAAQ,GAAG,IAAI,CAAC;KAChB,kBAAkB,GAAG,IAAI,CAAC;KAC1B,aAAa,GAAG,IAAI,CAAC;KACrB,cAAc,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;IAC5E;;;;;;;;;GASD,SAAS,MAAM,CAAC,EAAE,EAAE,OAAO,EAAE;KAC3B,IAAI,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;KACrC,IAAI,kBAAkB,EAAE;OACtB,IAAI,aAAa,KAAK,EAAE,EAAE;SACxB,OAAO;QACR,MAAM;SACL,oBAAoB,EAAE,CAAC;QACxB;MACF;;KAED,IAAI,KAAK,GAAG,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;KAC3C,kBAAkB,GAAG,KAAK,CAAC;KAC3B,aAAa,GAAG,EAAE,CAAC;KACnB,QAAQ,GAAG,IAAI,CAAC;;;;;;KAMhB,UAAU,CAAC,WAAW;OACpB,IAAI,aAAa,KAAK,EAAE,EAAE;SACxB,oBAAoB,EAAE,CAAC;QACxB;MACF,EAAE,KAAK,CAAC,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC;;KAEhC,IAAI,OAAO,KAAK,KAAK,EAAE;OACrB,MAAM,EAAE,CAAC;MACV;IACF;;GAED,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC;GAC7B,MAAM,CAAC,WAAW,GAAG,WAAW,CAAC;GACjC,MAAM,CAAC,SAAS,GAAG,cAAc,CAAC;GAClC,OAAO,MAAM,CAAC;EACf,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqDL,QAAQ,CAAC,iBAAiB,GAAG,CAAC,SAAS,wBAAwB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4ChE,SAAS,8BAA8B,CAAC,EAAE,EAAE;KAC1C,IAAI,OAAO,EAAE,CAAC,KAAK,KAAK,WAAW,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO;;KAEzD,IAAI,MAAM,GAAG,yIAAyI,CAAC;KACvJ,IAAI,KAAK,GAAG,uHAAuH,CAAC;;;KAGpI,IAAI,KAAK,GAAG,4JAA4J,CAAC;;KAEzK,IAAI,SAAS,GAAG,+CAA+C,CAAC;KAChE,IAAI,UAAU,GAAG,+BAA+B,CAAC;KACjD,IAAI,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;KACjC,IAAI,KAAK,GAAG,EAAE,CAAC;KACf,IAAI,QAAQ,CAAC;KACb,IAAI,KAAK,CAAC;KACV,IAAI,OAAO,CAAC;KACZ,IAAI,SAAS,GAAG,qBAAqB,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;;KAEvD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE;OAC5C,KAAK,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG;SACnC,IAAI,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;SAC5D,IAAI,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;SACxD,IAAI,MAAM,KAAK,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;;WAEpD,KAAK,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;WACvB,KAAK,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;WACvB,KAAK,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;UACxB;SACD,OAAO,GAAG;WACR,GAAG,EAAE,CAAC,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI;WAChC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,gBAAgB;WAClC,IAAI,EAAE,QAAQ,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE;WAChC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI;WACjC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI;UACpC,CAAC;QACH,MAAM,KAAK,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG;SACzC,OAAO,GAAG;WACR,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;WACb,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,gBAAgB;WAClC,IAAI,EAAE,EAAE;WACR,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;WACf,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI;UACpC,CAAC;QACH,MAAM,KAAK,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG;SACzC,IAAI,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;SAC1D,IAAI,MAAM,KAAK,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;;WAEnD,KAAK,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;WACvB,KAAK,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;WACvB,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;UACjB,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,OAAO,EAAE,CAAC,YAAY,KAAK,WAAW,EAAE;;;;;WAKzE,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,EAAE,CAAC,YAAY,GAAG,CAAC,CAAC;UACvC;SACD,OAAO,GAAG;WACR,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;WACb,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,gBAAgB;WAClC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE;WACzC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI;WACjC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI;UACpC,CAAC;QACH,MAAM;SACL,SAAS;QACV;;OAED,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,EAAE;SACjC,OAAO,CAAC,IAAI,GAAG,gBAAgB,CAAC;QACjC;;OAED,IAAI,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,OAAO,EAAE;;;;;;SAMvD,IAAI,GAAG,GAAG,IAAI,cAAc,EAAE,CAAC;SAC/B,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;SACpC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;;;SAGf,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE;WACtB,IAAI,MAAM,GAAG,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC;;;;WAIpC,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC;;;WAG5B,IAAI,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;;;WAG9D,IAAI,UAAU,EAAE;aACd,IAAI,gBAAgB,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;;;;aAIrC,IAAI,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE;eACtC,gBAAgB,GAAG,iBAAiB,EAAE,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;cACpE;;;;aAID,OAAO,CAAC,GAAG,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAC7C;UACF;QACF;;OAED,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;MACrB;;KAED,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;OACjB,OAAO,IAAI,CAAC;MACb;;KAED,OAAO;OACL,IAAI,EAAE,EAAE,CAAC,IAAI;OACb,OAAO,EAAE,EAAE,CAAC,OAAO;OACnB,GAAG,EAAE,eAAe,EAAE;OACtB,KAAK,EAAE,KAAK;MACb,CAAC;IACH;;;;;;;;;;;;;;;GAeD,SAAS,mCAAmC,CAAC,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE;KAC5E,IAAI,OAAO,GAAG;OACZ,GAAG,EAAE,GAAG;OACR,IAAI,EAAE,MAAM;MACb,CAAC;;KAEF,IAAI,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,IAAI,EAAE;OAC/B,SAAS,CAAC,UAAU,GAAG,KAAK,CAAC;;OAE7B,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;SACjB,OAAO,CAAC,IAAI,GAAG,gBAAgB,CAAC;QACjC;;OAED,IAAI,SAAS,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;SAC9B,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,OAAO,CAAC,GAAG,EAAE;WAC1C,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,EAAE;aAC5C,OAAO,KAAK,CAAC;YACd,MAAM;aACL,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI;aACxB,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI;aACxC;aACA,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;aACvC,OAAO,KAAK,CAAC;YACd;UACF;QACF;;OAED,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;OACjC,SAAS,CAAC,OAAO,GAAG,IAAI,CAAC;OACzB,OAAO,IAAI,CAAC;MACb,MAAM;OACL,SAAS,CAAC,UAAU,GAAG,IAAI,CAAC;MAC7B;;KAED,OAAO,KAAK,CAAC;IACd;;;;;;;;;;;GAWD,SAAS,qCAAqC,CAAC,EAAE,EAAE,KAAK,EAAE;KACxD,IAAI,YAAY,GAAG,oEAAoE;OACrF,KAAK,GAAG,EAAE;OACV,KAAK,GAAG,EAAE;OACV,SAAS,GAAG,KAAK;OACjB,KAAK;OACL,IAAI,CACG;;KAET;OACE,IAAI,IAAI,GAAG,qCAAqC,CAAC,MAAM;OACvD,IAAI,IAAI,CAAC,SAAS;OAClB,IAAI,GAAG,IAAI,CAAC,MAAM;OAClB;OACA,IAAI,IAAI,KAAK,iBAAiB,IAAI,IAAI,KAAK,QAAQ,CAAC,MAAM,EAAE;;SAE1D,SAAS;QACV;;OAED,IAAI,GAAG;SACL,GAAG,EAAE,IAAI;SACT,IAAI,EAAE,gBAAgB;SACtB,IAAI,EAAE,IAAI;SACV,MAAM,EAAE,IAAI;QACb,CAAC;;OAEF,IAAI,IAAI,CAAC,IAAI,EAAE;SACb,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACvB,MAAM,KAAK,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,GAAG;SACvD,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB;;OAED,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,WAAW,EAAE;SACpC,IAAI;WACF,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;UAChE,CAAC,OAAO,CAAC,EAAE,EAAE;QACf;;OAED,IAAI,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE;SACpB,SAAS,GAAG,IAAI,CAAC;QAClB,MAAM;SACL,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;QACzB;;OAED,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;MAClB;;KAED,IAAI,KAAK,EAAE;;;OAGT,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;MACxB;;KAED,IAAI,MAAM,GAAG;OACX,IAAI,EAAE,EAAE,CAAC,IAAI;OACb,OAAO,EAAE,EAAE,CAAC,OAAO;OACnB,GAAG,EAAE,eAAe,EAAE;OACtB,KAAK,EAAE,KAAK;MACb,CAAC;KACF,mCAAmC;OACjC,MAAM;OACN,EAAE,CAAC,SAAS,IAAI,EAAE,CAAC,QAAQ;OAC3B,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,UAAU;OACxB,EAAE,CAAC,OAAO,IAAI,EAAE,CAAC,WAAW;MAC7B,CAAC;KACF,OAAO,MAAM,CAAC;IACf;;;;;;;GAOD,SAAS,iBAAiB,CAAC,EAAE,EAAE,KAAK,EAAE;KACpC,IAAI,KAAK,GAAG,IAAI,CAAC;KACjB,KAAK,GAAG,KAAK,IAAI,IAAI,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC;;KAEnC,IAAI;OACF,KAAK,GAAG,8BAA8B,CAAC,EAAE,CAAC,CAAC;OAC3C,IAAI,KAAK,EAAE;SACT,OAAO,KAAK,CAAC;QACd;MACF,CAAC,OAAO,CAAC,EAAE;OACV,IAAI,QAAQ,CAAC,KAAK,EAAE;SAClB,MAAM,CAAC,CAAC;QACT;MACF;;KAED,IAAI;OACF,KAAK,GAAG,qCAAqC,CAAC,EAAE,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;OAC7D,IAAI,KAAK,EAAE;SACT,OAAO,KAAK,CAAC;QACd;MACF,CAAC,OAAO,CAAC,EAAE;OACV,IAAI,QAAQ,CAAC,KAAK,EAAE;SAClB,MAAM,CAAC,CAAC;QACT;MACF;KACD,OAAO;OACL,IAAI,EAAE,EAAE,CAAC,IAAI;OACb,OAAO,EAAE,EAAE,CAAC,OAAO;OACnB,GAAG,EAAE,eAAe,EAAE;MACvB,CAAC;IACH;;GAED,iBAAiB,CAAC,mCAAmC,GAAG,mCAAmC,CAAC;GAC5F,iBAAiB,CAAC,8BAA8B,GAAG,8BAA8B,CAAC;;GAElF,OAAO,iBAAiB,CAAC;EAC1B,GAAG,CAAC;;CAEL,YAAc,GAAG,QAAQ,CAAC;;CCzqB1B;;;;;;;;;;;;;;;;;;;;;;;CAuBA,SAAS,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE;GACrB,IAAI,GAAG,GAAG,CAAC,CAAC,GAAG,MAAM,KAAK,CAAC,GAAG,MAAM,CAAC,CAAC;GACtC,IAAI,GAAG,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,GAAG,IAAI,EAAE,CAAC,CAAC;GAC9C,OAAO,CAAC,GAAG,IAAI,EAAE,KAAK,GAAG,GAAG,MAAM,CAAC,CAAC;EACrC;;;;;CAKD,SAAS,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE;GAC/B,OAAO,CAAC,GAAG,IAAI,GAAG,KAAK,GAAG,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;EAC5C;;;;;CAKD,SAAS,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;GAChC,OAAO,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;EAC5E;CACD,SAAS,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;GAClC,OAAO,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;EAClD;CACD,SAAS,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;GAClC,OAAO,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;EAClD;CACD,SAAS,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;GAClC,OAAO,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;EACzC;CACD,SAAS,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;GAClC,OAAO,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;EAC5C;;;;;CAKD,SAAS,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE;;GAEvB,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,IAAI,KAAK,GAAG,GAAG,EAAE,CAAC,CAAC;GAClC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,GAAG,GAAG,CAAC;;GAExC,IAAI,CAAC,CAAC;GACN,IAAI,IAAI,CAAC;GACT,IAAI,IAAI,CAAC;GACT,IAAI,IAAI,CAAC;GACT,IAAI,IAAI,CAAC;GACT,IAAI,CAAC,GAAG,UAAU,CAAC;GACnB,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;GACnB,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC;GACpB,IAAI,CAAC,GAAG,SAAS,CAAC;;GAElB,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;KACjC,IAAI,GAAG,CAAC,CAAC;KACT,IAAI,GAAG,CAAC,CAAC;KACT,IAAI,GAAG,CAAC,CAAC;KACT,IAAI,GAAG,CAAC,CAAC;;KAET,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;KAC3C,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC;KAChD,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,SAAS,CAAC,CAAC;KAC/C,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC;KACjD,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;KAC/C,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,UAAU,CAAC,CAAC;KAChD,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC;KACjD,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC;KAC/C,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC;KAC/C,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC;KACjD,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;KAC7C,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC;KAClD,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC;KAChD,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC;KAChD,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC;KAClD,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,UAAU,CAAC,CAAC;;KAEjD,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;KAC/C,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC;KAChD,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,SAAS,CAAC,CAAC;KAChD,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC;KAC5C,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;KAC/C,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;KAC9C,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC;KACjD,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC;KAChD,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;KAC9C,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC;KACjD,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC;KAChD,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,UAAU,CAAC,CAAC;KAChD,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC;KACjD,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;KAC9C,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,UAAU,CAAC,CAAC;KAChD,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC;;KAElD,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;KAC5C,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC;KACjD,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,UAAU,CAAC,CAAC;KACjD,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC;KAChD,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC;KAChD,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,UAAU,CAAC,CAAC;KAChD,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC;KAChD,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC;KAClD,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;KAC/C,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC;KAC5C,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC;KAChD,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAC;KAC9C,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;KAC/C,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC;KACjD,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,SAAS,CAAC,CAAC;KAChD,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC;;KAEhD,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;KAC3C,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,UAAU,CAAC,CAAC;KAChD,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC;KAClD,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC;KAC/C,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC;KAChD,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC;KACjD,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC;KAC/C,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC;KACjD,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC;KAC/C,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC;KAChD,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC;KACjD,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,UAAU,CAAC,CAAC;KACjD,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;KAC/C,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC;KAClD,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,SAAS,CAAC,CAAC;KAC/C,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC;;KAEhD,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;KACrB,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;KACrB,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;KACrB,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACtB;GACD,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;EACrB;;;;;CAKD,SAAS,SAAS,CAAC,KAAK,EAAE;GACxB,IAAI,CAAC,CAAC;GACN,IAAI,MAAM,GAAG,EAAE,CAAC;GAChB,IAAI,QAAQ,GAAG,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC;GACjC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,IAAI,CAAC,EAAE;KAChC,MAAM,IAAI,MAAM,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC;IACpE;GACD,OAAO,MAAM,CAAC;EACf;;;;;;CAMD,SAAS,SAAS,CAAC,KAAK,EAAE;GACxB,IAAI,CAAC,CAAC;GACN,IAAI,MAAM,GAAG,EAAE,CAAC;GAChB,MAAM,CAAC,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC;GAC5C,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE;KACrC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACf;GACD,IAAI,OAAO,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;GAC/B,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE;KAC/B,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;IAChE;GACD,OAAO,MAAM,CAAC;EACf;;;;;CAKD,SAAS,OAAO,CAAC,CAAC,EAAE;GAClB,OAAO,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;EACvD;;;;;CAKD,SAAS,WAAW,CAAC,GAAG,EAAE,IAAI,EAAE;GAC9B,IAAI,CAAC,CAAC;GACN,IAAI,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;GAC1B,IAAI,IAAI,GAAG,EAAE,CAAC;GACd,IAAI,IAAI,GAAG,EAAE,CAAC;GACd,IAAI,IAAI,CAAC;GACT,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC;GAChC,IAAI,IAAI,CAAC,MAAM,GAAG,EAAE,EAAE;KACpB,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACtC;GACD,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE;KAC1B,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC;KAC/B,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC;IAChC;GACD,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;GACpE,OAAO,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC;EACzD;;;;;CAKD,SAAS,QAAQ,CAAC,KAAK,EAAE;GACvB,IAAI,MAAM,GAAG,kBAAkB,CAAC;GAChC,IAAI,MAAM,GAAG,EAAE,CAAC;GAChB,IAAI,CAAC,CAAC;GACN,IAAI,CAAC,CAAC;GACN,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE;KACpC,CAAC,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;KACxB,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACrE;GACD,OAAO,MAAM,CAAC;EACf;;;;;CAKD,SAAS,YAAY,CAAC,KAAK,EAAE;GAC3B,OAAO,QAAQ,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC;EAC5C;;;;;CAKD,SAAS,MAAM,CAAC,CAAC,EAAE;GACjB,OAAO,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;EACjC;CACD,SAAS,MAAM,CAAC,CAAC,EAAE;GACjB,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;EAC5B;CACD,SAAS,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE;GACxB,OAAO,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;EACtD;CACD,SAAS,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE;GACxB,OAAO,QAAQ,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;EACnC;;CAED,SAAS,GAAG,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE;GAC7B,IAAI,CAAC,GAAG,EAAE;KACR,IAAI,CAAC,GAAG,EAAE;OACR,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC;MACvB;KACD,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC;IACvB;GACD,IAAI,CAAC,GAAG,EAAE;KACR,OAAO,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAChC;GACD,OAAO,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;EAChC;;CAED,SAAc,GAAG,GAAG,CAAC;;CCzQrB,SAAS,gBAAgB,CAAC,OAAO,EAAE;GACjC,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;GAC/B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;EACxB;CACD,gBAAgB,CAAC,SAAS,GAAG,IAAI,KAAK,EAAE,CAAC;CACzC,gBAAgB,CAAC,SAAS,CAAC,WAAW,GAAG,gBAAgB,CAAC;;CAE1D,eAAc,GAAG,gBAAgB,CAAC;;CCLlC,IAAI,UAAU,GAAG,SAAS,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE;GAClD,IAAI,oBAAoB,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;GAC1C,IAAI,eAAe,GAAG,OAAO,CAAC;;GAE9B,IAAI,EAAE,KAAK,IAAI,OAAO,CAAC,EAAE;KACvB,OAAO;IACR;;GAED,IAAI,WAAW,GAAG,KAAK,KAAK,MAAM,GAAG,SAAS,GAAG,KAAK,CAAC;;GAEvD,OAAO,CAAC,KAAK,CAAC,GAAG,WAAW;KAC1B,IAAI,IAAI,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;;KAEpC,IAAI,GAAG,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;KACpC,IAAI,IAAI,GAAG,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;;KAE7E,IAAI,KAAK,KAAK,QAAQ,EAAE;OACtB,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE;;SAErB,GAAG;WACD,oBAAoB,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,gBAAgB,CAAC,CAAC;SAClF,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SACrC,QAAQ,IAAI,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACjC;MACF,MAAM;OACL,QAAQ,IAAI,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;MACjC;;;KAGD,IAAI,oBAAoB,EAAE;;;OAGxB,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,oBAAoB,EAAE,eAAe,EAAE,IAAI,CAAC,CAAC;MAC5E;IACF,CAAC;EACH,CAAC;;CAEF,aAAc,GAAG;GACf,UAAU,EAAE,UAAU;EACvB,CAAC;;CCzCF;;;;;;;;CAQA,IAAIC,cAAY,GAAG,KAAK,CAAC,YAAY,CAAC;CACtC,IAAIC,YAAU,GAAG,KAAK,CAAC,UAAU,CAAC;CAClC,IAAIC,gBAAc,GAAG,KAAK,CAAC,cAAc,CAAC;CAC1C,IAAIC,SAAO,GAAG,KAAK,CAAC,OAAO,CAAC;CAC5B,IAAIC,UAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;CAC9B,IAAIC,eAAa,GAAG,KAAK,CAAC,aAAa,CAAC;CACxC,IAAIC,aAAW,GAAG,KAAK,CAAC,WAAW,CAAC;CACpC,IAAIC,YAAU,GAAG,KAAK,CAAC,UAAU,CAAC;CAClC,IAAIC,UAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;CAC9B,IAAIC,SAAO,GAAG,KAAK,CAAC,OAAO,CAAC;CAC5B,IAAIC,eAAa,GAAG,KAAK,CAAC,aAAa,CAAC;CACxC,IAAIC,MAAI,GAAG,KAAK,CAAC,IAAI,CAAC;CACtB,IAAIC,aAAW,GAAG,KAAK,CAAC,WAAW,CAAC;CACpC,IAAIC,UAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;CAC9B,IAAIC,cAAY,GAAG,KAAK,CAAC,YAAY,CAAC;CACtC,IAAIC,QAAM,GAAG,KAAK,CAAC,MAAM,CAAC;CAC1B,IAAIC,YAAU,GAAG,KAAK,CAAC,UAAU,CAAC;CAClC,IAAIC,WAAS,GAAG,KAAK,CAAC,SAAS,CAAC;CAChC,IAAIC,OAAK,GAAG,KAAK,CAAC,KAAK,CAAC;CACxB,IAAIC,kBAAgB,GAAG,KAAK,CAAC,gBAAgB,CAAC;CAC9C,IAAIC,iBAAe,GAAG,KAAK,CAAC,eAAe,CAAC;CAC5C,IAAIC,kBAAgB,GAAG,KAAK,CAAC,gBAAgB,CAAC;CAC9C,IAAIC,UAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;CAC9B,IAAIC,MAAI,GAAG,KAAK,CAAC,IAAI,CAAC;CACtB,IAAIC,eAAa,GAAG,KAAK,CAAC,aAAa,CAAC;CACxC,IAAIC,wBAAsB,GAAG,KAAK,CAAC,sBAAsB,CAAC;CAC1D,IAAIC,yBAAuB,GAAG,KAAK,CAAC,uBAAuB,CAAC;CAC5D,IAAIC,oBAAkB,GAAG,KAAK,CAAC,kBAAkB,CAAC;CAClD,IAAIC,UAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;;CAE9B,IAAI,iBAAiB,GAAGC,SAAoB,CAAC,UAAU,CAAC;;CAExD,IAAI,OAAO,GAAG,0CAA0C,CAAC,KAAK,CAAC,GAAG,CAAC;GACjE,UAAU,GAAG,+DAA+D,CAAC;;CAE/E,SAAS,GAAG,GAAG;GACb,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;EACpB;;;CAGD,IAAI9B,SAAO;GACT,OAAO,MAAM,KAAK,WAAW;OACzB,MAAM;OACN,OAAOF,cAAM,KAAK,WAAW,GAAGA,cAAM,GAAG,OAAO,IAAI,KAAK,WAAW,GAAG,IAAI,GAAG,EAAE,CAAC;CACvF,IAAI,SAAS,GAAGE,SAAO,CAAC,QAAQ,CAAC;CACjC,IAAI,UAAU,GAAGA,SAAO,CAAC,SAAS,CAAC;;CAEnC,SAAS,oBAAoB,CAAC,QAAQ,EAAE,QAAQ,EAAE;GAChD,OAAOQ,YAAU,CAAC,QAAQ,CAAC;OACvB,SAAS,IAAI,EAAE;SACb,OAAO,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACjC;OACD,QAAQ,CAAC;EACd;;;;;CAKD,SAAS,KAAK,GAAG;GACf,IAAI,CAAC,QAAQ,GAAG,CAAC,EAAE,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC;;GAE/D,IAAI,CAAC,YAAY,GAAG,CAACD,aAAW,CAAC,SAAS,CAAC,CAAC;GAC5C,IAAI,CAAC,aAAa,GAAG,CAACA,aAAW,CAAC,UAAU,CAAC,CAAC;GAC9C,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC;GACnC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;GACtB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;GACzB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;GAC1B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;GACvB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;GAC3B,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;GACzB,IAAI,CAAC,cAAc,GAAG;;KAEpB,OAAO,EAAEP,SAAO,CAAC,cAAc,IAAIA,SAAO,CAAC,cAAc,CAAC,EAAE;KAC5D,MAAM,EAAE,YAAY;KACpB,YAAY,EAAE,EAAE;KAChB,UAAU,EAAE,EAAE;KACd,aAAa,EAAE,EAAE;KACjB,YAAY,EAAE,EAAE;KAChB,OAAO,EAAE,IAAI;KACb,mBAAmB,EAAE,IAAI;KACzB,0BAA0B,EAAE,IAAI;KAChC,gBAAgB,EAAE,CAAC;;KAEnB,YAAY,EAAE,GAAG;KACjB,eAAe,EAAE,EAAE;KACnB,eAAe,EAAE,IAAI;KACrB,UAAU,EAAE,IAAI;KAChB,UAAU,EAAE,CAAC;KACb,YAAY,EAAE,EAAE;IACjB,CAAC;GACF,IAAI,CAAC,cAAc,GAAG;KACpB,MAAM,EAAE,MAAM;KACd,SAAS,EAAE,IAAI;;;;;KAKf,cAAc,EAAE0B,wBAAsB,EAAE,GAAG,QAAQ,GAAG,EAAE;IACzD,CAAC;GACF,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC;GACxB,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;GAC/B,IAAI,CAAC,6BAA6B,GAAG,KAAK,CAAC,eAAe,CAAC;;;GAG3D,IAAI,CAAC,gBAAgB,GAAG1B,SAAO,CAAC,OAAO,IAAI,EAAE,CAAC;GAC9C,IAAI,CAAC,uBAAuB,GAAG,EAAE,CAAC;GAClC,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;GACnB,IAAI,CAAC,UAAU,GAAG,GAAG,EAAE,CAAC;GACxB,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAC;GAC3B,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;GACvB,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;GAC/B,IAAI,CAAC,gBAAgB,CAAC;GACtB,IAAI,CAAC,SAAS,GAAGA,SAAO,CAAC,QAAQ,CAAC;GAClC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;GACvD,IAAI,CAAC,aAAa,EAAE,CAAC;;;GAGrB,KAAK,IAAI,MAAM,IAAI,IAAI,CAAC,gBAAgB,EAAE;KACxC,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACtE;EACF;;;;;;;;CAQD,KAAK,CAAC,SAAS,GAAG;;;;;GAKhB,OAAO,EAAE,QAAQ;;GAEjB,KAAK,EAAE,KAAK;;GAEZ,QAAQ,EAAE+B,QAAQ;;;;;;;;;GASlB,MAAM,EAAE,SAAS,GAAG,EAAE,OAAO,EAAE;KAC7B,IAAI,IAAI,GAAG,IAAI,CAAC;;KAEhB,IAAI,IAAI,CAAC,aAAa,EAAE;OACtB,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,0CAA0C,CAAC,CAAC;OACpE,OAAO,IAAI,CAAC;MACb;KACD,IAAI,CAAC,GAAG,EAAE,OAAO,IAAI,CAAC;;KAEtB,IAAI,aAAa,GAAG,IAAI,CAAC,cAAc,CAAC;;;KAGxC,IAAI,OAAO,EAAE;OACXnB,MAAI,CAAC,OAAO,EAAE,SAAS,GAAG,EAAE,KAAK,EAAE;;SAEjC,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,OAAO,IAAI,GAAG,KAAK,MAAM,EAAE;WACvD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;UAClC,MAAM;WACL,aAAa,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;UAC5B;QACF,CAAC,CAAC;MACJ;;KAED,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;;;;KAIjB,aAAa,CAAC,YAAY,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;KACrD,aAAa,CAAC,YAAY,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;;;KAGjF,aAAa,CAAC,YAAY,GAAGK,YAAU,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;KACpE,aAAa,CAAC,UAAU,GAAG,aAAa,CAAC,UAAU,CAAC,MAAM;SACtDA,YAAU,CAAC,aAAa,CAAC,UAAU,CAAC;SACpC,KAAK,CAAC;KACV,aAAa,CAAC,aAAa,GAAG,aAAa,CAAC,aAAa,CAAC,MAAM;SAC5DA,YAAU,CAAC,aAAa,CAAC,aAAa,CAAC;SACvC,KAAK,CAAC;KACV,aAAa,CAAC,YAAY,GAAGA,YAAU,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;KACpE,aAAa,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG;OACrC,CAAC;OACD,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,cAAc,IAAI,GAAG,EAAE,GAAG,CAAC;MACnD,CAAC;;KAEF,IAAI,sBAAsB,GAAG;OAC3B,GAAG,EAAE,IAAI;OACT,OAAO,EAAE,IAAI;OACb,GAAG,EAAE,IAAI;OACT,QAAQ,EAAE,IAAI;OACd,MAAM,EAAE,IAAI;MACb,CAAC;;KAEF,IAAI,eAAe,GAAG,aAAa,CAAC,eAAe,CAAC;KACpD,IAAI,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,iBAAiB,EAAE;OAC3D,eAAe,GAAGJ,aAAW,CAAC,sBAAsB,EAAE,eAAe,CAAC,CAAC;MACxE,MAAM,IAAI,eAAe,KAAK,KAAK,EAAE;OACpC,eAAe,GAAG,sBAAsB,CAAC;MAC1C;KACD,aAAa,CAAC,eAAe,GAAG,eAAe,CAAC;;KAEhD,IAAI,kBAAkB,GAAG;OACvB,QAAQ,EAAE,IAAI;MACf,CAAC;;KAEF,IAAI,UAAU,GAAG,aAAa,CAAC,UAAU,CAAC;KAC1C,IAAI,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,iBAAiB,EAAE;OACtD,UAAU,GAAGA,aAAW,CAAC,kBAAkB,EAAE,UAAU,CAAC,CAAC;MAC1D,MAAM,IAAI,UAAU,KAAK,KAAK,EAAE;OAC/B,UAAU,GAAG,kBAAkB,CAAC;MACjC;KACD,aAAa,CAAC,UAAU,GAAG,UAAU,CAAC;;KAEtCkB,QAAQ,CAAC,mBAAmB,GAAG,CAAC,CAAC,aAAa,CAAC,mBAAmB,CAAC;;;KAGnE,OAAO,IAAI,CAAC;IACb;;;;;;;;;;GAUD,OAAO,EAAE,WAAW;KAClB,IAAI,IAAI,GAAG,IAAI,CAAC;KAChB,IAAI,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE;OAC7CA,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,WAAW;SACnC,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QACrD,CAAC,CAAC;;OAEH,IAAI,IAAI,CAAC,cAAc,CAAC,0BAA0B,EAAE;SAClD,IAAI,CAAC,8BAA8B,EAAE,CAAC;QACvC;;OAED,IAAI,CAAC,sBAAsB,EAAE,CAAC;;OAE9B,IAAI,IAAI,CAAC,cAAc,CAAC,UAAU,IAAI,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,QAAQ,EAAE;SAC7E,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC5B;;OAED,IAAI,IAAI,CAAC,cAAc,CAAC,eAAe,EAAE,IAAI,CAAC,sBAAsB,EAAE,CAAC;;;OAGvE,IAAI,CAAC,aAAa,EAAE,CAAC;;OAErB,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;MAC/B;;KAED,KAAK,CAAC,eAAe,GAAG,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC;KAC5D,OAAO,IAAI,CAAC;IACb;;;;;;;GAOD,MAAM,EAAE,SAAS,GAAG,EAAE;KACpB,IAAI,IAAI,GAAG,IAAI;OACb,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;OACzB,SAAS,GAAG,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC;OACrC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;;KAEvC,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC;KAChB,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC,IAAI,CAAC;KAC3B,IAAI,CAAC,aAAa,GAAG,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;KACpD,IAAI,CAAC,cAAc,GAAG,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;;KAErD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;;KAEhD,IAAI,CAAC,eAAe;OAClB,IAAI,CAAC,aAAa,GAAG,GAAG,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAAC,cAAc,GAAG,SAAS,CAAC;;;;KAI7E,IAAI,CAAC,aAAa,EAAE,CAAC;IACtB;;;;;;;;;;GAUD,OAAO,EAAE,SAAS,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE;KACrC,IAAIvB,YAAU,CAAC,OAAO,CAAC,EAAE;OACvB,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;OAClB,IAAI,GAAG,OAAO,CAAC;OACf,OAAO,GAAG,EAAE,CAAC;MACd;;KAED,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACnD;;;;;;;;;;GAUD,IAAI,EAAE,SAAS,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE;KACrC,IAAI,IAAI,GAAG,IAAI,CAAC;;;KAGhB,IAAID,aAAW,CAAC,IAAI,CAAC,IAAI,CAACC,YAAU,CAAC,OAAO,CAAC,EAAE;OAC7C,OAAO,OAAO,CAAC;MAChB;;;KAGD,IAAIA,YAAU,CAAC,OAAO,CAAC,EAAE;OACvB,IAAI,GAAG,OAAO,CAAC;OACf,OAAO,GAAG,SAAS,CAAC;MACrB;;;;KAID,IAAI,CAACA,YAAU,CAAC,IAAI,CAAC,EAAE;OACrB,OAAO,IAAI,CAAC;MACb;;;KAGD,IAAI;OACF,IAAI,IAAI,CAAC,SAAS,EAAE;SAClB,OAAO,IAAI,CAAC;QACb;;;OAGD,IAAI,IAAI,CAAC,iBAAiB,EAAE;SAC1B,OAAO,IAAI,CAAC,iBAAiB,CAAC;QAC/B;MACF,CAAC,OAAO,CAAC,EAAE;;;;OAIV,OAAO,IAAI,CAAC;MACb;;KAED,SAAS,OAAO,GAAG;OACjB,IAAI,IAAI,GAAG,EAAE;SACX,CAAC,GAAG,SAAS,CAAC,MAAM;SACpB,IAAI,GAAG,CAAC,OAAO,KAAK,OAAO,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC;;OAEzD,IAAI,OAAO,IAAIA,YAAU,CAAC,OAAO,CAAC,EAAE;SAClC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAChC;;;;OAID,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;;OAE7E,IAAI;;;;;SAKF,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC/B,CAAC,OAAO,CAAC,EAAE;SACV,IAAI,CAAC,kBAAkB,EAAE,CAAC;SAC1B,IAAI,CAAC,gBAAgB,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;SAClC,MAAM,CAAC,CAAC;QACT;MACF;;;KAGD,KAAK,IAAI,QAAQ,IAAI,IAAI,EAAE;OACzB,IAAIQ,QAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE;SAC1B,OAAO,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;QACpC;MACF;KACD,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;;KAEnC,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC;;;KAGjC,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;KACzB,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;;KAExB,OAAO,OAAO,CAAC;IAChB;;;;;;;GAOD,SAAS,EAAE,WAAW;KACpBe,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;;KAE5B,IAAI,CAAC,8BAA8B,EAAE,CAAC;KACtC,IAAI,CAAC,wBAAwB,EAAE,CAAC;KAChC,IAAI,CAAC,gBAAgB,EAAE,CAAC;KACxB,IAAI,CAAC,eAAe,EAAE,CAAC;;KAEvB,KAAK,CAAC,eAAe,GAAG,IAAI,CAAC,6BAA6B,CAAC;KAC3D,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;;KAE/B,OAAO,IAAI,CAAC;IACb;;;;;;;;;;GAUD,wBAAwB,EAAE,SAAS,KAAK,EAAE;KACxC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,2CAA2C,EAAE,KAAK,CAAC,CAAC;KAC5E,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,MAAM,EAAE;OAClC,SAAS,EAAE;SACT,IAAI,EAAE,sBAAsB;SAC5B,OAAO,EAAE,KAAK;QACf;MACF,CAAC,CAAC;IACJ;;;;;;;GAOD,8BAA8B,EAAE,WAAW;KACzC,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;KACzE/B,SAAO,CAAC,gBAAgB;OACtBA,SAAO,CAAC,gBAAgB,CAAC,oBAAoB,EAAE,IAAI,CAAC,wBAAwB,CAAC,CAAC;KAChF,OAAO,IAAI,CAAC;IACb;;;;;;;GAOD,8BAA8B,EAAE,WAAW;KACzCA,SAAO,CAAC,mBAAmB;OACzBA,SAAO,CAAC,mBAAmB,CAAC,oBAAoB,EAAE,IAAI,CAAC,wBAAwB,CAAC,CAAC;KACnF,OAAO,IAAI,CAAC;IACb;;;;;;;;;GASD,gBAAgB,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE;KACtC,OAAO,GAAGa,aAAW,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,GAAG,EAAE,CAAC,CAAC;;KAEnE,IAAIZ,cAAY,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE;;OAEhC,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC;MACf,MAAM,IAAIC,YAAU,CAAC,EAAE,CAAC,IAAIC,gBAAc,CAAC,EAAE,CAAC,EAAE;;;;;OAK/C,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,KAAKD,YAAU,CAAC,EAAE,CAAC,GAAG,UAAU,GAAG,cAAc,CAAC,CAAC;OACrE,IAAI,OAAO,GAAG,EAAE,CAAC,OAAO,GAAG,IAAI,GAAG,IAAI,GAAG,EAAE,CAAC,OAAO,GAAG,IAAI,CAAC;;OAE3D,OAAO,IAAI,CAAC,cAAc;SACxB,OAAO;SACPW,aAAW,CAAC,OAAO,EAAE;;;WAGnB,UAAU,EAAE,IAAI;WAChB,cAAc,EAAE,OAAO,CAAC,cAAc,GAAG,CAAC;UAC3C,CAAC;QACH,CAAC;MACH,MAAM,IAAIT,SAAO,CAAC,EAAE,CAAC,EAAE;;OAEtB,EAAE,GAAG,EAAE,CAAC;MACT,MAAM,IAAIE,eAAa,CAAC,EAAE,CAAC,EAAE;;;;OAI5B,OAAO,GAAG,IAAI,CAAC,0CAA0C,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;OACvE,EAAE,GAAG,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;MACjC,MAAM;;;;;;;OAOL,OAAO,IAAI,CAAC,cAAc;SACxB,EAAE;SACFO,aAAW,CAAC,OAAO,EAAE;WACnB,UAAU,EAAE,IAAI;WAChB,cAAc,EAAE,OAAO,CAAC,cAAc,GAAG,CAAC;UAC3C,CAAC;QACH,CAAC;MACH;;;KAGD,IAAI,CAAC,sBAAsB,GAAG,EAAE,CAAC;;;;;;;KAOjC,IAAI;OACF,IAAI,KAAK,GAAGkB,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;OAC3C,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;MACvC,CAAC,OAAO,GAAG,EAAE;OACZ,IAAI,EAAE,KAAK,GAAG,EAAE;SACd,MAAM,GAAG,CAAC;QACX;MACF;;KAED,OAAO,IAAI,CAAC;IACb;;GAED,0CAA0C,EAAE,SAAS,cAAc,EAAE,EAAE,EAAE;KACvE,IAAI,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;KACpC,IAAI,OAAO,GAAGlB,aAAW,CAAC,cAAc,EAAE;OACxC,OAAO;SACL,0CAA0C,GAAGc,yBAAuB,CAAC,MAAM,CAAC;OAC9E,WAAW,EAAE,CAACK,KAAG,CAAC,MAAM,CAAC,CAAC;OAC1B,KAAK,EAAE,cAAc,CAAC,KAAK,IAAI,EAAE;MAClC,CAAC,CAAC;KACH,OAAO,CAAC,KAAK,CAAC,cAAc,GAAGJ,oBAAkB,CAAC,EAAE,CAAC,CAAC;;KAEtD,OAAO,OAAO,CAAC;IAChB;;;;;;;;;GASD,cAAc,EAAE,SAAS,GAAG,EAAE,OAAO,EAAE;;;;KAIrC;OACE,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,IAAI;OACvC,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC;OAC1C;OACA,OAAO;MACR;;KAED,OAAO,GAAG,OAAO,IAAI,EAAE,CAAC;KACxB,GAAG,GAAG,GAAG,GAAG,EAAE,CAAC;;KAEf,IAAI,IAAI,GAAGf,aAAW;OACpB;SACE,OAAO,EAAE,GAAG;QACb;OACD,OAAO;MACR,CAAC;;KAEF,IAAI,EAAE,CAAC;;;;;KAKP,IAAI;OACF,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC;MACtB,CAAC,OAAO,GAAG,EAAE;OACZ,EAAE,GAAG,GAAG,CAAC;MACV;;;KAGD,EAAE,CAAC,IAAI,GAAG,IAAI,CAAC;KACf,IAAI,KAAK,GAAGkB,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;;;KAG3C,IAAI,WAAW,GAAGrB,SAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;;;;;KAKzD,IAAI,WAAW,IAAI,WAAW,CAAC,IAAI,KAAK,wBAAwB,EAAE;OAChE,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;MAC9B;;KAED,IAAI,OAAO,GAAG,CAAC,WAAW,IAAI,WAAW,CAAC,GAAG,KAAK,EAAE,CAAC;;KAErD;OACE,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,IAAI;OACrC,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC;OAC5C;OACA,OAAO;MACR;;KAED;OACE,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,IAAI;OACxC,CAAC,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC;OAChD;OACA,OAAO;MACR;;KAED,IAAI,IAAI,CAAC,cAAc,CAAC,UAAU,KAAK,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,EAAE;;OAErE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC;;OAErE,OAAO,GAAGG,aAAW;SACnB;WACE,cAAc,EAAE,CAAC;UAClB;SACD,OAAO;QACR,CAAC;;;;;OAKF,OAAO,CAAC,cAAc,IAAI,CAAC,CAAC;;OAE5B,IAAI,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;OACjD,IAAI,CAAC,UAAU,GAAG;;SAEhB,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE;QACzB,CAAC;MACH;;;KAGD,IAAI,IAAI,CAAC,WAAW,EAAE;OACpB,IAAI,CAAC,WAAW,GAAGH,SAAO,CAAC,IAAI,CAAC,WAAW,CAAC;WACxC,IAAI,CAAC,WAAW;WAChB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;MACxB;;;KAGD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;;KAEjB,OAAO,IAAI,CAAC;IACb;;GAED,iBAAiB,EAAE,SAAS,GAAG,EAAE;KAC/B,IAAI,KAAK,GAAGG,aAAW;OACrB;SACE,SAAS,EAAE,GAAG,EAAE,GAAG,IAAI;QACxB;OACD,GAAG;MACJ,CAAC;;KAEF,IAAIL,YAAU,CAAC,IAAI,CAAC,cAAc,CAAC,kBAAkB,CAAC,EAAE;OACtD,IAAI,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;;OAE3D,IAAIH,UAAQ,CAAC,MAAM,CAAC,IAAI,CAACM,eAAa,CAAC,MAAM,CAAC,EAAE;SAC9C,KAAK,GAAG,MAAM,CAAC;QAChB,MAAM,IAAI,MAAM,KAAK,KAAK,EAAE;SAC3B,OAAO,IAAI,CAAC;QACb;MACF;;KAED,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;KAC9B,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,cAAc,EAAE;OACjE,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;MAC3B;KACD,OAAO,IAAI,CAAC;IACb;;GAED,SAAS,EAAE,SAAS,MAAM,2BAA2B;KACnD,IAAI,UAAU,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;;KAE7C,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;KACzC,IAAI,IAAI,CAAC,iBAAiB,EAAE;OAC1B,IAAI,CAAC,aAAa,EAAE,CAAC;MACtB;;KAED,OAAO,IAAI,CAAC;IACb;;;;;;;;GAQD,cAAc,EAAE,SAAS,IAAI,EAAE;;KAE7B,IAAI,CAAC,cAAc,CAAC,IAAI,GAAG,IAAI,CAAC;;KAEhC,OAAO,IAAI,CAAC;IACb;;;;;;;;GAQD,eAAe,EAAE,SAAS,KAAK,EAAE;KAC/B,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;;KAEnC,OAAO,IAAI,CAAC;IACb;;;;;;;;GAQD,cAAc,EAAE,SAAS,IAAI,EAAE;KAC7B,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;;KAEjC,OAAO,IAAI,CAAC;IACb;;;;;;;GAOD,YAAY,EAAE,WAAW;KACvB,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;;KAEzB,OAAO,IAAI,CAAC;IACb;;;;;;;GAOD,UAAU,EAAE,WAAW;;KAErB,OAAO,IAAI,CAAC,KAAK,CAACZ,WAAS,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;IACnD;;;;;;;;GAQD,cAAc,EAAE,SAAS,WAAW,EAAE;KACpC,IAAI,CAAC,cAAc,CAAC,WAAW,GAAG,WAAW,CAAC;;KAE9C,OAAO,IAAI,CAAC;IACb;;;;;;;;GAQD,UAAU,EAAE,SAAS,OAAO,EAAE;KAC5B,IAAI,CAAC,cAAc,CAAC,OAAO,GAAG,OAAO,CAAC;;KAEtC,OAAO,IAAI,CAAC;IACb;;;;;;;;;GASD,eAAe,EAAE,SAAS,QAAQ,EAAE;KAClC,IAAI,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC;KAChD,IAAI,CAAC,cAAc,CAAC,YAAY,GAAG,oBAAoB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;KAC5E,OAAO,IAAI,CAAC;IACb;;;;;;;;;GASD,qBAAqB,EAAE,SAAS,QAAQ,EAAE;KACxC,IAAI,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,kBAAkB,CAAC;KACtD,IAAI,CAAC,cAAc,CAAC,kBAAkB,GAAG,oBAAoB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;KAClF,OAAO,IAAI,CAAC;IACb;;;;;;;;;GASD,qBAAqB,EAAE,SAAS,QAAQ,EAAE;KACxC,IAAI,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,kBAAkB,CAAC;KACtD,IAAI,CAAC,cAAc,CAAC,kBAAkB,GAAG,oBAAoB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;KAClF,OAAO,IAAI,CAAC;IACb;;;;;;;;;;;GAWD,YAAY,EAAE,SAAS,SAAS,EAAE;KAChC,IAAI,CAAC,cAAc,CAAC,SAAS,GAAG,SAAS,CAAC;;KAE1C,OAAO,IAAI,CAAC;IACb;;;;;;;GAOD,aAAa,EAAE,WAAW;KACxB,OAAO,IAAI,CAAC,sBAAsB,CAAC;IACpC;;;;;;;GAOD,WAAW,EAAE,WAAW;KACtB,OAAO,IAAI,CAAC,YAAY,CAAC;IAC1B;;;;;;;GAOD,OAAO,EAAE,WAAW;KAClB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,KAAK,CAAC;KACjC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;OACvB,IAAI,CAAC,IAAI,CAAC,uBAAuB,EAAE;SACjC,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC;SACpC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,uCAAuC,CAAC,CAAC;QAClE;OACD,OAAO,KAAK,CAAC;MACd;KACD,OAAO,IAAI,CAAC;IACb;;GAED,SAAS,EAAE,WAAW;;;;KAIpB,IAAI,WAAW,GAAGC,SAAO,CAAC,WAAW,CAAC;KACtC,IAAI,WAAW,EAAE;OACf,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC;MAC5D;IACF;;GAED,gBAAgB,EAAE,SAAS,OAAO,EAAE;KAClC;OACE,CAAC,SAAS;;OAEV,OAAO;;KAET,OAAO,GAAG,OAAO,IAAI,EAAE,CAAC;;KAExB,IAAI,WAAW,GAAG,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;KACxD,IAAI,CAAC,WAAW,EAAE;OAChB,MAAM,IAAIiC,WAAgB,CAAC,iBAAiB,CAAC,CAAC;MAC/C;;KAED,IAAI,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC;KACnC,IAAI,CAAC,GAAG,EAAE;OACR,MAAM,IAAIA,WAAgB,CAAC,aAAa,CAAC,CAAC;MAC3C;;KAED,IAAI,MAAM,GAAG,kBAAkB,CAAC;KAChC,IAAI,EAAE,GAAG,EAAE,CAAC;KACZ,EAAE,IAAI,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;KACxC,EAAE,IAAI,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;;KAE5B,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;KACpD,IAAI,IAAI,EAAE;OACR,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;OAClD,IAAI,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;MACtD;;KAED,IAAI,YAAY,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;;KAE9D,IAAI,MAAM,GAAG,SAAS,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;KAC/C,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC;KACpB,MAAM,CAAC,GAAG,GAAG,YAAY,GAAG,wBAAwB,GAAG,EAAE,CAAC;KAC1D,CAAC,SAAS,CAAC,IAAI,IAAI,SAAS,CAAC,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACxD;;;GAGD,kBAAkB,EAAE,WAAW;KAC7B,IAAI,IAAI,GAAG,IAAI,CAAC;KAChB,IAAI,CAAC,cAAc,IAAI,CAAC,CAAC;KACzB,UAAU,CAAC,WAAW;;OAEpB,IAAI,CAAC,cAAc,IAAI,CAAC,CAAC;MAC1B,CAAC,CAAC;IACJ;;GAED,aAAa,EAAE,SAAS,SAAS,EAAE,OAAO,EAAE;;KAE1C,IAAI,GAAG,EAAE,GAAG,CAAC;;KAEb,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO;;KAE/B,OAAO,GAAG,OAAO,IAAI,EAAE,CAAC;;KAExB,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;;KAEjF,IAAI,SAAS,CAAC,WAAW,EAAE;OACzB,GAAG,GAAG,SAAS,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;OAC1C,GAAG,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;MACtC,MAAM;OACL,GAAG,GAAG,SAAS,CAAC,iBAAiB,EAAE,CAAC;OACpC,GAAG,CAAC,SAAS,GAAG,SAAS,CAAC;MAC3B;;KAED,KAAK,GAAG,IAAI,OAAO;OACjB,IAAIjB,QAAM,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE;SACxB,GAAG,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QACzB;;KAEH,IAAI,SAAS,CAAC,WAAW,EAAE;;OAEzB,SAAS,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;MAC9B,MAAM;;;OAGL,IAAI;SACF,SAAS,CAAC,SAAS,CAAC,IAAI,GAAG,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,GAAG,CAAC,CAAC;QAC9D,CAAC,OAAO,CAAC,EAAE;;QAEX;MACF;IACF;;;;;;;;GAQD,uBAAuB,EAAE,SAAS,OAAO,EAAE;KACzC,IAAI,IAAI,GAAG,IAAI,CAAC;KAChB,OAAO,SAAS,GAAG,EAAE;;;;OAInB,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;;;;;OAK7B,IAAI,IAAI,CAAC,kBAAkB,KAAK,GAAG,EAAE,OAAO;;OAE5C,IAAI,CAAC,kBAAkB,GAAG,GAAG,CAAC;;;;;;OAM9B,IAAI,MAAM,CAAC;OACX,IAAI;SACF,MAAM,GAAGI,kBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACvC,CAAC,OAAO,CAAC,EAAE;SACV,MAAM,GAAG,WAAW,CAAC;QACtB;;OAED,IAAI,CAAC,iBAAiB,CAAC;SACrB,QAAQ,EAAE,KAAK,GAAG,OAAO;SACzB,OAAO,EAAE,MAAM;QAChB,CAAC,CAAC;MACJ,CAAC;IACH;;;;;;;GAOD,qBAAqB,EAAE,WAAW;KAChC,IAAI,IAAI,GAAG,IAAI;OACb,gBAAgB,GAAG,IAAI,CAAC;;;;;KAK1B,OAAO,SAAS,GAAG,EAAE;OACnB,IAAI,MAAM,CAAC;OACX,IAAI;SACF,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;QACrB,CAAC,OAAO,CAAC,EAAE;;;SAGV,OAAO;QACR;OACD,IAAI,OAAO,GAAG,MAAM,IAAI,MAAM,CAAC,OAAO,CAAC;;;;;OAKvC;SACE,CAAC,OAAO;UACP,OAAO,KAAK,OAAO,IAAI,OAAO,KAAK,UAAU,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC;;SAE5E,OAAO;;;;OAIT,IAAI,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC;OACpC,IAAI,CAAC,OAAO,EAAE;SACZ,IAAI,CAAC,uBAAuB,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC;QAC5C;OACD,YAAY,CAAC,OAAO,CAAC,CAAC;OACtB,IAAI,CAAC,gBAAgB,GAAG,UAAU,CAAC,WAAW;SAC5C,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC9B,EAAE,gBAAgB,CAAC,CAAC;MACtB,CAAC;IACH;;;;;;;;GAQD,iBAAiB,EAAE,SAAS,IAAI,EAAE,EAAE,EAAE;KACpC,IAAI,SAAS,GAAGG,UAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;KAC9C,IAAI,QAAQ,GAAGA,UAAQ,CAAC,EAAE,CAAC,CAAC;KAC5B,IAAI,UAAU,GAAGA,UAAQ,CAAC,IAAI,CAAC,CAAC;;;;;KAKhC,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;;;;KAIpB,IAAI,SAAS,CAAC,QAAQ,KAAK,QAAQ,CAAC,QAAQ,IAAI,SAAS,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI;OAC9E,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC;KACzB,IAAI,SAAS,CAAC,QAAQ,KAAK,UAAU,CAAC,QAAQ,IAAI,SAAS,CAAC,IAAI,KAAK,UAAU,CAAC,IAAI;OAClF,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC;;KAE7B,IAAI,CAAC,iBAAiB,CAAC;OACrB,QAAQ,EAAE,YAAY;OACtB,IAAI,EAAE;SACJ,EAAE,EAAE,EAAE;SACN,IAAI,EAAE,IAAI;QACX;MACF,CAAC,CAAC;IACJ;;GAED,sBAAsB,EAAE,WAAW;KACjC,IAAI,IAAI,GAAG,IAAI,CAAC;KAChB,IAAI,CAAC,yBAAyB,GAAG,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC;;KAE7D,QAAQ,CAAC,SAAS,CAAC,QAAQ,GAAG,WAAW;OACvC,IAAI,OAAO,IAAI,KAAK,UAAU,IAAI,IAAI,CAAC,SAAS,EAAE;SAChD,OAAO,IAAI,CAAC,yBAAyB,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QACvE;OACD,OAAO,IAAI,CAAC,yBAAyB,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;MAC9D,CAAC;IACH;;GAED,wBAAwB,EAAE,WAAW;KACnC,IAAI,IAAI,CAAC,yBAAyB,EAAE;;OAElC,QAAQ,CAAC,SAAS,CAAC,QAAQ,GAAG,IAAI,CAAC,yBAAyB,CAAC;MAC9D;IACF;;;;;;GAMD,mBAAmB,EAAE,WAAW;KAC9B,IAAI,IAAI,GAAG,IAAI,CAAC;;KAEhB,IAAI,eAAe,GAAG,IAAI,CAAC,gBAAgB,CAAC;;KAE5C,SAAS,UAAU,CAAC,IAAI,EAAE;OACxB,OAAO,SAAS,EAAE,EAAE,CAAC,EAAE;;;;SAIrB,IAAI,IAAI,GAAG,IAAI,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;SACvC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;WACpC,IAAI,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;UACxB;SACD,IAAI,gBAAgB,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;SAC/B,IAAIf,YAAU,CAAC,gBAAgB,CAAC,EAAE;WAChC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI;aACjB;eACE,SAAS,EAAE;iBACT,IAAI,EAAE,YAAY;iBAClB,IAAI,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,IAAI,aAAa,CAAC;gBAC7C;cACF;aACD,gBAAgB;YACjB,CAAC;UACH;;;;;SAKD,IAAI,IAAI,CAAC,KAAK,EAAE;WACd,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;UAC/B,MAAM;WACL,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;UAC/B;QACF,CAAC;MACH;;KAED,IAAI,eAAe,GAAG,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC;;KAE1D,SAAS,eAAe,CAAC,MAAM,EAAE;OAC/B,IAAI,KAAK,GAAGR,SAAO,CAAC,MAAM,CAAC,IAAIA,SAAO,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC;OACzD,IAAI,KAAK,IAAI,KAAK,CAAC,cAAc,IAAI,KAAK,CAAC,cAAc,CAAC,kBAAkB,CAAC,EAAE;SAC7EwB,MAAI;WACF,KAAK;WACL,kBAAkB;WAClB,SAAS,IAAI,EAAE;aACb,OAAO,SAAS,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE;;eAE5C,IAAI;iBACF,IAAI,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE;mBACxB,EAAE,CAAC,WAAW,GAAG,IAAI,CAAC,IAAI;qBACxB;uBACE,SAAS,EAAE;yBACT,IAAI,EAAE,YAAY;yBAClB,IAAI,EAAE;2BACJ,MAAM,EAAE,MAAM;2BACd,QAAQ,EAAE,aAAa;2BACvB,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,IAAI,KAAK,aAAa;0BAC1C;wBACF;sBACF;qBACD,EAAE,CAAC,WAAW;oBACf,CAAC;kBACH;gBACF,CAAC,OAAO,GAAG,EAAE;;gBAEb;;;;eAID,IAAI,MAAM,EAAE,YAAY,EAAE,eAAe,CAAC;;eAE1C;iBACE,eAAe;iBACf,eAAe,CAAC,GAAG;kBAClB,MAAM,KAAK,aAAa,IAAI,MAAM,KAAK,MAAM,CAAC;iBAC/C;;;iBAGA,YAAY,GAAG,IAAI,CAAC,uBAAuB,CAAC,OAAO,CAAC,CAAC;iBACrD,eAAe,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;iBAC/C,MAAM,GAAG,SAAS,GAAG,EAAE;;;;mBAIrB,IAAI,CAAC,GAAG,EAAE,OAAO;;mBAEjB,IAAI,SAAS,CAAC;mBACd,IAAI;qBACF,SAAS,GAAG,GAAG,CAAC,IAAI,CAAC;oBACtB,CAAC,OAAO,CAAC,EAAE;;;qBAGV,OAAO;oBACR;mBACD,IAAI,SAAS,KAAK,OAAO,EAAE,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC;wBAC/C,IAAI,SAAS,KAAK,UAAU,EAAE,OAAO,eAAe,CAAC,GAAG,CAAC,CAAC;kBAChE,CAAC;gBACH;eACD,OAAO,IAAI,CAAC,IAAI;iBACd,IAAI;iBACJ,OAAO;iBACP,IAAI,CAAC,IAAI;mBACP;qBACE,SAAS,EAAE;uBACT,IAAI,EAAE,YAAY;uBAClB,IAAI,EAAE;yBACJ,MAAM,EAAE,MAAM;yBACd,QAAQ,EAAE,kBAAkB;yBAC5B,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,IAAI,KAAK,aAAa;wBAC1C;sBACF;oBACF;mBACD,EAAE;mBACF,MAAM;kBACP;iBACD,OAAO;iBACP,MAAM;gBACP,CAAC;cACH,CAAC;YACH;WACD,eAAe;UAChB,CAAC;SACFA,MAAI;WACF,KAAK;WACL,qBAAqB;WACrB,SAAS,IAAI,EAAE;aACb,OAAO,SAAS,GAAG,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE;eACxC,IAAI;iBACF,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,iBAAiB,GAAG,EAAE,CAAC,iBAAiB,GAAG,EAAE,CAAC,CAAC;gBAC/D,CAAC,OAAO,CAAC,EAAE;;gBAEX;eACD,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;cAClD,CAAC;YACH;WACD,eAAe;UAChB,CAAC;QACH;MACF;;KAEDA,MAAI,CAACxB,SAAO,EAAE,YAAY,EAAE,UAAU,EAAE,eAAe,CAAC,CAAC;KACzDwB,MAAI,CAACxB,SAAO,EAAE,aAAa,EAAE,UAAU,EAAE,eAAe,CAAC,CAAC;KAC1D,IAAIA,SAAO,CAAC,qBAAqB,EAAE;OACjCwB,MAAI;SACFxB,SAAO;SACP,uBAAuB;SACvB,SAAS,IAAI,EAAE;WACb,OAAO,SAAS,EAAE,EAAE;aAClB,OAAO,IAAI;eACT,IAAI,CAAC,IAAI;iBACP;mBACE,SAAS,EAAE;qBACT,IAAI,EAAE,YAAY;qBAClB,IAAI,EAAE;uBACJ,QAAQ,EAAE,uBAAuB;uBACjC,OAAO,EAAE,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,aAAa;sBAC9C;oBACF;kBACF;iBACD,EAAE;gBACH;cACF,CAAC;YACH,CAAC;UACH;SACD,eAAe;QAChB,CAAC;MACH;;;;KAID,IAAI,YAAY,GAAG;OACjB,aAAa;OACb,QAAQ;OACR,MAAM;OACN,kBAAkB;OAClB,gBAAgB;OAChB,mBAAmB;OACnB,iBAAiB;OACjB,aAAa;OACb,YAAY;OACZ,oBAAoB;OACpB,aAAa;OACb,YAAY;OACZ,gBAAgB;OAChB,cAAc;OACd,iBAAiB;OACjB,aAAa;OACb,aAAa;OACb,cAAc;OACd,oBAAoB;OACpB,QAAQ;OACR,WAAW;OACX,cAAc;OACd,eAAe;OACf,WAAW;OACX,iBAAiB;OACjB,QAAQ;OACR,gBAAgB;OAChB,2BAA2B;OAC3B,sBAAsB;MACvB,CAAC;KACF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;OAC5C,eAAe,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;MAClC;IACF;;;;;;;;;;;GAWD,sBAAsB,EAAE,WAAW;KACjC,IAAI,IAAI,GAAG,IAAI,CAAC;KAChB,IAAI,eAAe,GAAG,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC;;KAE1D,IAAI,eAAe,GAAG,IAAI,CAAC,gBAAgB,CAAC;;KAE5C,SAAS,QAAQ,CAAC,IAAI,EAAE,GAAG,EAAE;OAC3B,IAAI,IAAI,IAAI,GAAG,IAAIQ,YAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE;SACxCgB,MAAI,CAAC,GAAG,EAAE,IAAI,EAAE,SAAS,IAAI,EAAE;WAC7B,OAAO,IAAI,CAAC,IAAI;aACd;eACE,SAAS,EAAE;iBACT,IAAI,EAAE,YAAY;iBAClB,IAAI,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,aAAa,CAAC;gBACtE;cACF;aACD,IAAI;YACL,CAAC;UACH,CAAC,CAAC;QACJ;MACF;;KAED,IAAI,eAAe,CAAC,GAAG,IAAI,gBAAgB,IAAIxB,SAAO,EAAE;OACtD,IAAI,QAAQ,GAAGA,SAAO,CAAC,cAAc,IAAIA,SAAO,CAAC,cAAc,CAAC,SAAS,CAAC;OAC1EwB,MAAI;SACF,QAAQ;SACR,MAAM;SACN,SAAS,QAAQ,EAAE;WACjB,OAAO,SAAS,MAAM,EAAE,GAAG,EAAE;;;;aAI3B,IAAIf,UAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE;eACxD,IAAI,CAAC,WAAW,GAAG;iBACjB,MAAM,EAAE,MAAM;iBACd,GAAG,EAAE,GAAG;iBACR,WAAW,EAAE,IAAI;gBAClB,CAAC;cACH;;aAED,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YACxC,CAAC;UACH;SACD,eAAe;QAChB,CAAC;;OAEFe,MAAI;SACF,QAAQ;SACR,MAAM;SACN,SAAS,QAAQ,EAAE;WACjB,OAAO,WAAW;;aAEhB,IAAI,GAAG,GAAG,IAAI,CAAC;;aAEf,SAAS,yBAAyB,GAAG;eACnC,IAAI,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,UAAU,KAAK,CAAC,EAAE;iBAC3C,IAAI;;;mBAGF,GAAG,CAAC,WAAW,CAAC,WAAW,GAAG,GAAG,CAAC,MAAM,CAAC;kBAC1C,CAAC,OAAO,CAAC,EAAE;;kBAEX;;iBAED,IAAI,CAAC,iBAAiB,CAAC;mBACrB,IAAI,EAAE,MAAM;mBACZ,QAAQ,EAAE,KAAK;mBACf,IAAI,EAAE,GAAG,CAAC,WAAW;kBACtB,CAAC,CAAC;gBACJ;cACF;;aAED,IAAI,KAAK,GAAG,CAAC,QAAQ,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;aAChD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;eACrC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;cACzB;;aAED,IAAI,oBAAoB,IAAI,GAAG,IAAIhB,YAAU,CAAC,GAAG,CAAC,kBAAkB,CAAC,EAAE;eACrEgB,MAAI;iBACF,GAAG;iBACH,oBAAoB;iBACpB,SAAS,IAAI,EAAE;mBACb,OAAO,IAAI,CAAC,IAAI;qBACd;uBACE,SAAS,EAAE;yBACT,IAAI,EAAE,YAAY;yBAClB,IAAI,EAAE;2BACJ,QAAQ,EAAE,oBAAoB;2BAC9B,OAAO,EAAE,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,aAAa;0BAC9C;wBACF;sBACF;qBACD,IAAI;qBACJ,yBAAyB;oBAC1B,CAAC;kBACH;gBACF,CAAC;cACH,MAAM;;;eAGL,GAAG,CAAC,kBAAkB,GAAG,yBAAyB,CAAC;cACpD;;aAED,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YACxC,CAAC;UACH;SACD,eAAe;QAChB,CAAC;MACH;;KAED,IAAI,eAAe,CAAC,GAAG,IAAIC,eAAa,EAAE,EAAE;OAC1CD,MAAI;SACFxB,SAAO;SACP,OAAO;SACP,SAAS,SAAS,EAAE;WAClB,OAAO,WAAW;;;;aAIhB,IAAI,IAAI,GAAG,IAAI,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;aACvC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;eACpC,IAAI,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;cACxB;;aAED,IAAI,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;aACzB,IAAI,MAAM,GAAG,KAAK,CAAC;aACnB,IAAI,GAAG,CAAC;;aAER,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE;eAClC,GAAG,GAAG,UAAU,CAAC;cAClB,MAAM,IAAI,SAAS,IAAIA,SAAO,IAAI,UAAU,YAAYA,SAAO,CAAC,OAAO,EAAE;eACxE,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC;eACrB,IAAI,UAAU,CAAC,MAAM,EAAE;iBACrB,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;gBAC5B;cACF,MAAM;eACL,GAAG,GAAG,EAAE,GAAG,UAAU,CAAC;cACvB;;;aAGD,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE;eACvC,OAAO,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;cACpC;;aAED,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE;eAC7B,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;cACzB;;aAED,IAAI,SAAS,GAAG;eACd,MAAM,EAAE,MAAM;eACd,GAAG,EAAE,GAAG;eACR,WAAW,EAAE,IAAI;cAClB,CAAC;;aAEF,OAAO,SAAS;gBACb,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC;gBACjB,IAAI,CAAC,SAAS,QAAQ,EAAE;iBACvB,SAAS,CAAC,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC;;iBAExC,IAAI,CAAC,iBAAiB,CAAC;mBACrB,IAAI,EAAE,MAAM;mBACZ,QAAQ,EAAE,OAAO;mBACjB,IAAI,EAAE,SAAS;kBAChB,CAAC,CAAC;;iBAEH,OAAO,QAAQ,CAAC;gBACjB,CAAC;gBACD,OAAO,CAAC,CAAC,SAAS,GAAG,EAAE;;iBAEtB,IAAI,CAAC,iBAAiB,CAAC;mBACrB,IAAI,EAAE,MAAM;mBACZ,QAAQ,EAAE,OAAO;mBACjB,IAAI,EAAE,SAAS;mBACf,KAAK,EAAE,OAAO;kBACf,CAAC,CAAC;;iBAEH,MAAM,GAAG,CAAC;gBACX,CAAC,CAAC;YACN,CAAC;UACH;SACD,eAAe;QAChB,CAAC;MACH;;;;KAID,IAAI,eAAe,CAAC,GAAG,IAAI,IAAI,CAAC,YAAY,EAAE;OAC5C,IAAI,SAAS,CAAC,gBAAgB,EAAE;SAC9B,SAAS,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,uBAAuB,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,CAAC;SAClF,SAAS,CAAC,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAAC,qBAAqB,EAAE,EAAE,KAAK,CAAC,CAAC;QAC7E,MAAM,IAAI,SAAS,CAAC,WAAW,EAAE;;SAEhC,SAAS,CAAC,WAAW,CAAC,SAAS,EAAE,IAAI,CAAC,uBAAuB,CAAC,OAAO,CAAC,CAAC,CAAC;SACxE,SAAS,CAAC,WAAW,CAAC,YAAY,EAAE,IAAI,CAAC,qBAAqB,EAAE,CAAC,CAAC;QACnE;MACF;;;;;;KAMD,IAAI,MAAM,GAAGA,SAAO,CAAC,MAAM,CAAC;KAC5B,IAAI,mBAAmB,GAAG,MAAM,IAAI,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC;KACrE,IAAI,sBAAsB;OACxB,CAAC,mBAAmB;OACpBA,SAAO,CAAC,OAAO;OACfA,SAAO,CAAC,OAAO,CAAC,SAAS;OACzBA,SAAO,CAAC,OAAO,CAAC,YAAY,CAAC;KAC/B,IAAI,eAAe,CAAC,QAAQ,IAAI,sBAAsB,EAAE;;OAEtD,IAAI,aAAa,GAAGA,SAAO,CAAC,UAAU,CAAC;OACvCA,SAAO,CAAC,UAAU,GAAG,WAAW;SAC9B,IAAI,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SACtC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;;SAEpD,IAAI,aAAa,EAAE;WACjB,OAAO,aAAa,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;UAC7C;QACF,CAAC;;OAEF,IAAI,0BAA0B,GAAG,SAAS,gBAAgB,EAAE;;;SAG1D,OAAO,kCAAkC;WACvC,IAAI,GAAG,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;;;WAG1D,IAAI,GAAG,EAAE;;aAEP,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC;YAClD;;WAED,OAAO,gBAAgB,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;UAChD,CAAC;QACH,CAAC;;OAEFwB,MAAI,CAACxB,SAAO,CAAC,OAAO,EAAE,WAAW,EAAE,0BAA0B,EAAE,eAAe,CAAC,CAAC;OAChFwB,MAAI,CAACxB,SAAO,CAAC,OAAO,EAAE,cAAc,EAAE,0BAA0B,EAAE,eAAe,CAAC,CAAC;MACpF;;KAED,IAAI,eAAe,CAAC,OAAO,IAAI,SAAS,IAAIA,SAAO,IAAI,OAAO,CAAC,GAAG,EAAE;;OAElE,IAAI,qBAAqB,GAAG,SAAS,GAAG,EAAE,IAAI,EAAE;SAC9C,IAAI,CAAC,iBAAiB,CAAC;WACrB,OAAO,EAAE,GAAG;WACZ,KAAK,EAAE,IAAI,CAAC,KAAK;WACjB,QAAQ,EAAE,SAAS;UACpB,CAAC,CAAC;QACJ,CAAC;;OAEFY,MAAI,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,SAAS,CAAC,EAAE,KAAK,EAAE;SACjE,iBAAiB,CAAC,OAAO,EAAE,KAAK,EAAE,qBAAqB,CAAC,CAAC;QAC1D,CAAC,CAAC;MACJ;IACF;;GAED,gBAAgB,EAAE,WAAW;;KAE3B,IAAI,OAAO,CAAC;KACZ,OAAO,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE;OACnC,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC;;OAExC,IAAI,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC;SAClB,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC;SACjB,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;;OAEpB,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;MAClB;IACF;;GAED,eAAe,EAAE,WAAW;;KAE1B,KAAK,IAAI,MAAM,IAAI,IAAI,CAAC,uBAAuB,EAAE;OAC/C,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC;MACtE;IACF;;GAED,aAAa,EAAE,WAAW;KACxB,IAAI,IAAI,GAAG,IAAI,CAAC;;;KAGhBA,MAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE;OACtC,IAAI,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;OAC1B,IAAI,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;OACrB,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;MAC5C,CAAC,CAAC;IACJ;;GAED,SAAS,EAAE,SAAS,GAAG,EAAE;KACvB,IAAI,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC;OAC1B,GAAG,GAAG,EAAE;OACR,CAAC,GAAG,CAAC,CAAC;;KAER,IAAI;OACF,OAAO,CAAC,EAAE,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;MAC1C,CAAC,OAAO,CAAC,EAAE;OACV,MAAM,IAAIqB,WAAgB,CAAC,eAAe,GAAG,GAAG,CAAC,CAAC;MACnD;;KAED,IAAI,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,cAAc,EAAE;OACnD,MAAM,IAAIA,WAAgB;SACxB,gFAAgF;QACjF,CAAC;MACH;;KAED,OAAO,GAAG,CAAC;IACZ;;GAED,gBAAgB,EAAE,SAAS,GAAG,EAAE;;KAE9B,IAAI,YAAY,GAAG,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,GAAG,GAAG,GAAG,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;;KAEtE,IAAI,GAAG,CAAC,QAAQ,EAAE;OAChB,YAAY,GAAG,GAAG,CAAC,QAAQ,GAAG,GAAG,GAAG,YAAY,CAAC;MAClD;KACD,OAAO,YAAY,CAAC;IACrB;;GAED,uBAAuB,EAAE,SAAS,SAAS,EAAE,OAAO,EAAE;KACpD,OAAO,GAAG,OAAO,IAAI,EAAE,CAAC;KACxB,OAAO,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI;OACvC,IAAI,EAAE,SAAS;OACf,OAAO,EAAE,KAAK;MACf,CAAC;;;KAGF,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;OACxB,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;MAC3C;IACF;;GAED,gBAAgB,EAAE,SAAS,SAAS,EAAE,OAAO,EAAE;KAC7C,IAAI,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;;KAErD,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE;OAC3B,SAAS,EAAE,SAAS;OACpB,OAAO,EAAE,OAAO;MACjB,CAAC,CAAC;;KAEH,IAAI,CAAC,iBAAiB;OACpB,SAAS,CAAC,IAAI;OACd,SAAS,CAAC,OAAO;OACjB,SAAS,CAAC,GAAG;OACb,SAAS,CAAC,MAAM;OAChB,MAAM;OACN,OAAO;MACR,CAAC;IACH;;GAED,cAAc,EAAE,SAAS,SAAS,EAAE,OAAO,EAAE;KAC3C,IAAI,IAAI,GAAG,IAAI,CAAC;KAChB,IAAI,MAAM,GAAG,EAAE,CAAC;KAChB,IAAI,SAAS,CAAC,KAAK,IAAI,SAAS,CAAC,KAAK,CAAC,MAAM,EAAE;OAC7CrB,MAAI,CAAC,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,KAAK,EAAE;SACvC,IAAI,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC;SACvD,IAAI,KAAK,EAAE;WACT,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;UACpB;QACF,CAAC,CAAC;;;OAGH,IAAI,OAAO,IAAI,OAAO,CAAC,cAAc,EAAE;SACrC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,cAAc,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;WACpE,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,KAAK,CAAC;UAC1B;QACF;MACF;KACD,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;KAC9D,OAAO,MAAM,CAAC;IACf;;GAED,eAAe,EAAE,SAAS,KAAK,EAAE,YAAY,EAAE;;KAE7C,IAAI,UAAU,GAAG;OACf,QAAQ,EAAE,KAAK,CAAC,GAAG;OACnB,MAAM,EAAE,KAAK,CAAC,IAAI;OAClB,KAAK,EAAE,KAAK,CAAC,MAAM;OACnB,QAAQ,EAAE,KAAK,CAAC,IAAI,IAAI,GAAG;MAC5B,CAAC;;;;;;;KAOF,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE;OACd,UAAU,CAAC,QAAQ,GAAG,YAAY,CAAC;MACpC;;KAED,UAAU,CAAC,MAAM,GAAG;;;OAGlB,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,IAAI;SACtC,CAAC,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;;OAE7D,oBAAoB,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;;OAEjD,oBAAoB,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;MAC/C,CAAC;;KAEF,OAAO,UAAU,CAAC;IACnB;;GAED,iBAAiB,EAAE,SAAS,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE;KAC3E,IAAI,eAAe,GAAG,CAAC,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,EAAE,KAAK,OAAO,IAAI,EAAE,CAAC,CAAC;KAClE;OACE,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,IAAI;QACtC,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC;SAC7C,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;OACzD;OACA,OAAO;MACR;;KAED,IAAI,UAAU,CAAC;;KAEf,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE;OAC3B,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,OAAO,CAAC;;;OAGxC,MAAM,CAAC,OAAO,EAAE,CAAC;OACjB,UAAU,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;MAC/B,MAAM,IAAI,OAAO,EAAE;OAClB,UAAU,GAAG;SACX,MAAM,EAAE;WACN;aACE,QAAQ,EAAE,OAAO;aACjB,MAAM,EAAE,MAAM;aACd,MAAM,EAAE,IAAI;YACb;UACF;QACF,CAAC;MACH;;KAED;OACE,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,IAAI;OACrC,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC;OAC5C;OACA,OAAO;MACR;;KAED;OACE,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,IAAI;OACxC,CAAC,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC;OAChD;OACA,OAAO;MACR;;KAED,IAAI,IAAI,GAAGC,aAAW;OACpB;;SAEE,SAAS,EAAE;WACT,MAAM,EAAE;aACN;eACE,IAAI,EAAE,IAAI;eACV,KAAK,EAAE,OAAO;eACd,UAAU,EAAE,UAAU;cACvB;YACF;UACF;SACD,WAAW,EAAE,OAAO;QACrB;OACD,OAAO;MACR,CAAC;;;;;KAKF,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,EAAE;OAC/C,IAAI,CAAC,SAAS,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;OAC1C,OAAO,IAAI,CAAC,SAAS,CAAC;MACvB;;KAED,IAAI,CAAC,SAAS,CAAC,SAAS,GAAGA,aAAW;OACpC;SACE,IAAI,EAAE,SAAS;SACf,OAAO,EAAE,IAAI;QACd;OACD,IAAI,CAAC,SAAS,CAAC,SAAS,IAAI,EAAE;MAC/B,CAAC;;;KAGF,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClB;;GAED,WAAW,EAAE,SAAS,IAAI,EAAE;;;KAG1B,IAAI,GAAG,GAAG,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC;KAC/C,IAAI,IAAI,CAAC,OAAO,EAAE;OAChB,IAAI,CAAC,OAAO,GAAGC,UAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;MAC5C;KACD,IAAI,IAAI,CAAC,SAAS,EAAE;OAClB,IAAI,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;OACzC,SAAS,CAAC,KAAK,GAAGA,UAAQ,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;MAClD;;KAED,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;KAC3B,IAAI,OAAO,EAAE;OACX,IAAI,OAAO,CAAC,GAAG,EAAE;SACf,OAAO,CAAC,GAAG,GAAGA,UAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;QACvE;OACD,IAAI,OAAO,CAAC,OAAO,EAAE;SACnB,OAAO,CAAC,OAAO,GAAGA,UAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;QAC/E;MACF;;KAED,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM;OAC7C,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;;KAE1C,OAAO,IAAI,CAAC;IACb;;;;;GAKD,gBAAgB,EAAE,SAAS,WAAW,EAAE;;;KAGtC,IAAI,QAAQ,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC;OAClC,OAAO;OACP,KAAK;OACL,IAAI,CAAC;;KAEP,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;OAClD,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;OAC9B;SACE,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC;SAC7B,CAACT,UAAQ,CAAC,KAAK,CAAC,IAAI,CAAC;SACrBU,cAAY,CAAC,KAAK,CAAC,IAAI,CAAC;;SAExB,SAAS;;OAEX,IAAI,GAAGF,aAAW,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;OACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;SACxC,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;SACtB,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,EAAE;WACjD,IAAI,CAAC,OAAO,CAAC,GAAGC,UAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;UAC3E;QACF;OACD,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC;MACnC;IACF;;GAED,YAAY,EAAE,WAAW;KACvB,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO;KACtD,IAAI,QAAQ,GAAG,EAAE,CAAC;;KAElB,IAAI,IAAI,CAAC,aAAa,IAAI,UAAU,CAAC,SAAS,EAAE;OAC9C,QAAQ,CAAC,OAAO,GAAG;SACjB,YAAY,EAAE,UAAU,CAAC,SAAS;QACnC,CAAC;MACH;;;KAGD,IAAId,SAAO,CAAC,QAAQ,IAAIA,SAAO,CAAC,QAAQ,CAAC,IAAI,EAAE;OAC7C,QAAQ,CAAC,GAAG,GAAGA,SAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;MACtC;;KAED,IAAI,IAAI,CAAC,YAAY,IAAI,SAAS,CAAC,QAAQ,EAAE;OAC3C,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,OAAO,GAAG,EAAE,CAAC;OAC7C,QAAQ,CAAC,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,QAAQ,CAAC;MAC/C;;KAED,OAAO,QAAQ,CAAC;IACjB;;GAED,aAAa,EAAE,WAAW;KACxB,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC;KAC1B,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;IAC3B;;GAED,cAAc,EAAE,WAAW;KACzB,OAAO,IAAI,CAAC,gBAAgB,IAAI,GAAG,EAAE,GAAG,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,gBAAgB,CAAC;IACpF;;;;;;;;;;;GAWD,aAAa,EAAE,SAAS,OAAO,EAAE;KAC/B,IAAI,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC;;KAE1B;OACE,CAAC,IAAI;OACL,OAAO,CAAC,OAAO,KAAK,IAAI,CAAC,OAAO;OAChC,OAAO,CAAC,WAAW,KAAK,IAAI,CAAC,WAAW;;OAExC,OAAO,KAAK,CAAC;;;KAGf,IAAI,OAAO,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,EAAE;OACzC,OAAOsB,kBAAgB,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;MAC9D,MAAM,IAAI,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,EAAE;;OAE9C,OAAOD,iBAAe,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;MAC3D;;KAED,OAAO,IAAI,CAAC;IACb;;GAED,gBAAgB,EAAE,SAAS,OAAO,EAAE;;KAElC,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE;OACzB,OAAO;MACR;;KAED,IAAI,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;;;;;KAK5B,IAAI,EAAE,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,CAAC,EAAE,OAAO;;KAElE,IAAI,KAAK,CAAC;KACV,IAAI;;;OAGF,IAAII,eAAa,EAAE,EAAE;SACnB,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAC5C,MAAM;SACL,KAAK,GAAG,OAAO,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC;QAClD;;;OAGD,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC;MACpC,CAAC,OAAO,CAAC,EAAE;;MAEX;;KAED,IAAI,CAAC,gBAAgB,GAAG,KAAK;;SAEzB,KAAK;;SAEL,IAAI,CAAC,gBAAgB,GAAG,CAAC,IAAI,IAAI,CAAC;;KAEtC,IAAI,CAAC,aAAa,GAAG,GAAG,EAAE,CAAC;IAC5B;;GAED,KAAK,EAAE,SAAS,IAAI,EAAE;KACpB,IAAI,aAAa,GAAG,IAAI,CAAC,cAAc,CAAC;;KAExC,IAAI,QAAQ,GAAG;SACX,OAAO,EAAE,IAAI,CAAC,cAAc;SAC5B,MAAM,EAAE,aAAa,CAAC,MAAM;SAC5B,QAAQ,EAAE,YAAY;QACvB;OACD,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;;KAEjC,IAAI,QAAQ,EAAE;OACZ,QAAQ,CAAC,OAAO,GAAG,QAAQ,CAAC;MAC7B;;;KAGD,IAAI,IAAI,CAAC,cAAc,EAAE,OAAO,IAAI,CAAC,cAAc,CAAC;;KAEpD,IAAI,GAAGZ,aAAW,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;;;KAGnC,IAAI,CAAC,IAAI,GAAGA,aAAW,CAACA,aAAW,CAAC,EAAE,EAAE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;KAC9E,IAAI,CAAC,KAAK,GAAGA,aAAW,CAACA,aAAW,CAAC,EAAE,EAAE,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;;;KAGjF,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC;;KAEzD,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE;;;OAGrD,IAAI,CAAC,WAAW,GAAG;SACjB,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;QAC5C,CAAC;MACH;;KAED,IAAI,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE;;OAE5B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;MACtC;;;KAGD,IAAI,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,WAAW,GAAG,aAAa,CAAC,WAAW,CAAC;;;KAG5E,IAAI,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,GAAG,aAAa,CAAC,OAAO,CAAC;;;KAGhE,IAAI,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,WAAW,GAAG,aAAa,CAAC,UAAU,CAAC;;KAE1E,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;;;KAGhC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,SAAS,GAAG,EAAE;OACtC,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAIF,eAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE;SACrE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;QAClB;MACF,CAAC,CAAC;;KAEH,IAAIH,YAAU,CAAC,aAAa,CAAC,YAAY,CAAC,EAAE;OAC1C,IAAI,GAAG,aAAa,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;MACjD;;;KAGD,IAAI,CAAC,IAAI,IAAIG,eAAa,CAAC,IAAI,CAAC,EAAE;OAChC,OAAO;MACR;;;KAGD;OACEH,YAAU,CAAC,aAAa,CAAC,kBAAkB,CAAC;OAC5C,CAAC,aAAa,CAAC,kBAAkB,CAAC,IAAI,CAAC;OACvC;OACA,OAAO;MACR;;;;KAID,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE;OACzB,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,sCAAsC,EAAE,IAAI,CAAC,CAAC;OACrE,OAAO;MACR;;KAED,IAAI,OAAO,aAAa,CAAC,UAAU,KAAK,QAAQ,EAAE;OAChD,IAAI,IAAI,CAAC,MAAM,EAAE,GAAG,aAAa,CAAC,UAAU,EAAE;SAC5C,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC;QAClC;MACF,MAAM;OACL,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC;MAClC;IACF;;GAED,aAAa,EAAE,SAAS,IAAI,EAAE;KAC5B,OAAOqB,UAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;IACzD;;GAED,QAAQ,EAAE,WAAW;KACnB,OAAOV,OAAK,EAAE,CAAC;IAChB;;GAED,qBAAqB,EAAE,SAAS,IAAI,EAAE,QAAQ,EAAE;KAC9C,IAAI,IAAI,GAAG,IAAI,CAAC;KAChB,IAAI,aAAa,GAAG,IAAI,CAAC,cAAc,CAAC;;KAExC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO;;;KAG5B,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;;;;;KAK9B,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,eAAe,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE;OACpE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,8BAA8B,EAAE,IAAI,CAAC,CAAC;OAC7D,OAAO;MACR;;;;;KAKD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;;;KAGvE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;;KAEtB,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,sBAAsB,EAAE,IAAI,CAAC,CAAC;;KAEtD,IAAI,IAAI,GAAG;OACT,cAAc,EAAE,GAAG;OACnB,aAAa,EAAE,WAAW,GAAG,IAAI,CAAC,OAAO;OACzC,UAAU,EAAE,IAAI,CAAC,UAAU;MAC5B,CAAC;;KAEF,IAAI,IAAI,CAAC,aAAa,EAAE;OACtB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;MACzC;;KAED,IAAI,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;;;KAG3D;OACE,IAAI,CAAC,cAAc,CAAC,eAAe;OACnC,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC,MAAM;OAC1C;OACA,IAAI,CAAC,iBAAiB,CAAC;SACrB,QAAQ,EAAE,QAAQ;SAClB,OAAO,EAAE,SAAS;aACd,CAAC,SAAS,CAAC,IAAI,GAAG,SAAS,CAAC,IAAI,GAAG,IAAI,GAAG,EAAE,IAAI,SAAS,CAAC,KAAK;aAC/D,IAAI,CAAC,OAAO;SAChB,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACvB,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,OAAO;QAC7B,CAAC,CAAC;MACJ;;KAED,IAAI,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC;KAC/B,CAAC,aAAa,CAAC,SAAS,IAAI,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,IAAI,EAAE;OACxD,GAAG,EAAE,GAAG;OACR,IAAI,EAAE,IAAI;OACV,IAAI,EAAE,IAAI;OACV,OAAO,EAAE,aAAa;OACtB,SAAS,EAAE,SAAS,OAAO,GAAG;SAC5B,IAAI,CAAC,aAAa,EAAE,CAAC;;SAErB,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE;WAC5B,IAAI,EAAE,IAAI;WACV,GAAG,EAAE,GAAG;UACT,CAAC,CAAC;SACH,QAAQ,IAAI,QAAQ,EAAE,CAAC;QACxB;OACD,OAAO,EAAE,SAAS,OAAO,CAAC,KAAK,EAAE;SAC/B,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,kCAAkC,EAAE,KAAK,CAAC,CAAC;;SAEnE,IAAI,KAAK,CAAC,OAAO,EAAE;WACjB,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;UACtC;;SAED,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE;WAC5B,IAAI,EAAE,IAAI;WACV,GAAG,EAAE,GAAG;UACT,CAAC,CAAC;SACH,KAAK,GAAG,KAAK,IAAI,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;SACjF,QAAQ,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC7B;MACF,CAAC,CAAC;IACJ;;GAED,YAAY,EAAE,SAAS,IAAI,EAAE;;KAE3B,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAGD,WAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;;KAEhD,IAAI,gBAAgB,GAAG,IAAI,CAAC;KAC5B,IAAI,wBAAwB,GAAG,EAAE,CAAC;;KAElC,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;OACxB,gBAAgB,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;MAC7D;;KAED,IAAI,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE;OAChC,wBAAwB,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;MAC7E;;KAED,IAAIO,eAAa,EAAE,EAAE;OACnB,wBAAwB,CAAC,IAAI,GAAG1B,WAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;;OAErD,IAAI,mBAAmB,GAAGc,aAAW,CAAC,EAAE,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;OAC/D,IAAI,YAAY,GAAGA,aAAW,CAAC,mBAAmB,EAAE,wBAAwB,CAAC,CAAC;;OAE9E,IAAI,gBAAgB,EAAE;SACpB,YAAY,CAAC,OAAO,GAAG,gBAAgB,CAAC;QACzC;;OAED,OAAOb,SAAO;UACX,KAAK,CAAC,GAAG,EAAE,YAAY,CAAC;UACxB,IAAI,CAAC,SAAS,QAAQ,EAAE;WACvB,IAAI,QAAQ,CAAC,EAAE,EAAE;aACf,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACpC,MAAM;aACL,IAAI,KAAK,GAAG,IAAI,KAAK,CAAC,qBAAqB,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;;;aAG/D,KAAK,CAAC,OAAO,GAAG,QAAQ,CAAC;aACzB,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACrC;UACF,CAAC;UACD,OAAO,CAAC,CAAC,WAAW;WACnB,IAAI,CAAC,OAAO;aACV,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC,CAAC;UACrE,CAAC,CAAC;MACN;;KAED,IAAI,OAAO,GAAGA,SAAO,CAAC,cAAc,IAAI,IAAIA,SAAO,CAAC,cAAc,EAAE,CAAC;KACrE,IAAI,CAAC,OAAO,EAAE,OAAO;;;KAGrB,IAAI,OAAO,GAAG,iBAAiB,IAAI,OAAO,IAAI,OAAO,cAAc,KAAK,WAAW,CAAC;;KAEpF,IAAI,CAAC,OAAO,EAAE,OAAO;;KAErB,IAAI,iBAAiB,IAAI,OAAO,EAAE;OAChC,OAAO,CAAC,kBAAkB,GAAG,WAAW;SACtC,IAAI,OAAO,CAAC,UAAU,KAAK,CAAC,EAAE;WAC5B,OAAO;UACR,MAAM,IAAI,OAAO,CAAC,MAAM,KAAK,GAAG,EAAE;WACjC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;UACpC,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE;WACvB,IAAI,GAAG,GAAG,IAAI,KAAK,CAAC,qBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;WAC5D,GAAG,CAAC,OAAO,GAAG,OAAO,CAAC;WACtB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;UACnB;QACF,CAAC;MACH,MAAM;OACL,OAAO,GAAG,IAAI,cAAc,EAAE,CAAC;;;OAG/B,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;;;OAGlC,IAAI,IAAI,CAAC,SAAS,EAAE;SAClB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC;QACjC;OACD,IAAI,IAAI,CAAC,OAAO,EAAE;SAChB,OAAO,CAAC,OAAO,GAAG,WAAW;WAC3B,IAAI,GAAG,GAAG,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;WACzD,GAAG,CAAC,OAAO,GAAG,OAAO,CAAC;WACtB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;UACnB,CAAC;QACH;MACF;;KAED,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;;KAE1B,IAAI,gBAAgB,EAAE;OACpBY,MAAI,CAAC,gBAAgB,EAAE,SAAS,GAAG,EAAE,KAAK,EAAE;SAC1C,OAAO,CAAC,gBAAgB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACtC,CAAC,CAAC;MACJ;;KAED,OAAO,CAAC,IAAI,CAACb,WAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACpC;;GAED,aAAa,EAAE,SAAS,IAAI,EAAE;KAC5B,IAAI,SAAS,GAAG,EAAE,CAAC;;KAEnB,KAAK,IAAI,GAAG,IAAI,IAAI,EAAE;OACpB,IAAI,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE;SAC5B,IAAI,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;SACtB,SAAS,CAAC,GAAG,CAAC,GAAG,OAAO,KAAK,KAAK,UAAU,GAAG,KAAK,EAAE,GAAG,KAAK,CAAC;QAChE;MACF;;KAED,OAAO,SAAS,CAAC;IAClB;;GAED,SAAS,EAAE,SAAS,KAAK,EAAE;;KAEzB;OACE,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC;QAClC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC;OACzC;;OAEA,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI;SAC3B,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC;SACnC,IAAI,CAAC,gBAAgB;SACrB,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;QAC5B,CAAC;MACH;IACF;;GAED,aAAa,EAAE,SAAS,GAAG,EAAE,OAAO,EAAE;KACpC,IAAIQ,aAAW,CAAC,OAAO,CAAC,EAAE;OACxB,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;MACjC,MAAM;OACL,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAGM,aAAW,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC;MACjF;IACF;EACF,CAAC;;;CAGF,KAAK,CAAC,SAAS,CAAC,OAAO,GAAG,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC;CACzD,KAAK,CAAC,SAAS,CAAC,iBAAiB,GAAG,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC;;CAE/D,SAAc,GAAG,KAAK,CAAC;;CCjuEvB;;;;;;;;;CASA,IAAIb,SAAO;GACT,OAAO,MAAM,KAAK,WAAW;OACzB,MAAM;OACN,OAAOF,cAAM,KAAK,WAAW,GAAGA,cAAM,GAAG,OAAO,IAAI,KAAK,WAAW,GAAG,IAAI,GAAG,EAAE,CAAC;CACvF,IAAI,MAAM,GAAGE,SAAO,CAAC,KAAK,CAAC;;CAE3B,IAAIkC,OAAK,GAAG,IAAIC,KAAgB,EAAE,CAAC;;;;;;;;AAQnCD,QAAK,CAAC,UAAU,GAAG,WAAW;GAC5BlC,SAAO,CAAC,KAAK,GAAG,MAAM,CAAC;GACvB,OAAOkC,OAAK,CAAC;EACd,CAAC;;AAEFA,QAAK,CAAC,SAAS,EAAE,CAAC;;CAElB,aAAc,GAAGA,OAAK,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoCvB,UAAqB,GAAGC,KAAgB,CAAC;;;CClEzC;AACA;CAOA,CAAC,YAAM;CACH,QAAMC,SAASC,OAAOC,QAAP,CAAgBC,IAAhB,KAAyB,SAAxC;;CAEA;CACA;CACA,QAAIH,MAAJ,EAAY;CACRF,kBAAMM,MAAN,CAAa,2DAAb,EAA0EC,OAA1E;CACH;;CAEDC,aAASC,gBAAT,CAA0B,kBAA1B,EAA8C,YAAM;CAChDT,kBAAMU,OAAN,CAAc,YAAM;CAChB,gBAAIP,OAAOQ,GAAX,EAAgB;CACZR,uBAAOQ,GAAP,CAAWC,KAAX,CAAiB;CACbC,2BAAO;CACHC,mCAAW;CADR;CADM,iBAAjB;CAKH;;CAED;CACA,gBAAMC,eAAe,WAArB;;CAEA;CACAP,qBAASC,gBAAT,CAA0B,UAA1B,EAAsC,iBAAS;CAC3CO,sBAAMC,MAAN,CAAaC,SAAb,CAAuBC,MAAvB,CAA8BJ,YAA9B;CACH,aAFD;;CAIA;CACAP,qBAASC,gBAAT,CAA0B,SAA1B,EAAqC,iBAAS;CAC1C,oBAAIO,MAAMI,OAAN,KAAkB,CAAtB,EAAyB;CACrB;CACH;;CAED;CACA;CACAC,2BAAW,YAAM;CACbb,6BAASc,aAAT,CAAuBJ,SAAvB,CAAiCK,GAAjC,CAAqCR,YAArC;CACH,iBAFD,EAEG,CAFH;CAGH,aAVD;;CAYA;CACA,gBAAMS,SAAS,IAAIC,IAAJ,CAAS,SAAT,EAAoB;CAC/BC,uBAAO,IADwB;CAE/BC,uBAAO,uBAFwB;CAG/BC,yBAAS,kBAHsB;CAI/BC,0BAAU;CACNjE,4BAAQ;CADF,iBAJqB;CAO/BkE,0BAAU;CACNC,8BAAU;CADJ,iBAPqB;CAU/B;;;;;;;;;;;;;;;;;CAiBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiCAC,0BAAU;CACNC,4BAAQ;CADF,iBA5DqB;CA+D/BC,sBAAM;CACFC,4BAAQ;CADN,iBA/DyB;CAkE/BC,qBAAK;CACDC,6BAAS,IADR;CAEDC,iCAAa;CAFZ;CAlE0B,aAApB,CAAf;;CAwEA;CACAnC,mBAAOqB,MAAP,GAAgBA,MAAhB;;CAEA;CACA,gBAAMe,UAAU/B,SAASgC,gBAAT,CAA0B,eAA1B,CAAhB;CACA,gBAAMC,QAAQ;CACVC,uBAAO,OADG;CAEVC,uBAAO,OAFG;CAGVC,yBAAS,SAHC;CAIVC,uBAAO;CAJG,aAAd;CAMA,gBAAIC,cAAc3C,OAAOC,QAAP,CAAgB2C,IAAhB,CAAqBC,OAArB,CAA6B,GAA7B,EAAkC,EAAlC,CAAlB;CACA,gBAAMC,iBAAiB9C,OAAO+C,OAAP,IAAkB/C,OAAO+C,OAAP,CAAeC,SAAxD;;CAEA;CACA,qBAASC,WAAT,CAAqBC,OAArB,EAA8BC,SAA9B,EAAyCC,KAAzC,EAAgD;CAC5C,oBAAIF,OAAJ,EAAa;CACTA,4BAAQnC,SAAR,CAAkBqC,QAAQ,KAAR,GAAgB,QAAlC,EAA4CD,SAA5C;CACH;CACJ;;CAED;CACA,qBAASE,SAAT,CAAmBC,IAAnB,EAAyBC,IAAzB,EAA+B;CAC3B;CACA,oBAAI,EAAED,QAAQhB,KAAV,KAAqB,CAACiB,IAAD,IAASD,SAASX,WAAvC,IAAwD,CAACA,YAAYa,MAAb,IAAuBF,SAAShB,MAAMC,KAAlG,EAA0G;CACtG;CACH;;CAED,wBAAQe,IAAR;CACI,yBAAKhB,MAAMC,KAAX;CACIlB,+BAAOoC,MAAP,GAAgB;CACZH,kCAAM,OADM;CAEZ9B,mCAAO,uBAFK;CAGZkC,qCAAS,CACL;CACIC,qCAAK,wEADT;CAEIL,sCAAM,WAFV;CAGIM,sCAAM;CAHV,6BADK,EAML;CACID,qCAAK,wEADT;CAEIL,sCAAM,WAFV;CAGIM,sCAAM;CAHV,6BANK,EAWL;CACID,qCAAK,yEADT;CAEIL,sCAAM,WAFV;CAGIM,sCAAM;CAHV,6BAXK,EAgBL;CACID,qCAAK,yEADT;CAEIL,sCAAM,WAFV;CAGIM,sCAAM;CAHV,6BAhBK,CAHG;CAyBZC,oCAAQ,sEAzBI;CA0BZC,oCAAQ,CACJ;CACIC,sCAAM,UADV;CAEIC,uCAAO,SAFX;CAGIC,yCAAS,IAHb;CAIIN,qCAAK,yEAJT;CAKIO,yCAAS;CALb,6BADI,EAQJ;CACIH,sCAAM,UADV;CAEIC,uCAAO,QAFX;CAGIC,yCAAS,IAHb;CAIIN,qCAAK;CAJT,6BARI;CA1BI,yBAAhB;;CA2CA;;CAEJ,yBAAKrB,MAAME,KAAX;CACInB,+BAAOoC,MAAP,GAAgB;CACZH,kCAAM,OADM;CAEZ9B,mCAAO,6DAFK;CAGZkC,qCAAS,CACL;CACIC,qCAAK,6EADT;CAEIL,sCAAM;CAFV,6BADK,EAKL;CACIK,qCAAK,6EADT;CAEIL,sCAAM;CAFV,6BALK;CAHG,yBAAhB;;CAeA;;CAEJ,yBAAKhB,MAAMG,OAAX;CACIpB,+BAAOoC,MAAP,GAAgB;CACZH,kCAAM,OADM;CAEZI,qCAAS,CAAC;CACNC,qCAAK,yCADC;CAENQ,0CAAU;CAFJ,6BAAD;CAFG,yBAAhB;;CAQA;;CAEJ,yBAAK7B,MAAMI,KAAX;CACIrB,+BAAOoC,MAAP,GAAgB;CACZH,kCAAM,OADM;CAEZI,qCAAS,CAAC;CACNC,qCAAK,4BADC;CAENQ,0CAAU;CAFJ,6BAAD;CAFG,yBAAhB;;CAQA;;CAEJ;CACI;CAxFR;;CA2FA;CACAxB,8BAAcW,IAAd;;CAEA;CACAc,sBAAMC,IAAN,CAAWjC,OAAX,EAAoBkC,OAApB,CAA4B;CAAA,2BAAUrB,YAAYsB,OAAOC,aAAnB,EAAkC,QAAlC,EAA4C,KAA5C,CAAV;CAAA,iBAA5B;;CAEA;CACAvB,4BAAY5C,SAASoE,aAAT,oBAAwCnB,IAAxC,QAAZ,EAA+D,QAA/D,EAAyE,IAAzE;;CAEA;CACAc,sBAAMC,IAAN,CAAWhE,SAASgC,gBAAT,CAA0B,aAA1B,CAAX,EAAqDiC,OAArD,CAA6D,gBAAQ;CACjEI,yBAAKC,YAAL,CAAkB,QAAlB,EAA4B,EAA5B;CACH,iBAFD;CAGAtE,yBAASoE,aAAT,mBAAuCnB,IAAvC,EAA+CsB,eAA/C,CAA+D,QAA/D;CACH;;CAED;CACAR,kBAAMC,IAAN,CAAWjC,OAAX,EAAoBkC,OAApB,CAA4B,kBAAU;CAClCC,uBAAOjE,gBAAP,CAAwB,OAAxB,EAAiC,YAAM;CACnC,wBAAMgD,OAAOiB,OAAOM,YAAP,CAAoB,aAApB,CAAb;;CAEAxB,8BAAUC,IAAV;;CAEA,wBAAIR,cAAJ,EAAoB;CAChB9C,+BAAO+C,OAAP,CAAeC,SAAf,CAAyB,EAAEM,UAAF,EAAzB,EAAmC,EAAnC,QAA2CA,IAA3C;CACH;CACJ,iBARD;CASH,aAVD;;CAYA;CACAtD,mBAAOM,gBAAP,CAAwB,UAAxB,EAAoC,iBAAS;CACzC,oBAAIO,MAAMuC,KAAN,IAAe,UAAUvC,MAAMuC,KAAnC,EAA0C;CACtCC,8BAAUxC,MAAMuC,KAAN,CAAYE,IAAtB;CACH;CACJ,aAJD;;CAMA;CACA,gBAAIR,cAAJ,EAAoB;CAChB,oBAAMP,QAAQ,CAACI,YAAYa,MAA3B;;CAEA;CACA,oBAAIjB,KAAJ,EAAW;CACPI,kCAAcL,MAAMC,KAApB;CACH;;CAED;CACA,oBAAII,eAAeL,KAAnB,EAA0B;CACtBtC,2BAAO+C,OAAP,CAAe+B,YAAf,CACI;CACIxB,8BAAMX;CADV,qBADJ,EAII,EAJJ,EAKIJ,QAAQ,EAAR,SAAiBI,WALrB;CAOH;;CAED;CACA,oBAAIA,gBAAgBL,MAAMC,KAA1B,EAAiC;CAC7Bc,8BAAUV,WAAV,EAAuB,IAAvB;CACH;CACJ;CACJ,SA3RD;CA4RH,KA7RD;;CA+RA;CACA;CACA;CACA,QAAI5C,MAAJ,EAAY;CACR,SAAC,UAASgF,CAAT,EAAYC,CAAZ,EAAeC,CAAf,EAAkBC,CAAlB,EAAqBC,CAArB,EAAwBC,CAAxB,EAA2BC,CAA3B,EAA8B;CAC3BN,cAAEO,qBAAF,GAA0BH,CAA1B;CACAJ,cAAEI,CAAF,IACIJ,EAAEI,CAAF,KACA,YAAW;CACP,iBAACJ,EAAEI,CAAF,EAAKI,CAAL,GAASR,EAAEI,CAAF,EAAKI,CAAL,IAAU,EAApB,EAAwBC,IAAxB,CAA6BC,SAA7B;CACH,aAJL;CAKAV,cAAEI,CAAF,EAAKO,CAAL,GAAS,IAAI,IAAIC,IAAJ,EAAb;CACAP,gBAAIJ,EAAEY,aAAF,CAAgBX,CAAhB,CAAJ;CACAI,gBAAIL,EAAEa,oBAAF,CAAuBZ,CAAvB,EAA0B,CAA1B,CAAJ;CACAG,cAAEU,KAAF,GAAU,CAAV;CACAV,cAAEzB,GAAF,GAAQuB,CAAR;CACAG,cAAEU,UAAF,CAAaC,YAAb,CAA0BZ,CAA1B,EAA6BC,CAA7B;CACH,SAbD,EAaGrF,MAbH,EAaWK,QAbX,EAaqB,QAbrB,EAa+B,+CAb/B,EAagF,IAbhF;CAcAL,eAAOiG,EAAP,CAAU,QAAV,EAAoB,gBAApB,EAAsC,MAAtC;CACAjG,eAAOiG,EAAP,CAAU,MAAV,EAAkB,UAAlB;CACH;CACD;CACH,CA9TD","file":"demo.js","sourcesContent":["/*\n json-stringify-safe\n Like JSON.stringify, but doesn't throw on circular references.\n\n Originally forked from https://github.com/isaacs/json-stringify-safe\n version 5.0.1 on 3/8/2017 and modified to handle Errors serialization\n and IE8 compatibility. Tests for this are in test/vendor.\n\n ISC license: https://github.com/isaacs/json-stringify-safe/blob/master/LICENSE\n*/\n\nexports = module.exports = stringify;\nexports.getSerialize = serializer;\n\nfunction indexOf(haystack, needle) {\n for (var i = 0; i < haystack.length; ++i) {\n if (haystack[i] === needle) return i;\n }\n return -1;\n}\n\nfunction stringify(obj, replacer, spaces, cycleReplacer) {\n return JSON.stringify(obj, serializer(replacer, cycleReplacer), spaces);\n}\n\n// https://github.com/ftlabs/js-abbreviate/blob/fa709e5f139e7770a71827b1893f22418097fbda/index.js#L95-L106\nfunction stringifyError(value) {\n var err = {\n // These properties are implemented as magical getters and don't show up in for in\n stack: value.stack,\n message: value.message,\n name: value.name\n };\n\n for (var i in value) {\n if (Object.prototype.hasOwnProperty.call(value, i)) {\n err[i] = value[i];\n }\n }\n\n return err;\n}\n\nfunction serializer(replacer, cycleReplacer) {\n var stack = [];\n var keys = [];\n\n if (cycleReplacer == null) {\n cycleReplacer = function(key, value) {\n if (stack[0] === value) {\n return '[Circular ~]';\n }\n return '[Circular ~.' + keys.slice(0, indexOf(stack, value)).join('.') + ']';\n };\n }\n\n return function(key, value) {\n if (stack.length > 0) {\n var thisPos = indexOf(stack, this);\n ~thisPos ? stack.splice(thisPos + 1) : stack.push(this);\n ~thisPos ? keys.splice(thisPos, Infinity, key) : keys.push(key);\n\n if (~indexOf(stack, value)) {\n value = cycleReplacer.call(this, key, value);\n }\n } else {\n stack.push(value);\n }\n\n return replacer == null\n ? value instanceof Error ? stringifyError(value) : value\n : replacer.call(this, key, value);\n };\n}\n","var stringify = require('../vendor/json-stringify-safe/stringify');\n\nvar _window =\n typeof window !== 'undefined'\n ? window\n : typeof global !== 'undefined'\n ? global\n : typeof self !== 'undefined'\n ? self\n : {};\n\nfunction isObject(what) {\n return typeof what === 'object' && what !== null;\n}\n\n// Yanked from https://git.io/vS8DV re-used under CC0\n// with some tiny modifications\nfunction isError(value) {\n switch (Object.prototype.toString.call(value)) {\n case '[object Error]':\n return true;\n case '[object Exception]':\n return true;\n case '[object DOMException]':\n return true;\n default:\n return value instanceof Error;\n }\n}\n\nfunction isErrorEvent(value) {\n return Object.prototype.toString.call(value) === '[object ErrorEvent]';\n}\n\nfunction isDOMError(value) {\n return Object.prototype.toString.call(value) === '[object DOMError]';\n}\n\nfunction isDOMException(value) {\n return Object.prototype.toString.call(value) === '[object DOMException]';\n}\n\nfunction isUndefined(what) {\n return what === void 0;\n}\n\nfunction isFunction(what) {\n return typeof what === 'function';\n}\n\nfunction isPlainObject(what) {\n return Object.prototype.toString.call(what) === '[object Object]';\n}\n\nfunction isString(what) {\n return Object.prototype.toString.call(what) === '[object String]';\n}\n\nfunction isArray(what) {\n return Object.prototype.toString.call(what) === '[object Array]';\n}\n\nfunction isEmptyObject(what) {\n if (!isPlainObject(what)) return false;\n\n for (var _ in what) {\n if (what.hasOwnProperty(_)) {\n return false;\n }\n }\n return true;\n}\n\nfunction supportsErrorEvent() {\n try {\n new ErrorEvent(''); // eslint-disable-line no-new\n return true;\n } catch (e) {\n return false;\n }\n}\n\nfunction supportsDOMError() {\n try {\n new DOMError(''); // eslint-disable-line no-new\n return true;\n } catch (e) {\n return false;\n }\n}\n\nfunction supportsDOMException() {\n try {\n new DOMException(''); // eslint-disable-line no-new\n return true;\n } catch (e) {\n return false;\n }\n}\n\nfunction supportsFetch() {\n if (!('fetch' in _window)) return false;\n\n try {\n new Headers(); // eslint-disable-line no-new\n new Request(''); // eslint-disable-line no-new\n new Response(); // eslint-disable-line no-new\n return true;\n } catch (e) {\n return false;\n }\n}\n\n// Despite all stars in the sky saying that Edge supports old draft syntax, aka 'never', 'always', 'origin' and 'default\n// https://caniuse.com/#feat=referrer-policy\n// It doesn't. And it throw exception instead of ignoring this parameter...\n// REF: https://github.com/getsentry/raven-js/issues/1233\nfunction supportsReferrerPolicy() {\n if (!supportsFetch()) return false;\n\n try {\n // eslint-disable-next-line no-new\n new Request('pickleRick', {\n referrerPolicy: 'origin'\n });\n return true;\n } catch (e) {\n return false;\n }\n}\n\nfunction supportsPromiseRejectionEvent() {\n return typeof PromiseRejectionEvent === 'function';\n}\n\nfunction wrappedCallback(callback) {\n function dataCallback(data, original) {\n var normalizedData = callback(data) || data;\n if (original) {\n return original(normalizedData) || normalizedData;\n }\n return normalizedData;\n }\n\n return dataCallback;\n}\n\nfunction each(obj, callback) {\n var i, j;\n\n if (isUndefined(obj.length)) {\n for (i in obj) {\n if (hasKey(obj, i)) {\n callback.call(null, i, obj[i]);\n }\n }\n } else {\n j = obj.length;\n if (j) {\n for (i = 0; i < j; i++) {\n callback.call(null, i, obj[i]);\n }\n }\n }\n}\n\nfunction objectMerge(obj1, obj2) {\n if (!obj2) {\n return obj1;\n }\n each(obj2, function(key, value) {\n obj1[key] = value;\n });\n return obj1;\n}\n\n/**\n * This function is only used for react-native.\n * react-native freezes object that have already been sent over the\n * js bridge. We need this function in order to check if the object is frozen.\n * So it's ok that objectFrozen returns false if Object.isFrozen is not\n * supported because it's not relevant for other \"platforms\". See related issue:\n * https://github.com/getsentry/react-native-sentry/issues/57\n */\nfunction objectFrozen(obj) {\n if (!Object.isFrozen) {\n return false;\n }\n return Object.isFrozen(obj);\n}\n\nfunction truncate(str, max) {\n if (typeof max !== 'number') {\n throw new Error('2nd argument to `truncate` function should be a number');\n }\n if (typeof str !== 'string' || max === 0) {\n return str;\n }\n return str.length <= max ? str : str.substr(0, max) + '\\u2026';\n}\n\n/**\n * hasKey, a better form of hasOwnProperty\n * Example: hasKey(MainHostObject, property) === true/false\n *\n * @param {Object} host object to check property\n * @param {string} key to check\n */\nfunction hasKey(object, key) {\n return Object.prototype.hasOwnProperty.call(object, key);\n}\n\nfunction joinRegExp(patterns) {\n // Combine an array of regular expressions and strings into one large regexp\n // Be mad.\n var sources = [],\n i = 0,\n len = patterns.length,\n pattern;\n\n for (; i < len; i++) {\n pattern = patterns[i];\n if (isString(pattern)) {\n // If it's a string, we need to escape it\n // Taken from: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions\n sources.push(pattern.replace(/([.*+?^=!:${}()|\\[\\]\\/\\\\])/g, '\\\\$1'));\n } else if (pattern && pattern.source) {\n // If it's a regexp already, we want to extract the source\n sources.push(pattern.source);\n }\n // Intentionally skip other cases\n }\n return new RegExp(sources.join('|'), 'i');\n}\n\nfunction urlencode(o) {\n var pairs = [];\n each(o, function(key, value) {\n pairs.push(encodeURIComponent(key) + '=' + encodeURIComponent(value));\n });\n return pairs.join('&');\n}\n\n// borrowed from https://tools.ietf.org/html/rfc3986#appendix-B\n// intentionally using regex and not <a/> href parsing trick because React Native and other\n// environments where DOM might not be available\nfunction parseUrl(url) {\n if (typeof url !== 'string') return {};\n var match = url.match(/^(([^:\\/?#]+):)?(\\/\\/([^\\/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?$/);\n\n // coerce to undefined values to empty string so we don't get 'undefined'\n var query = match[6] || '';\n var fragment = match[8] || '';\n return {\n protocol: match[2],\n host: match[4],\n path: match[5],\n relative: match[5] + query + fragment // everything minus origin\n };\n}\nfunction uuid4() {\n var crypto = _window.crypto || _window.msCrypto;\n\n if (!isUndefined(crypto) && crypto.getRandomValues) {\n // Use window.crypto API if available\n // eslint-disable-next-line no-undef\n var arr = new Uint16Array(8);\n crypto.getRandomValues(arr);\n\n // set 4 in byte 7\n arr[3] = (arr[3] & 0xfff) | 0x4000;\n // set 2 most significant bits of byte 9 to '10'\n arr[4] = (arr[4] & 0x3fff) | 0x8000;\n\n var pad = function(num) {\n var v = num.toString(16);\n while (v.length < 4) {\n v = '0' + v;\n }\n return v;\n };\n\n return (\n pad(arr[0]) +\n pad(arr[1]) +\n pad(arr[2]) +\n pad(arr[3]) +\n pad(arr[4]) +\n pad(arr[5]) +\n pad(arr[6]) +\n pad(arr[7])\n );\n } else {\n // http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#2117523\n return 'xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n var r = (Math.random() * 16) | 0,\n v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n}\n\n/**\n * Given a child DOM element, returns a query-selector statement describing that\n * and its ancestors\n * e.g. [HTMLElement] => body > div > input#foo.btn[name=baz]\n * @param elem\n * @returns {string}\n */\nfunction htmlTreeAsString(elem) {\n /* eslint no-extra-parens:0*/\n var MAX_TRAVERSE_HEIGHT = 5,\n MAX_OUTPUT_LEN = 80,\n out = [],\n height = 0,\n len = 0,\n separator = ' > ',\n sepLength = separator.length,\n nextStr;\n\n while (elem && height++ < MAX_TRAVERSE_HEIGHT) {\n nextStr = htmlElementAsString(elem);\n // bail out if\n // - nextStr is the 'html' element\n // - the length of the string that would be created exceeds MAX_OUTPUT_LEN\n // (ignore this limit if we are on the first iteration)\n if (\n nextStr === 'html' ||\n (height > 1 && len + out.length * sepLength + nextStr.length >= MAX_OUTPUT_LEN)\n ) {\n break;\n }\n\n out.push(nextStr);\n\n len += nextStr.length;\n elem = elem.parentNode;\n }\n\n return out.reverse().join(separator);\n}\n\n/**\n * Returns a simple, query-selector representation of a DOM element\n * e.g. [HTMLElement] => input#foo.btn[name=baz]\n * @param HTMLElement\n * @returns {string}\n */\nfunction htmlElementAsString(elem) {\n var out = [],\n className,\n classes,\n key,\n attr,\n i;\n\n if (!elem || !elem.tagName) {\n return '';\n }\n\n out.push(elem.tagName.toLowerCase());\n if (elem.id) {\n out.push('#' + elem.id);\n }\n\n className = elem.className;\n if (className && isString(className)) {\n classes = className.split(/\\s+/);\n for (i = 0; i < classes.length; i++) {\n out.push('.' + classes[i]);\n }\n }\n var attrWhitelist = ['type', 'name', 'title', 'alt'];\n for (i = 0; i < attrWhitelist.length; i++) {\n key = attrWhitelist[i];\n attr = elem.getAttribute(key);\n if (attr) {\n out.push('[' + key + '=\"' + attr + '\"]');\n }\n }\n return out.join('');\n}\n\n/**\n * Returns true if either a OR b is truthy, but not both\n */\nfunction isOnlyOneTruthy(a, b) {\n return !!(!!a ^ !!b);\n}\n\n/**\n * Returns true if both parameters are undefined\n */\nfunction isBothUndefined(a, b) {\n return isUndefined(a) && isUndefined(b);\n}\n\n/**\n * Returns true if the two input exception interfaces have the same content\n */\nfunction isSameException(ex1, ex2) {\n if (isOnlyOneTruthy(ex1, ex2)) return false;\n\n ex1 = ex1.values[0];\n ex2 = ex2.values[0];\n\n if (ex1.type !== ex2.type || ex1.value !== ex2.value) return false;\n\n // in case both stacktraces are undefined, we can't decide so default to false\n if (isBothUndefined(ex1.stacktrace, ex2.stacktrace)) return false;\n\n return isSameStacktrace(ex1.stacktrace, ex2.stacktrace);\n}\n\n/**\n * Returns true if the two input stack trace interfaces have the same content\n */\nfunction isSameStacktrace(stack1, stack2) {\n if (isOnlyOneTruthy(stack1, stack2)) return false;\n\n var frames1 = stack1.frames;\n var frames2 = stack2.frames;\n\n // Exit early if stacktrace is malformed\n if (frames1 === undefined || frames2 === undefined) return false;\n\n // Exit early if frame count differs\n if (frames1.length !== frames2.length) return false;\n\n // Iterate through every frame; bail out if anything differs\n var a, b;\n for (var i = 0; i < frames1.length; i++) {\n a = frames1[i];\n b = frames2[i];\n if (\n a.filename !== b.filename ||\n a.lineno !== b.lineno ||\n a.colno !== b.colno ||\n a['function'] !== b['function']\n )\n return false;\n }\n return true;\n}\n\n/**\n * Polyfill a method\n * @param obj object e.g. `document`\n * @param name method name present on object e.g. `addEventListener`\n * @param replacement replacement function\n * @param track {optional} record instrumentation to an array\n */\nfunction fill(obj, name, replacement, track) {\n if (obj == null) return;\n var orig = obj[name];\n obj[name] = replacement(orig);\n obj[name].__raven__ = true;\n obj[name].__orig__ = orig;\n if (track) {\n track.push([obj, name, orig]);\n }\n}\n\n/**\n * Join values in array\n * @param input array of values to be joined together\n * @param delimiter string to be placed in-between values\n * @returns {string}\n */\nfunction safeJoin(input, delimiter) {\n if (!isArray(input)) return '';\n\n var output = [];\n\n for (var i = 0; i < input.length; i++) {\n try {\n output.push(String(input[i]));\n } catch (e) {\n output.push('[value cannot be serialized]');\n }\n }\n\n return output.join(delimiter);\n}\n\n// Default Node.js REPL depth\nvar MAX_SERIALIZE_EXCEPTION_DEPTH = 3;\n// 50kB, as 100kB is max payload size, so half sounds reasonable\nvar MAX_SERIALIZE_EXCEPTION_SIZE = 50 * 1024;\nvar MAX_SERIALIZE_KEYS_LENGTH = 40;\n\nfunction utf8Length(value) {\n return ~-encodeURI(value).split(/%..|./).length;\n}\n\nfunction jsonSize(value) {\n return utf8Length(JSON.stringify(value));\n}\n\nfunction serializeValue(value) {\n if (typeof value === 'string') {\n var maxLength = 40;\n return truncate(value, maxLength);\n } else if (\n typeof value === 'number' ||\n typeof value === 'boolean' ||\n typeof value === 'undefined'\n ) {\n return value;\n }\n\n var type = Object.prototype.toString.call(value);\n\n // Node.js REPL notation\n if (type === '[object Object]') return '[Object]';\n if (type === '[object Array]') return '[Array]';\n if (type === '[object Function]')\n return value.name ? '[Function: ' + value.name + ']' : '[Function]';\n\n return value;\n}\n\nfunction serializeObject(value, depth) {\n if (depth === 0) return serializeValue(value);\n\n if (isPlainObject(value)) {\n return Object.keys(value).reduce(function(acc, key) {\n acc[key] = serializeObject(value[key], depth - 1);\n return acc;\n }, {});\n } else if (Array.isArray(value)) {\n return value.map(function(val) {\n return serializeObject(val, depth - 1);\n });\n }\n\n return serializeValue(value);\n}\n\nfunction serializeException(ex, depth, maxSize) {\n if (!isPlainObject(ex)) return ex;\n\n depth = typeof depth !== 'number' ? MAX_SERIALIZE_EXCEPTION_DEPTH : depth;\n maxSize = typeof depth !== 'number' ? MAX_SERIALIZE_EXCEPTION_SIZE : maxSize;\n\n var serialized = serializeObject(ex, depth);\n\n if (jsonSize(stringify(serialized)) > maxSize) {\n return serializeException(ex, depth - 1);\n }\n\n return serialized;\n}\n\nfunction serializeKeysForMessage(keys, maxLength) {\n if (typeof keys === 'number' || typeof keys === 'string') return keys.toString();\n if (!Array.isArray(keys)) return '';\n\n keys = keys.filter(function(key) {\n return typeof key === 'string';\n });\n if (keys.length === 0) return '[object has no keys]';\n\n maxLength = typeof maxLength !== 'number' ? MAX_SERIALIZE_KEYS_LENGTH : maxLength;\n if (keys[0].length >= maxLength) return keys[0];\n\n for (var usedKeys = keys.length; usedKeys > 0; usedKeys--) {\n var serialized = keys.slice(0, usedKeys).join(', ');\n if (serialized.length > maxLength) continue;\n if (usedKeys === keys.length) return serialized;\n return serialized + '\\u2026';\n }\n\n return '';\n}\n\nfunction sanitize(input, sanitizeKeys) {\n if (!isArray(sanitizeKeys) || (isArray(sanitizeKeys) && sanitizeKeys.length === 0))\n return input;\n\n var sanitizeRegExp = joinRegExp(sanitizeKeys);\n var sanitizeMask = '********';\n var safeInput;\n\n try {\n safeInput = JSON.parse(stringify(input));\n } catch (o_O) {\n return input;\n }\n\n function sanitizeWorker(workerInput) {\n if (isArray(workerInput)) {\n return workerInput.map(function(val) {\n return sanitizeWorker(val);\n });\n }\n\n if (isPlainObject(workerInput)) {\n return Object.keys(workerInput).reduce(function(acc, k) {\n if (sanitizeRegExp.test(k)) {\n acc[k] = sanitizeMask;\n } else {\n acc[k] = sanitizeWorker(workerInput[k]);\n }\n return acc;\n }, {});\n }\n\n return workerInput;\n }\n\n return sanitizeWorker(safeInput);\n}\n\nmodule.exports = {\n isObject: isObject,\n isError: isError,\n isErrorEvent: isErrorEvent,\n isDOMError: isDOMError,\n isDOMException: isDOMException,\n isUndefined: isUndefined,\n isFunction: isFunction,\n isPlainObject: isPlainObject,\n isString: isString,\n isArray: isArray,\n isEmptyObject: isEmptyObject,\n supportsErrorEvent: supportsErrorEvent,\n supportsDOMError: supportsDOMError,\n supportsDOMException: supportsDOMException,\n supportsFetch: supportsFetch,\n supportsReferrerPolicy: supportsReferrerPolicy,\n supportsPromiseRejectionEvent: supportsPromiseRejectionEvent,\n wrappedCallback: wrappedCallback,\n each: each,\n objectMerge: objectMerge,\n truncate: truncate,\n objectFrozen: objectFrozen,\n hasKey: hasKey,\n joinRegExp: joinRegExp,\n urlencode: urlencode,\n uuid4: uuid4,\n htmlTreeAsString: htmlTreeAsString,\n htmlElementAsString: htmlElementAsString,\n isSameException: isSameException,\n isSameStacktrace: isSameStacktrace,\n parseUrl: parseUrl,\n fill: fill,\n safeJoin: safeJoin,\n serializeException: serializeException,\n serializeKeysForMessage: serializeKeysForMessage,\n sanitize: sanitize\n};\n","var utils = require('../../src/utils');\n\n/*\n TraceKit - Cross brower stack traces\n\n This was originally forked from github.com/occ/TraceKit, but has since been\n largely re-written and is now maintained as part of raven-js. Tests for\n this are in test/vendor.\n\n MIT license\n*/\n\nvar TraceKit = {\n collectWindowErrors: true,\n debug: false\n};\n\n// This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785)\nvar _window =\n typeof window !== 'undefined'\n ? window\n : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\n// global reference to slice\nvar _slice = [].slice;\nvar UNKNOWN_FUNCTION = '?';\n\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error#Error_types\nvar ERROR_TYPES_RE = /^(?:[Uu]ncaught (?:exception: )?)?(?:((?:Eval|Internal|Range|Reference|Syntax|Type|URI|)Error): )?(.*)$/;\n\nfunction getLocationHref() {\n if (typeof document === 'undefined' || document.location == null) return '';\n return document.location.href;\n}\n\nfunction getLocationOrigin() {\n if (typeof document === 'undefined' || document.location == null) return '';\n\n // Oh dear IE10...\n if (!document.location.origin) {\n return (\n document.location.protocol +\n '//' +\n document.location.hostname +\n (document.location.port ? ':' + document.location.port : '')\n );\n }\n\n return document.location.origin;\n}\n\n/**\n * TraceKit.report: cross-browser processing of unhandled exceptions\n *\n * Syntax:\n * TraceKit.report.subscribe(function(stackInfo) { ... })\n * TraceKit.report.unsubscribe(function(stackInfo) { ... })\n * TraceKit.report(exception)\n * try { ...code... } catch(ex) { TraceKit.report(ex); }\n *\n * Supports:\n * - Firefox: full stack trace with line numbers, plus column number\n * on top frame; column number is not guaranteed\n * - Opera: full stack trace with line and column numbers\n * - Chrome: full stack trace with line and column numbers\n * - Safari: line and column number for the top frame only; some frames\n * may be missing, and column number is not guaranteed\n * - IE: line and column number for the top frame only; some frames\n * may be missing, and column number is not guaranteed\n *\n * In theory, TraceKit should work on all of the following versions:\n * - IE5.5+ (only 8.0 tested)\n * - Firefox 0.9+ (only 3.5+ tested)\n * - Opera 7+ (only 10.50 tested; versions 9 and earlier may require\n * Exceptions Have Stacktrace to be enabled in opera:config)\n * - Safari 3+ (only 4+ tested)\n * - Chrome 1+ (only 5+ tested)\n * - Konqueror 3.5+ (untested)\n *\n * Requires TraceKit.computeStackTrace.\n *\n * Tries to catch all unhandled exceptions and report them to the\n * subscribed handlers. Please note that TraceKit.report will rethrow the\n * exception. This is REQUIRED in order to get a useful stack trace in IE.\n * If the exception does not reach the top of the browser, you will only\n * get a stack trace from the point where TraceKit.report was called.\n *\n * Handlers receive a stackInfo object as described in the\n * TraceKit.computeStackTrace docs.\n */\nTraceKit.report = (function reportModuleWrapper() {\n var handlers = [],\n lastArgs = null,\n lastException = null,\n lastExceptionStack = null;\n\n /**\n * Add a crash handler.\n * @param {Function} handler\n */\n function subscribe(handler) {\n installGlobalHandler();\n handlers.push(handler);\n }\n\n /**\n * Remove a crash handler.\n * @param {Function} handler\n */\n function unsubscribe(handler) {\n for (var i = handlers.length - 1; i >= 0; --i) {\n if (handlers[i] === handler) {\n handlers.splice(i, 1);\n }\n }\n }\n\n /**\n * Remove all crash handlers.\n */\n function unsubscribeAll() {\n uninstallGlobalHandler();\n handlers = [];\n }\n\n /**\n * Dispatch stack information to all handlers.\n * @param {Object.<string, *>} stack\n */\n function notifyHandlers(stack, isWindowError) {\n var exception = null;\n if (isWindowError && !TraceKit.collectWindowErrors) {\n return;\n }\n for (var i in handlers) {\n if (handlers.hasOwnProperty(i)) {\n try {\n handlers[i].apply(null, [stack].concat(_slice.call(arguments, 2)));\n } catch (inner) {\n exception = inner;\n }\n }\n }\n\n if (exception) {\n throw exception;\n }\n }\n\n var _oldOnerrorHandler, _onErrorHandlerInstalled;\n\n /**\n * Ensures all global unhandled exceptions are recorded.\n * Supported by Gecko and IE.\n * @param {string} msg Error message.\n * @param {string} url URL of script that generated the exception.\n * @param {(number|string)} lineNo The line number at which the error\n * occurred.\n * @param {?(number|string)} colNo The column number at which the error\n * occurred.\n * @param {?Error} ex The actual Error object.\n */\n function traceKitWindowOnError(msg, url, lineNo, colNo, ex) {\n var stack = null;\n // If 'ex' is ErrorEvent, get real Error from inside\n var exception = utils.isErrorEvent(ex) ? ex.error : ex;\n // If 'msg' is ErrorEvent, get real message from inside\n var message = utils.isErrorEvent(msg) ? msg.message : msg;\n\n if (lastExceptionStack) {\n TraceKit.computeStackTrace.augmentStackTraceWithInitialElement(\n lastExceptionStack,\n url,\n lineNo,\n message\n );\n processLastException();\n } else if (exception && utils.isError(exception)) {\n // non-string `exception` arg; attempt to extract stack trace\n\n // New chrome and blink send along a real error object\n // Let's just report that like a normal error.\n // See: https://mikewest.org/2013/08/debugging-runtime-errors-with-window-onerror\n stack = TraceKit.computeStackTrace(exception);\n notifyHandlers(stack, true);\n } else {\n var location = {\n url: url,\n line: lineNo,\n column: colNo\n };\n\n var name = undefined;\n var groups;\n\n if ({}.toString.call(message) === '[object String]') {\n var groups = message.match(ERROR_TYPES_RE);\n if (groups) {\n name = groups[1];\n message = groups[2];\n }\n }\n\n location.func = UNKNOWN_FUNCTION;\n\n stack = {\n name: name,\n message: message,\n url: getLocationHref(),\n stack: [location]\n };\n notifyHandlers(stack, true);\n }\n\n if (_oldOnerrorHandler) {\n return _oldOnerrorHandler.apply(this, arguments);\n }\n\n return false;\n }\n\n function installGlobalHandler() {\n if (_onErrorHandlerInstalled) {\n return;\n }\n _oldOnerrorHandler = _window.onerror;\n _window.onerror = traceKitWindowOnError;\n _onErrorHandlerInstalled = true;\n }\n\n function uninstallGlobalHandler() {\n if (!_onErrorHandlerInstalled) {\n return;\n }\n _window.onerror = _oldOnerrorHandler;\n _onErrorHandlerInstalled = false;\n _oldOnerrorHandler = undefined;\n }\n\n function processLastException() {\n var _lastExceptionStack = lastExceptionStack,\n _lastArgs = lastArgs;\n lastArgs = null;\n lastExceptionStack = null;\n lastException = null;\n notifyHandlers.apply(null, [_lastExceptionStack, false].concat(_lastArgs));\n }\n\n /**\n * Reports an unhandled Error to TraceKit.\n * @param {Error} ex\n * @param {?boolean} rethrow If false, do not re-throw the exception.\n * Only used for window.onerror to not cause an infinite loop of\n * rethrowing.\n */\n function report(ex, rethrow) {\n var args = _slice.call(arguments, 1);\n if (lastExceptionStack) {\n if (lastException === ex) {\n return; // already caught by an inner catch block, ignore\n } else {\n processLastException();\n }\n }\n\n var stack = TraceKit.computeStackTrace(ex);\n lastExceptionStack = stack;\n lastException = ex;\n lastArgs = args;\n\n // If the stack trace is incomplete, wait for 2 seconds for\n // slow slow IE to see if onerror occurs or not before reporting\n // this exception; otherwise, we will end up with an incomplete\n // stack trace\n setTimeout(function() {\n if (lastException === ex) {\n processLastException();\n }\n }, stack.incomplete ? 2000 : 0);\n\n if (rethrow !== false) {\n throw ex; // re-throw to propagate to the top level (and cause window.onerror)\n }\n }\n\n report.subscribe = subscribe;\n report.unsubscribe = unsubscribe;\n report.uninstall = unsubscribeAll;\n return report;\n})();\n\n/**\n * TraceKit.computeStackTrace: cross-browser stack traces in JavaScript\n *\n * Syntax:\n * s = TraceKit.computeStackTrace(exception) // consider using TraceKit.report instead (see below)\n * Returns:\n * s.name - exception name\n * s.message - exception message\n * s.stack[i].url - JavaScript or HTML file URL\n * s.stack[i].func - function name, or empty for anonymous functions (if guessing did not work)\n * s.stack[i].args - arguments passed to the function, if known\n * s.stack[i].line - line number, if known\n * s.stack[i].column - column number, if known\n *\n * Supports:\n * - Firefox: full stack trace with line numbers and unreliable column\n * number on top frame\n * - Opera 10: full stack trace with line and column numbers\n * - Opera 9-: full stack trace with line numbers\n * - Chrome: full stack trace with line and column numbers\n * - Safari: line and column number for the topmost stacktrace element\n * only\n * - IE: no line numbers whatsoever\n *\n * Tries to guess names of anonymous functions by looking for assignments\n * in the source code. In IE and Safari, we have to guess source file names\n * by searching for function bodies inside all page scripts. This will not\n * work for scripts that are loaded cross-domain.\n * Here be dragons: some function names may be guessed incorrectly, and\n * duplicate functions may be mismatched.\n *\n * TraceKit.computeStackTrace should only be used for tracing purposes.\n * Logging of unhandled exceptions should be done with TraceKit.report,\n * which builds on top of TraceKit.computeStackTrace and provides better\n * IE support by utilizing the window.onerror event to retrieve information\n * about the top of the stack.\n *\n * Note: In IE and Safari, no stack trace is recorded on the Error object,\n * so computeStackTrace instead walks its *own* chain of callers.\n * This means that:\n * * in Safari, some methods may be missing from the stack trace;\n * * in IE, the topmost function in the stack trace will always be the\n * caller of computeStackTrace.\n *\n * This is okay for tracing (because you are likely to be calling\n * computeStackTrace from the function you want to be the topmost element\n * of the stack trace anyway), but not okay for logging unhandled\n * exceptions (because your catch block will likely be far away from the\n * inner function that actually caused the exception).\n *\n */\nTraceKit.computeStackTrace = (function computeStackTraceWrapper() {\n // Contents of Exception in various browsers.\n //\n // SAFARI:\n // ex.message = Can't find variable: qq\n // ex.line = 59\n // ex.sourceId = 580238192\n // ex.sourceURL = http://...\n // ex.expressionBeginOffset = 96\n // ex.expressionCaretOffset = 98\n // ex.expressionEndOffset = 98\n // ex.name = ReferenceError\n //\n // FIREFOX:\n // ex.message = qq is not defined\n // ex.fileName = http://...\n // ex.lineNumber = 59\n // ex.columnNumber = 69\n // ex.stack = ...stack trace... (see the example below)\n // ex.name = ReferenceError\n //\n // CHROME:\n // ex.message = qq is not defined\n // ex.name = ReferenceError\n // ex.type = not_defined\n // ex.arguments = ['aa']\n // ex.stack = ...stack trace...\n //\n // INTERNET EXPLORER:\n // ex.message = ...\n // ex.name = ReferenceError\n //\n // OPERA:\n // ex.message = ...message... (see the example below)\n // ex.name = ReferenceError\n // ex.opera#sourceloc = 11 (pretty much useless, duplicates the info in ex.message)\n // ex.stacktrace = n/a; see 'opera:config#UserPrefs|Exceptions Have Stacktrace'\n\n /**\n * Computes stack trace information from the stack property.\n * Chrome and Gecko use this property.\n * @param {Error} ex\n * @return {?Object.<string, *>} Stack trace information.\n */\n function computeStackTraceFromStackProp(ex) {\n if (typeof ex.stack === 'undefined' || !ex.stack) return;\n\n var chrome = /^\\s*at (?:(.*?) ?\\()?((?:file|https?|blob|chrome-extension|native|eval|webpack|<anonymous>|[a-z]:|\\/).*?)(?::(\\d+))?(?::(\\d+))?\\)?\\s*$/i;\n var winjs = /^\\s*at (?:((?:\\[object object\\])?.+) )?\\(?((?:file|ms-appx(?:-web)|https?|webpack|blob):.*?):(\\d+)(?::(\\d+))?\\)?\\s*$/i;\n // NOTE: blob urls are now supposed to always have an origin, therefore it's format\n // which is `blob:http://url/path/with-some-uuid`, is matched by `blob.*?:\\/` as well\n var gecko = /^\\s*(.*?)(?:\\((.*?)\\))?(?:^|@)((?:file|https?|blob|chrome|webpack|resource|moz-extension).*?:\\/.*?|\\[native code\\]|[^@]*bundle)(?::(\\d+))?(?::(\\d+))?\\s*$/i;\n // Used to additionally parse URL/line/column from eval frames\n var geckoEval = /(\\S+) line (\\d+)(?: > eval line \\d+)* > eval/i;\n var chromeEval = /\\((\\S*)(?::(\\d+))(?::(\\d+))\\)/;\n var lines = ex.stack.split('\\n');\n var stack = [];\n var submatch;\n var parts;\n var element;\n var reference = /^(.*) is undefined$/.exec(ex.message);\n\n for (var i = 0, j = lines.length; i < j; ++i) {\n if ((parts = chrome.exec(lines[i]))) {\n var isNative = parts[2] && parts[2].indexOf('native') === 0; // start of line\n var isEval = parts[2] && parts[2].indexOf('eval') === 0; // start of line\n if (isEval && (submatch = chromeEval.exec(parts[2]))) {\n // throw out eval line/column and use top-most line/column number\n parts[2] = submatch[1]; // url\n parts[3] = submatch[2]; // line\n parts[4] = submatch[3]; // column\n }\n element = {\n url: !isNative ? parts[2] : null,\n func: parts[1] || UNKNOWN_FUNCTION,\n args: isNative ? [parts[2]] : [],\n line: parts[3] ? +parts[3] : null,\n column: parts[4] ? +parts[4] : null\n };\n } else if ((parts = winjs.exec(lines[i]))) {\n element = {\n url: parts[2],\n func: parts[1] || UNKNOWN_FUNCTION,\n args: [],\n line: +parts[3],\n column: parts[4] ? +parts[4] : null\n };\n } else if ((parts = gecko.exec(lines[i]))) {\n var isEval = parts[3] && parts[3].indexOf(' > eval') > -1;\n if (isEval && (submatch = geckoEval.exec(parts[3]))) {\n // throw out eval line/column and use top-most line number\n parts[3] = submatch[1];\n parts[4] = submatch[2];\n parts[5] = null; // no column when eval\n } else if (i === 0 && !parts[5] && typeof ex.columnNumber !== 'undefined') {\n // FireFox uses this awesome columnNumber property for its top frame\n // Also note, Firefox's column number is 0-based and everything else expects 1-based,\n // so adding 1\n // NOTE: this hack doesn't work if top-most frame is eval\n stack[0].column = ex.columnNumber + 1;\n }\n element = {\n url: parts[3],\n func: parts[1] || UNKNOWN_FUNCTION,\n args: parts[2] ? parts[2].split(',') : [],\n line: parts[4] ? +parts[4] : null,\n column: parts[5] ? +parts[5] : null\n };\n } else {\n continue;\n }\n\n if (!element.func && element.line) {\n element.func = UNKNOWN_FUNCTION;\n }\n\n if (element.url && element.url.substr(0, 5) === 'blob:') {\n // Special case for handling JavaScript loaded into a blob.\n // We use a synchronous AJAX request here as a blob is already in\n // memory - it's not making a network request. This will generate a warning\n // in the browser console, but there has already been an error so that's not\n // that much of an issue.\n var xhr = new XMLHttpRequest();\n xhr.open('GET', element.url, false);\n xhr.send(null);\n\n // If we failed to download the source, skip this patch\n if (xhr.status === 200) {\n var source = xhr.responseText || '';\n\n // We trim the source down to the last 300 characters as sourceMappingURL is always at the end of the file.\n // Why 300? To be in line with: https://github.com/getsentry/sentry/blob/4af29e8f2350e20c28a6933354e4f42437b4ba42/src/sentry/lang/javascript/processor.py#L164-L175\n source = source.slice(-300);\n\n // Now we dig out the source map URL\n var sourceMaps = source.match(/\\/\\/# sourceMappingURL=(.*)$/);\n\n // If we don't find a source map comment or we find more than one, continue on to the next element.\n if (sourceMaps) {\n var sourceMapAddress = sourceMaps[1];\n\n // Now we check to see if it's a relative URL.\n // If it is, convert it to an absolute one.\n if (sourceMapAddress.charAt(0) === '~') {\n sourceMapAddress = getLocationOrigin() + sourceMapAddress.slice(1);\n }\n\n // Now we strip the '.map' off of the end of the URL and update the\n // element so that Sentry can match the map to the blob.\n element.url = sourceMapAddress.slice(0, -4);\n }\n }\n }\n\n stack.push(element);\n }\n\n if (!stack.length) {\n return null;\n }\n\n return {\n name: ex.name,\n message: ex.message,\n url: getLocationHref(),\n stack: stack\n };\n }\n\n /**\n * Adds information about the first frame to incomplete stack traces.\n * Safari and IE require this to get complete data on the first frame.\n * @param {Object.<string, *>} stackInfo Stack trace information from\n * one of the compute* methods.\n * @param {string} url The URL of the script that caused an error.\n * @param {(number|string)} lineNo The line number of the script that\n * caused an error.\n * @param {string=} message The error generated by the browser, which\n * hopefully contains the name of the object that caused the error.\n * @return {boolean} Whether or not the stack information was\n * augmented.\n */\n function augmentStackTraceWithInitialElement(stackInfo, url, lineNo, message) {\n var initial = {\n url: url,\n line: lineNo\n };\n\n if (initial.url && initial.line) {\n stackInfo.incomplete = false;\n\n if (!initial.func) {\n initial.func = UNKNOWN_FUNCTION;\n }\n\n if (stackInfo.stack.length > 0) {\n if (stackInfo.stack[0].url === initial.url) {\n if (stackInfo.stack[0].line === initial.line) {\n return false; // already in stack trace\n } else if (\n !stackInfo.stack[0].line &&\n stackInfo.stack[0].func === initial.func\n ) {\n stackInfo.stack[0].line = initial.line;\n return false;\n }\n }\n }\n\n stackInfo.stack.unshift(initial);\n stackInfo.partial = true;\n return true;\n } else {\n stackInfo.incomplete = true;\n }\n\n return false;\n }\n\n /**\n * Computes stack trace information by walking the arguments.caller\n * chain at the time the exception occurred. This will cause earlier\n * frames to be missed but is the only way to get any stack trace in\n * Safari and IE. The top frame is restored by\n * {@link augmentStackTraceWithInitialElement}.\n * @param {Error} ex\n * @return {?Object.<string, *>} Stack trace information.\n */\n function computeStackTraceByWalkingCallerChain(ex, depth) {\n var functionName = /function\\s+([_$a-zA-Z\\xA0-\\uFFFF][_$a-zA-Z0-9\\xA0-\\uFFFF]*)?\\s*\\(/i,\n stack = [],\n funcs = {},\n recursion = false,\n parts,\n item,\n source;\n\n for (\n var curr = computeStackTraceByWalkingCallerChain.caller;\n curr && !recursion;\n curr = curr.caller\n ) {\n if (curr === computeStackTrace || curr === TraceKit.report) {\n // console.log('skipping internal function');\n continue;\n }\n\n item = {\n url: null,\n func: UNKNOWN_FUNCTION,\n line: null,\n column: null\n };\n\n if (curr.name) {\n item.func = curr.name;\n } else if ((parts = functionName.exec(curr.toString()))) {\n item.func = parts[1];\n }\n\n if (typeof item.func === 'undefined') {\n try {\n item.func = parts.input.substring(0, parts.input.indexOf('{'));\n } catch (e) {}\n }\n\n if (funcs['' + curr]) {\n recursion = true;\n } else {\n funcs['' + curr] = true;\n }\n\n stack.push(item);\n }\n\n if (depth) {\n // console.log('depth is ' + depth);\n // console.log('stack is ' + stack.length);\n stack.splice(0, depth);\n }\n\n var result = {\n name: ex.name,\n message: ex.message,\n url: getLocationHref(),\n stack: stack\n };\n augmentStackTraceWithInitialElement(\n result,\n ex.sourceURL || ex.fileName,\n ex.line || ex.lineNumber,\n ex.message || ex.description\n );\n return result;\n }\n\n /**\n * Computes a stack trace for an exception.\n * @param {Error} ex\n * @param {(string|number)=} depth\n */\n function computeStackTrace(ex, depth) {\n var stack = null;\n depth = depth == null ? 0 : +depth;\n\n try {\n stack = computeStackTraceFromStackProp(ex);\n if (stack) {\n return stack;\n }\n } catch (e) {\n if (TraceKit.debug) {\n throw e;\n }\n }\n\n try {\n stack = computeStackTraceByWalkingCallerChain(ex, depth + 1);\n if (stack) {\n return stack;\n }\n } catch (e) {\n if (TraceKit.debug) {\n throw e;\n }\n }\n return {\n name: ex.name,\n message: ex.message,\n url: getLocationHref()\n };\n }\n\n computeStackTrace.augmentStackTraceWithInitialElement = augmentStackTraceWithInitialElement;\n computeStackTrace.computeStackTraceFromStackProp = computeStackTraceFromStackProp;\n\n return computeStackTrace;\n})();\n\nmodule.exports = TraceKit;\n","/*\n * JavaScript MD5\n * https://github.com/blueimp/JavaScript-MD5\n *\n * Copyright 2011, Sebastian Tschan\n * https://blueimp.net\n *\n * Licensed under the MIT license:\n * https://opensource.org/licenses/MIT\n *\n * Based on\n * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message\n * Digest Algorithm, as defined in RFC 1321.\n * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009\n * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet\n * Distributed under the BSD License\n * See http://pajhome.org.uk/crypt/md5 for more info.\n */\n\n/*\n* Add integers, wrapping at 2^32. This uses 16-bit operations internally\n* to work around bugs in some JS interpreters.\n*/\nfunction safeAdd(x, y) {\n var lsw = (x & 0xffff) + (y & 0xffff);\n var msw = (x >> 16) + (y >> 16) + (lsw >> 16);\n return (msw << 16) | (lsw & 0xffff);\n}\n\n/*\n* Bitwise rotate a 32-bit number to the left.\n*/\nfunction bitRotateLeft(num, cnt) {\n return (num << cnt) | (num >>> (32 - cnt));\n}\n\n/*\n* These functions implement the four basic operations the algorithm uses.\n*/\nfunction md5cmn(q, a, b, x, s, t) {\n return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b);\n}\nfunction md5ff(a, b, c, d, x, s, t) {\n return md5cmn((b & c) | (~b & d), a, b, x, s, t);\n}\nfunction md5gg(a, b, c, d, x, s, t) {\n return md5cmn((b & d) | (c & ~d), a, b, x, s, t);\n}\nfunction md5hh(a, b, c, d, x, s, t) {\n return md5cmn(b ^ c ^ d, a, b, x, s, t);\n}\nfunction md5ii(a, b, c, d, x, s, t) {\n return md5cmn(c ^ (b | ~d), a, b, x, s, t);\n}\n\n/*\n* Calculate the MD5 of an array of little-endian words, and a bit length.\n*/\nfunction binlMD5(x, len) {\n /* append padding */\n x[len >> 5] |= 0x80 << (len % 32);\n x[(((len + 64) >>> 9) << 4) + 14] = len;\n\n var i;\n var olda;\n var oldb;\n var oldc;\n var oldd;\n var a = 1732584193;\n var b = -271733879;\n var c = -1732584194;\n var d = 271733878;\n\n for (i = 0; i < x.length; i += 16) {\n olda = a;\n oldb = b;\n oldc = c;\n oldd = d;\n\n a = md5ff(a, b, c, d, x[i], 7, -680876936);\n d = md5ff(d, a, b, c, x[i + 1], 12, -389564586);\n c = md5ff(c, d, a, b, x[i + 2], 17, 606105819);\n b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330);\n a = md5ff(a, b, c, d, x[i + 4], 7, -176418897);\n d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426);\n c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341);\n b = md5ff(b, c, d, a, x[i + 7], 22, -45705983);\n a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416);\n d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417);\n c = md5ff(c, d, a, b, x[i + 10], 17, -42063);\n b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162);\n a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682);\n d = md5ff(d, a, b, c, x[i + 13], 12, -40341101);\n c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290);\n b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329);\n\n a = md5gg(a, b, c, d, x[i + 1], 5, -165796510);\n d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632);\n c = md5gg(c, d, a, b, x[i + 11], 14, 643717713);\n b = md5gg(b, c, d, a, x[i], 20, -373897302);\n a = md5gg(a, b, c, d, x[i + 5], 5, -701558691);\n d = md5gg(d, a, b, c, x[i + 10], 9, 38016083);\n c = md5gg(c, d, a, b, x[i + 15], 14, -660478335);\n b = md5gg(b, c, d, a, x[i + 4], 20, -405537848);\n a = md5gg(a, b, c, d, x[i + 9], 5, 568446438);\n d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690);\n c = md5gg(c, d, a, b, x[i + 3], 14, -187363961);\n b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501);\n a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467);\n d = md5gg(d, a, b, c, x[i + 2], 9, -51403784);\n c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473);\n b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734);\n\n a = md5hh(a, b, c, d, x[i + 5], 4, -378558);\n d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463);\n c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562);\n b = md5hh(b, c, d, a, x[i + 14], 23, -35309556);\n a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060);\n d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353);\n c = md5hh(c, d, a, b, x[i + 7], 16, -155497632);\n b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640);\n a = md5hh(a, b, c, d, x[i + 13], 4, 681279174);\n d = md5hh(d, a, b, c, x[i], 11, -358537222);\n c = md5hh(c, d, a, b, x[i + 3], 16, -722521979);\n b = md5hh(b, c, d, a, x[i + 6], 23, 76029189);\n a = md5hh(a, b, c, d, x[i + 9], 4, -640364487);\n d = md5hh(d, a, b, c, x[i + 12], 11, -421815835);\n c = md5hh(c, d, a, b, x[i + 15], 16, 530742520);\n b = md5hh(b, c, d, a, x[i + 2], 23, -995338651);\n\n a = md5ii(a, b, c, d, x[i], 6, -198630844);\n d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415);\n c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905);\n b = md5ii(b, c, d, a, x[i + 5], 21, -57434055);\n a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571);\n d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606);\n c = md5ii(c, d, a, b, x[i + 10], 15, -1051523);\n b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799);\n a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359);\n d = md5ii(d, a, b, c, x[i + 15], 10, -30611744);\n c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380);\n b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649);\n a = md5ii(a, b, c, d, x[i + 4], 6, -145523070);\n d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379);\n c = md5ii(c, d, a, b, x[i + 2], 15, 718787259);\n b = md5ii(b, c, d, a, x[i + 9], 21, -343485551);\n\n a = safeAdd(a, olda);\n b = safeAdd(b, oldb);\n c = safeAdd(c, oldc);\n d = safeAdd(d, oldd);\n }\n return [a, b, c, d];\n}\n\n/*\n* Convert an array of little-endian words to a string\n*/\nfunction binl2rstr(input) {\n var i;\n var output = '';\n var length32 = input.length * 32;\n for (i = 0; i < length32; i += 8) {\n output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xff);\n }\n return output;\n}\n\n/*\n* Convert a raw string to an array of little-endian words\n* Characters >255 have their high-byte silently ignored.\n*/\nfunction rstr2binl(input) {\n var i;\n var output = [];\n output[(input.length >> 2) - 1] = undefined;\n for (i = 0; i < output.length; i += 1) {\n output[i] = 0;\n }\n var length8 = input.length * 8;\n for (i = 0; i < length8; i += 8) {\n output[i >> 5] |= (input.charCodeAt(i / 8) & 0xff) << (i % 32);\n }\n return output;\n}\n\n/*\n* Calculate the MD5 of a raw string\n*/\nfunction rstrMD5(s) {\n return binl2rstr(binlMD5(rstr2binl(s), s.length * 8));\n}\n\n/*\n* Calculate the HMAC-MD5, of a key and some data (raw strings)\n*/\nfunction rstrHMACMD5(key, data) {\n var i;\n var bkey = rstr2binl(key);\n var ipad = [];\n var opad = [];\n var hash;\n ipad[15] = opad[15] = undefined;\n if (bkey.length > 16) {\n bkey = binlMD5(bkey, key.length * 8);\n }\n for (i = 0; i < 16; i += 1) {\n ipad[i] = bkey[i] ^ 0x36363636;\n opad[i] = bkey[i] ^ 0x5c5c5c5c;\n }\n hash = binlMD5(ipad.concat(rstr2binl(data)), 512 + data.length * 8);\n return binl2rstr(binlMD5(opad.concat(hash), 512 + 128));\n}\n\n/*\n* Convert a raw string to a hex string\n*/\nfunction rstr2hex(input) {\n var hexTab = '0123456789abcdef';\n var output = '';\n var x;\n var i;\n for (i = 0; i < input.length; i += 1) {\n x = input.charCodeAt(i);\n output += hexTab.charAt((x >>> 4) & 0x0f) + hexTab.charAt(x & 0x0f);\n }\n return output;\n}\n\n/*\n* Encode a string as utf-8\n*/\nfunction str2rstrUTF8(input) {\n return unescape(encodeURIComponent(input));\n}\n\n/*\n* Take string arguments and return either raw or hex encoded strings\n*/\nfunction rawMD5(s) {\n return rstrMD5(str2rstrUTF8(s));\n}\nfunction hexMD5(s) {\n return rstr2hex(rawMD5(s));\n}\nfunction rawHMACMD5(k, d) {\n return rstrHMACMD5(str2rstrUTF8(k), str2rstrUTF8(d));\n}\nfunction hexHMACMD5(k, d) {\n return rstr2hex(rawHMACMD5(k, d));\n}\n\nfunction md5(string, key, raw) {\n if (!key) {\n if (!raw) {\n return hexMD5(string);\n }\n return rawMD5(string);\n }\n if (!raw) {\n return hexHMACMD5(key, string);\n }\n return rawHMACMD5(key, string);\n}\n\nmodule.exports = md5;\n","function RavenConfigError(message) {\n this.name = 'RavenConfigError';\n this.message = message;\n}\nRavenConfigError.prototype = new Error();\nRavenConfigError.prototype.constructor = RavenConfigError;\n\nmodule.exports = RavenConfigError;\n","var utils = require('./utils');\n\nvar wrapMethod = function(console, level, callback) {\n var originalConsoleLevel = console[level];\n var originalConsole = console;\n\n if (!(level in console)) {\n return;\n }\n\n var sentryLevel = level === 'warn' ? 'warning' : level;\n\n console[level] = function() {\n var args = [].slice.call(arguments);\n\n var msg = utils.safeJoin(args, ' ');\n var data = {level: sentryLevel, logger: 'console', extra: {arguments: args}};\n\n if (level === 'assert') {\n if (args[0] === false) {\n // Default browsers message\n msg =\n 'Assertion failed: ' + (utils.safeJoin(args.slice(1), ' ') || 'console.assert');\n data.extra.arguments = args.slice(1);\n callback && callback(msg, data);\n }\n } else {\n callback && callback(msg, data);\n }\n\n // this fails for some browsers. :(\n if (originalConsoleLevel) {\n // IE9 doesn't allow calling apply on console functions directly\n // See: https://stackoverflow.com/questions/5472938/does-ie9-support-console-log-and-is-it-a-real-function#answer-5473193\n Function.prototype.apply.call(originalConsoleLevel, originalConsole, args);\n }\n };\n};\n\nmodule.exports = {\n wrapMethod: wrapMethod\n};\n","/*global XDomainRequest:false */\n\nvar TraceKit = require('../vendor/TraceKit/tracekit');\nvar stringify = require('../vendor/json-stringify-safe/stringify');\nvar md5 = require('../vendor/md5/md5');\nvar RavenConfigError = require('./configError');\n\nvar utils = require('./utils');\nvar isErrorEvent = utils.isErrorEvent;\nvar isDOMError = utils.isDOMError;\nvar isDOMException = utils.isDOMException;\nvar isError = utils.isError;\nvar isObject = utils.isObject;\nvar isPlainObject = utils.isPlainObject;\nvar isUndefined = utils.isUndefined;\nvar isFunction = utils.isFunction;\nvar isString = utils.isString;\nvar isArray = utils.isArray;\nvar isEmptyObject = utils.isEmptyObject;\nvar each = utils.each;\nvar objectMerge = utils.objectMerge;\nvar truncate = utils.truncate;\nvar objectFrozen = utils.objectFrozen;\nvar hasKey = utils.hasKey;\nvar joinRegExp = utils.joinRegExp;\nvar urlencode = utils.urlencode;\nvar uuid4 = utils.uuid4;\nvar htmlTreeAsString = utils.htmlTreeAsString;\nvar isSameException = utils.isSameException;\nvar isSameStacktrace = utils.isSameStacktrace;\nvar parseUrl = utils.parseUrl;\nvar fill = utils.fill;\nvar supportsFetch = utils.supportsFetch;\nvar supportsReferrerPolicy = utils.supportsReferrerPolicy;\nvar serializeKeysForMessage = utils.serializeKeysForMessage;\nvar serializeException = utils.serializeException;\nvar sanitize = utils.sanitize;\n\nvar wrapConsoleMethod = require('./console').wrapMethod;\n\nvar dsnKeys = 'source protocol user pass host port path'.split(' '),\n dsnPattern = /^(?:(\\w+):)?\\/\\/(?:(\\w+)(:\\w+)?@)?([\\w\\.-]+)(?::(\\d+))?(\\/.*)/;\n\nfunction now() {\n return +new Date();\n}\n\n// This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785)\nvar _window =\n typeof window !== 'undefined'\n ? window\n : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\nvar _document = _window.document;\nvar _navigator = _window.navigator;\n\nfunction keepOriginalCallback(original, callback) {\n return isFunction(callback)\n ? function(data) {\n return callback(data, original);\n }\n : callback;\n}\n\n// First, check for JSON support\n// If there is no JSON, we no-op the core features of Raven\n// since JSON is required to encode the payload\nfunction Raven() {\n this._hasJSON = !!(typeof JSON === 'object' && JSON.stringify);\n // Raven can run in contexts where there's no document (react-native)\n this._hasDocument = !isUndefined(_document);\n this._hasNavigator = !isUndefined(_navigator);\n this._lastCapturedException = null;\n this._lastData = null;\n this._lastEventId = null;\n this._globalServer = null;\n this._globalKey = null;\n this._globalProject = null;\n this._globalContext = {};\n this._globalOptions = {\n // SENTRY_RELEASE can be injected by https://github.com/getsentry/sentry-webpack-plugin\n release: _window.SENTRY_RELEASE && _window.SENTRY_RELEASE.id,\n logger: 'javascript',\n ignoreErrors: [],\n ignoreUrls: [],\n whitelistUrls: [],\n includePaths: [],\n headers: null,\n collectWindowErrors: true,\n captureUnhandledRejections: true,\n maxMessageLength: 0,\n // By default, truncates URL values to 250 chars\n maxUrlLength: 250,\n stackTraceLimit: 50,\n autoBreadcrumbs: true,\n instrument: true,\n sampleRate: 1,\n sanitizeKeys: []\n };\n this._fetchDefaults = {\n method: 'POST',\n keepalive: true,\n // Despite all stars in the sky saying that Edge supports old draft syntax, aka 'never', 'always', 'origin' and 'default\n // https://caniuse.com/#feat=referrer-policy\n // It doesn't. And it throw exception instead of ignoring this parameter...\n // REF: https://github.com/getsentry/raven-js/issues/1233\n referrerPolicy: supportsReferrerPolicy() ? 'origin' : ''\n };\n this._ignoreOnError = 0;\n this._isRavenInstalled = false;\n this._originalErrorStackTraceLimit = Error.stackTraceLimit;\n // capture references to window.console *and* all its methods first\n // before the console plugin has a chance to monkey patch\n this._originalConsole = _window.console || {};\n this._originalConsoleMethods = {};\n this._plugins = [];\n this._startTime = now();\n this._wrappedBuiltIns = [];\n this._breadcrumbs = [];\n this._lastCapturedEvent = null;\n this._keypressTimeout;\n this._location = _window.location;\n this._lastHref = this._location && this._location.href;\n this._resetBackoff();\n\n // eslint-disable-next-line guard-for-in\n for (var method in this._originalConsole) {\n this._originalConsoleMethods[method] = this._originalConsole[method];\n }\n}\n\n/*\n * The core Raven singleton\n *\n * @this {Raven}\n */\n\nRaven.prototype = {\n // Hardcode version string so that raven source can be loaded directly via\n // webpack (using a build step causes webpack #1617). Grunt verifies that\n // this value matches package.json during build.\n // See: https://github.com/getsentry/raven-js/issues/465\n VERSION: '3.26.2',\n\n debug: false,\n\n TraceKit: TraceKit, // alias to TraceKit\n\n /*\n * Configure Raven with a DSN and extra options\n *\n * @param {string} dsn The public Sentry DSN\n * @param {object} options Set of global options [optional]\n * @return {Raven}\n */\n config: function(dsn, options) {\n var self = this;\n\n if (self._globalServer) {\n this._logDebug('error', 'Error: Raven has already been configured');\n return self;\n }\n if (!dsn) return self;\n\n var globalOptions = self._globalOptions;\n\n // merge in options\n if (options) {\n each(options, function(key, value) {\n // tags and extra are special and need to be put into context\n if (key === 'tags' || key === 'extra' || key === 'user') {\n self._globalContext[key] = value;\n } else {\n globalOptions[key] = value;\n }\n });\n }\n\n self.setDSN(dsn);\n\n // \"Script error.\" is hard coded into browsers for errors that it can't read.\n // this is the result of a script being pulled in from an external domain and CORS.\n globalOptions.ignoreErrors.push(/^Script error\\.?$/);\n globalOptions.ignoreErrors.push(/^Javascript error: Script error\\.? on line 0$/);\n\n // join regexp rules into one big rule\n globalOptions.ignoreErrors = joinRegExp(globalOptions.ignoreErrors);\n globalOptions.ignoreUrls = globalOptions.ignoreUrls.length\n ? joinRegExp(globalOptions.ignoreUrls)\n : false;\n globalOptions.whitelistUrls = globalOptions.whitelistUrls.length\n ? joinRegExp(globalOptions.whitelistUrls)\n : false;\n globalOptions.includePaths = joinRegExp(globalOptions.includePaths);\n globalOptions.maxBreadcrumbs = Math.max(\n 0,\n Math.min(globalOptions.maxBreadcrumbs || 100, 100)\n ); // default and hard limit is 100\n\n var autoBreadcrumbDefaults = {\n xhr: true,\n console: true,\n dom: true,\n location: true,\n sentry: true\n };\n\n var autoBreadcrumbs = globalOptions.autoBreadcrumbs;\n if ({}.toString.call(autoBreadcrumbs) === '[object Object]') {\n autoBreadcrumbs = objectMerge(autoBreadcrumbDefaults, autoBreadcrumbs);\n } else if (autoBreadcrumbs !== false) {\n autoBreadcrumbs = autoBreadcrumbDefaults;\n }\n globalOptions.autoBreadcrumbs = autoBreadcrumbs;\n\n var instrumentDefaults = {\n tryCatch: true\n };\n\n var instrument = globalOptions.instrument;\n if ({}.toString.call(instrument) === '[object Object]') {\n instrument = objectMerge(instrumentDefaults, instrument);\n } else if (instrument !== false) {\n instrument = instrumentDefaults;\n }\n globalOptions.instrument = instrument;\n\n TraceKit.collectWindowErrors = !!globalOptions.collectWindowErrors;\n\n // return for chaining\n return self;\n },\n\n /*\n * Installs a global window.onerror error handler\n * to capture and report uncaught exceptions.\n * At this point, install() is required to be called due\n * to the way TraceKit is set up.\n *\n * @return {Raven}\n */\n install: function() {\n var self = this;\n if (self.isSetup() && !self._isRavenInstalled) {\n TraceKit.report.subscribe(function() {\n self._handleOnErrorStackInfo.apply(self, arguments);\n });\n\n if (self._globalOptions.captureUnhandledRejections) {\n self._attachPromiseRejectionHandler();\n }\n\n self._patchFunctionToString();\n\n if (self._globalOptions.instrument && self._globalOptions.instrument.tryCatch) {\n self._instrumentTryCatch();\n }\n\n if (self._globalOptions.autoBreadcrumbs) self._instrumentBreadcrumbs();\n\n // Install all of the plugins\n self._drainPlugins();\n\n self._isRavenInstalled = true;\n }\n\n Error.stackTraceLimit = self._globalOptions.stackTraceLimit;\n return this;\n },\n\n /*\n * Set the DSN (can be called multiple time unlike config)\n *\n * @param {string} dsn The public Sentry DSN\n */\n setDSN: function(dsn) {\n var self = this,\n uri = self._parseDSN(dsn),\n lastSlash = uri.path.lastIndexOf('/'),\n path = uri.path.substr(1, lastSlash);\n\n self._dsn = dsn;\n self._globalKey = uri.user;\n self._globalSecret = uri.pass && uri.pass.substr(1);\n self._globalProject = uri.path.substr(lastSlash + 1);\n\n self._globalServer = self._getGlobalServer(uri);\n\n self._globalEndpoint =\n self._globalServer + '/' + path + 'api/' + self._globalProject + '/store/';\n\n // Reset backoff state since we may be pointing at a\n // new project/server\n this._resetBackoff();\n },\n\n /*\n * Wrap code within a context so Raven can capture errors\n * reliably across domains that is executed immediately.\n *\n * @param {object} options A specific set of options for this context [optional]\n * @param {function} func The callback to be immediately executed within the context\n * @param {array} args An array of arguments to be called with the callback [optional]\n */\n context: function(options, func, args) {\n if (isFunction(options)) {\n args = func || [];\n func = options;\n options = {};\n }\n\n return this.wrap(options, func).apply(this, args);\n },\n\n /*\n * Wrap code within a context and returns back a new function to be executed\n *\n * @param {object} options A specific set of options for this context [optional]\n * @param {function} func The function to be wrapped in a new context\n * @param {function} _before A function to call before the try/catch wrapper [optional, private]\n * @return {function} The newly wrapped functions with a context\n */\n wrap: function(options, func, _before) {\n var self = this;\n // 1 argument has been passed, and it's not a function\n // so just return it\n if (isUndefined(func) && !isFunction(options)) {\n return options;\n }\n\n // options is optional\n if (isFunction(options)) {\n func = options;\n options = undefined;\n }\n\n // At this point, we've passed along 2 arguments, and the second one\n // is not a function either, so we'll just return the second argument.\n if (!isFunction(func)) {\n return func;\n }\n\n // We don't wanna wrap it twice!\n try {\n if (func.__raven__) {\n return func;\n }\n\n // If this has already been wrapped in the past, return that\n if (func.__raven_wrapper__) {\n return func.__raven_wrapper__;\n }\n } catch (e) {\n // Just accessing custom props in some Selenium environments\n // can cause a \"Permission denied\" exception (see raven-js#495).\n // Bail on wrapping and return the function as-is (defers to window.onerror).\n return func;\n }\n\n function wrapped() {\n var args = [],\n i = arguments.length,\n deep = !options || (options && options.deep !== false);\n\n if (_before && isFunction(_before)) {\n _before.apply(this, arguments);\n }\n\n // Recursively wrap all of a function's arguments that are\n // functions themselves.\n while (i--) args[i] = deep ? self.wrap(options, arguments[i]) : arguments[i];\n\n try {\n // Attempt to invoke user-land function\n // NOTE: If you are a Sentry user, and you are seeing this stack frame, it\n // means Raven caught an error invoking your application code. This is\n // expected behavior and NOT indicative of a bug with Raven.js.\n return func.apply(this, args);\n } catch (e) {\n self._ignoreNextOnError();\n self.captureException(e, options);\n throw e;\n }\n }\n\n // copy over properties of the old function\n for (var property in func) {\n if (hasKey(func, property)) {\n wrapped[property] = func[property];\n }\n }\n wrapped.prototype = func.prototype;\n\n func.__raven_wrapper__ = wrapped;\n // Signal that this function has been wrapped/filled already\n // for both debugging and to prevent it to being wrapped/filled twice\n wrapped.__raven__ = true;\n wrapped.__orig__ = func;\n\n return wrapped;\n },\n\n /**\n * Uninstalls the global error handler.\n *\n * @return {Raven}\n */\n uninstall: function() {\n TraceKit.report.uninstall();\n\n this._detachPromiseRejectionHandler();\n this._unpatchFunctionToString();\n this._restoreBuiltIns();\n this._restoreConsole();\n\n Error.stackTraceLimit = this._originalErrorStackTraceLimit;\n this._isRavenInstalled = false;\n\n return this;\n },\n\n /**\n * Callback used for `unhandledrejection` event\n *\n * @param {PromiseRejectionEvent} event An object containing\n * promise: the Promise that was rejected\n * reason: the value with which the Promise was rejected\n * @return void\n */\n _promiseRejectionHandler: function(event) {\n this._logDebug('debug', 'Raven caught unhandled promise rejection:', event);\n this.captureException(event.reason, {\n mechanism: {\n type: 'onunhandledrejection',\n handled: false\n }\n });\n },\n\n /**\n * Installs the global promise rejection handler.\n *\n * @return {raven}\n */\n _attachPromiseRejectionHandler: function() {\n this._promiseRejectionHandler = this._promiseRejectionHandler.bind(this);\n _window.addEventListener &&\n _window.addEventListener('unhandledrejection', this._promiseRejectionHandler);\n return this;\n },\n\n /**\n * Uninstalls the global promise rejection handler.\n *\n * @return {raven}\n */\n _detachPromiseRejectionHandler: function() {\n _window.removeEventListener &&\n _window.removeEventListener('unhandledrejection', this._promiseRejectionHandler);\n return this;\n },\n\n /**\n * Manually capture an exception and send it over to Sentry\n *\n * @param {error} ex An exception to be logged\n * @param {object} options A specific set of options for this error [optional]\n * @return {Raven}\n */\n captureException: function(ex, options) {\n options = objectMerge({trimHeadFrames: 0}, options ? options : {});\n\n if (isErrorEvent(ex) && ex.error) {\n // If it is an ErrorEvent with `error` property, extract it to get actual Error\n ex = ex.error;\n } else if (isDOMError(ex) || isDOMException(ex)) {\n // If it is a DOMError or DOMException (which are legacy APIs, but still supported in some browsers)\n // then we just extract the name and message, as they don't provide anything else\n // https://developer.mozilla.org/en-US/docs/Web/API/DOMError\n // https://developer.mozilla.org/en-US/docs/Web/API/DOMException\n var name = ex.name || (isDOMError(ex) ? 'DOMError' : 'DOMException');\n var message = ex.message ? name + ': ' + ex.message : name;\n\n return this.captureMessage(\n message,\n objectMerge(options, {\n // neither DOMError or DOMException provide stack trace and we most likely wont get it this way as well\n // but it's barely any overhead so we may at least try\n stacktrace: true,\n trimHeadFrames: options.trimHeadFrames + 1\n })\n );\n } else if (isError(ex)) {\n // we have a real Error object\n ex = ex;\n } else if (isPlainObject(ex)) {\n // If it is plain Object, serialize it manually and extract options\n // This will allow us to group events based on top-level keys\n // which is much better than creating new group when any key/value change\n options = this._getCaptureExceptionOptionsFromPlainObject(options, ex);\n ex = new Error(options.message);\n } else {\n // If none of previous checks were valid, then it means that\n // it's not a DOMError/DOMException\n // it's not a plain Object\n // it's not a valid ErrorEvent (one with an error property)\n // it's not an Error\n // So bail out and capture it as a simple message:\n return this.captureMessage(\n ex,\n objectMerge(options, {\n stacktrace: true, // if we fall back to captureMessage, default to attempting a new trace\n trimHeadFrames: options.trimHeadFrames + 1\n })\n );\n }\n\n // Store the raw exception object for potential debugging and introspection\n this._lastCapturedException = ex;\n\n // TraceKit.report will re-raise any exception passed to it,\n // which means you have to wrap it in try/catch. Instead, we\n // can wrap it here and only re-raise if TraceKit.report\n // raises an exception different from the one we asked to\n // report on.\n try {\n var stack = TraceKit.computeStackTrace(ex);\n this._handleStackInfo(stack, options);\n } catch (ex1) {\n if (ex !== ex1) {\n throw ex1;\n }\n }\n\n return this;\n },\n\n _getCaptureExceptionOptionsFromPlainObject: function(currentOptions, ex) {\n var exKeys = Object.keys(ex).sort();\n var options = objectMerge(currentOptions, {\n message:\n 'Non-Error exception captured with keys: ' + serializeKeysForMessage(exKeys),\n fingerprint: [md5(exKeys)],\n extra: currentOptions.extra || {}\n });\n options.extra.__serialized__ = serializeException(ex);\n\n return options;\n },\n\n /*\n * Manually send a message to Sentry\n *\n * @param {string} msg A plain message to be captured in Sentry\n * @param {object} options A specific set of options for this message [optional]\n * @return {Raven}\n */\n captureMessage: function(msg, options) {\n // config() automagically converts ignoreErrors from a list to a RegExp so we need to test for an\n // early call; we'll error on the side of logging anything called before configuration since it's\n // probably something you should see:\n if (\n !!this._globalOptions.ignoreErrors.test &&\n this._globalOptions.ignoreErrors.test(msg)\n ) {\n return;\n }\n\n options = options || {};\n msg = msg + ''; // Make sure it's actually a string\n\n var data = objectMerge(\n {\n message: msg\n },\n options\n );\n\n var ex;\n // Generate a \"synthetic\" stack trace from this point.\n // NOTE: If you are a Sentry user, and you are seeing this stack frame, it is NOT indicative\n // of a bug with Raven.js. Sentry generates synthetic traces either by configuration,\n // or if it catches a thrown object without a \"stack\" property.\n try {\n throw new Error(msg);\n } catch (ex1) {\n ex = ex1;\n }\n\n // null exception name so `Error` isn't prefixed to msg\n ex.name = null;\n var stack = TraceKit.computeStackTrace(ex);\n\n // stack[0] is `throw new Error(msg)` call itself, we are interested in the frame that was just before that, stack[1]\n var initialCall = isArray(stack.stack) && stack.stack[1];\n\n // if stack[1] is `Raven.captureException`, it means that someone passed a string to it and we redirected that call\n // to be handled by `captureMessage`, thus `initialCall` is the 3rd one, not 2nd\n // initialCall => captureException(string) => captureMessage(string)\n if (initialCall && initialCall.func === 'Raven.captureException') {\n initialCall = stack.stack[2];\n }\n\n var fileurl = (initialCall && initialCall.url) || '';\n\n if (\n !!this._globalOptions.ignoreUrls.test &&\n this._globalOptions.ignoreUrls.test(fileurl)\n ) {\n return;\n }\n\n if (\n !!this._globalOptions.whitelistUrls.test &&\n !this._globalOptions.whitelistUrls.test(fileurl)\n ) {\n return;\n }\n\n if (this._globalOptions.stacktrace || (options && options.stacktrace)) {\n // fingerprint on msg, not stack trace (legacy behavior, could be revisited)\n data.fingerprint = data.fingerprint == null ? msg : data.fingerprint;\n\n options = objectMerge(\n {\n trimHeadFrames: 0\n },\n options\n );\n // Since we know this is a synthetic trace, the top frame (this function call)\n // MUST be from Raven.js, so mark it for trimming\n // We add to the trim counter so that callers can choose to trim extra frames, such\n // as utility functions.\n options.trimHeadFrames += 1;\n\n var frames = this._prepareFrames(stack, options);\n data.stacktrace = {\n // Sentry expects frames oldest to newest\n frames: frames.reverse()\n };\n }\n\n // Make sure that fingerprint is always wrapped in an array\n if (data.fingerprint) {\n data.fingerprint = isArray(data.fingerprint)\n ? data.fingerprint\n : [data.fingerprint];\n }\n\n // Fire away!\n this._send(data);\n\n return this;\n },\n\n captureBreadcrumb: function(obj) {\n var crumb = objectMerge(\n {\n timestamp: now() / 1000\n },\n obj\n );\n\n if (isFunction(this._globalOptions.breadcrumbCallback)) {\n var result = this._globalOptions.breadcrumbCallback(crumb);\n\n if (isObject(result) && !isEmptyObject(result)) {\n crumb = result;\n } else if (result === false) {\n return this;\n }\n }\n\n this._breadcrumbs.push(crumb);\n if (this._breadcrumbs.length > this._globalOptions.maxBreadcrumbs) {\n this._breadcrumbs.shift();\n }\n return this;\n },\n\n addPlugin: function(plugin /*arg1, arg2, ... argN*/) {\n var pluginArgs = [].slice.call(arguments, 1);\n\n this._plugins.push([plugin, pluginArgs]);\n if (this._isRavenInstalled) {\n this._drainPlugins();\n }\n\n return this;\n },\n\n /*\n * Set/clear a user to be sent along with the payload.\n *\n * @param {object} user An object representing user data [optional]\n * @return {Raven}\n */\n setUserContext: function(user) {\n // Intentionally do not merge here since that's an unexpected behavior.\n this._globalContext.user = user;\n\n return this;\n },\n\n /*\n * Merge extra attributes to be sent along with the payload.\n *\n * @param {object} extra An object representing extra data [optional]\n * @return {Raven}\n */\n setExtraContext: function(extra) {\n this._mergeContext('extra', extra);\n\n return this;\n },\n\n /*\n * Merge tags to be sent along with the payload.\n *\n * @param {object} tags An object representing tags [optional]\n * @return {Raven}\n */\n setTagsContext: function(tags) {\n this._mergeContext('tags', tags);\n\n return this;\n },\n\n /*\n * Clear all of the context.\n *\n * @return {Raven}\n */\n clearContext: function() {\n this._globalContext = {};\n\n return this;\n },\n\n /*\n * Get a copy of the current context. This cannot be mutated.\n *\n * @return {object} copy of context\n */\n getContext: function() {\n // lol javascript\n return JSON.parse(stringify(this._globalContext));\n },\n\n /*\n * Set environment of application\n *\n * @param {string} environment Typically something like 'production'.\n * @return {Raven}\n */\n setEnvironment: function(environment) {\n this._globalOptions.environment = environment;\n\n return this;\n },\n\n /*\n * Set release version of application\n *\n * @param {string} release Typically something like a git SHA to identify version\n * @return {Raven}\n */\n setRelease: function(release) {\n this._globalOptions.release = release;\n\n return this;\n },\n\n /*\n * Set the dataCallback option\n *\n * @param {function} callback The callback to run which allows the\n * data blob to be mutated before sending\n * @return {Raven}\n */\n setDataCallback: function(callback) {\n var original = this._globalOptions.dataCallback;\n this._globalOptions.dataCallback = keepOriginalCallback(original, callback);\n return this;\n },\n\n /*\n * Set the breadcrumbCallback option\n *\n * @param {function} callback The callback to run which allows filtering\n * or mutating breadcrumbs\n * @return {Raven}\n */\n setBreadcrumbCallback: function(callback) {\n var original = this._globalOptions.breadcrumbCallback;\n this._globalOptions.breadcrumbCallback = keepOriginalCallback(original, callback);\n return this;\n },\n\n /*\n * Set the shouldSendCallback option\n *\n * @param {function} callback The callback to run which allows\n * introspecting the blob before sending\n * @return {Raven}\n */\n setShouldSendCallback: function(callback) {\n var original = this._globalOptions.shouldSendCallback;\n this._globalOptions.shouldSendCallback = keepOriginalCallback(original, callback);\n return this;\n },\n\n /**\n * Override the default HTTP transport mechanism that transmits data\n * to the Sentry server.\n *\n * @param {function} transport Function invoked instead of the default\n * `makeRequest` handler.\n *\n * @return {Raven}\n */\n setTransport: function(transport) {\n this._globalOptions.transport = transport;\n\n return this;\n },\n\n /*\n * Get the latest raw exception that was captured by Raven.\n *\n * @return {error}\n */\n lastException: function() {\n return this._lastCapturedException;\n },\n\n /*\n * Get the last event id\n *\n * @return {string}\n */\n lastEventId: function() {\n return this._lastEventId;\n },\n\n /*\n * Determine if Raven is setup and ready to go.\n *\n * @return {boolean}\n */\n isSetup: function() {\n if (!this._hasJSON) return false; // needs JSON support\n if (!this._globalServer) {\n if (!this.ravenNotConfiguredError) {\n this.ravenNotConfiguredError = true;\n this._logDebug('error', 'Error: Raven has not been configured.');\n }\n return false;\n }\n return true;\n },\n\n afterLoad: function() {\n // TODO: remove window dependence?\n\n // Attempt to initialize Raven on load\n var RavenConfig = _window.RavenConfig;\n if (RavenConfig) {\n this.config(RavenConfig.dsn, RavenConfig.config).install();\n }\n },\n\n showReportDialog: function(options) {\n if (\n !_document // doesn't work without a document (React native)\n )\n return;\n\n options = options || {};\n\n var lastEventId = options.eventId || this.lastEventId();\n if (!lastEventId) {\n throw new RavenConfigError('Missing eventId');\n }\n\n var dsn = options.dsn || this._dsn;\n if (!dsn) {\n throw new RavenConfigError('Missing DSN');\n }\n\n var encode = encodeURIComponent;\n var qs = '';\n qs += '?eventId=' + encode(lastEventId);\n qs += '&dsn=' + encode(dsn);\n\n var user = options.user || this._globalContext.user;\n if (user) {\n if (user.name) qs += '&name=' + encode(user.name);\n if (user.email) qs += '&email=' + encode(user.email);\n }\n\n var globalServer = this._getGlobalServer(this._parseDSN(dsn));\n\n var script = _document.createElement('script');\n script.async = true;\n script.src = globalServer + '/api/embed/error-page/' + qs;\n (_document.head || _document.body).appendChild(script);\n },\n\n /**** Private functions ****/\n _ignoreNextOnError: function() {\n var self = this;\n this._ignoreOnError += 1;\n setTimeout(function() {\n // onerror should trigger before setTimeout\n self._ignoreOnError -= 1;\n });\n },\n\n _triggerEvent: function(eventType, options) {\n // NOTE: `event` is a native browser thing, so let's avoid conflicting wiht it\n var evt, key;\n\n if (!this._hasDocument) return;\n\n options = options || {};\n\n eventType = 'raven' + eventType.substr(0, 1).toUpperCase() + eventType.substr(1);\n\n if (_document.createEvent) {\n evt = _document.createEvent('HTMLEvents');\n evt.initEvent(eventType, true, true);\n } else {\n evt = _document.createEventObject();\n evt.eventType = eventType;\n }\n\n for (key in options)\n if (hasKey(options, key)) {\n evt[key] = options[key];\n }\n\n if (_document.createEvent) {\n // IE9 if standards\n _document.dispatchEvent(evt);\n } else {\n // IE8 regardless of Quirks or Standards\n // IE9 if quirks\n try {\n _document.fireEvent('on' + evt.eventType.toLowerCase(), evt);\n } catch (e) {\n // Do nothing\n }\n }\n },\n\n /**\n * Wraps addEventListener to capture UI breadcrumbs\n * @param evtName the event name (e.g. \"click\")\n * @returns {Function}\n * @private\n */\n _breadcrumbEventHandler: function(evtName) {\n var self = this;\n return function(evt) {\n // reset keypress timeout; e.g. triggering a 'click' after\n // a 'keypress' will reset the keypress debounce so that a new\n // set of keypresses can be recorded\n self._keypressTimeout = null;\n\n // It's possible this handler might trigger multiple times for the same\n // event (e.g. event propagation through node ancestors). Ignore if we've\n // already captured the event.\n if (self._lastCapturedEvent === evt) return;\n\n self._lastCapturedEvent = evt;\n\n // try/catch both:\n // - accessing evt.target (see getsentry/raven-js#838, #768)\n // - `htmlTreeAsString` because it's complex, and just accessing the DOM incorrectly\n // can throw an exception in some circumstances.\n var target;\n try {\n target = htmlTreeAsString(evt.target);\n } catch (e) {\n target = '<unknown>';\n }\n\n self.captureBreadcrumb({\n category: 'ui.' + evtName, // e.g. ui.click, ui.input\n message: target\n });\n };\n },\n\n /**\n * Wraps addEventListener to capture keypress UI events\n * @returns {Function}\n * @private\n */\n _keypressEventHandler: function() {\n var self = this,\n debounceDuration = 1000; // milliseconds\n\n // TODO: if somehow user switches keypress target before\n // debounce timeout is triggered, we will only capture\n // a single breadcrumb from the FIRST target (acceptable?)\n return function(evt) {\n var target;\n try {\n target = evt.target;\n } catch (e) {\n // just accessing event properties can throw an exception in some rare circumstances\n // see: https://github.com/getsentry/raven-js/issues/838\n return;\n }\n var tagName = target && target.tagName;\n\n // only consider keypress events on actual input elements\n // this will disregard keypresses targeting body (e.g. tabbing\n // through elements, hotkeys, etc)\n if (\n !tagName ||\n (tagName !== 'INPUT' && tagName !== 'TEXTAREA' && !target.isContentEditable)\n )\n return;\n\n // record first keypress in a series, but ignore subsequent\n // keypresses until debounce clears\n var timeout = self._keypressTimeout;\n if (!timeout) {\n self._breadcrumbEventHandler('input')(evt);\n }\n clearTimeout(timeout);\n self._keypressTimeout = setTimeout(function() {\n self._keypressTimeout = null;\n }, debounceDuration);\n };\n },\n\n /**\n * Captures a breadcrumb of type \"navigation\", normalizing input URLs\n * @param to the originating URL\n * @param from the target URL\n * @private\n */\n _captureUrlChange: function(from, to) {\n var parsedLoc = parseUrl(this._location.href);\n var parsedTo = parseUrl(to);\n var parsedFrom = parseUrl(from);\n\n // because onpopstate only tells you the \"new\" (to) value of location.href, and\n // not the previous (from) value, we need to track the value of the current URL\n // state ourselves\n this._lastHref = to;\n\n // Use only the path component of the URL if the URL matches the current\n // document (almost all the time when using pushState)\n if (parsedLoc.protocol === parsedTo.protocol && parsedLoc.host === parsedTo.host)\n to = parsedTo.relative;\n if (parsedLoc.protocol === parsedFrom.protocol && parsedLoc.host === parsedFrom.host)\n from = parsedFrom.relative;\n\n this.captureBreadcrumb({\n category: 'navigation',\n data: {\n to: to,\n from: from\n }\n });\n },\n\n _patchFunctionToString: function() {\n var self = this;\n self._originalFunctionToString = Function.prototype.toString;\n // eslint-disable-next-line no-extend-native\n Function.prototype.toString = function() {\n if (typeof this === 'function' && this.__raven__) {\n return self._originalFunctionToString.apply(this.__orig__, arguments);\n }\n return self._originalFunctionToString.apply(this, arguments);\n };\n },\n\n _unpatchFunctionToString: function() {\n if (this._originalFunctionToString) {\n // eslint-disable-next-line no-extend-native\n Function.prototype.toString = this._originalFunctionToString;\n }\n },\n\n /**\n * Wrap timer functions and event targets to catch errors and provide\n * better metadata.\n */\n _instrumentTryCatch: function() {\n var self = this;\n\n var wrappedBuiltIns = self._wrappedBuiltIns;\n\n function wrapTimeFn(orig) {\n return function(fn, t) {\n // preserve arity\n // Make a copy of the arguments to prevent deoptimization\n // https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#32-leaking-arguments\n var args = new Array(arguments.length);\n for (var i = 0; i < args.length; ++i) {\n args[i] = arguments[i];\n }\n var originalCallback = args[0];\n if (isFunction(originalCallback)) {\n args[0] = self.wrap(\n {\n mechanism: {\n type: 'instrument',\n data: {function: orig.name || '<anonymous>'}\n }\n },\n originalCallback\n );\n }\n\n // IE < 9 doesn't support .call/.apply on setInterval/setTimeout, but it\n // also supports only two arguments and doesn't care what this is, so we\n // can just call the original function directly.\n if (orig.apply) {\n return orig.apply(this, args);\n } else {\n return orig(args[0], args[1]);\n }\n };\n }\n\n var autoBreadcrumbs = this._globalOptions.autoBreadcrumbs;\n\n function wrapEventTarget(global) {\n var proto = _window[global] && _window[global].prototype;\n if (proto && proto.hasOwnProperty && proto.hasOwnProperty('addEventListener')) {\n fill(\n proto,\n 'addEventListener',\n function(orig) {\n return function(evtName, fn, capture, secure) {\n // preserve arity\n try {\n if (fn && fn.handleEvent) {\n fn.handleEvent = self.wrap(\n {\n mechanism: {\n type: 'instrument',\n data: {\n target: global,\n function: 'handleEvent',\n handler: (fn && fn.name) || '<anonymous>'\n }\n }\n },\n fn.handleEvent\n );\n }\n } catch (err) {\n // can sometimes get 'Permission denied to access property \"handle Event'\n }\n\n // More breadcrumb DOM capture ... done here and not in `_instrumentBreadcrumbs`\n // so that we don't have more than one wrapper function\n var before, clickHandler, keypressHandler;\n\n if (\n autoBreadcrumbs &&\n autoBreadcrumbs.dom &&\n (global === 'EventTarget' || global === 'Node')\n ) {\n // NOTE: generating multiple handlers per addEventListener invocation, should\n // revisit and verify we can just use one (almost certainly)\n clickHandler = self._breadcrumbEventHandler('click');\n keypressHandler = self._keypressEventHandler();\n before = function(evt) {\n // need to intercept every DOM event in `before` argument, in case that\n // same wrapped method is re-used for different events (e.g. mousemove THEN click)\n // see #724\n if (!evt) return;\n\n var eventType;\n try {\n eventType = evt.type;\n } catch (e) {\n // just accessing event properties can throw an exception in some rare circumstances\n // see: https://github.com/getsentry/raven-js/issues/838\n return;\n }\n if (eventType === 'click') return clickHandler(evt);\n else if (eventType === 'keypress') return keypressHandler(evt);\n };\n }\n return orig.call(\n this,\n evtName,\n self.wrap(\n {\n mechanism: {\n type: 'instrument',\n data: {\n target: global,\n function: 'addEventListener',\n handler: (fn && fn.name) || '<anonymous>'\n }\n }\n },\n fn,\n before\n ),\n capture,\n secure\n );\n };\n },\n wrappedBuiltIns\n );\n fill(\n proto,\n 'removeEventListener',\n function(orig) {\n return function(evt, fn, capture, secure) {\n try {\n fn = fn && (fn.__raven_wrapper__ ? fn.__raven_wrapper__ : fn);\n } catch (e) {\n // ignore, accessing __raven_wrapper__ will throw in some Selenium environments\n }\n return orig.call(this, evt, fn, capture, secure);\n };\n },\n wrappedBuiltIns\n );\n }\n }\n\n fill(_window, 'setTimeout', wrapTimeFn, wrappedBuiltIns);\n fill(_window, 'setInterval', wrapTimeFn, wrappedBuiltIns);\n if (_window.requestAnimationFrame) {\n fill(\n _window,\n 'requestAnimationFrame',\n function(orig) {\n return function(cb) {\n return orig(\n self.wrap(\n {\n mechanism: {\n type: 'instrument',\n data: {\n function: 'requestAnimationFrame',\n handler: (orig && orig.name) || '<anonymous>'\n }\n }\n },\n cb\n )\n );\n };\n },\n wrappedBuiltIns\n );\n }\n\n // event targets borrowed from bugsnag-js:\n // https://github.com/bugsnag/bugsnag-js/blob/master/src/bugsnag.js#L666\n var eventTargets = [\n 'EventTarget',\n 'Window',\n 'Node',\n 'ApplicationCache',\n 'AudioTrackList',\n 'ChannelMergerNode',\n 'CryptoOperation',\n 'EventSource',\n 'FileReader',\n 'HTMLUnknownElement',\n 'IDBDatabase',\n 'IDBRequest',\n 'IDBTransaction',\n 'KeyOperation',\n 'MediaController',\n 'MessagePort',\n 'ModalWindow',\n 'Notification',\n 'SVGElementInstance',\n 'Screen',\n 'TextTrack',\n 'TextTrackCue',\n 'TextTrackList',\n 'WebSocket',\n 'WebSocketWorker',\n 'Worker',\n 'XMLHttpRequest',\n 'XMLHttpRequestEventTarget',\n 'XMLHttpRequestUpload'\n ];\n for (var i = 0; i < eventTargets.length; i++) {\n wrapEventTarget(eventTargets[i]);\n }\n },\n\n /**\n * Instrument browser built-ins w/ breadcrumb capturing\n * - XMLHttpRequests\n * - DOM interactions (click/typing)\n * - window.location changes\n * - console\n *\n * Can be disabled or individually configured via the `autoBreadcrumbs` config option\n */\n _instrumentBreadcrumbs: function() {\n var self = this;\n var autoBreadcrumbs = this._globalOptions.autoBreadcrumbs;\n\n var wrappedBuiltIns = self._wrappedBuiltIns;\n\n function wrapProp(prop, xhr) {\n if (prop in xhr && isFunction(xhr[prop])) {\n fill(xhr, prop, function(orig) {\n return self.wrap(\n {\n mechanism: {\n type: 'instrument',\n data: {function: prop, handler: (orig && orig.name) || '<anonymous>'}\n }\n },\n orig\n );\n }); // intentionally don't track filled methods on XHR instances\n }\n }\n\n if (autoBreadcrumbs.xhr && 'XMLHttpRequest' in _window) {\n var xhrproto = _window.XMLHttpRequest && _window.XMLHttpRequest.prototype;\n fill(\n xhrproto,\n 'open',\n function(origOpen) {\n return function(method, url) {\n // preserve arity\n\n // if Sentry key appears in URL, don't capture\n if (isString(url) && url.indexOf(self._globalKey) === -1) {\n this.__raven_xhr = {\n method: method,\n url: url,\n status_code: null\n };\n }\n\n return origOpen.apply(this, arguments);\n };\n },\n wrappedBuiltIns\n );\n\n fill(\n xhrproto,\n 'send',\n function(origSend) {\n return function() {\n // preserve arity\n var xhr = this;\n\n function onreadystatechangeHandler() {\n if (xhr.__raven_xhr && xhr.readyState === 4) {\n try {\n // touching statusCode in some platforms throws\n // an exception\n xhr.__raven_xhr.status_code = xhr.status;\n } catch (e) {\n /* do nothing */\n }\n\n self.captureBreadcrumb({\n type: 'http',\n category: 'xhr',\n data: xhr.__raven_xhr\n });\n }\n }\n\n var props = ['onload', 'onerror', 'onprogress'];\n for (var j = 0; j < props.length; j++) {\n wrapProp(props[j], xhr);\n }\n\n if ('onreadystatechange' in xhr && isFunction(xhr.onreadystatechange)) {\n fill(\n xhr,\n 'onreadystatechange',\n function(orig) {\n return self.wrap(\n {\n mechanism: {\n type: 'instrument',\n data: {\n function: 'onreadystatechange',\n handler: (orig && orig.name) || '<anonymous>'\n }\n }\n },\n orig,\n onreadystatechangeHandler\n );\n } /* intentionally don't track this instrumentation */\n );\n } else {\n // if onreadystatechange wasn't actually set by the page on this xhr, we\n // are free to set our own and capture the breadcrumb\n xhr.onreadystatechange = onreadystatechangeHandler;\n }\n\n return origSend.apply(this, arguments);\n };\n },\n wrappedBuiltIns\n );\n }\n\n if (autoBreadcrumbs.xhr && supportsFetch()) {\n fill(\n _window,\n 'fetch',\n function(origFetch) {\n return function() {\n // preserve arity\n // Make a copy of the arguments to prevent deoptimization\n // https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#32-leaking-arguments\n var args = new Array(arguments.length);\n for (var i = 0; i < args.length; ++i) {\n args[i] = arguments[i];\n }\n\n var fetchInput = args[0];\n var method = 'GET';\n var url;\n\n if (typeof fetchInput === 'string') {\n url = fetchInput;\n } else if ('Request' in _window && fetchInput instanceof _window.Request) {\n url = fetchInput.url;\n if (fetchInput.method) {\n method = fetchInput.method;\n }\n } else {\n url = '' + fetchInput;\n }\n\n // if Sentry key appears in URL, don't capture, as it's our own request\n if (url.indexOf(self._globalKey) !== -1) {\n return origFetch.apply(this, args);\n }\n\n if (args[1] && args[1].method) {\n method = args[1].method;\n }\n\n var fetchData = {\n method: method,\n url: url,\n status_code: null\n };\n\n return origFetch\n .apply(this, args)\n .then(function(response) {\n fetchData.status_code = response.status;\n\n self.captureBreadcrumb({\n type: 'http',\n category: 'fetch',\n data: fetchData\n });\n\n return response;\n })\n ['catch'](function(err) {\n // if there is an error performing the request\n self.captureBreadcrumb({\n type: 'http',\n category: 'fetch',\n data: fetchData,\n level: 'error'\n });\n\n throw err;\n });\n };\n },\n wrappedBuiltIns\n );\n }\n\n // Capture breadcrumbs from any click that is unhandled / bubbled up all the way\n // to the document. Do this before we instrument addEventListener.\n if (autoBreadcrumbs.dom && this._hasDocument) {\n if (_document.addEventListener) {\n _document.addEventListener('click', self._breadcrumbEventHandler('click'), false);\n _document.addEventListener('keypress', self._keypressEventHandler(), false);\n } else if (_document.attachEvent) {\n // IE8 Compatibility\n _document.attachEvent('onclick', self._breadcrumbEventHandler('click'));\n _document.attachEvent('onkeypress', self._keypressEventHandler());\n }\n }\n\n // record navigation (URL) changes\n // NOTE: in Chrome App environment, touching history.pushState, *even inside\n // a try/catch block*, will cause Chrome to output an error to console.error\n // borrowed from: https://github.com/angular/angular.js/pull/13945/files\n var chrome = _window.chrome;\n var isChromePackagedApp = chrome && chrome.app && chrome.app.runtime;\n var hasPushAndReplaceState =\n !isChromePackagedApp &&\n _window.history &&\n _window.history.pushState &&\n _window.history.replaceState;\n if (autoBreadcrumbs.location && hasPushAndReplaceState) {\n // TODO: remove onpopstate handler on uninstall()\n var oldOnPopState = _window.onpopstate;\n _window.onpopstate = function() {\n var currentHref = self._location.href;\n self._captureUrlChange(self._lastHref, currentHref);\n\n if (oldOnPopState) {\n return oldOnPopState.apply(this, arguments);\n }\n };\n\n var historyReplacementFunction = function(origHistFunction) {\n // note history.pushState.length is 0; intentionally not declaring\n // params to preserve 0 arity\n return function(/* state, title, url */) {\n var url = arguments.length > 2 ? arguments[2] : undefined;\n\n // url argument is optional\n if (url) {\n // coerce to string (this is what pushState does)\n self._captureUrlChange(self._lastHref, url + '');\n }\n\n return origHistFunction.apply(this, arguments);\n };\n };\n\n fill(_window.history, 'pushState', historyReplacementFunction, wrappedBuiltIns);\n fill(_window.history, 'replaceState', historyReplacementFunction, wrappedBuiltIns);\n }\n\n if (autoBreadcrumbs.console && 'console' in _window && console.log) {\n // console\n var consoleMethodCallback = function(msg, data) {\n self.captureBreadcrumb({\n message: msg,\n level: data.level,\n category: 'console'\n });\n };\n\n each(['debug', 'info', 'warn', 'error', 'log'], function(_, level) {\n wrapConsoleMethod(console, level, consoleMethodCallback);\n });\n }\n },\n\n _restoreBuiltIns: function() {\n // restore any wrapped builtins\n var builtin;\n while (this._wrappedBuiltIns.length) {\n builtin = this._wrappedBuiltIns.shift();\n\n var obj = builtin[0],\n name = builtin[1],\n orig = builtin[2];\n\n obj[name] = orig;\n }\n },\n\n _restoreConsole: function() {\n // eslint-disable-next-line guard-for-in\n for (var method in this._originalConsoleMethods) {\n this._originalConsole[method] = this._originalConsoleMethods[method];\n }\n },\n\n _drainPlugins: function() {\n var self = this;\n\n // FIX ME TODO\n each(this._plugins, function(_, plugin) {\n var installer = plugin[0];\n var args = plugin[1];\n installer.apply(self, [self].concat(args));\n });\n },\n\n _parseDSN: function(str) {\n var m = dsnPattern.exec(str),\n dsn = {},\n i = 7;\n\n try {\n while (i--) dsn[dsnKeys[i]] = m[i] || '';\n } catch (e) {\n throw new RavenConfigError('Invalid DSN: ' + str);\n }\n\n if (dsn.pass && !this._globalOptions.allowSecretKey) {\n throw new RavenConfigError(\n 'Do not specify your secret key in the DSN. See: http://bit.ly/raven-secret-key'\n );\n }\n\n return dsn;\n },\n\n _getGlobalServer: function(uri) {\n // assemble the endpoint from the uri pieces\n var globalServer = '//' + uri.host + (uri.port ? ':' + uri.port : '');\n\n if (uri.protocol) {\n globalServer = uri.protocol + ':' + globalServer;\n }\n return globalServer;\n },\n\n _handleOnErrorStackInfo: function(stackInfo, options) {\n options = options || {};\n options.mechanism = options.mechanism || {\n type: 'onerror',\n handled: false\n };\n\n // if we are intentionally ignoring errors via onerror, bail out\n if (!this._ignoreOnError) {\n this._handleStackInfo(stackInfo, options);\n }\n },\n\n _handleStackInfo: function(stackInfo, options) {\n var frames = this._prepareFrames(stackInfo, options);\n\n this._triggerEvent('handle', {\n stackInfo: stackInfo,\n options: options\n });\n\n this._processException(\n stackInfo.name,\n stackInfo.message,\n stackInfo.url,\n stackInfo.lineno,\n frames,\n options\n );\n },\n\n _prepareFrames: function(stackInfo, options) {\n var self = this;\n var frames = [];\n if (stackInfo.stack && stackInfo.stack.length) {\n each(stackInfo.stack, function(i, stack) {\n var frame = self._normalizeFrame(stack, stackInfo.url);\n if (frame) {\n frames.push(frame);\n }\n });\n\n // e.g. frames captured via captureMessage throw\n if (options && options.trimHeadFrames) {\n for (var j = 0; j < options.trimHeadFrames && j < frames.length; j++) {\n frames[j].in_app = false;\n }\n }\n }\n frames = frames.slice(0, this._globalOptions.stackTraceLimit);\n return frames;\n },\n\n _normalizeFrame: function(frame, stackInfoUrl) {\n // normalize the frames data\n var normalized = {\n filename: frame.url,\n lineno: frame.line,\n colno: frame.column,\n function: frame.func || '?'\n };\n\n // Case when we don't have any information about the error\n // E.g. throwing a string or raw object, instead of an `Error` in Firefox\n // Generating synthetic error doesn't add any value here\n //\n // We should probably somehow let a user know that they should fix their code\n if (!frame.url) {\n normalized.filename = stackInfoUrl; // fallback to whole stacks url from onerror handler\n }\n\n normalized.in_app = !// determine if an exception came from outside of our app\n // first we check the global includePaths list.\n (\n (!!this._globalOptions.includePaths.test &&\n !this._globalOptions.includePaths.test(normalized.filename)) ||\n // Now we check for fun, if the function name is Raven or TraceKit\n /(Raven|TraceKit)\\./.test(normalized['function']) ||\n // finally, we do a last ditch effort and check for raven.min.js\n /raven\\.(min\\.)?js$/.test(normalized.filename)\n );\n\n return normalized;\n },\n\n _processException: function(type, message, fileurl, lineno, frames, options) {\n var prefixedMessage = (type ? type + ': ' : '') + (message || '');\n if (\n !!this._globalOptions.ignoreErrors.test &&\n (this._globalOptions.ignoreErrors.test(message) ||\n this._globalOptions.ignoreErrors.test(prefixedMessage))\n ) {\n return;\n }\n\n var stacktrace;\n\n if (frames && frames.length) {\n fileurl = frames[0].filename || fileurl;\n // Sentry expects frames oldest to newest\n // and JS sends them as newest to oldest\n frames.reverse();\n stacktrace = {frames: frames};\n } else if (fileurl) {\n stacktrace = {\n frames: [\n {\n filename: fileurl,\n lineno: lineno,\n in_app: true\n }\n ]\n };\n }\n\n if (\n !!this._globalOptions.ignoreUrls.test &&\n this._globalOptions.ignoreUrls.test(fileurl)\n ) {\n return;\n }\n\n if (\n !!this._globalOptions.whitelistUrls.test &&\n !this._globalOptions.whitelistUrls.test(fileurl)\n ) {\n return;\n }\n\n var data = objectMerge(\n {\n // sentry.interfaces.Exception\n exception: {\n values: [\n {\n type: type,\n value: message,\n stacktrace: stacktrace\n }\n ]\n },\n transaction: fileurl\n },\n options\n );\n\n // Move mechanism from options to exception interface\n // We do this, as requiring user to pass `{exception:{mechanism:{ ... }}}` would be\n // too much\n if (!data.exception.mechanism && data.mechanism) {\n data.exception.mechanism = data.mechanism;\n delete data.mechanism;\n }\n\n data.exception.mechanism = objectMerge(\n {\n type: 'generic',\n handled: true\n },\n data.exception.mechanism || {}\n );\n\n // Fire away!\n this._send(data);\n },\n\n _trimPacket: function(data) {\n // For now, we only want to truncate the two different messages\n // but this could/should be expanded to just trim everything\n var max = this._globalOptions.maxMessageLength;\n if (data.message) {\n data.message = truncate(data.message, max);\n }\n if (data.exception) {\n var exception = data.exception.values[0];\n exception.value = truncate(exception.value, max);\n }\n\n var request = data.request;\n if (request) {\n if (request.url) {\n request.url = truncate(request.url, this._globalOptions.maxUrlLength);\n }\n if (request.Referer) {\n request.Referer = truncate(request.Referer, this._globalOptions.maxUrlLength);\n }\n }\n\n if (data.breadcrumbs && data.breadcrumbs.values)\n this._trimBreadcrumbs(data.breadcrumbs);\n\n return data;\n },\n\n /**\n * Truncate breadcrumb values (right now just URLs)\n */\n _trimBreadcrumbs: function(breadcrumbs) {\n // known breadcrumb properties with urls\n // TODO: also consider arbitrary prop values that start with (https?)?://\n var urlProps = ['to', 'from', 'url'],\n urlProp,\n crumb,\n data;\n\n for (var i = 0; i < breadcrumbs.values.length; ++i) {\n crumb = breadcrumbs.values[i];\n if (\n !crumb.hasOwnProperty('data') ||\n !isObject(crumb.data) ||\n objectFrozen(crumb.data)\n )\n continue;\n\n data = objectMerge({}, crumb.data);\n for (var j = 0; j < urlProps.length; ++j) {\n urlProp = urlProps[j];\n if (data.hasOwnProperty(urlProp) && data[urlProp]) {\n data[urlProp] = truncate(data[urlProp], this._globalOptions.maxUrlLength);\n }\n }\n breadcrumbs.values[i].data = data;\n }\n },\n\n _getHttpData: function() {\n if (!this._hasNavigator && !this._hasDocument) return;\n var httpData = {};\n\n if (this._hasNavigator && _navigator.userAgent) {\n httpData.headers = {\n 'User-Agent': _navigator.userAgent\n };\n }\n\n // Check in `window` instead of `document`, as we may be in ServiceWorker environment\n if (_window.location && _window.location.href) {\n httpData.url = _window.location.href;\n }\n\n if (this._hasDocument && _document.referrer) {\n if (!httpData.headers) httpData.headers = {};\n httpData.headers.Referer = _document.referrer;\n }\n\n return httpData;\n },\n\n _resetBackoff: function() {\n this._backoffDuration = 0;\n this._backoffStart = null;\n },\n\n _shouldBackoff: function() {\n return this._backoffDuration && now() - this._backoffStart < this._backoffDuration;\n },\n\n /**\n * Returns true if the in-process data payload matches the signature\n * of the previously-sent data\n *\n * NOTE: This has to be done at this level because TraceKit can generate\n * data from window.onerror WITHOUT an exception object (IE8, IE9,\n * other old browsers). This can take the form of an \"exception\"\n * data object with a single frame (derived from the onerror args).\n */\n _isRepeatData: function(current) {\n var last = this._lastData;\n\n if (\n !last ||\n current.message !== last.message || // defined for captureMessage\n current.transaction !== last.transaction // defined for captureException/onerror\n )\n return false;\n\n // Stacktrace interface (i.e. from captureMessage)\n if (current.stacktrace || last.stacktrace) {\n return isSameStacktrace(current.stacktrace, last.stacktrace);\n } else if (current.exception || last.exception) {\n // Exception interface (i.e. from captureException/onerror)\n return isSameException(current.exception, last.exception);\n }\n\n return true;\n },\n\n _setBackoffState: function(request) {\n // If we are already in a backoff state, don't change anything\n if (this._shouldBackoff()) {\n return;\n }\n\n var status = request.status;\n\n // 400 - project_id doesn't exist or some other fatal\n // 401 - invalid/revoked dsn\n // 429 - too many requests\n if (!(status === 400 || status === 401 || status === 429)) return;\n\n var retry;\n try {\n // If Retry-After is not in Access-Control-Expose-Headers, most\n // browsers will throw an exception trying to access it\n if (supportsFetch()) {\n retry = request.headers.get('Retry-After');\n } else {\n retry = request.getResponseHeader('Retry-After');\n }\n\n // Retry-After is returned in seconds\n retry = parseInt(retry, 10) * 1000;\n } catch (e) {\n /* eslint no-empty:0 */\n }\n\n this._backoffDuration = retry\n ? // If Sentry server returned a Retry-After value, use it\n retry\n : // Otherwise, double the last backoff duration (starts at 1 sec)\n this._backoffDuration * 2 || 1000;\n\n this._backoffStart = now();\n },\n\n _send: function(data) {\n var globalOptions = this._globalOptions;\n\n var baseData = {\n project: this._globalProject,\n logger: globalOptions.logger,\n platform: 'javascript'\n },\n httpData = this._getHttpData();\n\n if (httpData) {\n baseData.request = httpData;\n }\n\n // HACK: delete `trimHeadFrames` to prevent from appearing in outbound payload\n if (data.trimHeadFrames) delete data.trimHeadFrames;\n\n data = objectMerge(baseData, data);\n\n // Merge in the tags and extra separately since objectMerge doesn't handle a deep merge\n data.tags = objectMerge(objectMerge({}, this._globalContext.tags), data.tags);\n data.extra = objectMerge(objectMerge({}, this._globalContext.extra), data.extra);\n\n // Send along our own collected metadata with extra\n data.extra['session:duration'] = now() - this._startTime;\n\n if (this._breadcrumbs && this._breadcrumbs.length > 0) {\n // intentionally make shallow copy so that additions\n // to breadcrumbs aren't accidentally sent in this request\n data.breadcrumbs = {\n values: [].slice.call(this._breadcrumbs, 0)\n };\n }\n\n if (this._globalContext.user) {\n // sentry.interfaces.User\n data.user = this._globalContext.user;\n }\n\n // Include the environment if it's defined in globalOptions\n if (globalOptions.environment) data.environment = globalOptions.environment;\n\n // Include the release if it's defined in globalOptions\n if (globalOptions.release) data.release = globalOptions.release;\n\n // Include server_name if it's defined in globalOptions\n if (globalOptions.serverName) data.server_name = globalOptions.serverName;\n\n data = this._sanitizeData(data);\n\n // Cleanup empty properties before sending them to the server\n Object.keys(data).forEach(function(key) {\n if (data[key] == null || data[key] === '' || isEmptyObject(data[key])) {\n delete data[key];\n }\n });\n\n if (isFunction(globalOptions.dataCallback)) {\n data = globalOptions.dataCallback(data) || data;\n }\n\n // Why??????????\n if (!data || isEmptyObject(data)) {\n return;\n }\n\n // Check if the request should be filtered or not\n if (\n isFunction(globalOptions.shouldSendCallback) &&\n !globalOptions.shouldSendCallback(data)\n ) {\n return;\n }\n\n // Backoff state: Sentry server previously responded w/ an error (e.g. 429 - too many requests),\n // so drop requests until \"cool-off\" period has elapsed.\n if (this._shouldBackoff()) {\n this._logDebug('warn', 'Raven dropped error due to backoff: ', data);\n return;\n }\n\n if (typeof globalOptions.sampleRate === 'number') {\n if (Math.random() < globalOptions.sampleRate) {\n this._sendProcessedPayload(data);\n }\n } else {\n this._sendProcessedPayload(data);\n }\n },\n\n _sanitizeData: function(data) {\n return sanitize(data, this._globalOptions.sanitizeKeys);\n },\n\n _getUuid: function() {\n return uuid4();\n },\n\n _sendProcessedPayload: function(data, callback) {\n var self = this;\n var globalOptions = this._globalOptions;\n\n if (!this.isSetup()) return;\n\n // Try and clean up the packet before sending by truncating long values\n data = this._trimPacket(data);\n\n // ideally duplicate error testing should occur *before* dataCallback/shouldSendCallback,\n // but this would require copying an un-truncated copy of the data packet, which can be\n // arbitrarily deep (extra_data) -- could be worthwhile? will revisit\n if (!this._globalOptions.allowDuplicates && this._isRepeatData(data)) {\n this._logDebug('warn', 'Raven dropped repeat event: ', data);\n return;\n }\n\n // Send along an event_id if not explicitly passed.\n // This event_id can be used to reference the error within Sentry itself.\n // Set lastEventId after we know the error should actually be sent\n this._lastEventId = data.event_id || (data.event_id = this._getUuid());\n\n // Store outbound payload after trim\n this._lastData = data;\n\n this._logDebug('debug', 'Raven about to send:', data);\n\n var auth = {\n sentry_version: '7',\n sentry_client: 'raven-js/' + this.VERSION,\n sentry_key: this._globalKey\n };\n\n if (this._globalSecret) {\n auth.sentry_secret = this._globalSecret;\n }\n\n var exception = data.exception && data.exception.values[0];\n\n // only capture 'sentry' breadcrumb is autoBreadcrumbs is truthy\n if (\n this._globalOptions.autoBreadcrumbs &&\n this._globalOptions.autoBreadcrumbs.sentry\n ) {\n this.captureBreadcrumb({\n category: 'sentry',\n message: exception\n ? (exception.type ? exception.type + ': ' : '') + exception.value\n : data.message,\n event_id: data.event_id,\n level: data.level || 'error' // presume error unless specified\n });\n }\n\n var url = this._globalEndpoint;\n (globalOptions.transport || this._makeRequest).call(this, {\n url: url,\n auth: auth,\n data: data,\n options: globalOptions,\n onSuccess: function success() {\n self._resetBackoff();\n\n self._triggerEvent('success', {\n data: data,\n src: url\n });\n callback && callback();\n },\n onError: function failure(error) {\n self._logDebug('error', 'Raven transport failed to send: ', error);\n\n if (error.request) {\n self._setBackoffState(error.request);\n }\n\n self._triggerEvent('failure', {\n data: data,\n src: url\n });\n error = error || new Error('Raven send failed (no additional details provided)');\n callback && callback(error);\n }\n });\n },\n\n _makeRequest: function(opts) {\n // Auth is intentionally sent as part of query string (NOT as custom HTTP header) to avoid preflight CORS requests\n var url = opts.url + '?' + urlencode(opts.auth);\n\n var evaluatedHeaders = null;\n var evaluatedFetchParameters = {};\n\n if (opts.options.headers) {\n evaluatedHeaders = this._evaluateHash(opts.options.headers);\n }\n\n if (opts.options.fetchParameters) {\n evaluatedFetchParameters = this._evaluateHash(opts.options.fetchParameters);\n }\n\n if (supportsFetch()) {\n evaluatedFetchParameters.body = stringify(opts.data);\n\n var defaultFetchOptions = objectMerge({}, this._fetchDefaults);\n var fetchOptions = objectMerge(defaultFetchOptions, evaluatedFetchParameters);\n\n if (evaluatedHeaders) {\n fetchOptions.headers = evaluatedHeaders;\n }\n\n return _window\n .fetch(url, fetchOptions)\n .then(function(response) {\n if (response.ok) {\n opts.onSuccess && opts.onSuccess();\n } else {\n var error = new Error('Sentry error code: ' + response.status);\n // It's called request only to keep compatibility with XHR interface\n // and not add more redundant checks in setBackoffState method\n error.request = response;\n opts.onError && opts.onError(error);\n }\n })\n ['catch'](function() {\n opts.onError &&\n opts.onError(new Error('Sentry error code: network unavailable'));\n });\n }\n\n var request = _window.XMLHttpRequest && new _window.XMLHttpRequest();\n if (!request) return;\n\n // if browser doesn't support CORS (e.g. IE7), we are out of luck\n var hasCORS = 'withCredentials' in request || typeof XDomainRequest !== 'undefined';\n\n if (!hasCORS) return;\n\n if ('withCredentials' in request) {\n request.onreadystatechange = function() {\n if (request.readyState !== 4) {\n return;\n } else if (request.status === 200) {\n opts.onSuccess && opts.onSuccess();\n } else if (opts.onError) {\n var err = new Error('Sentry error code: ' + request.status);\n err.request = request;\n opts.onError(err);\n }\n };\n } else {\n request = new XDomainRequest();\n // xdomainrequest cannot go http -> https (or vice versa),\n // so always use protocol relative\n url = url.replace(/^https?:/, '');\n\n // onreadystatechange not supported by XDomainRequest\n if (opts.onSuccess) {\n request.onload = opts.onSuccess;\n }\n if (opts.onError) {\n request.onerror = function() {\n var err = new Error('Sentry error code: XDomainRequest');\n err.request = request;\n opts.onError(err);\n };\n }\n }\n\n request.open('POST', url);\n\n if (evaluatedHeaders) {\n each(evaluatedHeaders, function(key, value) {\n request.setRequestHeader(key, value);\n });\n }\n\n request.send(stringify(opts.data));\n },\n\n _evaluateHash: function(hash) {\n var evaluated = {};\n\n for (var key in hash) {\n if (hash.hasOwnProperty(key)) {\n var value = hash[key];\n evaluated[key] = typeof value === 'function' ? value() : value;\n }\n }\n\n return evaluated;\n },\n\n _logDebug: function(level) {\n // We allow `Raven.debug` and `Raven.config(DSN, { debug: true })` to not make backward incompatible API change\n if (\n this._originalConsoleMethods[level] &&\n (this.debug || this._globalOptions.debug)\n ) {\n // In IE<10 console methods do not have their own 'apply' method\n Function.prototype.apply.call(\n this._originalConsoleMethods[level],\n this._originalConsole,\n [].slice.call(arguments, 1)\n );\n }\n },\n\n _mergeContext: function(key, context) {\n if (isUndefined(context)) {\n delete this._globalContext[key];\n } else {\n this._globalContext[key] = objectMerge(this._globalContext[key] || {}, context);\n }\n }\n};\n\n// Deprecations\nRaven.prototype.setUser = Raven.prototype.setUserContext;\nRaven.prototype.setReleaseContext = Raven.prototype.setRelease;\n\nmodule.exports = Raven;\n","/**\n * Enforces a single instance of the Raven client, and the\n * main entry point for Raven. If you are a consumer of the\n * Raven library, you SHOULD load this file (vs raven.js).\n **/\n\nvar RavenConstructor = require('./raven');\n\n// This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785)\nvar _window =\n typeof window !== 'undefined'\n ? window\n : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\nvar _Raven = _window.Raven;\n\nvar Raven = new RavenConstructor();\n\n/*\n * Allow multiple versions of Raven to be installed.\n * Strip Raven from the global context and returns the instance.\n *\n * @return {Raven}\n */\nRaven.noConflict = function() {\n _window.Raven = _Raven;\n return Raven;\n};\n\nRaven.afterLoad();\n\nmodule.exports = Raven;\n\n/**\n * DISCLAIMER:\n *\n * Expose `Client` constructor for cases where user want to track multiple \"sub-applications\" in one larger app.\n * It's not meant to be used by a wide audience, so pleaaase make sure that you know what you're doing before using it.\n * Accidentally calling `install` multiple times, may result in an unexpected behavior that's very hard to debug.\n *\n * It's called `Client' to be in-line with Raven Node implementation.\n *\n * HOWTO:\n *\n * import Raven from 'raven-js';\n *\n * const someAppReporter = new Raven.Client();\n * const someOtherAppReporter = new Raven.Client();\n *\n * someAppReporter.config('__DSN__', {\n * ...config goes here\n * });\n *\n * someOtherAppReporter.config('__OTHER_DSN__', {\n * ...config goes here\n * });\n *\n * someAppReporter.captureMessage(...);\n * someAppReporter.captureException(...);\n * someAppReporter.captureBreadcrumb(...);\n *\n * someOtherAppReporter.captureMessage(...);\n * someOtherAppReporter.captureException(...);\n * someOtherAppReporter.captureBreadcrumb(...);\n *\n * It should \"just work\".\n */\nmodule.exports.Client = RavenConstructor;\n","// ==========================================================================\n// Plyr.io demo\n// This code is purely for the https://plyr.io website\n// Please see readme.md in the root or github.com/sampotts/plyr\n// ==========================================================================\n\nimport Raven from 'raven-js';\n\n(() => {\n const isLive = window.location.host === 'plyr.io';\n\n // Raven / Sentry\n // For demo site (https://plyr.io) only\n if (isLive) {\n Raven.config('https://d4ad9866ad834437a4754e23937071e4@sentry.io/305555').install();\n }\n\n document.addEventListener('DOMContentLoaded', () => {\n Raven.context(() => {\n if (window.shr) {\n window.shr.setup({\n count: {\n classname: 'button__count',\n },\n });\n }\n\n // Setup tab focus\n const tabClassName = 'tab-focus';\n\n // Remove class on blur\n document.addEventListener('focusout', event => {\n event.target.classList.remove(tabClassName);\n });\n\n // Add classname to tabbed elements\n document.addEventListener('keydown', event => {\n if (event.keyCode !== 9) {\n return;\n }\n\n // Delay the adding of classname until the focus has changed\n // This event fires before the focusin event\n setTimeout(() => {\n document.activeElement.classList.add(tabClassName);\n }, 0);\n });\n\n // Setup the player\n const player = new Plyr('#player', {\n debug: true,\n title: 'View From A Blue Moon',\n iconUrl: '../dist/plyr.svg',\n keyboard: {\n global: true,\n },\n tooltips: {\n controls: true,\n },\n /* controls: [\n 'play-large',\n 'restart',\n 'rewind',\n 'play',\n 'fast-forward',\n 'progress',\n 'current-time',\n 'duration',\n 'mute',\n 'volume',\n 'captions',\n 'settings',\n 'pip',\n 'airplay',\n 'fullscreen',\n ], */\n /* i18n: {\n restart: '重新開始',\n rewind: '快退{seektime}秒',\n play: '播放',\n pause: '暫停',\n fastForward: '快進{seektime}秒',\n seek: '尋求',\n played: '發揮',\n buffered: '緩衝的',\n currentTime: '當前時間戳',\n duration: '長短',\n volume: '音量',\n mute: '靜音',\n unmute: '取消靜音',\n enableCaptions: '開啟字幕',\n disableCaptions: '關閉字幕',\n enterFullscreen: '進入全螢幕',\n exitFullscreen: '退出全螢幕',\n frameTitle: '球員為{title}',\n captions: '字幕',\n settings: '設定',\n speed: '速度',\n normal: '正常',\n quality: '質量',\n loop: '循環',\n start: 'Start',\n end: 'End',\n all: 'All',\n reset: '重啟',\n disabled: '殘',\n enabled: '啟用',\n advertisement: '廣告',\n }, */\n captions: {\n active: true,\n },\n keys: {\n google: 'AIzaSyDrNwtN3nLH_8rjCmu5Wq3ZCm4MNAVdc0c',\n },\n ads: {\n enabled: true,\n publisherId: '918848828995742',\n },\n });\n\n // Expose for tinkering in the console\n window.player = player;\n\n // Setup type toggle\n const buttons = document.querySelectorAll('[data-source]');\n const types = {\n video: 'video',\n audio: 'audio',\n youtube: 'youtube',\n vimeo: 'vimeo',\n };\n let currentType = window.location.hash.replace('#', '');\n const historySupport = window.history && window.history.pushState;\n\n // Toggle class on an element\n function toggleClass(element, className, state) {\n if (element) {\n element.classList[state ? 'add' : 'remove'](className);\n }\n }\n\n // Set a new source\n function newSource(type, init) {\n // Bail if new type isn't known, it's the current type, or current type is empty (video is default) and new type is video\n if (!(type in types) || (!init && type === currentType) || (!currentType.length && type === types.video)) {\n return;\n }\n\n switch (type) {\n case types.video:\n player.source = {\n type: 'video',\n title: 'View From A Blue Moon',\n sources: [\n {\n src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-576p.mp4',\n type: 'video/mp4',\n size: 576,\n },\n {\n src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-720p.mp4',\n type: 'video/mp4',\n size: 720,\n },\n {\n src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-1080p.mp4',\n type: 'video/mp4',\n size: 1080,\n },\n {\n src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-1440p.mp4',\n type: 'video/mp4',\n size: 1440,\n },\n ],\n poster: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg',\n tracks: [\n {\n kind: 'captions',\n label: 'English',\n srclang: 'en',\n src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt',\n default: true,\n },\n {\n kind: 'captions',\n label: 'French',\n srclang: 'fr',\n src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt',\n },\n ],\n };\n\n break;\n\n case types.audio:\n player.source = {\n type: 'audio',\n title: 'Kishi Bashi &ndash; &ldquo;It All Began With A Burst&rdquo;',\n sources: [\n {\n src: 'https://cdn.plyr.io/static/demo/Kishi_Bashi_-_It_All_Began_With_a_Burst.mp3',\n type: 'audio/mp3',\n },\n {\n src: 'https://cdn.plyr.io/static/demo/Kishi_Bashi_-_It_All_Began_With_a_Burst.ogg',\n type: 'audio/ogg',\n },\n ],\n };\n\n break;\n\n case types.youtube:\n player.source = {\n type: 'video',\n sources: [{\n src: 'https://youtube.com/watch?v=bTqVqk7FSmY',\n provider: 'youtube',\n }],\n };\n\n break;\n\n case types.vimeo:\n player.source = {\n type: 'video',\n sources: [{\n src: 'https://vimeo.com/76979871',\n provider: 'vimeo',\n }],\n };\n\n break;\n\n default:\n break;\n }\n\n // Set the current type for next time\n currentType = type;\n\n // Remove active classes\n Array.from(buttons).forEach(button => toggleClass(button.parentElement, 'active', false));\n\n // Set active on parent\n toggleClass(document.querySelector(`[data-source=\"${type}\"]`), 'active', true);\n\n // Show cite\n Array.from(document.querySelectorAll('.plyr__cite')).forEach(cite => {\n cite.setAttribute('hidden', '');\n });\n document.querySelector(`.plyr__cite--${type}`).removeAttribute('hidden');\n }\n\n // Bind to each button\n Array.from(buttons).forEach(button => {\n button.addEventListener('click', () => {\n const type = button.getAttribute('data-source');\n\n newSource(type);\n\n if (historySupport) {\n window.history.pushState({ type }, '', `#${type}`);\n }\n });\n });\n\n // List for backwards/forwards\n window.addEventListener('popstate', event => {\n if (event.state && 'type' in event.state) {\n newSource(event.state.type);\n }\n });\n\n // On load\n if (historySupport) {\n const video = !currentType.length;\n\n // If there's no current type set, assume video\n if (video) {\n currentType = types.video;\n }\n\n // Replace current history state\n if (currentType in types) {\n window.history.replaceState(\n {\n type: currentType,\n },\n '',\n video ? '' : `#${currentType}`,\n );\n }\n\n // If it's not video, load the source\n if (currentType !== types.video) {\n newSource(currentType, true);\n }\n }\n });\n });\n\n // Google analytics\n // For demo site (https://plyr.io) only\n /* eslint-disable */\n if (isLive) {\n (function(i, s, o, g, r, a, m) {\n i.GoogleAnalyticsObject = r;\n i[r] =\n i[r] ||\n function() {\n (i[r].q = i[r].q || []).push(arguments);\n };\n i[r].l = 1 * new Date();\n a = s.createElement(o);\n m = s.getElementsByTagName(o)[0];\n a.async = 1;\n a.src = g;\n m.parentNode.insertBefore(a, m);\n })(window, document, 'script', 'https://www.google-analytics.com/analytics.js', 'ga');\n window.ga('create', 'UA-40881672-11', 'auto');\n window.ga('send', 'pageview');\n }\n /* eslint-enable */\n})();\n"]} \ No newline at end of file
diff --git a/demo/dist/demo.min.js b/demo/dist/demo.min.js
index d03a20e9..5abdaa42 100644
--- a/demo/dist/demo.min.js
+++ b/demo/dist/demo.min.js
@@ -1,2 +1,2 @@
-"object"==typeof navigator&&function(){"use strict";var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};var t,r=(function(e,t){function r(e,t){for(var r=0;r<e.length;++r)if(e[r]===t)return r;return-1}function n(e,t){var n=[],o=[];return null==t&&(t=function(e,t){return n[0]===t?"[Circular ~]":"[Circular ~."+o.slice(0,r(n,t)).join(".")+"]"}),function(i,a){if(n.length>0){var s=r(n,this);~s?n.splice(s+1):n.push(this),~s?o.splice(s,1/0,i):o.push(i),~r(n,a)&&(a=t.call(this,i,a))}else n.push(a);return null==e?a instanceof Error?function(e){var t={stack:e.stack,message:e.message,name:e.name};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t}(a):a:e.call(this,i,a)}}(e.exports=function(e,t,r,o){return JSON.stringify(e,n(t,o),r)}).getSerialize=n}(t={exports:{}},t.exports),t.exports),n=(r.getSerialize,"undefined"!=typeof window?window:void 0!==e?e:"undefined"!=typeof self?self:{});function o(e){return void 0===e}function i(e){return"[object Object]"===Object.prototype.toString.call(e)}function a(e){return"[object String]"===Object.prototype.toString.call(e)}function s(e){return"[object Array]"===Object.prototype.toString.call(e)}function c(){if(!("fetch"in n))return!1;try{return new Headers,new Request(""),new Response,!0}catch(e){return!1}}function l(e,t){var r,n;if(o(e.length))for(r in e)h(e,r)&&t.call(null,r,e[r]);else if(n=e.length)for(r=0;r<n;r++)t.call(null,r,e[r])}function u(e,t){if("number"!=typeof t)throw new Error("2nd argument to `truncate` function should be a number");return"string"!=typeof e||0===t?e:e.length<=t?e:e.substr(0,t)+"…"}function h(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function p(e){for(var t,r=[],n=0,o=e.length;n<o;n++)a(t=e[n])?r.push(t.replace(/([.*+?^=!:${}()|\[\]\/\\])/g,"\\$1")):t&&t.source&&r.push(t.source);return new RegExp(r.join("|"),"i")}function f(e){var t,r,n,o,i,s=[];if(!e||!e.tagName)return"";if(s.push(e.tagName.toLowerCase()),e.id&&s.push("#"+e.id),(t=e.className)&&a(t))for(r=t.split(/\s+/),i=0;i<r.length;i++)s.push("."+r[i]);var c=["type","name","title","alt"];for(i=0;i<c.length;i++)n=c[i],(o=e.getAttribute(n))&&s.push("["+n+'="'+o+'"]');return s.join("")}function d(e,t){return!!(!!e^!!t)}function g(e,t){if(d(e,t))return!1;var r,n,o=e.frames,i=t.frames;if(o.length!==i.length)return!1;for(var a=0;a<o.length;a++)if(r=o[a],n=i[a],r.filename!==n.filename||r.lineno!==n.lineno||r.colno!==n.colno||r.function!==n.function)return!1;return!0}var m=3,_=51200,v=40;function b(e){return function(e){return~-encodeURI(e).split(/%..|./).length}(JSON.stringify(e))}function y(e){if("string"==typeof e){return u(e,40)}if("number"==typeof e||"boolean"==typeof e||void 0===e)return e;var t=Object.prototype.toString.call(e);return"[object Object]"===t?"[Object]":"[object Array]"===t?"[Array]":"[object Function]"===t?e.name?"[Function: "+e.name+"]":"[Function]":e}var E={isObject:function(e){return"object"==typeof e&&null!==e},isError:function(e){switch(Object.prototype.toString.call(e)){case"[object Error]":case"[object Exception]":case"[object DOMException]":return!0;default:return e instanceof Error}},isErrorEvent:function(e){return"[object ErrorEvent]"===Object.prototype.toString.call(e)},isDOMError:function(e){return"[object DOMError]"===Object.prototype.toString.call(e)},isDOMException:function(e){return"[object DOMException]"===Object.prototype.toString.call(e)},isUndefined:o,isFunction:function(e){return"function"==typeof e},isPlainObject:i,isString:a,isArray:s,isEmptyObject:function(e){if(!i(e))return!1;for(var t in e)if(e.hasOwnProperty(t))return!1;return!0},supportsErrorEvent:function(){try{return new ErrorEvent(""),!0}catch(e){return!1}},supportsDOMError:function(){try{return new DOMError(""),!0}catch(e){return!1}},supportsDOMException:function(){try{return new DOMException(""),!0}catch(e){return!1}},supportsFetch:c,supportsReferrerPolicy:function(){if(!c())return!1;try{return new Request("pickleRick",{referrerPolicy:"origin"}),!0}catch(e){return!1}},supportsPromiseRejectionEvent:function(){return"function"==typeof PromiseRejectionEvent},wrappedCallback:function(e){return function(t,r){var n=e(t)||t;return r&&r(n)||n}},each:l,objectMerge:function(e,t){return t?(l(t,function(t,r){e[t]=r}),e):e},truncate:u,objectFrozen:function(e){return!!Object.isFrozen&&Object.isFrozen(e)},hasKey:h,joinRegExp:p,urlencode:function(e){var t=[];return l(e,function(e,r){t.push(encodeURIComponent(e)+"="+encodeURIComponent(r))}),t.join("&")},uuid4:function(){var e=n.crypto||n.msCrypto;if(!o(e)&&e.getRandomValues){var t=new Uint16Array(8);e.getRandomValues(t),t[3]=4095&t[3]|16384,t[4]=16383&t[4]|32768;var r=function(e){for(var t=e.toString(16);t.length<4;)t="0"+t;return t};return r(t[0])+r(t[1])+r(t[2])+r(t[3])+r(t[4])+r(t[5])+r(t[6])+r(t[7])}return"xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx".replace(/[xy]/g,function(e){var t=16*Math.random()|0;return("x"===e?t:3&t|8).toString(16)})},htmlTreeAsString:function(e){for(var t,r=[],n=0,o=0,i=" > ".length;e&&n++<5&&!("html"===(t=f(e))||n>1&&o+r.length*i+t.length>=80);)r.push(t),o+=t.length,e=e.parentNode;return r.reverse().join(" > ")},htmlElementAsString:f,isSameException:function(e,t){return!d(e,t)&&(e=e.values[0],t=t.values[0],e.type===t.type&&e.value===t.value&&(r=e.stacktrace,n=t.stacktrace,(!o(r)||!o(n))&&g(e.stacktrace,t.stacktrace)));var r,n},isSameStacktrace:g,parseUrl:function(e){if("string"!=typeof e)return{};var t=e.match(/^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?$/),r=t[6]||"",n=t[8]||"";return{protocol:t[2],host:t[4],path:t[5],relative:t[5]+r+n}},fill:function(e,t,r,n){if(null!=e){var o=e[t];e[t]=r(o),e[t].__raven__=!0,e[t].__orig__=o,n&&n.push([e,t,o])}},safeJoin:function(e,t){if(!s(e))return"";for(var r=[],n=0;n<e.length;n++)try{r.push(String(e[n]))}catch(e){r.push("[value cannot be serialized]")}return r.join(t)},serializeException:function e(t,n,o){if(!i(t))return t;o="number"!=typeof(n="number"!=typeof n?m:n)?_:o;var a=function e(t,r){return 0===r?y(t):i(t)?Object.keys(t).reduce(function(n,o){return n[o]=e(t[o],r-1),n},{}):Array.isArray(t)?t.map(function(t){return e(t,r-1)}):y(t)}(t,n);return b(r(a))>o?e(t,n-1):a},serializeKeysForMessage:function(e,t){if("number"==typeof e||"string"==typeof e)return e.toString();if(!Array.isArray(e))return"";if(0===(e=e.filter(function(e){return"string"==typeof e})).length)return"[object has no keys]";if(t="number"!=typeof t?v:t,e[0].length>=t)return e[0];for(var r=e.length;r>0;r--){var n=e.slice(0,r).join(", ");if(!(n.length>t))return r===e.length?n:n+"…"}return""},sanitize:function(e,t){if(!s(t)||s(t)&&0===t.length)return e;var n,o=p(t),a="********";try{n=JSON.parse(r(e))}catch(t){return e}return function e(t){return s(t)?t.map(function(t){return e(t)}):i(t)?Object.keys(t).reduce(function(r,n){return o.test(n)?r[n]=a:r[n]=e(t[n]),r},{}):t}(n)}},w={collectWindowErrors:!0,debug:!1},x="undefined"!=typeof window?window:void 0!==e?e:"undefined"!=typeof self?self:{},k=[].slice,S="?",O=/^(?:[Uu]ncaught (?:exception: )?)?(?:((?:Eval|Internal|Range|Reference|Syntax|Type|URI|)Error): )?(.*)$/;function C(){return"undefined"==typeof document||null==document.location?"":document.location.href}w.report=function(){var e,t,r=[],n=null,o=null,i=null;function a(e,t){var n=null;if(!t||w.collectWindowErrors){for(var o in r)if(r.hasOwnProperty(o))try{r[o].apply(null,[e].concat(k.call(arguments,2)))}catch(e){n=e}if(n)throw n}}function s(t,r,n,o,s){var l=E.isErrorEvent(s)?s.error:s,u=E.isErrorEvent(t)?t.message:t;if(i)w.computeStackTrace.augmentStackTraceWithInitialElement(i,r,n,u),c();else if(l&&E.isError(l))a(w.computeStackTrace(l),!0);else{var h,p={url:r,line:n,column:o},f=void 0;if("[object String]"==={}.toString.call(u))(h=u.match(O))&&(f=h[1],u=h[2]);p.func=S,a({name:f,message:u,url:C(),stack:[p]},!0)}return!!e&&e.apply(this,arguments)}function c(){var e=i,t=n;n=null,i=null,o=null,a.apply(null,[e,!1].concat(t))}function l(e,t){var r=k.call(arguments,1);if(i){if(o===e)return;c()}var a=w.computeStackTrace(e);if(i=a,o=e,n=r,setTimeout(function(){o===e&&c()},a.incomplete?2e3:0),!1!==t)throw e}return l.subscribe=function(n){t||(e=x.onerror,x.onerror=s,t=!0),r.push(n)},l.unsubscribe=function(e){for(var t=r.length-1;t>=0;--t)r[t]===e&&r.splice(t,1)},l.uninstall=function(){t&&(x.onerror=e,t=!1,e=void 0),r=[]},l}(),w.computeStackTrace=function(){function e(e){if(void 0!==e.stack&&e.stack){for(var t,r,n,o=/^\s*at (?:(.*?) ?\()?((?:file|https?|blob|chrome-extension|native|eval|webpack|<anonymous>|[a-z]:|\/).*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i,i=/^\s*at (?:((?:\[object object\])?.+) )?\(?((?:file|ms-appx(?:-web)|https?|webpack|blob):.*?):(\d+)(?::(\d+))?\)?\s*$/i,a=/^\s*(.*?)(?:\((.*?)\))?(?:^|@)((?:file|https?|blob|chrome|webpack|resource|moz-extension).*?:\/.*?|\[native code\]|[^@]*bundle)(?::(\d+))?(?::(\d+))?\s*$/i,s=/(\S+) line (\d+)(?: > eval line \d+)* > eval/i,c=/\((\S*)(?::(\d+))(?::(\d+))\)/,l=e.stack.split("\n"),u=[],h=(/^(.*) is undefined$/.exec(e.message),0),p=l.length;h<p;++h){if(r=o.exec(l[h])){var f=r[2]&&0===r[2].indexOf("native");r[2]&&0===r[2].indexOf("eval")&&(t=c.exec(r[2]))&&(r[2]=t[1],r[3]=t[2],r[4]=t[3]),n={url:f?null:r[2],func:r[1]||S,args:f?[r[2]]:[],line:r[3]?+r[3]:null,column:r[4]?+r[4]:null}}else if(r=i.exec(l[h]))n={url:r[2],func:r[1]||S,args:[],line:+r[3],column:r[4]?+r[4]:null};else{if(!(r=a.exec(l[h])))continue;r[3]&&r[3].indexOf(" > eval")>-1&&(t=s.exec(r[3]))?(r[3]=t[1],r[4]=t[2],r[5]=null):0!==h||r[5]||void 0===e.columnNumber||(u[0].column=e.columnNumber+1),n={url:r[3],func:r[1]||S,args:r[2]?r[2].split(","):[],line:r[4]?+r[4]:null,column:r[5]?+r[5]:null}}if(!n.func&&n.line&&(n.func=S),n.url&&"blob:"===n.url.substr(0,5)){var d=new XMLHttpRequest;if(d.open("GET",n.url,!1),d.send(null),200===d.status){var g=d.responseText||"",m=(g=g.slice(-300)).match(/\/\/# sourceMappingURL=(.*)$/);if(m){var _=m[1];"~"===_.charAt(0)&&(_=("undefined"==typeof document||null==document.location?"":document.location.origin?document.location.origin:document.location.protocol+"//"+document.location.hostname+(document.location.port?":"+document.location.port:""))+_.slice(1)),n.url=_.slice(0,-4)}}}u.push(n)}return u.length?{name:e.name,message:e.message,url:C(),stack:u}:null}}function t(e,t,r,n){var o={url:t,line:r};if(o.url&&o.line){if(e.incomplete=!1,o.func||(o.func=S),e.stack.length>0&&e.stack[0].url===o.url){if(e.stack[0].line===o.line)return!1;if(!e.stack[0].line&&e.stack[0].func===o.func)return e.stack[0].line=o.line,!1}return e.stack.unshift(o),e.partial=!0,!0}return e.incomplete=!0,!1}function r(e,o){for(var i,a,s=/function\s+([_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*)?\s*\(/i,c=[],l={},u=!1,h=r.caller;h&&!u;h=h.caller)if(h!==n&&h!==w.report){if(a={url:null,func:S,line:null,column:null},h.name?a.func=h.name:(i=s.exec(h.toString()))&&(a.func=i[1]),void 0===a.func)try{a.func=i.input.substring(0,i.input.indexOf("{"))}catch(e){}l[""+h]?u=!0:l[""+h]=!0,c.push(a)}o&&c.splice(0,o);var p={name:e.name,message:e.message,url:C(),stack:c};return t(p,e.sourceURL||e.fileName,e.line||e.lineNumber,e.message||e.description),p}function n(t,n){var o=null;n=null==n?0:+n;try{if(o=e(t))return o}catch(e){if(w.debug)throw e}try{if(o=r(t,n+1))return o}catch(e){if(w.debug)throw e}return{name:t.name,message:t.message,url:C()}}return n.augmentStackTraceWithInitialElement=t,n.computeStackTraceFromStackProp=e,n}();var R=w;function j(e,t){var r=(65535&e)+(65535&t);return(e>>16)+(t>>16)+(r>>16)<<16|65535&r}function T(e,t,r,n,o,i){return j((a=j(j(t,e),j(n,i)))<<(s=o)|a>>>32-s,r);var a,s}function F(e,t,r,n,o,i,a){return T(t&r|~t&n,e,t,o,i,a)}function D(e,t,r,n,o,i,a){return T(t&n|r&~n,e,t,o,i,a)}function A(e,t,r,n,o,i,a){return T(t^r^n,e,t,o,i,a)}function B(e,t,r,n,o,i,a){return T(r^(t|~n),e,t,o,i,a)}function M(e,t){var r,n,o,i,a;e[t>>5]|=128<<t%32,e[14+(t+64>>>9<<4)]=t;var s=1732584193,c=-271733879,l=-1732584194,u=271733878;for(r=0;r<e.length;r+=16)n=s,o=c,i=l,a=u,s=F(s,c,l,u,e[r],7,-680876936),u=F(u,s,c,l,e[r+1],12,-389564586),l=F(l,u,s,c,e[r+2],17,606105819),c=F(c,l,u,s,e[r+3],22,-1044525330),s=F(s,c,l,u,e[r+4],7,-176418897),u=F(u,s,c,l,e[r+5],12,1200080426),l=F(l,u,s,c,e[r+6],17,-1473231341),c=F(c,l,u,s,e[r+7],22,-45705983),s=F(s,c,l,u,e[r+8],7,1770035416),u=F(u,s,c,l,e[r+9],12,-1958414417),l=F(l,u,s,c,e[r+10],17,-42063),c=F(c,l,u,s,e[r+11],22,-1990404162),s=F(s,c,l,u,e[r+12],7,1804603682),u=F(u,s,c,l,e[r+13],12,-40341101),l=F(l,u,s,c,e[r+14],17,-1502002290),s=D(s,c=F(c,l,u,s,e[r+15],22,1236535329),l,u,e[r+1],5,-165796510),u=D(u,s,c,l,e[r+6],9,-1069501632),l=D(l,u,s,c,e[r+11],14,643717713),c=D(c,l,u,s,e[r],20,-373897302),s=D(s,c,l,u,e[r+5],5,-701558691),u=D(u,s,c,l,e[r+10],9,38016083),l=D(l,u,s,c,e[r+15],14,-660478335),c=D(c,l,u,s,e[r+4],20,-405537848),s=D(s,c,l,u,e[r+9],5,568446438),u=D(u,s,c,l,e[r+14],9,-1019803690),l=D(l,u,s,c,e[r+3],14,-187363961),c=D(c,l,u,s,e[r+8],20,1163531501),s=D(s,c,l,u,e[r+13],5,-1444681467),u=D(u,s,c,l,e[r+2],9,-51403784),l=D(l,u,s,c,e[r+7],14,1735328473),s=A(s,c=D(c,l,u,s,e[r+12],20,-1926607734),l,u,e[r+5],4,-378558),u=A(u,s,c,l,e[r+8],11,-2022574463),l=A(l,u,s,c,e[r+11],16,1839030562),c=A(c,l,u,s,e[r+14],23,-35309556),s=A(s,c,l,u,e[r+1],4,-1530992060),u=A(u,s,c,l,e[r+4],11,1272893353),l=A(l,u,s,c,e[r+7],16,-155497632),c=A(c,l,u,s,e[r+10],23,-1094730640),s=A(s,c,l,u,e[r+13],4,681279174),u=A(u,s,c,l,e[r],11,-358537222),l=A(l,u,s,c,e[r+3],16,-722521979),c=A(c,l,u,s,e[r+6],23,76029189),s=A(s,c,l,u,e[r+9],4,-640364487),u=A(u,s,c,l,e[r+12],11,-421815835),l=A(l,u,s,c,e[r+15],16,530742520),s=B(s,c=A(c,l,u,s,e[r+2],23,-995338651),l,u,e[r],6,-198630844),u=B(u,s,c,l,e[r+7],10,1126891415),l=B(l,u,s,c,e[r+14],15,-1416354905),c=B(c,l,u,s,e[r+5],21,-57434055),s=B(s,c,l,u,e[r+12],6,1700485571),u=B(u,s,c,l,e[r+3],10,-1894986606),l=B(l,u,s,c,e[r+10],15,-1051523),c=B(c,l,u,s,e[r+1],21,-2054922799),s=B(s,c,l,u,e[r+8],6,1873313359),u=B(u,s,c,l,e[r+15],10,-30611744),l=B(l,u,s,c,e[r+6],15,-1560198380),c=B(c,l,u,s,e[r+13],21,1309151649),s=B(s,c,l,u,e[r+4],6,-145523070),u=B(u,s,c,l,e[r+11],10,-1120210379),l=B(l,u,s,c,e[r+2],15,718787259),c=B(c,l,u,s,e[r+9],21,-343485551),s=j(s,n),c=j(c,o),l=j(l,i),u=j(u,a);return[s,c,l,u]}function H(e){var t,r="",n=32*e.length;for(t=0;t<n;t+=8)r+=String.fromCharCode(e[t>>5]>>>t%32&255);return r}function L(e){var t,r=[];for(r[(e.length>>2)-1]=void 0,t=0;t<r.length;t+=1)r[t]=0;var n=8*e.length;for(t=0;t<n;t+=8)r[t>>5]|=(255&e.charCodeAt(t/8))<<t%32;return r}function P(e){var t,r,n="";for(r=0;r<e.length;r+=1)t=e.charCodeAt(r),n+="0123456789abcdef".charAt(t>>>4&15)+"0123456789abcdef".charAt(15&t);return n}function I(e){return unescape(encodeURIComponent(e))}function U(e){return function(e){return H(M(L(e),8*e.length))}(I(e))}function N(e,t){return function(e,t){var r,n,o=L(e),i=[],a=[];for(i[15]=a[15]=void 0,o.length>16&&(o=M(o,8*e.length)),r=0;r<16;r+=1)i[r]=909522486^o[r],a[r]=1549556828^o[r];return n=M(i.concat(L(t)),512+8*t.length),H(M(a.concat(n),640))}(I(e),I(t))}var q=function(e,t,r){return t?r?N(t,e):P(N(t,e)):r?U(e):P(U(e))};function z(e){this.name="RavenConfigError",this.message=e}z.prototype=new Error,z.prototype.constructor=z;var K=z,W=function(e,t,r){var n=e[t],o=e;if(t in e){var i="warn"===t?"warning":t;e[t]=function(){var e=[].slice.call(arguments),a=E.safeJoin(e," "),s={level:i,logger:"console",extra:{arguments:e}};"assert"===t?!1===e[0]&&(a="Assertion failed: "+(E.safeJoin(e.slice(1)," ")||"console.assert"),s.extra.arguments=e.slice(1),r&&r(a,s)):r&&r(a,s),n&&Function.prototype.apply.call(n,o,e)}}},V=E.isErrorEvent,$=E.isDOMError,X=E.isDOMException,J=E.isError,G=E.isObject,Y=E.isPlainObject,Z=E.isUndefined,Q=E.isFunction,ee=E.isString,te=E.isArray,re=E.isEmptyObject,ne=E.each,oe=E.objectMerge,ie=E.truncate,ae=E.objectFrozen,se=E.hasKey,ce=E.joinRegExp,le=E.urlencode,ue=E.uuid4,he=E.htmlTreeAsString,pe=E.isSameException,fe=E.isSameStacktrace,de=E.parseUrl,ge=E.fill,me=E.supportsFetch,_e=E.supportsReferrerPolicy,ve=E.serializeKeysForMessage,be=E.serializeException,ye=E.sanitize,Ee=W,we="source protocol user pass host port path".split(" "),xe=/^(?:(\w+):)?\/\/(?:(\w+)(:\w+)?@)?([\w\.-]+)(?::(\d+))?(\/.*)/;function ke(){return+new Date}var Se="undefined"!=typeof window?window:void 0!==e?e:"undefined"!=typeof self?self:{},Oe=Se.document,Ce=Se.navigator;function Re(e,t){return Q(t)?function(r){return t(r,e)}:t}function je(){for(var e in this._hasJSON=!("object"!=typeof JSON||!JSON.stringify),this._hasDocument=!Z(Oe),this._hasNavigator=!Z(Ce),this._lastCapturedException=null,this._lastData=null,this._lastEventId=null,this._globalServer=null,this._globalKey=null,this._globalProject=null,this._globalContext={},this._globalOptions={release:Se.SENTRY_RELEASE&&Se.SENTRY_RELEASE.id,logger:"javascript",ignoreErrors:[],ignoreUrls:[],whitelistUrls:[],includePaths:[],headers:null,collectWindowErrors:!0,captureUnhandledRejections:!0,maxMessageLength:0,maxUrlLength:250,stackTraceLimit:50,autoBreadcrumbs:!0,instrument:!0,sampleRate:1,sanitizeKeys:[]},this._fetchDefaults={method:"POST",keepalive:!0,referrerPolicy:_e()?"origin":""},this._ignoreOnError=0,this._isRavenInstalled=!1,this._originalErrorStackTraceLimit=Error.stackTraceLimit,this._originalConsole=Se.console||{},this._originalConsoleMethods={},this._plugins=[],this._startTime=ke(),this._wrappedBuiltIns=[],this._breadcrumbs=[],this._lastCapturedEvent=null,this._keypressTimeout,this._location=Se.location,this._lastHref=this._location&&this._location.href,this._resetBackoff(),this._originalConsole)this._originalConsoleMethods[e]=this._originalConsole[e]}je.prototype={VERSION:"3.26.1",debug:!1,TraceKit:R,config:function(e,t){var r=this;if(r._globalServer)return this._logDebug("error","Error: Raven has already been configured"),r;if(!e)return r;var n=r._globalOptions;t&&ne(t,function(e,t){"tags"===e||"extra"===e||"user"===e?r._globalContext[e]=t:n[e]=t}),r.setDSN(e),n.ignoreErrors.push(/^Script error\.?$/),n.ignoreErrors.push(/^Javascript error: Script error\.? on line 0$/),n.ignoreErrors=ce(n.ignoreErrors),n.ignoreUrls=!!n.ignoreUrls.length&&ce(n.ignoreUrls),n.whitelistUrls=!!n.whitelistUrls.length&&ce(n.whitelistUrls),n.includePaths=ce(n.includePaths),n.maxBreadcrumbs=Math.max(0,Math.min(n.maxBreadcrumbs||100,100));var o={xhr:!0,console:!0,dom:!0,location:!0,sentry:!0},i=n.autoBreadcrumbs;"[object Object]"==={}.toString.call(i)?i=oe(o,i):!1!==i&&(i=o),n.autoBreadcrumbs=i;var a={tryCatch:!0},s=n.instrument;return"[object Object]"==={}.toString.call(s)?s=oe(a,s):!1!==s&&(s=a),n.instrument=s,R.collectWindowErrors=!!n.collectWindowErrors,r},install:function(){var e=this;return e.isSetup()&&!e._isRavenInstalled&&(R.report.subscribe(function(){e._handleOnErrorStackInfo.apply(e,arguments)}),e._globalOptions.captureUnhandledRejections&&e._attachPromiseRejectionHandler(),e._patchFunctionToString(),e._globalOptions.instrument&&e._globalOptions.instrument.tryCatch&&e._instrumentTryCatch(),e._globalOptions.autoBreadcrumbs&&e._instrumentBreadcrumbs(),e._drainPlugins(),e._isRavenInstalled=!0),Error.stackTraceLimit=e._globalOptions.stackTraceLimit,this},setDSN:function(e){var t=this._parseDSN(e),r=t.path.lastIndexOf("/"),n=t.path.substr(1,r);this._dsn=e,this._globalKey=t.user,this._globalSecret=t.pass&&t.pass.substr(1),this._globalProject=t.path.substr(r+1),this._globalServer=this._getGlobalServer(t),this._globalEndpoint=this._globalServer+"/"+n+"api/"+this._globalProject+"/store/",this._resetBackoff()},context:function(e,t,r){return Q(e)&&(r=t||[],t=e,e={}),this.wrap(e,t).apply(this,r)},wrap:function(e,t,r){var n=this;if(Z(t)&&!Q(e))return e;if(Q(e)&&(t=e,e=void 0),!Q(t))return t;try{if(t.__raven__)return t;if(t.__raven_wrapper__)return t.__raven_wrapper__}catch(e){return t}function o(){var o=[],i=arguments.length,a=!e||e&&!1!==e.deep;for(r&&Q(r)&&r.apply(this,arguments);i--;)o[i]=a?n.wrap(e,arguments[i]):arguments[i];try{return t.apply(this,o)}catch(t){throw n._ignoreNextOnError(),n.captureException(t,e),t}}for(var i in t)se(t,i)&&(o[i]=t[i]);return o.prototype=t.prototype,t.__raven_wrapper__=o,o.__raven__=!0,o.__orig__=t,o},uninstall:function(){return R.report.uninstall(),this._detachPromiseRejectionHandler(),this._unpatchFunctionToString(),this._restoreBuiltIns(),this._restoreConsole(),Error.stackTraceLimit=this._originalErrorStackTraceLimit,this._isRavenInstalled=!1,this},_promiseRejectionHandler:function(e){this._logDebug("debug","Raven caught unhandled promise rejection:",e),this.captureException(e.reason,{mechanism:{type:"onunhandledrejection",handled:!1}})},_attachPromiseRejectionHandler:function(){return this._promiseRejectionHandler=this._promiseRejectionHandler.bind(this),Se.addEventListener&&Se.addEventListener("unhandledrejection",this._promiseRejectionHandler),this},_detachPromiseRejectionHandler:function(){return Se.removeEventListener&&Se.removeEventListener("unhandledrejection",this._promiseRejectionHandler),this},captureException:function(e,t){if(t=oe({trimHeadFrames:0},t||{}),V(e)&&e.error)e=e.error;else{if($(e)||X(e)){var r=e.name||($(e)?"DOMError":"DOMException"),n=e.message?r+": "+e.message:r;return this.captureMessage(n,oe(t,{stacktrace:!0,trimHeadFrames:t.trimHeadFrames+1}))}if(J(e))e=e;else{if(!Y(e))return this.captureMessage(e,oe(t,{stacktrace:!0,trimHeadFrames:t.trimHeadFrames+1}));t=this._getCaptureExceptionOptionsFromPlainObject(t,e),e=new Error(t.message)}}this._lastCapturedException=e;try{var o=R.computeStackTrace(e);this._handleStackInfo(o,t)}catch(t){if(e!==t)throw t}return this},_getCaptureExceptionOptionsFromPlainObject:function(e,t){var r=Object.keys(t).sort(),n=oe(e,{message:"Non-Error exception captured with keys: "+ve(r),fingerprint:[q(r)],extra:e.extra||{}});return n.extra.__serialized__=be(t),n},captureMessage:function(e,t){if(!this._globalOptions.ignoreErrors.test||!this._globalOptions.ignoreErrors.test(e)){var r,n=oe({message:e+=""},t=t||{});try{throw new Error(e)}catch(e){r=e}r.name=null;var o=R.computeStackTrace(r),i=te(o.stack)&&o.stack[1];i&&"Raven.captureException"===i.func&&(i=o.stack[2]);var a=i&&i.url||"";if((!this._globalOptions.ignoreUrls.test||!this._globalOptions.ignoreUrls.test(a))&&(!this._globalOptions.whitelistUrls.test||this._globalOptions.whitelistUrls.test(a))){if(this._globalOptions.stacktrace||t&&t.stacktrace){n.fingerprint=null==n.fingerprint?e:n.fingerprint,(t=oe({trimHeadFrames:0},t)).trimHeadFrames+=1;var s=this._prepareFrames(o,t);n.stacktrace={frames:s.reverse()}}return n.fingerprint&&(n.fingerprint=te(n.fingerprint)?n.fingerprint:[n.fingerprint]),this._send(n),this}}},captureBreadcrumb:function(e){var t=oe({timestamp:ke()/1e3},e);if(Q(this._globalOptions.breadcrumbCallback)){var r=this._globalOptions.breadcrumbCallback(t);if(G(r)&&!re(r))t=r;else if(!1===r)return this}return this._breadcrumbs.push(t),this._breadcrumbs.length>this._globalOptions.maxBreadcrumbs&&this._breadcrumbs.shift(),this},addPlugin:function(e){var t=[].slice.call(arguments,1);return this._plugins.push([e,t]),this._isRavenInstalled&&this._drainPlugins(),this},setUserContext:function(e){return this._globalContext.user=e,this},setExtraContext:function(e){return this._mergeContext("extra",e),this},setTagsContext:function(e){return this._mergeContext("tags",e),this},clearContext:function(){return this._globalContext={},this},getContext:function(){return JSON.parse(r(this._globalContext))},setEnvironment:function(e){return this._globalOptions.environment=e,this},setRelease:function(e){return this._globalOptions.release=e,this},setDataCallback:function(e){var t=this._globalOptions.dataCallback;return this._globalOptions.dataCallback=Re(t,e),this},setBreadcrumbCallback:function(e){var t=this._globalOptions.breadcrumbCallback;return this._globalOptions.breadcrumbCallback=Re(t,e),this},setShouldSendCallback:function(e){var t=this._globalOptions.shouldSendCallback;return this._globalOptions.shouldSendCallback=Re(t,e),this},setTransport:function(e){return this._globalOptions.transport=e,this},lastException:function(){return this._lastCapturedException},lastEventId:function(){return this._lastEventId},isSetup:function(){return!!this._hasJSON&&(!!this._globalServer||(this.ravenNotConfiguredError||(this.ravenNotConfiguredError=!0,this._logDebug("error","Error: Raven has not been configured.")),!1))},afterLoad:function(){var e=Se.RavenConfig;e&&this.config(e.dsn,e.config).install()},showReportDialog:function(e){if(Oe){var t=(e=e||{}).eventId||this.lastEventId();if(!t)throw new K("Missing eventId");var r=e.dsn||this._dsn;if(!r)throw new K("Missing DSN");var n=encodeURIComponent,o="";o+="?eventId="+n(t),o+="&dsn="+n(r);var i=e.user||this._globalContext.user;i&&(i.name&&(o+="&name="+n(i.name)),i.email&&(o+="&email="+n(i.email)));var a=this._getGlobalServer(this._parseDSN(r)),s=Oe.createElement("script");s.async=!0,s.src=a+"/api/embed/error-page/"+o,(Oe.head||Oe.body).appendChild(s)}},_ignoreNextOnError:function(){var e=this;this._ignoreOnError+=1,setTimeout(function(){e._ignoreOnError-=1})},_triggerEvent:function(e,t){var r,n;if(this._hasDocument){for(n in t=t||{},e="raven"+e.substr(0,1).toUpperCase()+e.substr(1),Oe.createEvent?(r=Oe.createEvent("HTMLEvents")).initEvent(e,!0,!0):(r=Oe.createEventObject()).eventType=e,t)se(t,n)&&(r[n]=t[n]);if(Oe.createEvent)Oe.dispatchEvent(r);else try{Oe.fireEvent("on"+r.eventType.toLowerCase(),r)}catch(e){}}},_breadcrumbEventHandler:function(e){var t=this;return function(r){if(t._keypressTimeout=null,t._lastCapturedEvent!==r){var n;t._lastCapturedEvent=r;try{n=he(r.target)}catch(e){n="<unknown>"}t.captureBreadcrumb({category:"ui."+e,message:n})}}},_keypressEventHandler:function(){var e=this;return function(t){var r;try{r=t.target}catch(e){return}var n=r&&r.tagName;if(n&&("INPUT"===n||"TEXTAREA"===n||r.isContentEditable)){var o=e._keypressTimeout;o||e._breadcrumbEventHandler("input")(t),clearTimeout(o),e._keypressTimeout=setTimeout(function(){e._keypressTimeout=null},1e3)}}},_captureUrlChange:function(e,t){var r=de(this._location.href),n=de(t),o=de(e);this._lastHref=t,r.protocol===n.protocol&&r.host===n.host&&(t=n.relative),r.protocol===o.protocol&&r.host===o.host&&(e=o.relative),this.captureBreadcrumb({category:"navigation",data:{to:t,from:e}})},_patchFunctionToString:function(){var e=this;e._originalFunctionToString=Function.prototype.toString,Function.prototype.toString=function(){return"function"==typeof this&&this.__raven__?e._originalFunctionToString.apply(this.__orig__,arguments):e._originalFunctionToString.apply(this,arguments)}},_unpatchFunctionToString:function(){this._originalFunctionToString&&(Function.prototype.toString=this._originalFunctionToString)},_instrumentTryCatch:function(){var e=this,t=e._wrappedBuiltIns;function r(t){return function(r,n){for(var o=new Array(arguments.length),i=0;i<o.length;++i)o[i]=arguments[i];var a=o[0];return Q(a)&&(o[0]=e.wrap({mechanism:{type:"instrument",data:{function:t.name}}},a)),t.apply?t.apply(this,o):t(o[0],o[1])}}var n=this._globalOptions.autoBreadcrumbs;function o(r){var o=Se[r]&&Se[r].prototype;o&&o.hasOwnProperty&&o.hasOwnProperty("addEventListener")&&(ge(o,"addEventListener",function(t){return function(o,i,a,s){try{i&&i.handleEvent&&(i.handleEvent=e.wrap({mechanism:{type:"instrument",data:{target:r,function:"handleEvent",handler:i.name}}},i.handleEvent))}catch(e){}var c,l,u;return n&&n.dom&&("EventTarget"===r||"Node"===r)&&(l=e._breadcrumbEventHandler("click"),u=e._keypressEventHandler(),c=function(e){if(e){var t;try{t=e.type}catch(e){return}return"click"===t?l(e):"keypress"===t?u(e):void 0}}),t.call(this,o,e.wrap({mechanism:{type:"instrument",data:{target:r,function:"addEventListener",handler:i.name}}},i,c),a,s)}},t),ge(o,"removeEventListener",function(e){return function(t,r,n,o){try{r=r&&(r.__raven_wrapper__?r.__raven_wrapper__:r)}catch(e){}return e.call(this,t,r,n,o)}},t))}ge(Se,"setTimeout",r,t),ge(Se,"setInterval",r,t),Se.requestAnimationFrame&&ge(Se,"requestAnimationFrame",function(t){return function(r){return t(e.wrap({mechanism:{type:"instrument",data:{function:"requestAnimationFrame",handler:t.name}}},r))}},t);for(var i=["EventTarget","Window","Node","ApplicationCache","AudioTrackList","ChannelMergerNode","CryptoOperation","EventSource","FileReader","HTMLUnknownElement","IDBDatabase","IDBRequest","IDBTransaction","KeyOperation","MediaController","MessagePort","ModalWindow","Notification","SVGElementInstance","Screen","TextTrack","TextTrackCue","TextTrackList","WebSocket","WebSocketWorker","Worker","XMLHttpRequest","XMLHttpRequestEventTarget","XMLHttpRequestUpload"],a=0;a<i.length;a++)o(i[a])},_instrumentBreadcrumbs:function(){var e=this,t=this._globalOptions.autoBreadcrumbs,r=e._wrappedBuiltIns;function n(t,r){t in r&&Q(r[t])&&ge(r,t,function(r){return e.wrap({mechanism:{type:"instrument",data:{function:t,handler:r.name}}},r)})}if(t.xhr&&"XMLHttpRequest"in Se){var o=Se.XMLHttpRequest&&Se.XMLHttpRequest.prototype;ge(o,"open",function(t){return function(r,n){return ee(n)&&-1===n.indexOf(e._globalKey)&&(this.__raven_xhr={method:r,url:n,status_code:null}),t.apply(this,arguments)}},r),ge(o,"send",function(t){return function(){var r=this;function o(){if(r.__raven_xhr&&4===r.readyState){try{r.__raven_xhr.status_code=r.status}catch(e){}e.captureBreadcrumb({type:"http",category:"xhr",data:r.__raven_xhr})}}for(var i=["onload","onerror","onprogress"],a=0;a<i.length;a++)n(i[a],r);return"onreadystatechange"in r&&Q(r.onreadystatechange)?ge(r,"onreadystatechange",function(t){return e.wrap({mechanism:{type:"instrument",data:{function:"onreadystatechange",handler:t.name}}},t,o)}):r.onreadystatechange=o,t.apply(this,arguments)}},r)}t.xhr&&me()&&ge(Se,"fetch",function(t){return function(){for(var r=new Array(arguments.length),n=0;n<r.length;++n)r[n]=arguments[n];var o,i=r[0],a="GET";if("string"==typeof i?o=i:"Request"in Se&&i instanceof Se.Request?(o=i.url,i.method&&(a=i.method)):o=""+i,-1!==o.indexOf(e._globalKey))return t.apply(this,r);r[1]&&r[1].method&&(a=r[1].method);var s={method:a,url:o,status_code:null};return t.apply(this,r).then(function(t){return s.status_code=t.status,e.captureBreadcrumb({type:"http",category:"fetch",data:s}),t}).catch(function(t){throw e.captureBreadcrumb({type:"http",category:"fetch",data:s,level:"error"}),t})}},r),t.dom&&this._hasDocument&&(Oe.addEventListener?(Oe.addEventListener("click",e._breadcrumbEventHandler("click"),!1),Oe.addEventListener("keypress",e._keypressEventHandler(),!1)):Oe.attachEvent&&(Oe.attachEvent("onclick",e._breadcrumbEventHandler("click")),Oe.attachEvent("onkeypress",e._keypressEventHandler())));var i=Se.chrome,a=!(i&&i.app&&i.app.runtime)&&Se.history&&Se.history.pushState&&Se.history.replaceState;if(t.location&&a){var s=Se.onpopstate;Se.onpopstate=function(){var t=e._location.href;if(e._captureUrlChange(e._lastHref,t),s)return s.apply(this,arguments)};var c=function(t){return function(){var r=arguments.length>2?arguments[2]:void 0;return r&&e._captureUrlChange(e._lastHref,r+""),t.apply(this,arguments)}};ge(Se.history,"pushState",c,r),ge(Se.history,"replaceState",c,r)}if(t.console&&"console"in Se&&console.log){var l=function(t,r){e.captureBreadcrumb({message:t,level:r.level,category:"console"})};ne(["debug","info","warn","error","log"],function(e,t){Ee(console,t,l)})}},_restoreBuiltIns:function(){for(var e;this._wrappedBuiltIns.length;){var t=(e=this._wrappedBuiltIns.shift())[0],r=e[1],n=e[2];t[r]=n}},_restoreConsole:function(){for(var e in this._originalConsoleMethods)this._originalConsole[e]=this._originalConsoleMethods[e]},_drainPlugins:function(){var e=this;ne(this._plugins,function(t,r){var n=r[0],o=r[1];n.apply(e,[e].concat(o))})},_parseDSN:function(e){var t=xe.exec(e),r={},n=7;try{for(;n--;)r[we[n]]=t[n]||""}catch(t){throw new K("Invalid DSN: "+e)}if(r.pass&&!this._globalOptions.allowSecretKey)throw new K("Do not specify your secret key in the DSN. See: http://bit.ly/raven-secret-key");return r},_getGlobalServer:function(e){var t="//"+e.host+(e.port?":"+e.port:"");return e.protocol&&(t=e.protocol+":"+t),t},_handleOnErrorStackInfo:function(e,t){(t=t||{}).mechanism=t.mechanism||{type:"onerror",handled:!1},this._ignoreOnError||this._handleStackInfo(e,t)},_handleStackInfo:function(e,t){var r=this._prepareFrames(e,t);this._triggerEvent("handle",{stackInfo:e,options:t}),this._processException(e.name,e.message,e.url,e.lineno,r,t)},_prepareFrames:function(e,t){var r=this,n=[];if(e.stack&&e.stack.length&&(ne(e.stack,function(t,o){var i=r._normalizeFrame(o,e.url);i&&n.push(i)}),t&&t.trimHeadFrames))for(var o=0;o<t.trimHeadFrames&&o<n.length;o++)n[o].in_app=!1;return n=n.slice(0,this._globalOptions.stackTraceLimit)},_normalizeFrame:function(e,t){var r={filename:e.url,lineno:e.line,colno:e.column,function:e.func||"?"};return e.url||(r.filename=t),r.in_app=!(this._globalOptions.includePaths.test&&!this._globalOptions.includePaths.test(r.filename)||/(Raven|TraceKit)\./.test(r.function)||/raven\.(min\.)?js$/.test(r.filename)),r},_processException:function(e,t,r,n,o,i){var a,s=(e?e+": ":"")+(t||"");if((!this._globalOptions.ignoreErrors.test||!this._globalOptions.ignoreErrors.test(t)&&!this._globalOptions.ignoreErrors.test(s))&&(o&&o.length?(r=o[0].filename||r,o.reverse(),a={frames:o}):r&&(a={frames:[{filename:r,lineno:n,in_app:!0}]}),(!this._globalOptions.ignoreUrls.test||!this._globalOptions.ignoreUrls.test(r))&&(!this._globalOptions.whitelistUrls.test||this._globalOptions.whitelistUrls.test(r)))){var c=oe({exception:{values:[{type:e,value:t,stacktrace:a}]},transaction:r},i);!c.exception.mechanism&&c.mechanism&&(c.exception.mechanism=c.mechanism,delete c.mechanism),c.exception.mechanism=oe(c.exception.mechanism||{},{type:"generic",handled:!0}),this._send(c)}},_trimPacket:function(e){var t=this._globalOptions.maxMessageLength;if(e.message&&(e.message=ie(e.message,t)),e.exception){var r=e.exception.values[0];r.value=ie(r.value,t)}var n=e.request;return n&&(n.url&&(n.url=ie(n.url,this._globalOptions.maxUrlLength)),n.Referer&&(n.Referer=ie(n.Referer,this._globalOptions.maxUrlLength))),e.breadcrumbs&&e.breadcrumbs.values&&this._trimBreadcrumbs(e.breadcrumbs),e},_trimBreadcrumbs:function(e){for(var t,r,n,o=["to","from","url"],i=0;i<e.values.length;++i)if((r=e.values[i]).hasOwnProperty("data")&&G(r.data)&&!ae(r.data)){n=oe({},r.data);for(var a=0;a<o.length;++a)t=o[a],n.hasOwnProperty(t)&&n[t]&&(n[t]=ie(n[t],this._globalOptions.maxUrlLength));e.values[i].data=n}},_getHttpData:function(){if(this._hasNavigator||this._hasDocument){var e={};return this._hasNavigator&&Ce.userAgent&&(e.headers={"User-Agent":Ce.userAgent}),Se.location&&Se.location.href&&(e.url=Se.location.href),this._hasDocument&&Oe.referrer&&(e.headers||(e.headers={}),e.headers.Referer=Oe.referrer),e}},_resetBackoff:function(){this._backoffDuration=0,this._backoffStart=null},_shouldBackoff:function(){return this._backoffDuration&&ke()-this._backoffStart<this._backoffDuration},_isRepeatData:function(e){var t=this._lastData;return!(!t||e.message!==t.message||e.transaction!==t.transaction)&&(e.stacktrace||t.stacktrace?fe(e.stacktrace,t.stacktrace):!e.exception&&!t.exception||pe(e.exception,t.exception))},_setBackoffState:function(e){if(!this._shouldBackoff()){var t=e.status;if(400===t||401===t||429===t){var r;try{r=me()?e.headers.get("Retry-After"):e.getResponseHeader("Retry-After"),r=1e3*parseInt(r,10)}catch(e){}this._backoffDuration=r||(2*this._backoffDuration||1e3),this._backoffStart=ke()}}},_send:function(e){var t=this._globalOptions,r={project:this._globalProject,logger:t.logger,platform:"javascript"},n=this._getHttpData();n&&(r.request=n),e.trimHeadFrames&&delete e.trimHeadFrames,(e=oe(r,e)).tags=oe(oe({},this._globalContext.tags),e.tags),e.extra=oe(oe({},this._globalContext.extra),e.extra),e.extra["session:duration"]=ke()-this._startTime,this._breadcrumbs&&this._breadcrumbs.length>0&&(e.breadcrumbs={values:[].slice.call(this._breadcrumbs,0)}),this._globalContext.user&&(e.user=this._globalContext.user),t.environment&&(e.environment=t.environment),t.release&&(e.release=t.release),t.serverName&&(e.server_name=t.serverName),e=this._sanitizeData(e),Object.keys(e).forEach(function(t){(null==e[t]||""===e[t]||re(e[t]))&&delete e[t]}),Q(t.dataCallback)&&(e=t.dataCallback(e)||e),e&&!re(e)&&(Q(t.shouldSendCallback)&&!t.shouldSendCallback(e)||(this._shouldBackoff()?this._logDebug("warn","Raven dropped error due to backoff: ",e):"number"==typeof t.sampleRate?Math.random()<t.sampleRate&&this._sendProcessedPayload(e):this._sendProcessedPayload(e)))},_sanitizeData:function(e){return ye(e,this._globalOptions.sanitizeKeys)},_getUuid:function(){return ue()},_sendProcessedPayload:function(e,t){var r=this,n=this._globalOptions;if(this.isSetup())if(e=this._trimPacket(e),this._globalOptions.allowDuplicates||!this._isRepeatData(e)){this._lastEventId=e.event_id||(e.event_id=this._getUuid()),this._lastData=e,this._logDebug("debug","Raven about to send:",e);var o={sentry_version:"7",sentry_client:"raven-js/"+this.VERSION,sentry_key:this._globalKey};this._globalSecret&&(o.sentry_secret=this._globalSecret);var i=e.exception&&e.exception.values[0];this._globalOptions.autoBreadcrumbs&&this._globalOptions.autoBreadcrumbs.sentry&&this.captureBreadcrumb({category:"sentry",message:i?(i.type?i.type+": ":"")+i.value:e.message,event_id:e.event_id,level:e.level||"error"});var a=this._globalEndpoint;(n.transport||this._makeRequest).call(this,{url:a,auth:o,data:e,options:n,onSuccess:function(){r._resetBackoff(),r._triggerEvent("success",{data:e,src:a}),t&&t()},onError:function(n){r._logDebug("error","Raven transport failed to send: ",n),n.request&&r._setBackoffState(n.request),r._triggerEvent("failure",{data:e,src:a}),n=n||new Error("Raven send failed (no additional details provided)"),t&&t(n)}})}else this._logDebug("warn","Raven dropped repeat event: ",e)},_makeRequest:function(e){var t=e.url+"?"+le(e.auth),n=null,o={};if(e.options.headers&&(n=this._evaluateHash(e.options.headers)),e.options.fetchParameters&&(o=this._evaluateHash(e.options.fetchParameters)),me()){o.body=r(e.data);var i=oe({},this._fetchDefaults),a=oe(i,o);return n&&(a.headers=n),Se.fetch(t,a).then(function(t){if(t.ok)e.onSuccess&&e.onSuccess();else{var r=new Error("Sentry error code: "+t.status);r.request=t,e.onError&&e.onError(r)}}).catch(function(){e.onError&&e.onError(new Error("Sentry error code: network unavailable"))})}var s=Se.XMLHttpRequest&&new Se.XMLHttpRequest;s&&(("withCredentials"in s||"undefined"!=typeof XDomainRequest)&&("withCredentials"in s?s.onreadystatechange=function(){if(4===s.readyState)if(200===s.status)e.onSuccess&&e.onSuccess();else if(e.onError){var t=new Error("Sentry error code: "+s.status);t.request=s,e.onError(t)}}:(s=new XDomainRequest,t=t.replace(/^https?:/,""),e.onSuccess&&(s.onload=e.onSuccess),e.onError&&(s.onerror=function(){var t=new Error("Sentry error code: XDomainRequest");t.request=s,e.onError(t)})),s.open("POST",t),n&&ne(n,function(e,t){s.setRequestHeader(e,t)}),s.send(r(e.data))))},_evaluateHash:function(e){var t={};for(var r in e)if(e.hasOwnProperty(r)){var n=e[r];t[r]="function"==typeof n?n():n}return t},_logDebug:function(e){this._originalConsoleMethods[e]&&(this.debug||this._globalOptions.debug)&&Function.prototype.apply.call(this._originalConsoleMethods[e],this._originalConsole,[].slice.call(arguments,1))},_mergeContext:function(e,t){Z(t)?delete this._globalContext[e]:this._globalContext[e]=oe(this._globalContext[e]||{},t)}},je.prototype.setUser=je.prototype.setUserContext,je.prototype.setReleaseContext=je.prototype.setRelease;var Te=je,Fe="undefined"!=typeof window?window:void 0!==e?e:"undefined"!=typeof self?self:{},De=Fe.Raven,Ae=new Te;Ae.noConflict=function(){return Fe.Raven=De,Ae},Ae.afterLoad();var Be,Me,He,Le,Pe,Ie,Ue,Ne=Ae,qe=Te;Ne.Client=qe,(Ue="plyr.io"===window.location.host)&&Ne.config("https://d4ad9866ad834437a4754e23937071e4@sentry.io/305555").install(),document.addEventListener("DOMContentLoaded",function(){Ne.context(function(){window.shr&&window.shr.setup({count:{classname:"button__count"}}),document.addEventListener("focusout",function(e){e.target.classList.remove("tab-focus")}),document.addEventListener("keydown",function(e){9===e.keyCode&&setTimeout(function(){document.activeElement.classList.add("tab-focus")},0)});var e=new Plyr("#player",{debug:!0,title:"View From A Blue Moon",iconUrl:"../dist/plyr.svg",keyboard:{global:!0},tooltips:{controls:!0},captions:{active:!0},keys:{google:"AIzaSyDrNwtN3nLH_8rjCmu5Wq3ZCm4MNAVdc0c"},ads:{enabled:!0,publisherId:"918848828995742"}});window.player=e;var t=document.querySelectorAll("[data-source]"),r={video:"video",audio:"audio",youtube:"youtube",vimeo:"vimeo"},n=window.location.hash.replace("#",""),o=window.history&&window.history.pushState;function i(e,t,r){e&&e.classList[r?"add":"remove"](t)}function a(o,a){if(o in r&&(a||o!==n)&&(n.length||o!==r.video)){switch(o){case r.video:e.source={type:"video",title:"View From A Blue Moon",sources:[{src:"https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-576p.mp4",type:"video/mp4",size:576},{src:"https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-720p.mp4",type:"video/mp4",size:720},{src:"https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-1080p.mp4",type:"video/mp4",size:1080},{src:"https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-1440p.mp4",type:"video/mp4",size:1440}],poster:"https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg",tracks:[{kind:"captions",label:"English",srclang:"en",src:"https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt",default:!0},{kind:"captions",label:"French",srclang:"fr",src:"https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt"}]};break;case r.audio:e.source={type:"audio",title:"Kishi Bashi &ndash; &ldquo;It All Began With A Burst&rdquo;",sources:[{src:"https://cdn.plyr.io/static/demo/Kishi_Bashi_-_It_All_Began_With_a_Burst.mp3",type:"audio/mp3"},{src:"https://cdn.plyr.io/static/demo/Kishi_Bashi_-_It_All_Began_With_a_Burst.ogg",type:"audio/ogg"}]};break;case r.youtube:e.source={type:"video",sources:[{src:"https://youtube.com/watch?v=bTqVqk7FSmY",provider:"youtube"}]};break;case r.vimeo:e.source={type:"video",sources:[{src:"https://vimeo.com/76979871",provider:"vimeo"}]}}n=o,Array.from(t).forEach(function(e){return i(e.parentElement,"active",!1)}),i(document.querySelector('[data-source="'+o+'"]'),"active",!0),Array.from(document.querySelectorAll(".plyr__cite")).forEach(function(e){e.setAttribute("hidden","")}),document.querySelector(".plyr__cite--"+o).removeAttribute("hidden")}}if(Array.from(t).forEach(function(e){e.addEventListener("click",function(){var t=e.getAttribute("data-source");a(t),o&&window.history.pushState({type:t},"","#"+t)})}),window.addEventListener("popstate",function(e){e.state&&"type"in e.state&&a(e.state.type)}),o){var s=!n.length;s&&(n=r.video),n in r&&window.history.replaceState({type:n},"",s?"":"#"+n),n!==r.video&&a(n,!0)}})}),Ue&&(Be=window,Me=document,He="script",Le="ga",Be.GoogleAnalyticsObject=Le,Be.ga=Be.ga||function(){(Be.ga.q=Be.ga.q||[]).push(arguments)},Be.ga.l=1*new Date,Pe=Me.createElement(He),Ie=Me.getElementsByTagName(He)[0],Pe.async=1,Pe.src="https://www.google-analytics.com/analytics.js",Ie.parentNode.insertBefore(Pe,Ie),window.ga("create","UA-40881672-11","auto"),window.ga("send","pageview"))}();
+"object"==typeof navigator&&function(){"use strict";var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};var t,r=(function(e,t){function r(e,t){for(var r=0;r<e.length;++r)if(e[r]===t)return r;return-1}function n(e,t){var n=[],o=[];return null==t&&(t=function(e,t){return n[0]===t?"[Circular ~]":"[Circular ~."+o.slice(0,r(n,t)).join(".")+"]"}),function(i,a){if(n.length>0){var s=r(n,this);~s?n.splice(s+1):n.push(this),~s?o.splice(s,1/0,i):o.push(i),~r(n,a)&&(a=t.call(this,i,a))}else n.push(a);return null==e?a instanceof Error?function(e){var t={stack:e.stack,message:e.message,name:e.name};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t}(a):a:e.call(this,i,a)}}(e.exports=function(e,t,r,o){return JSON.stringify(e,n(t,o),r)}).getSerialize=n}(t={exports:{}},t.exports),t.exports),n=(r.getSerialize,"undefined"!=typeof window?window:void 0!==e?e:"undefined"!=typeof self?self:{});function o(e){return void 0===e}function i(e){return"[object Object]"===Object.prototype.toString.call(e)}function a(e){return"[object String]"===Object.prototype.toString.call(e)}function s(e){return"[object Array]"===Object.prototype.toString.call(e)}function c(){if(!("fetch"in n))return!1;try{return new Headers,new Request(""),new Response,!0}catch(e){return!1}}function l(e,t){var r,n;if(o(e.length))for(r in e)h(e,r)&&t.call(null,r,e[r]);else if(n=e.length)for(r=0;r<n;r++)t.call(null,r,e[r])}function u(e,t){if("number"!=typeof t)throw new Error("2nd argument to `truncate` function should be a number");return"string"!=typeof e||0===t?e:e.length<=t?e:e.substr(0,t)+"…"}function h(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function p(e){for(var t,r=[],n=0,o=e.length;n<o;n++)a(t=e[n])?r.push(t.replace(/([.*+?^=!:${}()|\[\]\/\\])/g,"\\$1")):t&&t.source&&r.push(t.source);return new RegExp(r.join("|"),"i")}function f(e){var t,r,n,o,i,s=[];if(!e||!e.tagName)return"";if(s.push(e.tagName.toLowerCase()),e.id&&s.push("#"+e.id),(t=e.className)&&a(t))for(r=t.split(/\s+/),i=0;i<r.length;i++)s.push("."+r[i]);var c=["type","name","title","alt"];for(i=0;i<c.length;i++)n=c[i],(o=e.getAttribute(n))&&s.push("["+n+'="'+o+'"]');return s.join("")}function d(e,t){return!!(!!e^!!t)}function g(e,t){if(d(e,t))return!1;var r,n,o=e.frames,i=t.frames;if(void 0===o||void 0===i)return!1;if(o.length!==i.length)return!1;for(var a=0;a<o.length;a++)if(r=o[a],n=i[a],r.filename!==n.filename||r.lineno!==n.lineno||r.colno!==n.colno||r.function!==n.function)return!1;return!0}var m=3,_=51200,v=40;function b(e){return function(e){return~-encodeURI(e).split(/%..|./).length}(JSON.stringify(e))}function y(e){if("string"==typeof e){return u(e,40)}if("number"==typeof e||"boolean"==typeof e||void 0===e)return e;var t=Object.prototype.toString.call(e);return"[object Object]"===t?"[Object]":"[object Array]"===t?"[Array]":"[object Function]"===t?e.name?"[Function: "+e.name+"]":"[Function]":e}var E={isObject:function(e){return"object"==typeof e&&null!==e},isError:function(e){switch(Object.prototype.toString.call(e)){case"[object Error]":case"[object Exception]":case"[object DOMException]":return!0;default:return e instanceof Error}},isErrorEvent:function(e){return"[object ErrorEvent]"===Object.prototype.toString.call(e)},isDOMError:function(e){return"[object DOMError]"===Object.prototype.toString.call(e)},isDOMException:function(e){return"[object DOMException]"===Object.prototype.toString.call(e)},isUndefined:o,isFunction:function(e){return"function"==typeof e},isPlainObject:i,isString:a,isArray:s,isEmptyObject:function(e){if(!i(e))return!1;for(var t in e)if(e.hasOwnProperty(t))return!1;return!0},supportsErrorEvent:function(){try{return new ErrorEvent(""),!0}catch(e){return!1}},supportsDOMError:function(){try{return new DOMError(""),!0}catch(e){return!1}},supportsDOMException:function(){try{return new DOMException(""),!0}catch(e){return!1}},supportsFetch:c,supportsReferrerPolicy:function(){if(!c())return!1;try{return new Request("pickleRick",{referrerPolicy:"origin"}),!0}catch(e){return!1}},supportsPromiseRejectionEvent:function(){return"function"==typeof PromiseRejectionEvent},wrappedCallback:function(e){return function(t,r){var n=e(t)||t;return r&&r(n)||n}},each:l,objectMerge:function(e,t){return t?(l(t,function(t,r){e[t]=r}),e):e},truncate:u,objectFrozen:function(e){return!!Object.isFrozen&&Object.isFrozen(e)},hasKey:h,joinRegExp:p,urlencode:function(e){var t=[];return l(e,function(e,r){t.push(encodeURIComponent(e)+"="+encodeURIComponent(r))}),t.join("&")},uuid4:function(){var e=n.crypto||n.msCrypto;if(!o(e)&&e.getRandomValues){var t=new Uint16Array(8);e.getRandomValues(t),t[3]=4095&t[3]|16384,t[4]=16383&t[4]|32768;var r=function(e){for(var t=e.toString(16);t.length<4;)t="0"+t;return t};return r(t[0])+r(t[1])+r(t[2])+r(t[3])+r(t[4])+r(t[5])+r(t[6])+r(t[7])}return"xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx".replace(/[xy]/g,function(e){var t=16*Math.random()|0;return("x"===e?t:3&t|8).toString(16)})},htmlTreeAsString:function(e){for(var t,r=[],n=0,o=0,i=" > ".length;e&&n++<5&&!("html"===(t=f(e))||n>1&&o+r.length*i+t.length>=80);)r.push(t),o+=t.length,e=e.parentNode;return r.reverse().join(" > ")},htmlElementAsString:f,isSameException:function(e,t){return!d(e,t)&&(e=e.values[0],t=t.values[0],e.type===t.type&&e.value===t.value&&(r=e.stacktrace,n=t.stacktrace,(!o(r)||!o(n))&&g(e.stacktrace,t.stacktrace)));var r,n},isSameStacktrace:g,parseUrl:function(e){if("string"!=typeof e)return{};var t=e.match(/^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?$/),r=t[6]||"",n=t[8]||"";return{protocol:t[2],host:t[4],path:t[5],relative:t[5]+r+n}},fill:function(e,t,r,n){if(null!=e){var o=e[t];e[t]=r(o),e[t].__raven__=!0,e[t].__orig__=o,n&&n.push([e,t,o])}},safeJoin:function(e,t){if(!s(e))return"";for(var r=[],n=0;n<e.length;n++)try{r.push(String(e[n]))}catch(e){r.push("[value cannot be serialized]")}return r.join(t)},serializeException:function e(t,n,o){if(!i(t))return t;o="number"!=typeof(n="number"!=typeof n?m:n)?_:o;var a=function e(t,r){return 0===r?y(t):i(t)?Object.keys(t).reduce(function(n,o){return n[o]=e(t[o],r-1),n},{}):Array.isArray(t)?t.map(function(t){return e(t,r-1)}):y(t)}(t,n);return b(r(a))>o?e(t,n-1):a},serializeKeysForMessage:function(e,t){if("number"==typeof e||"string"==typeof e)return e.toString();if(!Array.isArray(e))return"";if(0===(e=e.filter(function(e){return"string"==typeof e})).length)return"[object has no keys]";if(t="number"!=typeof t?v:t,e[0].length>=t)return e[0];for(var r=e.length;r>0;r--){var n=e.slice(0,r).join(", ");if(!(n.length>t))return r===e.length?n:n+"…"}return""},sanitize:function(e,t){if(!s(t)||s(t)&&0===t.length)return e;var n,o=p(t),a="********";try{n=JSON.parse(r(e))}catch(t){return e}return function e(t){return s(t)?t.map(function(t){return e(t)}):i(t)?Object.keys(t).reduce(function(r,n){return o.test(n)?r[n]=a:r[n]=e(t[n]),r},{}):t}(n)}},w={collectWindowErrors:!0,debug:!1},x="undefined"!=typeof window?window:void 0!==e?e:"undefined"!=typeof self?self:{},k=[].slice,S="?",O=/^(?:[Uu]ncaught (?:exception: )?)?(?:((?:Eval|Internal|Range|Reference|Syntax|Type|URI|)Error): )?(.*)$/;function C(){return"undefined"==typeof document||null==document.location?"":document.location.href}w.report=function(){var e,t,r=[],n=null,o=null,i=null;function a(e,t){var n=null;if(!t||w.collectWindowErrors){for(var o in r)if(r.hasOwnProperty(o))try{r[o].apply(null,[e].concat(k.call(arguments,2)))}catch(e){n=e}if(n)throw n}}function s(t,r,n,o,s){var l=E.isErrorEvent(s)?s.error:s,u=E.isErrorEvent(t)?t.message:t;if(i)w.computeStackTrace.augmentStackTraceWithInitialElement(i,r,n,u),c();else if(l&&E.isError(l))a(w.computeStackTrace(l),!0);else{var h,p={url:r,line:n,column:o},f=void 0;if("[object String]"==={}.toString.call(u))(h=u.match(O))&&(f=h[1],u=h[2]);p.func=S,a({name:f,message:u,url:C(),stack:[p]},!0)}return!!e&&e.apply(this,arguments)}function c(){var e=i,t=n;n=null,i=null,o=null,a.apply(null,[e,!1].concat(t))}function l(e,t){var r=k.call(arguments,1);if(i){if(o===e)return;c()}var a=w.computeStackTrace(e);if(i=a,o=e,n=r,setTimeout(function(){o===e&&c()},a.incomplete?2e3:0),!1!==t)throw e}return l.subscribe=function(n){t||(e=x.onerror,x.onerror=s,t=!0),r.push(n)},l.unsubscribe=function(e){for(var t=r.length-1;t>=0;--t)r[t]===e&&r.splice(t,1)},l.uninstall=function(){t&&(x.onerror=e,t=!1,e=void 0),r=[]},l}(),w.computeStackTrace=function(){function e(e){if(void 0!==e.stack&&e.stack){for(var t,r,n,o=/^\s*at (?:(.*?) ?\()?((?:file|https?|blob|chrome-extension|native|eval|webpack|<anonymous>|[a-z]:|\/).*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i,i=/^\s*at (?:((?:\[object object\])?.+) )?\(?((?:file|ms-appx(?:-web)|https?|webpack|blob):.*?):(\d+)(?::(\d+))?\)?\s*$/i,a=/^\s*(.*?)(?:\((.*?)\))?(?:^|@)((?:file|https?|blob|chrome|webpack|resource|moz-extension).*?:\/.*?|\[native code\]|[^@]*bundle)(?::(\d+))?(?::(\d+))?\s*$/i,s=/(\S+) line (\d+)(?: > eval line \d+)* > eval/i,c=/\((\S*)(?::(\d+))(?::(\d+))\)/,l=e.stack.split("\n"),u=[],h=(/^(.*) is undefined$/.exec(e.message),0),p=l.length;h<p;++h){if(r=o.exec(l[h])){var f=r[2]&&0===r[2].indexOf("native");r[2]&&0===r[2].indexOf("eval")&&(t=c.exec(r[2]))&&(r[2]=t[1],r[3]=t[2],r[4]=t[3]),n={url:f?null:r[2],func:r[1]||S,args:f?[r[2]]:[],line:r[3]?+r[3]:null,column:r[4]?+r[4]:null}}else if(r=i.exec(l[h]))n={url:r[2],func:r[1]||S,args:[],line:+r[3],column:r[4]?+r[4]:null};else{if(!(r=a.exec(l[h])))continue;r[3]&&r[3].indexOf(" > eval")>-1&&(t=s.exec(r[3]))?(r[3]=t[1],r[4]=t[2],r[5]=null):0!==h||r[5]||void 0===e.columnNumber||(u[0].column=e.columnNumber+1),n={url:r[3],func:r[1]||S,args:r[2]?r[2].split(","):[],line:r[4]?+r[4]:null,column:r[5]?+r[5]:null}}if(!n.func&&n.line&&(n.func=S),n.url&&"blob:"===n.url.substr(0,5)){var d=new XMLHttpRequest;if(d.open("GET",n.url,!1),d.send(null),200===d.status){var g=d.responseText||"",m=(g=g.slice(-300)).match(/\/\/# sourceMappingURL=(.*)$/);if(m){var _=m[1];"~"===_.charAt(0)&&(_=("undefined"==typeof document||null==document.location?"":document.location.origin?document.location.origin:document.location.protocol+"//"+document.location.hostname+(document.location.port?":"+document.location.port:""))+_.slice(1)),n.url=_.slice(0,-4)}}}u.push(n)}return u.length?{name:e.name,message:e.message,url:C(),stack:u}:null}}function t(e,t,r,n){var o={url:t,line:r};if(o.url&&o.line){if(e.incomplete=!1,o.func||(o.func=S),e.stack.length>0&&e.stack[0].url===o.url){if(e.stack[0].line===o.line)return!1;if(!e.stack[0].line&&e.stack[0].func===o.func)return e.stack[0].line=o.line,!1}return e.stack.unshift(o),e.partial=!0,!0}return e.incomplete=!0,!1}function r(e,o){for(var i,a,s=/function\s+([_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*)?\s*\(/i,c=[],l={},u=!1,h=r.caller;h&&!u;h=h.caller)if(h!==n&&h!==w.report){if(a={url:null,func:S,line:null,column:null},h.name?a.func=h.name:(i=s.exec(h.toString()))&&(a.func=i[1]),void 0===a.func)try{a.func=i.input.substring(0,i.input.indexOf("{"))}catch(e){}l[""+h]?u=!0:l[""+h]=!0,c.push(a)}o&&c.splice(0,o);var p={name:e.name,message:e.message,url:C(),stack:c};return t(p,e.sourceURL||e.fileName,e.line||e.lineNumber,e.message||e.description),p}function n(t,n){var o=null;n=null==n?0:+n;try{if(o=e(t))return o}catch(e){if(w.debug)throw e}try{if(o=r(t,n+1))return o}catch(e){if(w.debug)throw e}return{name:t.name,message:t.message,url:C()}}return n.augmentStackTraceWithInitialElement=t,n.computeStackTraceFromStackProp=e,n}();var R=w;function j(e,t){var r=(65535&e)+(65535&t);return(e>>16)+(t>>16)+(r>>16)<<16|65535&r}function T(e,t,r,n,o,i){return j((a=j(j(t,e),j(n,i)))<<(s=o)|a>>>32-s,r);var a,s}function F(e,t,r,n,o,i,a){return T(t&r|~t&n,e,t,o,i,a)}function D(e,t,r,n,o,i,a){return T(t&n|r&~n,e,t,o,i,a)}function A(e,t,r,n,o,i,a){return T(t^r^n,e,t,o,i,a)}function B(e,t,r,n,o,i,a){return T(r^(t|~n),e,t,o,i,a)}function M(e,t){var r,n,o,i,a;e[t>>5]|=128<<t%32,e[14+(t+64>>>9<<4)]=t;var s=1732584193,c=-271733879,l=-1732584194,u=271733878;for(r=0;r<e.length;r+=16)n=s,o=c,i=l,a=u,s=F(s,c,l,u,e[r],7,-680876936),u=F(u,s,c,l,e[r+1],12,-389564586),l=F(l,u,s,c,e[r+2],17,606105819),c=F(c,l,u,s,e[r+3],22,-1044525330),s=F(s,c,l,u,e[r+4],7,-176418897),u=F(u,s,c,l,e[r+5],12,1200080426),l=F(l,u,s,c,e[r+6],17,-1473231341),c=F(c,l,u,s,e[r+7],22,-45705983),s=F(s,c,l,u,e[r+8],7,1770035416),u=F(u,s,c,l,e[r+9],12,-1958414417),l=F(l,u,s,c,e[r+10],17,-42063),c=F(c,l,u,s,e[r+11],22,-1990404162),s=F(s,c,l,u,e[r+12],7,1804603682),u=F(u,s,c,l,e[r+13],12,-40341101),l=F(l,u,s,c,e[r+14],17,-1502002290),s=D(s,c=F(c,l,u,s,e[r+15],22,1236535329),l,u,e[r+1],5,-165796510),u=D(u,s,c,l,e[r+6],9,-1069501632),l=D(l,u,s,c,e[r+11],14,643717713),c=D(c,l,u,s,e[r],20,-373897302),s=D(s,c,l,u,e[r+5],5,-701558691),u=D(u,s,c,l,e[r+10],9,38016083),l=D(l,u,s,c,e[r+15],14,-660478335),c=D(c,l,u,s,e[r+4],20,-405537848),s=D(s,c,l,u,e[r+9],5,568446438),u=D(u,s,c,l,e[r+14],9,-1019803690),l=D(l,u,s,c,e[r+3],14,-187363961),c=D(c,l,u,s,e[r+8],20,1163531501),s=D(s,c,l,u,e[r+13],5,-1444681467),u=D(u,s,c,l,e[r+2],9,-51403784),l=D(l,u,s,c,e[r+7],14,1735328473),s=A(s,c=D(c,l,u,s,e[r+12],20,-1926607734),l,u,e[r+5],4,-378558),u=A(u,s,c,l,e[r+8],11,-2022574463),l=A(l,u,s,c,e[r+11],16,1839030562),c=A(c,l,u,s,e[r+14],23,-35309556),s=A(s,c,l,u,e[r+1],4,-1530992060),u=A(u,s,c,l,e[r+4],11,1272893353),l=A(l,u,s,c,e[r+7],16,-155497632),c=A(c,l,u,s,e[r+10],23,-1094730640),s=A(s,c,l,u,e[r+13],4,681279174),u=A(u,s,c,l,e[r],11,-358537222),l=A(l,u,s,c,e[r+3],16,-722521979),c=A(c,l,u,s,e[r+6],23,76029189),s=A(s,c,l,u,e[r+9],4,-640364487),u=A(u,s,c,l,e[r+12],11,-421815835),l=A(l,u,s,c,e[r+15],16,530742520),s=B(s,c=A(c,l,u,s,e[r+2],23,-995338651),l,u,e[r],6,-198630844),u=B(u,s,c,l,e[r+7],10,1126891415),l=B(l,u,s,c,e[r+14],15,-1416354905),c=B(c,l,u,s,e[r+5],21,-57434055),s=B(s,c,l,u,e[r+12],6,1700485571),u=B(u,s,c,l,e[r+3],10,-1894986606),l=B(l,u,s,c,e[r+10],15,-1051523),c=B(c,l,u,s,e[r+1],21,-2054922799),s=B(s,c,l,u,e[r+8],6,1873313359),u=B(u,s,c,l,e[r+15],10,-30611744),l=B(l,u,s,c,e[r+6],15,-1560198380),c=B(c,l,u,s,e[r+13],21,1309151649),s=B(s,c,l,u,e[r+4],6,-145523070),u=B(u,s,c,l,e[r+11],10,-1120210379),l=B(l,u,s,c,e[r+2],15,718787259),c=B(c,l,u,s,e[r+9],21,-343485551),s=j(s,n),c=j(c,o),l=j(l,i),u=j(u,a);return[s,c,l,u]}function H(e){var t,r="",n=32*e.length;for(t=0;t<n;t+=8)r+=String.fromCharCode(e[t>>5]>>>t%32&255);return r}function L(e){var t,r=[];for(r[(e.length>>2)-1]=void 0,t=0;t<r.length;t+=1)r[t]=0;var n=8*e.length;for(t=0;t<n;t+=8)r[t>>5]|=(255&e.charCodeAt(t/8))<<t%32;return r}function P(e){var t,r,n="";for(r=0;r<e.length;r+=1)t=e.charCodeAt(r),n+="0123456789abcdef".charAt(t>>>4&15)+"0123456789abcdef".charAt(15&t);return n}function I(e){return unescape(encodeURIComponent(e))}function U(e){return function(e){return H(M(L(e),8*e.length))}(I(e))}function N(e,t){return function(e,t){var r,n,o=L(e),i=[],a=[];for(i[15]=a[15]=void 0,o.length>16&&(o=M(o,8*e.length)),r=0;r<16;r+=1)i[r]=909522486^o[r],a[r]=1549556828^o[r];return n=M(i.concat(L(t)),512+8*t.length),H(M(a.concat(n),640))}(I(e),I(t))}var q=function(e,t,r){return t?r?N(t,e):P(N(t,e)):r?U(e):P(U(e))};function z(e){this.name="RavenConfigError",this.message=e}z.prototype=new Error,z.prototype.constructor=z;var K=z,W=function(e,t,r){var n=e[t],o=e;if(t in e){var i="warn"===t?"warning":t;e[t]=function(){var e=[].slice.call(arguments),a=E.safeJoin(e," "),s={level:i,logger:"console",extra:{arguments:e}};"assert"===t?!1===e[0]&&(a="Assertion failed: "+(E.safeJoin(e.slice(1)," ")||"console.assert"),s.extra.arguments=e.slice(1),r&&r(a,s)):r&&r(a,s),n&&Function.prototype.apply.call(n,o,e)}}},V=E.isErrorEvent,$=E.isDOMError,X=E.isDOMException,J=E.isError,G=E.isObject,Y=E.isPlainObject,Z=E.isUndefined,Q=E.isFunction,ee=E.isString,te=E.isArray,re=E.isEmptyObject,ne=E.each,oe=E.objectMerge,ie=E.truncate,ae=E.objectFrozen,se=E.hasKey,ce=E.joinRegExp,le=E.urlencode,ue=E.uuid4,he=E.htmlTreeAsString,pe=E.isSameException,fe=E.isSameStacktrace,de=E.parseUrl,ge=E.fill,me=E.supportsFetch,_e=E.supportsReferrerPolicy,ve=E.serializeKeysForMessage,be=E.serializeException,ye=E.sanitize,Ee=W,we="source protocol user pass host port path".split(" "),xe=/^(?:(\w+):)?\/\/(?:(\w+)(:\w+)?@)?([\w\.-]+)(?::(\d+))?(\/.*)/;function ke(){return+new Date}var Se="undefined"!=typeof window?window:void 0!==e?e:"undefined"!=typeof self?self:{},Oe=Se.document,Ce=Se.navigator;function Re(e,t){return Q(t)?function(r){return t(r,e)}:t}function je(){for(var e in this._hasJSON=!("object"!=typeof JSON||!JSON.stringify),this._hasDocument=!Z(Oe),this._hasNavigator=!Z(Ce),this._lastCapturedException=null,this._lastData=null,this._lastEventId=null,this._globalServer=null,this._globalKey=null,this._globalProject=null,this._globalContext={},this._globalOptions={release:Se.SENTRY_RELEASE&&Se.SENTRY_RELEASE.id,logger:"javascript",ignoreErrors:[],ignoreUrls:[],whitelistUrls:[],includePaths:[],headers:null,collectWindowErrors:!0,captureUnhandledRejections:!0,maxMessageLength:0,maxUrlLength:250,stackTraceLimit:50,autoBreadcrumbs:!0,instrument:!0,sampleRate:1,sanitizeKeys:[]},this._fetchDefaults={method:"POST",keepalive:!0,referrerPolicy:_e()?"origin":""},this._ignoreOnError=0,this._isRavenInstalled=!1,this._originalErrorStackTraceLimit=Error.stackTraceLimit,this._originalConsole=Se.console||{},this._originalConsoleMethods={},this._plugins=[],this._startTime=ke(),this._wrappedBuiltIns=[],this._breadcrumbs=[],this._lastCapturedEvent=null,this._keypressTimeout,this._location=Se.location,this._lastHref=this._location&&this._location.href,this._resetBackoff(),this._originalConsole)this._originalConsoleMethods[e]=this._originalConsole[e]}je.prototype={VERSION:"3.26.2",debug:!1,TraceKit:R,config:function(e,t){var r=this;if(r._globalServer)return this._logDebug("error","Error: Raven has already been configured"),r;if(!e)return r;var n=r._globalOptions;t&&ne(t,function(e,t){"tags"===e||"extra"===e||"user"===e?r._globalContext[e]=t:n[e]=t}),r.setDSN(e),n.ignoreErrors.push(/^Script error\.?$/),n.ignoreErrors.push(/^Javascript error: Script error\.? on line 0$/),n.ignoreErrors=ce(n.ignoreErrors),n.ignoreUrls=!!n.ignoreUrls.length&&ce(n.ignoreUrls),n.whitelistUrls=!!n.whitelistUrls.length&&ce(n.whitelistUrls),n.includePaths=ce(n.includePaths),n.maxBreadcrumbs=Math.max(0,Math.min(n.maxBreadcrumbs||100,100));var o={xhr:!0,console:!0,dom:!0,location:!0,sentry:!0},i=n.autoBreadcrumbs;"[object Object]"==={}.toString.call(i)?i=oe(o,i):!1!==i&&(i=o),n.autoBreadcrumbs=i;var a={tryCatch:!0},s=n.instrument;return"[object Object]"==={}.toString.call(s)?s=oe(a,s):!1!==s&&(s=a),n.instrument=s,R.collectWindowErrors=!!n.collectWindowErrors,r},install:function(){var e=this;return e.isSetup()&&!e._isRavenInstalled&&(R.report.subscribe(function(){e._handleOnErrorStackInfo.apply(e,arguments)}),e._globalOptions.captureUnhandledRejections&&e._attachPromiseRejectionHandler(),e._patchFunctionToString(),e._globalOptions.instrument&&e._globalOptions.instrument.tryCatch&&e._instrumentTryCatch(),e._globalOptions.autoBreadcrumbs&&e._instrumentBreadcrumbs(),e._drainPlugins(),e._isRavenInstalled=!0),Error.stackTraceLimit=e._globalOptions.stackTraceLimit,this},setDSN:function(e){var t=this._parseDSN(e),r=t.path.lastIndexOf("/"),n=t.path.substr(1,r);this._dsn=e,this._globalKey=t.user,this._globalSecret=t.pass&&t.pass.substr(1),this._globalProject=t.path.substr(r+1),this._globalServer=this._getGlobalServer(t),this._globalEndpoint=this._globalServer+"/"+n+"api/"+this._globalProject+"/store/",this._resetBackoff()},context:function(e,t,r){return Q(e)&&(r=t||[],t=e,e={}),this.wrap(e,t).apply(this,r)},wrap:function(e,t,r){var n=this;if(Z(t)&&!Q(e))return e;if(Q(e)&&(t=e,e=void 0),!Q(t))return t;try{if(t.__raven__)return t;if(t.__raven_wrapper__)return t.__raven_wrapper__}catch(e){return t}function o(){var o=[],i=arguments.length,a=!e||e&&!1!==e.deep;for(r&&Q(r)&&r.apply(this,arguments);i--;)o[i]=a?n.wrap(e,arguments[i]):arguments[i];try{return t.apply(this,o)}catch(t){throw n._ignoreNextOnError(),n.captureException(t,e),t}}for(var i in t)se(t,i)&&(o[i]=t[i]);return o.prototype=t.prototype,t.__raven_wrapper__=o,o.__raven__=!0,o.__orig__=t,o},uninstall:function(){return R.report.uninstall(),this._detachPromiseRejectionHandler(),this._unpatchFunctionToString(),this._restoreBuiltIns(),this._restoreConsole(),Error.stackTraceLimit=this._originalErrorStackTraceLimit,this._isRavenInstalled=!1,this},_promiseRejectionHandler:function(e){this._logDebug("debug","Raven caught unhandled promise rejection:",e),this.captureException(e.reason,{mechanism:{type:"onunhandledrejection",handled:!1}})},_attachPromiseRejectionHandler:function(){return this._promiseRejectionHandler=this._promiseRejectionHandler.bind(this),Se.addEventListener&&Se.addEventListener("unhandledrejection",this._promiseRejectionHandler),this},_detachPromiseRejectionHandler:function(){return Se.removeEventListener&&Se.removeEventListener("unhandledrejection",this._promiseRejectionHandler),this},captureException:function(e,t){if(t=oe({trimHeadFrames:0},t||{}),V(e)&&e.error)e=e.error;else{if($(e)||X(e)){var r=e.name||($(e)?"DOMError":"DOMException"),n=e.message?r+": "+e.message:r;return this.captureMessage(n,oe(t,{stacktrace:!0,trimHeadFrames:t.trimHeadFrames+1}))}if(J(e))e=e;else{if(!Y(e))return this.captureMessage(e,oe(t,{stacktrace:!0,trimHeadFrames:t.trimHeadFrames+1}));t=this._getCaptureExceptionOptionsFromPlainObject(t,e),e=new Error(t.message)}}this._lastCapturedException=e;try{var o=R.computeStackTrace(e);this._handleStackInfo(o,t)}catch(t){if(e!==t)throw t}return this},_getCaptureExceptionOptionsFromPlainObject:function(e,t){var r=Object.keys(t).sort(),n=oe(e,{message:"Non-Error exception captured with keys: "+ve(r),fingerprint:[q(r)],extra:e.extra||{}});return n.extra.__serialized__=be(t),n},captureMessage:function(e,t){if(!this._globalOptions.ignoreErrors.test||!this._globalOptions.ignoreErrors.test(e)){var r,n=oe({message:e+=""},t=t||{});try{throw new Error(e)}catch(e){r=e}r.name=null;var o=R.computeStackTrace(r),i=te(o.stack)&&o.stack[1];i&&"Raven.captureException"===i.func&&(i=o.stack[2]);var a=i&&i.url||"";if((!this._globalOptions.ignoreUrls.test||!this._globalOptions.ignoreUrls.test(a))&&(!this._globalOptions.whitelistUrls.test||this._globalOptions.whitelistUrls.test(a))){if(this._globalOptions.stacktrace||t&&t.stacktrace){n.fingerprint=null==n.fingerprint?e:n.fingerprint,(t=oe({trimHeadFrames:0},t)).trimHeadFrames+=1;var s=this._prepareFrames(o,t);n.stacktrace={frames:s.reverse()}}return n.fingerprint&&(n.fingerprint=te(n.fingerprint)?n.fingerprint:[n.fingerprint]),this._send(n),this}}},captureBreadcrumb:function(e){var t=oe({timestamp:ke()/1e3},e);if(Q(this._globalOptions.breadcrumbCallback)){var r=this._globalOptions.breadcrumbCallback(t);if(G(r)&&!re(r))t=r;else if(!1===r)return this}return this._breadcrumbs.push(t),this._breadcrumbs.length>this._globalOptions.maxBreadcrumbs&&this._breadcrumbs.shift(),this},addPlugin:function(e){var t=[].slice.call(arguments,1);return this._plugins.push([e,t]),this._isRavenInstalled&&this._drainPlugins(),this},setUserContext:function(e){return this._globalContext.user=e,this},setExtraContext:function(e){return this._mergeContext("extra",e),this},setTagsContext:function(e){return this._mergeContext("tags",e),this},clearContext:function(){return this._globalContext={},this},getContext:function(){return JSON.parse(r(this._globalContext))},setEnvironment:function(e){return this._globalOptions.environment=e,this},setRelease:function(e){return this._globalOptions.release=e,this},setDataCallback:function(e){var t=this._globalOptions.dataCallback;return this._globalOptions.dataCallback=Re(t,e),this},setBreadcrumbCallback:function(e){var t=this._globalOptions.breadcrumbCallback;return this._globalOptions.breadcrumbCallback=Re(t,e),this},setShouldSendCallback:function(e){var t=this._globalOptions.shouldSendCallback;return this._globalOptions.shouldSendCallback=Re(t,e),this},setTransport:function(e){return this._globalOptions.transport=e,this},lastException:function(){return this._lastCapturedException},lastEventId:function(){return this._lastEventId},isSetup:function(){return!!this._hasJSON&&(!!this._globalServer||(this.ravenNotConfiguredError||(this.ravenNotConfiguredError=!0,this._logDebug("error","Error: Raven has not been configured.")),!1))},afterLoad:function(){var e=Se.RavenConfig;e&&this.config(e.dsn,e.config).install()},showReportDialog:function(e){if(Oe){var t=(e=e||{}).eventId||this.lastEventId();if(!t)throw new K("Missing eventId");var r=e.dsn||this._dsn;if(!r)throw new K("Missing DSN");var n=encodeURIComponent,o="";o+="?eventId="+n(t),o+="&dsn="+n(r);var i=e.user||this._globalContext.user;i&&(i.name&&(o+="&name="+n(i.name)),i.email&&(o+="&email="+n(i.email)));var a=this._getGlobalServer(this._parseDSN(r)),s=Oe.createElement("script");s.async=!0,s.src=a+"/api/embed/error-page/"+o,(Oe.head||Oe.body).appendChild(s)}},_ignoreNextOnError:function(){var e=this;this._ignoreOnError+=1,setTimeout(function(){e._ignoreOnError-=1})},_triggerEvent:function(e,t){var r,n;if(this._hasDocument){for(n in t=t||{},e="raven"+e.substr(0,1).toUpperCase()+e.substr(1),Oe.createEvent?(r=Oe.createEvent("HTMLEvents")).initEvent(e,!0,!0):(r=Oe.createEventObject()).eventType=e,t)se(t,n)&&(r[n]=t[n]);if(Oe.createEvent)Oe.dispatchEvent(r);else try{Oe.fireEvent("on"+r.eventType.toLowerCase(),r)}catch(e){}}},_breadcrumbEventHandler:function(e){var t=this;return function(r){if(t._keypressTimeout=null,t._lastCapturedEvent!==r){var n;t._lastCapturedEvent=r;try{n=he(r.target)}catch(e){n="<unknown>"}t.captureBreadcrumb({category:"ui."+e,message:n})}}},_keypressEventHandler:function(){var e=this;return function(t){var r;try{r=t.target}catch(e){return}var n=r&&r.tagName;if(n&&("INPUT"===n||"TEXTAREA"===n||r.isContentEditable)){var o=e._keypressTimeout;o||e._breadcrumbEventHandler("input")(t),clearTimeout(o),e._keypressTimeout=setTimeout(function(){e._keypressTimeout=null},1e3)}}},_captureUrlChange:function(e,t){var r=de(this._location.href),n=de(t),o=de(e);this._lastHref=t,r.protocol===n.protocol&&r.host===n.host&&(t=n.relative),r.protocol===o.protocol&&r.host===o.host&&(e=o.relative),this.captureBreadcrumb({category:"navigation",data:{to:t,from:e}})},_patchFunctionToString:function(){var e=this;e._originalFunctionToString=Function.prototype.toString,Function.prototype.toString=function(){return"function"==typeof this&&this.__raven__?e._originalFunctionToString.apply(this.__orig__,arguments):e._originalFunctionToString.apply(this,arguments)}},_unpatchFunctionToString:function(){this._originalFunctionToString&&(Function.prototype.toString=this._originalFunctionToString)},_instrumentTryCatch:function(){var e=this,t=e._wrappedBuiltIns;function r(t){return function(r,n){for(var o=new Array(arguments.length),i=0;i<o.length;++i)o[i]=arguments[i];var a=o[0];return Q(a)&&(o[0]=e.wrap({mechanism:{type:"instrument",data:{function:t.name||"<anonymous>"}}},a)),t.apply?t.apply(this,o):t(o[0],o[1])}}var n=this._globalOptions.autoBreadcrumbs;function o(r){var o=Se[r]&&Se[r].prototype;o&&o.hasOwnProperty&&o.hasOwnProperty("addEventListener")&&(ge(o,"addEventListener",function(t){return function(o,i,a,s){try{i&&i.handleEvent&&(i.handleEvent=e.wrap({mechanism:{type:"instrument",data:{target:r,function:"handleEvent",handler:i&&i.name||"<anonymous>"}}},i.handleEvent))}catch(e){}var c,l,u;return n&&n.dom&&("EventTarget"===r||"Node"===r)&&(l=e._breadcrumbEventHandler("click"),u=e._keypressEventHandler(),c=function(e){if(e){var t;try{t=e.type}catch(e){return}return"click"===t?l(e):"keypress"===t?u(e):void 0}}),t.call(this,o,e.wrap({mechanism:{type:"instrument",data:{target:r,function:"addEventListener",handler:i&&i.name||"<anonymous>"}}},i,c),a,s)}},t),ge(o,"removeEventListener",function(e){return function(t,r,n,o){try{r=r&&(r.__raven_wrapper__?r.__raven_wrapper__:r)}catch(e){}return e.call(this,t,r,n,o)}},t))}ge(Se,"setTimeout",r,t),ge(Se,"setInterval",r,t),Se.requestAnimationFrame&&ge(Se,"requestAnimationFrame",function(t){return function(r){return t(e.wrap({mechanism:{type:"instrument",data:{function:"requestAnimationFrame",handler:t&&t.name||"<anonymous>"}}},r))}},t);for(var i=["EventTarget","Window","Node","ApplicationCache","AudioTrackList","ChannelMergerNode","CryptoOperation","EventSource","FileReader","HTMLUnknownElement","IDBDatabase","IDBRequest","IDBTransaction","KeyOperation","MediaController","MessagePort","ModalWindow","Notification","SVGElementInstance","Screen","TextTrack","TextTrackCue","TextTrackList","WebSocket","WebSocketWorker","Worker","XMLHttpRequest","XMLHttpRequestEventTarget","XMLHttpRequestUpload"],a=0;a<i.length;a++)o(i[a])},_instrumentBreadcrumbs:function(){var e=this,t=this._globalOptions.autoBreadcrumbs,r=e._wrappedBuiltIns;function n(t,r){t in r&&Q(r[t])&&ge(r,t,function(r){return e.wrap({mechanism:{type:"instrument",data:{function:t,handler:r&&r.name||"<anonymous>"}}},r)})}if(t.xhr&&"XMLHttpRequest"in Se){var o=Se.XMLHttpRequest&&Se.XMLHttpRequest.prototype;ge(o,"open",function(t){return function(r,n){return ee(n)&&-1===n.indexOf(e._globalKey)&&(this.__raven_xhr={method:r,url:n,status_code:null}),t.apply(this,arguments)}},r),ge(o,"send",function(t){return function(){var r=this;function o(){if(r.__raven_xhr&&4===r.readyState){try{r.__raven_xhr.status_code=r.status}catch(e){}e.captureBreadcrumb({type:"http",category:"xhr",data:r.__raven_xhr})}}for(var i=["onload","onerror","onprogress"],a=0;a<i.length;a++)n(i[a],r);return"onreadystatechange"in r&&Q(r.onreadystatechange)?ge(r,"onreadystatechange",function(t){return e.wrap({mechanism:{type:"instrument",data:{function:"onreadystatechange",handler:t&&t.name||"<anonymous>"}}},t,o)}):r.onreadystatechange=o,t.apply(this,arguments)}},r)}t.xhr&&me()&&ge(Se,"fetch",function(t){return function(){for(var r=new Array(arguments.length),n=0;n<r.length;++n)r[n]=arguments[n];var o,i=r[0],a="GET";if("string"==typeof i?o=i:"Request"in Se&&i instanceof Se.Request?(o=i.url,i.method&&(a=i.method)):o=""+i,-1!==o.indexOf(e._globalKey))return t.apply(this,r);r[1]&&r[1].method&&(a=r[1].method);var s={method:a,url:o,status_code:null};return t.apply(this,r).then(function(t){return s.status_code=t.status,e.captureBreadcrumb({type:"http",category:"fetch",data:s}),t}).catch(function(t){throw e.captureBreadcrumb({type:"http",category:"fetch",data:s,level:"error"}),t})}},r),t.dom&&this._hasDocument&&(Oe.addEventListener?(Oe.addEventListener("click",e._breadcrumbEventHandler("click"),!1),Oe.addEventListener("keypress",e._keypressEventHandler(),!1)):Oe.attachEvent&&(Oe.attachEvent("onclick",e._breadcrumbEventHandler("click")),Oe.attachEvent("onkeypress",e._keypressEventHandler())));var i=Se.chrome,a=!(i&&i.app&&i.app.runtime)&&Se.history&&Se.history.pushState&&Se.history.replaceState;if(t.location&&a){var s=Se.onpopstate;Se.onpopstate=function(){var t=e._location.href;if(e._captureUrlChange(e._lastHref,t),s)return s.apply(this,arguments)};var c=function(t){return function(){var r=arguments.length>2?arguments[2]:void 0;return r&&e._captureUrlChange(e._lastHref,r+""),t.apply(this,arguments)}};ge(Se.history,"pushState",c,r),ge(Se.history,"replaceState",c,r)}if(t.console&&"console"in Se&&console.log){var l=function(t,r){e.captureBreadcrumb({message:t,level:r.level,category:"console"})};ne(["debug","info","warn","error","log"],function(e,t){Ee(console,t,l)})}},_restoreBuiltIns:function(){for(var e;this._wrappedBuiltIns.length;){var t=(e=this._wrappedBuiltIns.shift())[0],r=e[1],n=e[2];t[r]=n}},_restoreConsole:function(){for(var e in this._originalConsoleMethods)this._originalConsole[e]=this._originalConsoleMethods[e]},_drainPlugins:function(){var e=this;ne(this._plugins,function(t,r){var n=r[0],o=r[1];n.apply(e,[e].concat(o))})},_parseDSN:function(e){var t=xe.exec(e),r={},n=7;try{for(;n--;)r[we[n]]=t[n]||""}catch(t){throw new K("Invalid DSN: "+e)}if(r.pass&&!this._globalOptions.allowSecretKey)throw new K("Do not specify your secret key in the DSN. See: http://bit.ly/raven-secret-key");return r},_getGlobalServer:function(e){var t="//"+e.host+(e.port?":"+e.port:"");return e.protocol&&(t=e.protocol+":"+t),t},_handleOnErrorStackInfo:function(e,t){(t=t||{}).mechanism=t.mechanism||{type:"onerror",handled:!1},this._ignoreOnError||this._handleStackInfo(e,t)},_handleStackInfo:function(e,t){var r=this._prepareFrames(e,t);this._triggerEvent("handle",{stackInfo:e,options:t}),this._processException(e.name,e.message,e.url,e.lineno,r,t)},_prepareFrames:function(e,t){var r=this,n=[];if(e.stack&&e.stack.length&&(ne(e.stack,function(t,o){var i=r._normalizeFrame(o,e.url);i&&n.push(i)}),t&&t.trimHeadFrames))for(var o=0;o<t.trimHeadFrames&&o<n.length;o++)n[o].in_app=!1;return n=n.slice(0,this._globalOptions.stackTraceLimit)},_normalizeFrame:function(e,t){var r={filename:e.url,lineno:e.line,colno:e.column,function:e.func||"?"};return e.url||(r.filename=t),r.in_app=!(this._globalOptions.includePaths.test&&!this._globalOptions.includePaths.test(r.filename)||/(Raven|TraceKit)\./.test(r.function)||/raven\.(min\.)?js$/.test(r.filename)),r},_processException:function(e,t,r,n,o,i){var a,s=(e?e+": ":"")+(t||"");if((!this._globalOptions.ignoreErrors.test||!this._globalOptions.ignoreErrors.test(t)&&!this._globalOptions.ignoreErrors.test(s))&&(o&&o.length?(r=o[0].filename||r,o.reverse(),a={frames:o}):r&&(a={frames:[{filename:r,lineno:n,in_app:!0}]}),(!this._globalOptions.ignoreUrls.test||!this._globalOptions.ignoreUrls.test(r))&&(!this._globalOptions.whitelistUrls.test||this._globalOptions.whitelistUrls.test(r)))){var c=oe({exception:{values:[{type:e,value:t,stacktrace:a}]},transaction:r},i);!c.exception.mechanism&&c.mechanism&&(c.exception.mechanism=c.mechanism,delete c.mechanism),c.exception.mechanism=oe({type:"generic",handled:!0},c.exception.mechanism||{}),this._send(c)}},_trimPacket:function(e){var t=this._globalOptions.maxMessageLength;if(e.message&&(e.message=ie(e.message,t)),e.exception){var r=e.exception.values[0];r.value=ie(r.value,t)}var n=e.request;return n&&(n.url&&(n.url=ie(n.url,this._globalOptions.maxUrlLength)),n.Referer&&(n.Referer=ie(n.Referer,this._globalOptions.maxUrlLength))),e.breadcrumbs&&e.breadcrumbs.values&&this._trimBreadcrumbs(e.breadcrumbs),e},_trimBreadcrumbs:function(e){for(var t,r,n,o=["to","from","url"],i=0;i<e.values.length;++i)if((r=e.values[i]).hasOwnProperty("data")&&G(r.data)&&!ae(r.data)){n=oe({},r.data);for(var a=0;a<o.length;++a)t=o[a],n.hasOwnProperty(t)&&n[t]&&(n[t]=ie(n[t],this._globalOptions.maxUrlLength));e.values[i].data=n}},_getHttpData:function(){if(this._hasNavigator||this._hasDocument){var e={};return this._hasNavigator&&Ce.userAgent&&(e.headers={"User-Agent":Ce.userAgent}),Se.location&&Se.location.href&&(e.url=Se.location.href),this._hasDocument&&Oe.referrer&&(e.headers||(e.headers={}),e.headers.Referer=Oe.referrer),e}},_resetBackoff:function(){this._backoffDuration=0,this._backoffStart=null},_shouldBackoff:function(){return this._backoffDuration&&ke()-this._backoffStart<this._backoffDuration},_isRepeatData:function(e){var t=this._lastData;return!(!t||e.message!==t.message||e.transaction!==t.transaction)&&(e.stacktrace||t.stacktrace?fe(e.stacktrace,t.stacktrace):!e.exception&&!t.exception||pe(e.exception,t.exception))},_setBackoffState:function(e){if(!this._shouldBackoff()){var t=e.status;if(400===t||401===t||429===t){var r;try{r=me()?e.headers.get("Retry-After"):e.getResponseHeader("Retry-After"),r=1e3*parseInt(r,10)}catch(e){}this._backoffDuration=r||(2*this._backoffDuration||1e3),this._backoffStart=ke()}}},_send:function(e){var t=this._globalOptions,r={project:this._globalProject,logger:t.logger,platform:"javascript"},n=this._getHttpData();n&&(r.request=n),e.trimHeadFrames&&delete e.trimHeadFrames,(e=oe(r,e)).tags=oe(oe({},this._globalContext.tags),e.tags),e.extra=oe(oe({},this._globalContext.extra),e.extra),e.extra["session:duration"]=ke()-this._startTime,this._breadcrumbs&&this._breadcrumbs.length>0&&(e.breadcrumbs={values:[].slice.call(this._breadcrumbs,0)}),this._globalContext.user&&(e.user=this._globalContext.user),t.environment&&(e.environment=t.environment),t.release&&(e.release=t.release),t.serverName&&(e.server_name=t.serverName),e=this._sanitizeData(e),Object.keys(e).forEach(function(t){(null==e[t]||""===e[t]||re(e[t]))&&delete e[t]}),Q(t.dataCallback)&&(e=t.dataCallback(e)||e),e&&!re(e)&&(Q(t.shouldSendCallback)&&!t.shouldSendCallback(e)||(this._shouldBackoff()?this._logDebug("warn","Raven dropped error due to backoff: ",e):"number"==typeof t.sampleRate?Math.random()<t.sampleRate&&this._sendProcessedPayload(e):this._sendProcessedPayload(e)))},_sanitizeData:function(e){return ye(e,this._globalOptions.sanitizeKeys)},_getUuid:function(){return ue()},_sendProcessedPayload:function(e,t){var r=this,n=this._globalOptions;if(this.isSetup())if(e=this._trimPacket(e),this._globalOptions.allowDuplicates||!this._isRepeatData(e)){this._lastEventId=e.event_id||(e.event_id=this._getUuid()),this._lastData=e,this._logDebug("debug","Raven about to send:",e);var o={sentry_version:"7",sentry_client:"raven-js/"+this.VERSION,sentry_key:this._globalKey};this._globalSecret&&(o.sentry_secret=this._globalSecret);var i=e.exception&&e.exception.values[0];this._globalOptions.autoBreadcrumbs&&this._globalOptions.autoBreadcrumbs.sentry&&this.captureBreadcrumb({category:"sentry",message:i?(i.type?i.type+": ":"")+i.value:e.message,event_id:e.event_id,level:e.level||"error"});var a=this._globalEndpoint;(n.transport||this._makeRequest).call(this,{url:a,auth:o,data:e,options:n,onSuccess:function(){r._resetBackoff(),r._triggerEvent("success",{data:e,src:a}),t&&t()},onError:function(n){r._logDebug("error","Raven transport failed to send: ",n),n.request&&r._setBackoffState(n.request),r._triggerEvent("failure",{data:e,src:a}),n=n||new Error("Raven send failed (no additional details provided)"),t&&t(n)}})}else this._logDebug("warn","Raven dropped repeat event: ",e)},_makeRequest:function(e){var t=e.url+"?"+le(e.auth),n=null,o={};if(e.options.headers&&(n=this._evaluateHash(e.options.headers)),e.options.fetchParameters&&(o=this._evaluateHash(e.options.fetchParameters)),me()){o.body=r(e.data);var i=oe({},this._fetchDefaults),a=oe(i,o);return n&&(a.headers=n),Se.fetch(t,a).then(function(t){if(t.ok)e.onSuccess&&e.onSuccess();else{var r=new Error("Sentry error code: "+t.status);r.request=t,e.onError&&e.onError(r)}}).catch(function(){e.onError&&e.onError(new Error("Sentry error code: network unavailable"))})}var s=Se.XMLHttpRequest&&new Se.XMLHttpRequest;s&&(("withCredentials"in s||"undefined"!=typeof XDomainRequest)&&("withCredentials"in s?s.onreadystatechange=function(){if(4===s.readyState)if(200===s.status)e.onSuccess&&e.onSuccess();else if(e.onError){var t=new Error("Sentry error code: "+s.status);t.request=s,e.onError(t)}}:(s=new XDomainRequest,t=t.replace(/^https?:/,""),e.onSuccess&&(s.onload=e.onSuccess),e.onError&&(s.onerror=function(){var t=new Error("Sentry error code: XDomainRequest");t.request=s,e.onError(t)})),s.open("POST",t),n&&ne(n,function(e,t){s.setRequestHeader(e,t)}),s.send(r(e.data))))},_evaluateHash:function(e){var t={};for(var r in e)if(e.hasOwnProperty(r)){var n=e[r];t[r]="function"==typeof n?n():n}return t},_logDebug:function(e){this._originalConsoleMethods[e]&&(this.debug||this._globalOptions.debug)&&Function.prototype.apply.call(this._originalConsoleMethods[e],this._originalConsole,[].slice.call(arguments,1))},_mergeContext:function(e,t){Z(t)?delete this._globalContext[e]:this._globalContext[e]=oe(this._globalContext[e]||{},t)}},je.prototype.setUser=je.prototype.setUserContext,je.prototype.setReleaseContext=je.prototype.setRelease;var Te=je,Fe="undefined"!=typeof window?window:void 0!==e?e:"undefined"!=typeof self?self:{},De=Fe.Raven,Ae=new Te;Ae.noConflict=function(){return Fe.Raven=De,Ae},Ae.afterLoad();var Be,Me,He,Le,Pe,Ie,Ue,Ne=Ae,qe=Te;Ne.Client=qe,(Ue="plyr.io"===window.location.host)&&Ne.config("https://d4ad9866ad834437a4754e23937071e4@sentry.io/305555").install(),document.addEventListener("DOMContentLoaded",function(){Ne.context(function(){window.shr&&window.shr.setup({count:{classname:"button__count"}}),document.addEventListener("focusout",function(e){e.target.classList.remove("tab-focus")}),document.addEventListener("keydown",function(e){9===e.keyCode&&setTimeout(function(){document.activeElement.classList.add("tab-focus")},0)});var e=new Plyr("#player",{debug:!0,title:"View From A Blue Moon",iconUrl:"../dist/plyr.svg",keyboard:{global:!0},tooltips:{controls:!0},captions:{active:!0},keys:{google:"AIzaSyDrNwtN3nLH_8rjCmu5Wq3ZCm4MNAVdc0c"},ads:{enabled:!0,publisherId:"918848828995742"}});window.player=e;var t=document.querySelectorAll("[data-source]"),r={video:"video",audio:"audio",youtube:"youtube",vimeo:"vimeo"},n=window.location.hash.replace("#",""),o=window.history&&window.history.pushState;function i(e,t,r){e&&e.classList[r?"add":"remove"](t)}function a(o,a){if(o in r&&(a||o!==n)&&(n.length||o!==r.video)){switch(o){case r.video:e.source={type:"video",title:"View From A Blue Moon",sources:[{src:"https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-576p.mp4",type:"video/mp4",size:576},{src:"https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-720p.mp4",type:"video/mp4",size:720},{src:"https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-1080p.mp4",type:"video/mp4",size:1080},{src:"https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-1440p.mp4",type:"video/mp4",size:1440}],poster:"https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg",tracks:[{kind:"captions",label:"English",srclang:"en",src:"https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt",default:!0},{kind:"captions",label:"French",srclang:"fr",src:"https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt"}]};break;case r.audio:e.source={type:"audio",title:"Kishi Bashi &ndash; &ldquo;It All Began With A Burst&rdquo;",sources:[{src:"https://cdn.plyr.io/static/demo/Kishi_Bashi_-_It_All_Began_With_a_Burst.mp3",type:"audio/mp3"},{src:"https://cdn.plyr.io/static/demo/Kishi_Bashi_-_It_All_Began_With_a_Burst.ogg",type:"audio/ogg"}]};break;case r.youtube:e.source={type:"video",sources:[{src:"https://youtube.com/watch?v=bTqVqk7FSmY",provider:"youtube"}]};break;case r.vimeo:e.source={type:"video",sources:[{src:"https://vimeo.com/76979871",provider:"vimeo"}]}}n=o,Array.from(t).forEach(function(e){return i(e.parentElement,"active",!1)}),i(document.querySelector('[data-source="'+o+'"]'),"active",!0),Array.from(document.querySelectorAll(".plyr__cite")).forEach(function(e){e.setAttribute("hidden","")}),document.querySelector(".plyr__cite--"+o).removeAttribute("hidden")}}if(Array.from(t).forEach(function(e){e.addEventListener("click",function(){var t=e.getAttribute("data-source");a(t),o&&window.history.pushState({type:t},"","#"+t)})}),window.addEventListener("popstate",function(e){e.state&&"type"in e.state&&a(e.state.type)}),o){var s=!n.length;s&&(n=r.video),n in r&&window.history.replaceState({type:n},"",s?"":"#"+n),n!==r.video&&a(n,!0)}})}),Ue&&(Be=window,Me=document,He="script",Le="ga",Be.GoogleAnalyticsObject=Le,Be.ga=Be.ga||function(){(Be.ga.q=Be.ga.q||[]).push(arguments)},Be.ga.l=1*new Date,Pe=Me.createElement(He),Ie=Me.getElementsByTagName(He)[0],Pe.async=1,Pe.src="https://www.google-analytics.com/analytics.js",Ie.parentNode.insertBefore(Pe,Ie),window.ga("create","UA-40881672-11","auto"),window.ga("send","pageview"))}();
//# sourceMappingURL=demo.min.js.map
diff --git a/demo/dist/demo.min.js.map b/demo/dist/demo.min.js.map
index 01e08ac1..fa9486b8 100644
--- a/demo/dist/demo.min.js.map
+++ b/demo/dist/demo.min.js.map
@@ -1 +1 @@
-{"version":3,"sources":["../../../node_modules/raven-js/vendor/json-stringify-safe/stringify.js","../../../node_modules/raven-js/src/utils.js","../../../node_modules/raven-js/vendor/TraceKit/tracekit.js","../../../node_modules/raven-js/vendor/md5/md5.js","../../../node_modules/raven-js/src/configError.js","../../../node_modules/raven-js/src/console.js","../../../node_modules/raven-js/src/raven.js","../../../node_modules/raven-js/src/singleton.js","demo.js"],"names":["indexOf","haystack","needle","i","length","serializer","replacer","cycleReplacer","stack","keys","key","value","slice","join","thisPos","this","splice","push","Infinity","call","Error","err","message","name","Object","prototype","hasOwnProperty","stringifyError","module","exports","obj","spaces","JSON","stringify","getSerialize","_window","window","global","self","isUndefined","what","isPlainObject","toString","isString","isArray","supportsFetch","Headers","Request","Response","e","each","callback","j","hasKey","truncate","str","max","substr","object","joinRegExp","patterns","pattern","sources","len","replace","source","RegExp","htmlElementAsString","elem","className","classes","attr","out","tagName","toLowerCase","id","split","attrWhitelist","getAttribute","isOnlyOneTruthy","a","b","isSameStacktrace","stack1","stack2","frames1","frames","frames2","filename","lineno","colno","MAX_SERIALIZE_EXCEPTION_DEPTH","MAX_SERIALIZE_EXCEPTION_SIZE","MAX_SERIALIZE_KEYS_LENGTH","jsonSize","encodeURI","utf8Length","serializeValue","type","utils","isObject","isError","isErrorEvent","isDOMError","isDOMException","isFunction","isEmptyObject","_","supportsErrorEvent","ErrorEvent","supportsDOMError","DOMError","supportsDOMException","DOMException","supportsReferrerPolicy","referrerPolicy","supportsPromiseRejectionEvent","PromiseRejectionEvent","wrappedCallback","data","original","normalizedData","objectMerge","obj1","obj2","objectFrozen","isFrozen","urlencode","o","pairs","encodeURIComponent","uuid4","crypto","msCrypto","getRandomValues","arr","Uint16Array","pad","num","v","c","r","Math","random","htmlTreeAsString","nextStr","height","sepLength","parentNode","reverse","isSameException","ex1","ex2","values","stacktrace","parseUrl","url","match","query","fragment","protocol","host","path","relative","fill","replacement","track","orig","__raven__","__orig__","safeJoin","input","delimiter","output","String","serializeException","ex","depth","maxSize","serialized","serializeObject","reduce","acc","Array","map","val","serializeKeysForMessage","maxLength","filter","usedKeys","sanitize","sanitizeKeys","safeInput","sanitizeRegExp","sanitizeMask","parse","o_O","sanitizeWorker","workerInput","k","test","TraceKit","collectWindowErrors","debug","_slice","UNKNOWN_FUNCTION","ERROR_TYPES_RE","getLocationHref","document","location","href","report","_oldOnerrorHandler","_onErrorHandlerInstalled","handlers","lastArgs","lastException","lastExceptionStack","notifyHandlers","isWindowError","exception","apply","concat","arguments","inner","traceKitWindowOnError","msg","lineNo","colNo","error","computeStackTrace","augmentStackTraceWithInitialElement","processLastException","groups","line","column","undefined","func","_lastExceptionStack","_lastArgs","rethrow","args","setTimeout","incomplete","subscribe","handler","onerror","unsubscribe","uninstall","computeStackTraceFromStackProp","submatch","parts","element","chrome","winjs","gecko","geckoEval","chromeEval","lines","exec","isNative","columnNumber","xhr","XMLHttpRequest","open","send","status","responseText","sourceMaps","sourceMapAddress","charAt","origin","hostname","port","stackInfo","initial","unshift","partial","computeStackTraceByWalkingCallerChain","item","functionName","funcs","recursion","curr","caller","substring","result","sourceURL","fileName","lineNumber","description","tracekit","safeAdd","x","y","lsw","md5cmn","q","s","t","cnt","md5ff","d","md5gg","md5hh","md5ii","binlMD5","olda","oldb","oldc","oldd","binl2rstr","length32","fromCharCode","rstr2binl","length8","charCodeAt","rstr2hex","str2rstrUTF8","unescape","rawMD5","rstrMD5","rawHMACMD5","hash","bkey","ipad","opad","rstrHMACMD5","md5_1","string","raw","RavenConfigError","constructor","configError","console$1","console","level","originalConsoleLevel","originalConsole","sentryLevel","logger","extra","Function","wrapConsoleMethod","require$$0","dsnKeys","dsnPattern","now","Date","_document","_navigator","navigator","keepOriginalCallback","Raven","method","_hasJSON","_hasDocument","_hasNavigator","_lastCapturedException","_lastData","_lastEventId","_globalServer","_globalKey","_globalProject","_globalContext","_globalOptions","release","SENTRY_RELEASE","ignoreErrors","ignoreUrls","whitelistUrls","includePaths","headers","captureUnhandledRejections","maxMessageLength","maxUrlLength","stackTraceLimit","autoBreadcrumbs","instrument","sampleRate","_fetchDefaults","keepalive","_ignoreOnError","_isRavenInstalled","_originalErrorStackTraceLimit","_originalConsole","_originalConsoleMethods","_plugins","_startTime","_wrappedBuiltIns","_breadcrumbs","_lastCapturedEvent","_keypressTimeout","_location","_lastHref","_resetBackoff","VERSION","config","dsn","options","_logDebug","globalOptions","setDSN","maxBreadcrumbs","min","autoBreadcrumbDefaults","dom","sentry","instrumentDefaults","tryCatch","install","isSetup","_handleOnErrorStackInfo","_attachPromiseRejectionHandler","_patchFunctionToString","_instrumentTryCatch","_instrumentBreadcrumbs","_drainPlugins","uri","_parseDSN","lastSlash","lastIndexOf","_dsn","user","_globalSecret","pass","_getGlobalServer","_globalEndpoint","context","wrap","_before","__raven_wrapper__","wrapped","deep","_ignoreNextOnError","captureException","property","_detachPromiseRejectionHandler","_unpatchFunctionToString","_restoreBuiltIns","_restoreConsole","_promiseRejectionHandler","event","reason","mechanism","handled","bind","addEventListener","removeEventListener","trimHeadFrames","captureMessage","_getCaptureExceptionOptionsFromPlainObject","_handleStackInfo","currentOptions","exKeys","sort","fingerprint","md5","__serialized__","initialCall","fileurl","_prepareFrames","_send","captureBreadcrumb","crumb","timestamp","breadcrumbCallback","shift","addPlugin","plugin","pluginArgs","setUserContext","setExtraContext","_mergeContext","setTagsContext","tags","clearContext","getContext","setEnvironment","environment","setRelease","setDataCallback","dataCallback","setBreadcrumbCallback","setShouldSendCallback","shouldSendCallback","setTransport","transport","lastEventId","ravenNotConfiguredError","afterLoad","RavenConfig","showReportDialog","eventId","encode","qs","email","globalServer","script","createElement","async","src","head","body","appendChild","_triggerEvent","eventType","evt","toUpperCase","createEvent","initEvent","createEventObject","dispatchEvent","fireEvent","_breadcrumbEventHandler","evtName","target","category","_keypressEventHandler","isContentEditable","timeout","clearTimeout","_captureUrlChange","from","to","parsedLoc","parsedTo","parsedFrom","_originalFunctionToString","wrappedBuiltIns","wrapTimeFn","fn","originalCallback","function","wrapEventTarget","proto","capture","secure","handleEvent","before","clickHandler","keypressHandler","requestAnimationFrame","cb","eventTargets","wrapProp","prop","xhrproto","origOpen","__raven_xhr","status_code","origSend","onreadystatechangeHandler","readyState","props","onreadystatechange","origFetch","fetchInput","fetchData","then","response","attachEvent","hasPushAndReplaceState","app","runtime","history","pushState","replaceState","oldOnPopState","onpopstate","currentHref","historyReplacementFunction","origHistFunction","log","consoleMethodCallback","builtin","installer","m","allowSecretKey","_processException","frame","_normalizeFrame","in_app","stackInfoUrl","normalized","prefixedMessage","transaction","_trimPacket","request","Referer","breadcrumbs","_trimBreadcrumbs","urlProp","urlProps","_getHttpData","httpData","userAgent","User-Agent","referrer","_backoffDuration","_backoffStart","_shouldBackoff","_isRepeatData","current","last","_setBackoffState","retry","get","getResponseHeader","parseInt","baseData","project","platform","serverName","server_name","_sanitizeData","forEach","_sendProcessedPayload","_getUuid","allowDuplicates","event_id","auth","sentry_version","sentry_client","sentry_key","sentry_secret","_makeRequest","onSuccess","onError","opts","evaluatedHeaders","evaluatedFetchParameters","_evaluateHash","fetchParameters","defaultFetchOptions","fetchOptions","fetch","ok","XDomainRequest","onload","setRequestHeader","evaluated","setUser","setReleaseContext","raven","_Raven","RavenConstructor","noConflict","isLive","singleton","Client","shr","setup","classList","remove","keyCode","activeElement","add","player","Plyr","buttons","querySelectorAll","types","currentType","historySupport","toggleClass","state","newSource","init","video","audio","youtube","vimeo","button","parentElement","querySelector","cite","setAttribute","removeAttribute","GoogleAnalyticsObject","l","getElementsByTagName","insertBefore","ga"],"mappings":"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","file":"demo.min.js","sourcesContent":["/*\n json-stringify-safe\n Like JSON.stringify, but doesn't throw on circular references.\n\n Originally forked from https://github.com/isaacs/json-stringify-safe\n version 5.0.1 on 3/8/2017 and modified to handle Errors serialization\n and IE8 compatibility. Tests for this are in test/vendor.\n\n ISC license: https://github.com/isaacs/json-stringify-safe/blob/master/LICENSE\n*/\n\nexports = module.exports = stringify;\nexports.getSerialize = serializer;\n\nfunction indexOf(haystack, needle) {\n for (var i = 0; i < haystack.length; ++i) {\n if (haystack[i] === needle) return i;\n }\n return -1;\n}\n\nfunction stringify(obj, replacer, spaces, cycleReplacer) {\n return JSON.stringify(obj, serializer(replacer, cycleReplacer), spaces);\n}\n\n// https://github.com/ftlabs/js-abbreviate/blob/fa709e5f139e7770a71827b1893f22418097fbda/index.js#L95-L106\nfunction stringifyError(value) {\n var err = {\n // These properties are implemented as magical getters and don't show up in for in\n stack: value.stack,\n message: value.message,\n name: value.name\n };\n\n for (var i in value) {\n if (Object.prototype.hasOwnProperty.call(value, i)) {\n err[i] = value[i];\n }\n }\n\n return err;\n}\n\nfunction serializer(replacer, cycleReplacer) {\n var stack = [];\n var keys = [];\n\n if (cycleReplacer == null) {\n cycleReplacer = function(key, value) {\n if (stack[0] === value) {\n return '[Circular ~]';\n }\n return '[Circular ~.' + keys.slice(0, indexOf(stack, value)).join('.') + ']';\n };\n }\n\n return function(key, value) {\n if (stack.length > 0) {\n var thisPos = indexOf(stack, this);\n ~thisPos ? stack.splice(thisPos + 1) : stack.push(this);\n ~thisPos ? keys.splice(thisPos, Infinity, key) : keys.push(key);\n\n if (~indexOf(stack, value)) {\n value = cycleReplacer.call(this, key, value);\n }\n } else {\n stack.push(value);\n }\n\n return replacer == null\n ? value instanceof Error ? stringifyError(value) : value\n : replacer.call(this, key, value);\n };\n}\n","var stringify = require('../vendor/json-stringify-safe/stringify');\n\nvar _window =\n typeof window !== 'undefined'\n ? window\n : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\nfunction isObject(what) {\n return typeof what === 'object' && what !== null;\n}\n\n// Yanked from https://git.io/vS8DV re-used under CC0\n// with some tiny modifications\nfunction isError(value) {\n switch (Object.prototype.toString.call(value)) {\n case '[object Error]':\n return true;\n case '[object Exception]':\n return true;\n case '[object DOMException]':\n return true;\n default:\n return value instanceof Error;\n }\n}\n\nfunction isErrorEvent(value) {\n return Object.prototype.toString.call(value) === '[object ErrorEvent]';\n}\n\nfunction isDOMError(value) {\n return Object.prototype.toString.call(value) === '[object DOMError]';\n}\n\nfunction isDOMException(value) {\n return Object.prototype.toString.call(value) === '[object DOMException]';\n}\n\nfunction isUndefined(what) {\n return what === void 0;\n}\n\nfunction isFunction(what) {\n return typeof what === 'function';\n}\n\nfunction isPlainObject(what) {\n return Object.prototype.toString.call(what) === '[object Object]';\n}\n\nfunction isString(what) {\n return Object.prototype.toString.call(what) === '[object String]';\n}\n\nfunction isArray(what) {\n return Object.prototype.toString.call(what) === '[object Array]';\n}\n\nfunction isEmptyObject(what) {\n if (!isPlainObject(what)) return false;\n\n for (var _ in what) {\n if (what.hasOwnProperty(_)) {\n return false;\n }\n }\n return true;\n}\n\nfunction supportsErrorEvent() {\n try {\n new ErrorEvent(''); // eslint-disable-line no-new\n return true;\n } catch (e) {\n return false;\n }\n}\n\nfunction supportsDOMError() {\n try {\n new DOMError(''); // eslint-disable-line no-new\n return true;\n } catch (e) {\n return false;\n }\n}\n\nfunction supportsDOMException() {\n try {\n new DOMException(''); // eslint-disable-line no-new\n return true;\n } catch (e) {\n return false;\n }\n}\n\nfunction supportsFetch() {\n if (!('fetch' in _window)) return false;\n\n try {\n new Headers(); // eslint-disable-line no-new\n new Request(''); // eslint-disable-line no-new\n new Response(); // eslint-disable-line no-new\n return true;\n } catch (e) {\n return false;\n }\n}\n\n// Despite all stars in the sky saying that Edge supports old draft syntax, aka 'never', 'always', 'origin' and 'default\n// https://caniuse.com/#feat=referrer-policy\n// It doesn't. And it throw exception instead of ignoring this parameter...\n// REF: https://github.com/getsentry/raven-js/issues/1233\nfunction supportsReferrerPolicy() {\n if (!supportsFetch()) return false;\n\n try {\n // eslint-disable-next-line no-new\n new Request('pickleRick', {\n referrerPolicy: 'origin'\n });\n return true;\n } catch (e) {\n return false;\n }\n}\n\nfunction supportsPromiseRejectionEvent() {\n return typeof PromiseRejectionEvent === 'function';\n}\n\nfunction wrappedCallback(callback) {\n function dataCallback(data, original) {\n var normalizedData = callback(data) || data;\n if (original) {\n return original(normalizedData) || normalizedData;\n }\n return normalizedData;\n }\n\n return dataCallback;\n}\n\nfunction each(obj, callback) {\n var i, j;\n\n if (isUndefined(obj.length)) {\n for (i in obj) {\n if (hasKey(obj, i)) {\n callback.call(null, i, obj[i]);\n }\n }\n } else {\n j = obj.length;\n if (j) {\n for (i = 0; i < j; i++) {\n callback.call(null, i, obj[i]);\n }\n }\n }\n}\n\nfunction objectMerge(obj1, obj2) {\n if (!obj2) {\n return obj1;\n }\n each(obj2, function(key, value) {\n obj1[key] = value;\n });\n return obj1;\n}\n\n/**\n * This function is only used for react-native.\n * react-native freezes object that have already been sent over the\n * js bridge. We need this function in order to check if the object is frozen.\n * So it's ok that objectFrozen returns false if Object.isFrozen is not\n * supported because it's not relevant for other \"platforms\". See related issue:\n * https://github.com/getsentry/react-native-sentry/issues/57\n */\nfunction objectFrozen(obj) {\n if (!Object.isFrozen) {\n return false;\n }\n return Object.isFrozen(obj);\n}\n\nfunction truncate(str, max) {\n if (typeof max !== 'number') {\n throw new Error('2nd argument to `truncate` function should be a number');\n }\n if (typeof str !== 'string' || max === 0) {\n return str;\n }\n return str.length <= max ? str : str.substr(0, max) + '\\u2026';\n}\n\n/**\n * hasKey, a better form of hasOwnProperty\n * Example: hasKey(MainHostObject, property) === true/false\n *\n * @param {Object} host object to check property\n * @param {string} key to check\n */\nfunction hasKey(object, key) {\n return Object.prototype.hasOwnProperty.call(object, key);\n}\n\nfunction joinRegExp(patterns) {\n // Combine an array of regular expressions and strings into one large regexp\n // Be mad.\n var sources = [],\n i = 0,\n len = patterns.length,\n pattern;\n\n for (; i < len; i++) {\n pattern = patterns[i];\n if (isString(pattern)) {\n // If it's a string, we need to escape it\n // Taken from: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions\n sources.push(pattern.replace(/([.*+?^=!:${}()|\\[\\]\\/\\\\])/g, '\\\\$1'));\n } else if (pattern && pattern.source) {\n // If it's a regexp already, we want to extract the source\n sources.push(pattern.source);\n }\n // Intentionally skip other cases\n }\n return new RegExp(sources.join('|'), 'i');\n}\n\nfunction urlencode(o) {\n var pairs = [];\n each(o, function(key, value) {\n pairs.push(encodeURIComponent(key) + '=' + encodeURIComponent(value));\n });\n return pairs.join('&');\n}\n\n// borrowed from https://tools.ietf.org/html/rfc3986#appendix-B\n// intentionally using regex and not <a/> href parsing trick because React Native and other\n// environments where DOM might not be available\nfunction parseUrl(url) {\n if (typeof url !== 'string') return {};\n var match = url.match(/^(([^:\\/?#]+):)?(\\/\\/([^\\/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?$/);\n\n // coerce to undefined values to empty string so we don't get 'undefined'\n var query = match[6] || '';\n var fragment = match[8] || '';\n return {\n protocol: match[2],\n host: match[4],\n path: match[5],\n relative: match[5] + query + fragment // everything minus origin\n };\n}\nfunction uuid4() {\n var crypto = _window.crypto || _window.msCrypto;\n\n if (!isUndefined(crypto) && crypto.getRandomValues) {\n // Use window.crypto API if available\n // eslint-disable-next-line no-undef\n var arr = new Uint16Array(8);\n crypto.getRandomValues(arr);\n\n // set 4 in byte 7\n arr[3] = (arr[3] & 0xfff) | 0x4000;\n // set 2 most significant bits of byte 9 to '10'\n arr[4] = (arr[4] & 0x3fff) | 0x8000;\n\n var pad = function(num) {\n var v = num.toString(16);\n while (v.length < 4) {\n v = '0' + v;\n }\n return v;\n };\n\n return (\n pad(arr[0]) +\n pad(arr[1]) +\n pad(arr[2]) +\n pad(arr[3]) +\n pad(arr[4]) +\n pad(arr[5]) +\n pad(arr[6]) +\n pad(arr[7])\n );\n } else {\n // http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#2117523\n return 'xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n var r = (Math.random() * 16) | 0,\n v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n}\n\n/**\n * Given a child DOM element, returns a query-selector statement describing that\n * and its ancestors\n * e.g. [HTMLElement] => body > div > input#foo.btn[name=baz]\n * @param elem\n * @returns {string}\n */\nfunction htmlTreeAsString(elem) {\n /* eslint no-extra-parens:0*/\n var MAX_TRAVERSE_HEIGHT = 5,\n MAX_OUTPUT_LEN = 80,\n out = [],\n height = 0,\n len = 0,\n separator = ' > ',\n sepLength = separator.length,\n nextStr;\n\n while (elem && height++ < MAX_TRAVERSE_HEIGHT) {\n nextStr = htmlElementAsString(elem);\n // bail out if\n // - nextStr is the 'html' element\n // - the length of the string that would be created exceeds MAX_OUTPUT_LEN\n // (ignore this limit if we are on the first iteration)\n if (\n nextStr === 'html' ||\n (height > 1 && len + out.length * sepLength + nextStr.length >= MAX_OUTPUT_LEN)\n ) {\n break;\n }\n\n out.push(nextStr);\n\n len += nextStr.length;\n elem = elem.parentNode;\n }\n\n return out.reverse().join(separator);\n}\n\n/**\n * Returns a simple, query-selector representation of a DOM element\n * e.g. [HTMLElement] => input#foo.btn[name=baz]\n * @param HTMLElement\n * @returns {string}\n */\nfunction htmlElementAsString(elem) {\n var out = [],\n className,\n classes,\n key,\n attr,\n i;\n\n if (!elem || !elem.tagName) {\n return '';\n }\n\n out.push(elem.tagName.toLowerCase());\n if (elem.id) {\n out.push('#' + elem.id);\n }\n\n className = elem.className;\n if (className && isString(className)) {\n classes = className.split(/\\s+/);\n for (i = 0; i < classes.length; i++) {\n out.push('.' + classes[i]);\n }\n }\n var attrWhitelist = ['type', 'name', 'title', 'alt'];\n for (i = 0; i < attrWhitelist.length; i++) {\n key = attrWhitelist[i];\n attr = elem.getAttribute(key);\n if (attr) {\n out.push('[' + key + '=\"' + attr + '\"]');\n }\n }\n return out.join('');\n}\n\n/**\n * Returns true if either a OR b is truthy, but not both\n */\nfunction isOnlyOneTruthy(a, b) {\n return !!(!!a ^ !!b);\n}\n\n/**\n * Returns true if both parameters are undefined\n */\nfunction isBothUndefined(a, b) {\n return isUndefined(a) && isUndefined(b);\n}\n\n/**\n * Returns true if the two input exception interfaces have the same content\n */\nfunction isSameException(ex1, ex2) {\n if (isOnlyOneTruthy(ex1, ex2)) return false;\n\n ex1 = ex1.values[0];\n ex2 = ex2.values[0];\n\n if (ex1.type !== ex2.type || ex1.value !== ex2.value) return false;\n\n // in case both stacktraces are undefined, we can't decide so default to false\n if (isBothUndefined(ex1.stacktrace, ex2.stacktrace)) return false;\n\n return isSameStacktrace(ex1.stacktrace, ex2.stacktrace);\n}\n\n/**\n * Returns true if the two input stack trace interfaces have the same content\n */\nfunction isSameStacktrace(stack1, stack2) {\n if (isOnlyOneTruthy(stack1, stack2)) return false;\n\n var frames1 = stack1.frames;\n var frames2 = stack2.frames;\n\n // Exit early if frame count differs\n if (frames1.length !== frames2.length) return false;\n\n // Iterate through every frame; bail out if anything differs\n var a, b;\n for (var i = 0; i < frames1.length; i++) {\n a = frames1[i];\n b = frames2[i];\n if (\n a.filename !== b.filename ||\n a.lineno !== b.lineno ||\n a.colno !== b.colno ||\n a['function'] !== b['function']\n )\n return false;\n }\n return true;\n}\n\n/**\n * Polyfill a method\n * @param obj object e.g. `document`\n * @param name method name present on object e.g. `addEventListener`\n * @param replacement replacement function\n * @param track {optional} record instrumentation to an array\n */\nfunction fill(obj, name, replacement, track) {\n if (obj == null) return;\n var orig = obj[name];\n obj[name] = replacement(orig);\n obj[name].__raven__ = true;\n obj[name].__orig__ = orig;\n if (track) {\n track.push([obj, name, orig]);\n }\n}\n\n/**\n * Join values in array\n * @param input array of values to be joined together\n * @param delimiter string to be placed in-between values\n * @returns {string}\n */\nfunction safeJoin(input, delimiter) {\n if (!isArray(input)) return '';\n\n var output = [];\n\n for (var i = 0; i < input.length; i++) {\n try {\n output.push(String(input[i]));\n } catch (e) {\n output.push('[value cannot be serialized]');\n }\n }\n\n return output.join(delimiter);\n}\n\n// Default Node.js REPL depth\nvar MAX_SERIALIZE_EXCEPTION_DEPTH = 3;\n// 50kB, as 100kB is max payload size, so half sounds reasonable\nvar MAX_SERIALIZE_EXCEPTION_SIZE = 50 * 1024;\nvar MAX_SERIALIZE_KEYS_LENGTH = 40;\n\nfunction utf8Length(value) {\n return ~-encodeURI(value).split(/%..|./).length;\n}\n\nfunction jsonSize(value) {\n return utf8Length(JSON.stringify(value));\n}\n\nfunction serializeValue(value) {\n if (typeof value === 'string') {\n var maxLength = 40;\n return truncate(value, maxLength);\n } else if (\n typeof value === 'number' ||\n typeof value === 'boolean' ||\n typeof value === 'undefined'\n ) {\n return value;\n }\n\n var type = Object.prototype.toString.call(value);\n\n // Node.js REPL notation\n if (type === '[object Object]') return '[Object]';\n if (type === '[object Array]') return '[Array]';\n if (type === '[object Function]')\n return value.name ? '[Function: ' + value.name + ']' : '[Function]';\n\n return value;\n}\n\nfunction serializeObject(value, depth) {\n if (depth === 0) return serializeValue(value);\n\n if (isPlainObject(value)) {\n return Object.keys(value).reduce(function(acc, key) {\n acc[key] = serializeObject(value[key], depth - 1);\n return acc;\n }, {});\n } else if (Array.isArray(value)) {\n return value.map(function(val) {\n return serializeObject(val, depth - 1);\n });\n }\n\n return serializeValue(value);\n}\n\nfunction serializeException(ex, depth, maxSize) {\n if (!isPlainObject(ex)) return ex;\n\n depth = typeof depth !== 'number' ? MAX_SERIALIZE_EXCEPTION_DEPTH : depth;\n maxSize = typeof depth !== 'number' ? MAX_SERIALIZE_EXCEPTION_SIZE : maxSize;\n\n var serialized = serializeObject(ex, depth);\n\n if (jsonSize(stringify(serialized)) > maxSize) {\n return serializeException(ex, depth - 1);\n }\n\n return serialized;\n}\n\nfunction serializeKeysForMessage(keys, maxLength) {\n if (typeof keys === 'number' || typeof keys === 'string') return keys.toString();\n if (!Array.isArray(keys)) return '';\n\n keys = keys.filter(function(key) {\n return typeof key === 'string';\n });\n if (keys.length === 0) return '[object has no keys]';\n\n maxLength = typeof maxLength !== 'number' ? MAX_SERIALIZE_KEYS_LENGTH : maxLength;\n if (keys[0].length >= maxLength) return keys[0];\n\n for (var usedKeys = keys.length; usedKeys > 0; usedKeys--) {\n var serialized = keys.slice(0, usedKeys).join(', ');\n if (serialized.length > maxLength) continue;\n if (usedKeys === keys.length) return serialized;\n return serialized + '\\u2026';\n }\n\n return '';\n}\n\nfunction sanitize(input, sanitizeKeys) {\n if (!isArray(sanitizeKeys) || (isArray(sanitizeKeys) && sanitizeKeys.length === 0))\n return input;\n\n var sanitizeRegExp = joinRegExp(sanitizeKeys);\n var sanitizeMask = '********';\n var safeInput;\n\n try {\n safeInput = JSON.parse(stringify(input));\n } catch (o_O) {\n return input;\n }\n\n function sanitizeWorker(workerInput) {\n if (isArray(workerInput)) {\n return workerInput.map(function(val) {\n return sanitizeWorker(val);\n });\n }\n\n if (isPlainObject(workerInput)) {\n return Object.keys(workerInput).reduce(function(acc, k) {\n if (sanitizeRegExp.test(k)) {\n acc[k] = sanitizeMask;\n } else {\n acc[k] = sanitizeWorker(workerInput[k]);\n }\n return acc;\n }, {});\n }\n\n return workerInput;\n }\n\n return sanitizeWorker(safeInput);\n}\n\nmodule.exports = {\n isObject: isObject,\n isError: isError,\n isErrorEvent: isErrorEvent,\n isDOMError: isDOMError,\n isDOMException: isDOMException,\n isUndefined: isUndefined,\n isFunction: isFunction,\n isPlainObject: isPlainObject,\n isString: isString,\n isArray: isArray,\n isEmptyObject: isEmptyObject,\n supportsErrorEvent: supportsErrorEvent,\n supportsDOMError: supportsDOMError,\n supportsDOMException: supportsDOMException,\n supportsFetch: supportsFetch,\n supportsReferrerPolicy: supportsReferrerPolicy,\n supportsPromiseRejectionEvent: supportsPromiseRejectionEvent,\n wrappedCallback: wrappedCallback,\n each: each,\n objectMerge: objectMerge,\n truncate: truncate,\n objectFrozen: objectFrozen,\n hasKey: hasKey,\n joinRegExp: joinRegExp,\n urlencode: urlencode,\n uuid4: uuid4,\n htmlTreeAsString: htmlTreeAsString,\n htmlElementAsString: htmlElementAsString,\n isSameException: isSameException,\n isSameStacktrace: isSameStacktrace,\n parseUrl: parseUrl,\n fill: fill,\n safeJoin: safeJoin,\n serializeException: serializeException,\n serializeKeysForMessage: serializeKeysForMessage,\n sanitize: sanitize\n};\n","var utils = require('../../src/utils');\n\n/*\n TraceKit - Cross brower stack traces\n\n This was originally forked from github.com/occ/TraceKit, but has since been\n largely re-written and is now maintained as part of raven-js. Tests for\n this are in test/vendor.\n\n MIT license\n*/\n\nvar TraceKit = {\n collectWindowErrors: true,\n debug: false\n};\n\n// This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785)\nvar _window =\n typeof window !== 'undefined'\n ? window\n : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\n// global reference to slice\nvar _slice = [].slice;\nvar UNKNOWN_FUNCTION = '?';\n\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error#Error_types\nvar ERROR_TYPES_RE = /^(?:[Uu]ncaught (?:exception: )?)?(?:((?:Eval|Internal|Range|Reference|Syntax|Type|URI|)Error): )?(.*)$/;\n\nfunction getLocationHref() {\n if (typeof document === 'undefined' || document.location == null) return '';\n return document.location.href;\n}\n\nfunction getLocationOrigin() {\n if (typeof document === 'undefined' || document.location == null) return '';\n\n // Oh dear IE10...\n if (!document.location.origin) {\n return (\n document.location.protocol +\n '//' +\n document.location.hostname +\n (document.location.port ? ':' + document.location.port : '')\n );\n }\n\n return document.location.origin;\n}\n\n/**\n * TraceKit.report: cross-browser processing of unhandled exceptions\n *\n * Syntax:\n * TraceKit.report.subscribe(function(stackInfo) { ... })\n * TraceKit.report.unsubscribe(function(stackInfo) { ... })\n * TraceKit.report(exception)\n * try { ...code... } catch(ex) { TraceKit.report(ex); }\n *\n * Supports:\n * - Firefox: full stack trace with line numbers, plus column number\n * on top frame; column number is not guaranteed\n * - Opera: full stack trace with line and column numbers\n * - Chrome: full stack trace with line and column numbers\n * - Safari: line and column number for the top frame only; some frames\n * may be missing, and column number is not guaranteed\n * - IE: line and column number for the top frame only; some frames\n * may be missing, and column number is not guaranteed\n *\n * In theory, TraceKit should work on all of the following versions:\n * - IE5.5+ (only 8.0 tested)\n * - Firefox 0.9+ (only 3.5+ tested)\n * - Opera 7+ (only 10.50 tested; versions 9 and earlier may require\n * Exceptions Have Stacktrace to be enabled in opera:config)\n * - Safari 3+ (only 4+ tested)\n * - Chrome 1+ (only 5+ tested)\n * - Konqueror 3.5+ (untested)\n *\n * Requires TraceKit.computeStackTrace.\n *\n * Tries to catch all unhandled exceptions and report them to the\n * subscribed handlers. Please note that TraceKit.report will rethrow the\n * exception. This is REQUIRED in order to get a useful stack trace in IE.\n * If the exception does not reach the top of the browser, you will only\n * get a stack trace from the point where TraceKit.report was called.\n *\n * Handlers receive a stackInfo object as described in the\n * TraceKit.computeStackTrace docs.\n */\nTraceKit.report = (function reportModuleWrapper() {\n var handlers = [],\n lastArgs = null,\n lastException = null,\n lastExceptionStack = null;\n\n /**\n * Add a crash handler.\n * @param {Function} handler\n */\n function subscribe(handler) {\n installGlobalHandler();\n handlers.push(handler);\n }\n\n /**\n * Remove a crash handler.\n * @param {Function} handler\n */\n function unsubscribe(handler) {\n for (var i = handlers.length - 1; i >= 0; --i) {\n if (handlers[i] === handler) {\n handlers.splice(i, 1);\n }\n }\n }\n\n /**\n * Remove all crash handlers.\n */\n function unsubscribeAll() {\n uninstallGlobalHandler();\n handlers = [];\n }\n\n /**\n * Dispatch stack information to all handlers.\n * @param {Object.<string, *>} stack\n */\n function notifyHandlers(stack, isWindowError) {\n var exception = null;\n if (isWindowError && !TraceKit.collectWindowErrors) {\n return;\n }\n for (var i in handlers) {\n if (handlers.hasOwnProperty(i)) {\n try {\n handlers[i].apply(null, [stack].concat(_slice.call(arguments, 2)));\n } catch (inner) {\n exception = inner;\n }\n }\n }\n\n if (exception) {\n throw exception;\n }\n }\n\n var _oldOnerrorHandler, _onErrorHandlerInstalled;\n\n /**\n * Ensures all global unhandled exceptions are recorded.\n * Supported by Gecko and IE.\n * @param {string} msg Error message.\n * @param {string} url URL of script that generated the exception.\n * @param {(number|string)} lineNo The line number at which the error\n * occurred.\n * @param {?(number|string)} colNo The column number at which the error\n * occurred.\n * @param {?Error} ex The actual Error object.\n */\n function traceKitWindowOnError(msg, url, lineNo, colNo, ex) {\n var stack = null;\n // If 'ex' is ErrorEvent, get real Error from inside\n var exception = utils.isErrorEvent(ex) ? ex.error : ex;\n // If 'msg' is ErrorEvent, get real message from inside\n var message = utils.isErrorEvent(msg) ? msg.message : msg;\n\n if (lastExceptionStack) {\n TraceKit.computeStackTrace.augmentStackTraceWithInitialElement(\n lastExceptionStack,\n url,\n lineNo,\n message\n );\n processLastException();\n } else if (exception && utils.isError(exception)) {\n // non-string `exception` arg; attempt to extract stack trace\n\n // New chrome and blink send along a real error object\n // Let's just report that like a normal error.\n // See: https://mikewest.org/2013/08/debugging-runtime-errors-with-window-onerror\n stack = TraceKit.computeStackTrace(exception);\n notifyHandlers(stack, true);\n } else {\n var location = {\n url: url,\n line: lineNo,\n column: colNo\n };\n\n var name = undefined;\n var groups;\n\n if ({}.toString.call(message) === '[object String]') {\n var groups = message.match(ERROR_TYPES_RE);\n if (groups) {\n name = groups[1];\n message = groups[2];\n }\n }\n\n location.func = UNKNOWN_FUNCTION;\n\n stack = {\n name: name,\n message: message,\n url: getLocationHref(),\n stack: [location]\n };\n notifyHandlers(stack, true);\n }\n\n if (_oldOnerrorHandler) {\n return _oldOnerrorHandler.apply(this, arguments);\n }\n\n return false;\n }\n\n function installGlobalHandler() {\n if (_onErrorHandlerInstalled) {\n return;\n }\n _oldOnerrorHandler = _window.onerror;\n _window.onerror = traceKitWindowOnError;\n _onErrorHandlerInstalled = true;\n }\n\n function uninstallGlobalHandler() {\n if (!_onErrorHandlerInstalled) {\n return;\n }\n _window.onerror = _oldOnerrorHandler;\n _onErrorHandlerInstalled = false;\n _oldOnerrorHandler = undefined;\n }\n\n function processLastException() {\n var _lastExceptionStack = lastExceptionStack,\n _lastArgs = lastArgs;\n lastArgs = null;\n lastExceptionStack = null;\n lastException = null;\n notifyHandlers.apply(null, [_lastExceptionStack, false].concat(_lastArgs));\n }\n\n /**\n * Reports an unhandled Error to TraceKit.\n * @param {Error} ex\n * @param {?boolean} rethrow If false, do not re-throw the exception.\n * Only used for window.onerror to not cause an infinite loop of\n * rethrowing.\n */\n function report(ex, rethrow) {\n var args = _slice.call(arguments, 1);\n if (lastExceptionStack) {\n if (lastException === ex) {\n return; // already caught by an inner catch block, ignore\n } else {\n processLastException();\n }\n }\n\n var stack = TraceKit.computeStackTrace(ex);\n lastExceptionStack = stack;\n lastException = ex;\n lastArgs = args;\n\n // If the stack trace is incomplete, wait for 2 seconds for\n // slow slow IE to see if onerror occurs or not before reporting\n // this exception; otherwise, we will end up with an incomplete\n // stack trace\n setTimeout(function() {\n if (lastException === ex) {\n processLastException();\n }\n }, stack.incomplete ? 2000 : 0);\n\n if (rethrow !== false) {\n throw ex; // re-throw to propagate to the top level (and cause window.onerror)\n }\n }\n\n report.subscribe = subscribe;\n report.unsubscribe = unsubscribe;\n report.uninstall = unsubscribeAll;\n return report;\n})();\n\n/**\n * TraceKit.computeStackTrace: cross-browser stack traces in JavaScript\n *\n * Syntax:\n * s = TraceKit.computeStackTrace(exception) // consider using TraceKit.report instead (see below)\n * Returns:\n * s.name - exception name\n * s.message - exception message\n * s.stack[i].url - JavaScript or HTML file URL\n * s.stack[i].func - function name, or empty for anonymous functions (if guessing did not work)\n * s.stack[i].args - arguments passed to the function, if known\n * s.stack[i].line - line number, if known\n * s.stack[i].column - column number, if known\n *\n * Supports:\n * - Firefox: full stack trace with line numbers and unreliable column\n * number on top frame\n * - Opera 10: full stack trace with line and column numbers\n * - Opera 9-: full stack trace with line numbers\n * - Chrome: full stack trace with line and column numbers\n * - Safari: line and column number for the topmost stacktrace element\n * only\n * - IE: no line numbers whatsoever\n *\n * Tries to guess names of anonymous functions by looking for assignments\n * in the source code. In IE and Safari, we have to guess source file names\n * by searching for function bodies inside all page scripts. This will not\n * work for scripts that are loaded cross-domain.\n * Here be dragons: some function names may be guessed incorrectly, and\n * duplicate functions may be mismatched.\n *\n * TraceKit.computeStackTrace should only be used for tracing purposes.\n * Logging of unhandled exceptions should be done with TraceKit.report,\n * which builds on top of TraceKit.computeStackTrace and provides better\n * IE support by utilizing the window.onerror event to retrieve information\n * about the top of the stack.\n *\n * Note: In IE and Safari, no stack trace is recorded on the Error object,\n * so computeStackTrace instead walks its *own* chain of callers.\n * This means that:\n * * in Safari, some methods may be missing from the stack trace;\n * * in IE, the topmost function in the stack trace will always be the\n * caller of computeStackTrace.\n *\n * This is okay for tracing (because you are likely to be calling\n * computeStackTrace from the function you want to be the topmost element\n * of the stack trace anyway), but not okay for logging unhandled\n * exceptions (because your catch block will likely be far away from the\n * inner function that actually caused the exception).\n *\n */\nTraceKit.computeStackTrace = (function computeStackTraceWrapper() {\n // Contents of Exception in various browsers.\n //\n // SAFARI:\n // ex.message = Can't find variable: qq\n // ex.line = 59\n // ex.sourceId = 580238192\n // ex.sourceURL = http://...\n // ex.expressionBeginOffset = 96\n // ex.expressionCaretOffset = 98\n // ex.expressionEndOffset = 98\n // ex.name = ReferenceError\n //\n // FIREFOX:\n // ex.message = qq is not defined\n // ex.fileName = http://...\n // ex.lineNumber = 59\n // ex.columnNumber = 69\n // ex.stack = ...stack trace... (see the example below)\n // ex.name = ReferenceError\n //\n // CHROME:\n // ex.message = qq is not defined\n // ex.name = ReferenceError\n // ex.type = not_defined\n // ex.arguments = ['aa']\n // ex.stack = ...stack trace...\n //\n // INTERNET EXPLORER:\n // ex.message = ...\n // ex.name = ReferenceError\n //\n // OPERA:\n // ex.message = ...message... (see the example below)\n // ex.name = ReferenceError\n // ex.opera#sourceloc = 11 (pretty much useless, duplicates the info in ex.message)\n // ex.stacktrace = n/a; see 'opera:config#UserPrefs|Exceptions Have Stacktrace'\n\n /**\n * Computes stack trace information from the stack property.\n * Chrome and Gecko use this property.\n * @param {Error} ex\n * @return {?Object.<string, *>} Stack trace information.\n */\n function computeStackTraceFromStackProp(ex) {\n if (typeof ex.stack === 'undefined' || !ex.stack) return;\n\n var chrome = /^\\s*at (?:(.*?) ?\\()?((?:file|https?|blob|chrome-extension|native|eval|webpack|<anonymous>|[a-z]:|\\/).*?)(?::(\\d+))?(?::(\\d+))?\\)?\\s*$/i;\n var winjs = /^\\s*at (?:((?:\\[object object\\])?.+) )?\\(?((?:file|ms-appx(?:-web)|https?|webpack|blob):.*?):(\\d+)(?::(\\d+))?\\)?\\s*$/i;\n // NOTE: blob urls are now supposed to always have an origin, therefore it's format\n // which is `blob:http://url/path/with-some-uuid`, is matched by `blob.*?:\\/` as well\n var gecko = /^\\s*(.*?)(?:\\((.*?)\\))?(?:^|@)((?:file|https?|blob|chrome|webpack|resource|moz-extension).*?:\\/.*?|\\[native code\\]|[^@]*bundle)(?::(\\d+))?(?::(\\d+))?\\s*$/i;\n // Used to additionally parse URL/line/column from eval frames\n var geckoEval = /(\\S+) line (\\d+)(?: > eval line \\d+)* > eval/i;\n var chromeEval = /\\((\\S*)(?::(\\d+))(?::(\\d+))\\)/;\n var lines = ex.stack.split('\\n');\n var stack = [];\n var submatch;\n var parts;\n var element;\n var reference = /^(.*) is undefined$/.exec(ex.message);\n\n for (var i = 0, j = lines.length; i < j; ++i) {\n if ((parts = chrome.exec(lines[i]))) {\n var isNative = parts[2] && parts[2].indexOf('native') === 0; // start of line\n var isEval = parts[2] && parts[2].indexOf('eval') === 0; // start of line\n if (isEval && (submatch = chromeEval.exec(parts[2]))) {\n // throw out eval line/column and use top-most line/column number\n parts[2] = submatch[1]; // url\n parts[3] = submatch[2]; // line\n parts[4] = submatch[3]; // column\n }\n element = {\n url: !isNative ? parts[2] : null,\n func: parts[1] || UNKNOWN_FUNCTION,\n args: isNative ? [parts[2]] : [],\n line: parts[3] ? +parts[3] : null,\n column: parts[4] ? +parts[4] : null\n };\n } else if ((parts = winjs.exec(lines[i]))) {\n element = {\n url: parts[2],\n func: parts[1] || UNKNOWN_FUNCTION,\n args: [],\n line: +parts[3],\n column: parts[4] ? +parts[4] : null\n };\n } else if ((parts = gecko.exec(lines[i]))) {\n var isEval = parts[3] && parts[3].indexOf(' > eval') > -1;\n if (isEval && (submatch = geckoEval.exec(parts[3]))) {\n // throw out eval line/column and use top-most line number\n parts[3] = submatch[1];\n parts[4] = submatch[2];\n parts[5] = null; // no column when eval\n } else if (i === 0 && !parts[5] && typeof ex.columnNumber !== 'undefined') {\n // FireFox uses this awesome columnNumber property for its top frame\n // Also note, Firefox's column number is 0-based and everything else expects 1-based,\n // so adding 1\n // NOTE: this hack doesn't work if top-most frame is eval\n stack[0].column = ex.columnNumber + 1;\n }\n element = {\n url: parts[3],\n func: parts[1] || UNKNOWN_FUNCTION,\n args: parts[2] ? parts[2].split(',') : [],\n line: parts[4] ? +parts[4] : null,\n column: parts[5] ? +parts[5] : null\n };\n } else {\n continue;\n }\n\n if (!element.func && element.line) {\n element.func = UNKNOWN_FUNCTION;\n }\n\n if (element.url && element.url.substr(0, 5) === 'blob:') {\n // Special case for handling JavaScript loaded into a blob.\n // We use a synchronous AJAX request here as a blob is already in\n // memory - it's not making a network request. This will generate a warning\n // in the browser console, but there has already been an error so that's not\n // that much of an issue.\n var xhr = new XMLHttpRequest();\n xhr.open('GET', element.url, false);\n xhr.send(null);\n\n // If we failed to download the source, skip this patch\n if (xhr.status === 200) {\n var source = xhr.responseText || '';\n\n // We trim the source down to the last 300 characters as sourceMappingURL is always at the end of the file.\n // Why 300? To be in line with: https://github.com/getsentry/sentry/blob/4af29e8f2350e20c28a6933354e4f42437b4ba42/src/sentry/lang/javascript/processor.py#L164-L175\n source = source.slice(-300);\n\n // Now we dig out the source map URL\n var sourceMaps = source.match(/\\/\\/# sourceMappingURL=(.*)$/);\n\n // If we don't find a source map comment or we find more than one, continue on to the next element.\n if (sourceMaps) {\n var sourceMapAddress = sourceMaps[1];\n\n // Now we check to see if it's a relative URL.\n // If it is, convert it to an absolute one.\n if (sourceMapAddress.charAt(0) === '~') {\n sourceMapAddress = getLocationOrigin() + sourceMapAddress.slice(1);\n }\n\n // Now we strip the '.map' off of the end of the URL and update the\n // element so that Sentry can match the map to the blob.\n element.url = sourceMapAddress.slice(0, -4);\n }\n }\n }\n\n stack.push(element);\n }\n\n if (!stack.length) {\n return null;\n }\n\n return {\n name: ex.name,\n message: ex.message,\n url: getLocationHref(),\n stack: stack\n };\n }\n\n /**\n * Adds information about the first frame to incomplete stack traces.\n * Safari and IE require this to get complete data on the first frame.\n * @param {Object.<string, *>} stackInfo Stack trace information from\n * one of the compute* methods.\n * @param {string} url The URL of the script that caused an error.\n * @param {(number|string)} lineNo The line number of the script that\n * caused an error.\n * @param {string=} message The error generated by the browser, which\n * hopefully contains the name of the object that caused the error.\n * @return {boolean} Whether or not the stack information was\n * augmented.\n */\n function augmentStackTraceWithInitialElement(stackInfo, url, lineNo, message) {\n var initial = {\n url: url,\n line: lineNo\n };\n\n if (initial.url && initial.line) {\n stackInfo.incomplete = false;\n\n if (!initial.func) {\n initial.func = UNKNOWN_FUNCTION;\n }\n\n if (stackInfo.stack.length > 0) {\n if (stackInfo.stack[0].url === initial.url) {\n if (stackInfo.stack[0].line === initial.line) {\n return false; // already in stack trace\n } else if (\n !stackInfo.stack[0].line &&\n stackInfo.stack[0].func === initial.func\n ) {\n stackInfo.stack[0].line = initial.line;\n return false;\n }\n }\n }\n\n stackInfo.stack.unshift(initial);\n stackInfo.partial = true;\n return true;\n } else {\n stackInfo.incomplete = true;\n }\n\n return false;\n }\n\n /**\n * Computes stack trace information by walking the arguments.caller\n * chain at the time the exception occurred. This will cause earlier\n * frames to be missed but is the only way to get any stack trace in\n * Safari and IE. The top frame is restored by\n * {@link augmentStackTraceWithInitialElement}.\n * @param {Error} ex\n * @return {?Object.<string, *>} Stack trace information.\n */\n function computeStackTraceByWalkingCallerChain(ex, depth) {\n var functionName = /function\\s+([_$a-zA-Z\\xA0-\\uFFFF][_$a-zA-Z0-9\\xA0-\\uFFFF]*)?\\s*\\(/i,\n stack = [],\n funcs = {},\n recursion = false,\n parts,\n item,\n source;\n\n for (\n var curr = computeStackTraceByWalkingCallerChain.caller;\n curr && !recursion;\n curr = curr.caller\n ) {\n if (curr === computeStackTrace || curr === TraceKit.report) {\n // console.log('skipping internal function');\n continue;\n }\n\n item = {\n url: null,\n func: UNKNOWN_FUNCTION,\n line: null,\n column: null\n };\n\n if (curr.name) {\n item.func = curr.name;\n } else if ((parts = functionName.exec(curr.toString()))) {\n item.func = parts[1];\n }\n\n if (typeof item.func === 'undefined') {\n try {\n item.func = parts.input.substring(0, parts.input.indexOf('{'));\n } catch (e) {}\n }\n\n if (funcs['' + curr]) {\n recursion = true;\n } else {\n funcs['' + curr] = true;\n }\n\n stack.push(item);\n }\n\n if (depth) {\n // console.log('depth is ' + depth);\n // console.log('stack is ' + stack.length);\n stack.splice(0, depth);\n }\n\n var result = {\n name: ex.name,\n message: ex.message,\n url: getLocationHref(),\n stack: stack\n };\n augmentStackTraceWithInitialElement(\n result,\n ex.sourceURL || ex.fileName,\n ex.line || ex.lineNumber,\n ex.message || ex.description\n );\n return result;\n }\n\n /**\n * Computes a stack trace for an exception.\n * @param {Error} ex\n * @param {(string|number)=} depth\n */\n function computeStackTrace(ex, depth) {\n var stack = null;\n depth = depth == null ? 0 : +depth;\n\n try {\n stack = computeStackTraceFromStackProp(ex);\n if (stack) {\n return stack;\n }\n } catch (e) {\n if (TraceKit.debug) {\n throw e;\n }\n }\n\n try {\n stack = computeStackTraceByWalkingCallerChain(ex, depth + 1);\n if (stack) {\n return stack;\n }\n } catch (e) {\n if (TraceKit.debug) {\n throw e;\n }\n }\n return {\n name: ex.name,\n message: ex.message,\n url: getLocationHref()\n };\n }\n\n computeStackTrace.augmentStackTraceWithInitialElement = augmentStackTraceWithInitialElement;\n computeStackTrace.computeStackTraceFromStackProp = computeStackTraceFromStackProp;\n\n return computeStackTrace;\n})();\n\nmodule.exports = TraceKit;\n","/*\n * JavaScript MD5\n * https://github.com/blueimp/JavaScript-MD5\n *\n * Copyright 2011, Sebastian Tschan\n * https://blueimp.net\n *\n * Licensed under the MIT license:\n * https://opensource.org/licenses/MIT\n *\n * Based on\n * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message\n * Digest Algorithm, as defined in RFC 1321.\n * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009\n * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet\n * Distributed under the BSD License\n * See http://pajhome.org.uk/crypt/md5 for more info.\n */\n\n/*\n* Add integers, wrapping at 2^32. This uses 16-bit operations internally\n* to work around bugs in some JS interpreters.\n*/\nfunction safeAdd(x, y) {\n var lsw = (x & 0xffff) + (y & 0xffff);\n var msw = (x >> 16) + (y >> 16) + (lsw >> 16);\n return (msw << 16) | (lsw & 0xffff);\n}\n\n/*\n* Bitwise rotate a 32-bit number to the left.\n*/\nfunction bitRotateLeft(num, cnt) {\n return (num << cnt) | (num >>> (32 - cnt));\n}\n\n/*\n* These functions implement the four basic operations the algorithm uses.\n*/\nfunction md5cmn(q, a, b, x, s, t) {\n return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b);\n}\nfunction md5ff(a, b, c, d, x, s, t) {\n return md5cmn((b & c) | (~b & d), a, b, x, s, t);\n}\nfunction md5gg(a, b, c, d, x, s, t) {\n return md5cmn((b & d) | (c & ~d), a, b, x, s, t);\n}\nfunction md5hh(a, b, c, d, x, s, t) {\n return md5cmn(b ^ c ^ d, a, b, x, s, t);\n}\nfunction md5ii(a, b, c, d, x, s, t) {\n return md5cmn(c ^ (b | ~d), a, b, x, s, t);\n}\n\n/*\n* Calculate the MD5 of an array of little-endian words, and a bit length.\n*/\nfunction binlMD5(x, len) {\n /* append padding */\n x[len >> 5] |= 0x80 << (len % 32);\n x[(((len + 64) >>> 9) << 4) + 14] = len;\n\n var i;\n var olda;\n var oldb;\n var oldc;\n var oldd;\n var a = 1732584193;\n var b = -271733879;\n var c = -1732584194;\n var d = 271733878;\n\n for (i = 0; i < x.length; i += 16) {\n olda = a;\n oldb = b;\n oldc = c;\n oldd = d;\n\n a = md5ff(a, b, c, d, x[i], 7, -680876936);\n d = md5ff(d, a, b, c, x[i + 1], 12, -389564586);\n c = md5ff(c, d, a, b, x[i + 2], 17, 606105819);\n b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330);\n a = md5ff(a, b, c, d, x[i + 4], 7, -176418897);\n d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426);\n c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341);\n b = md5ff(b, c, d, a, x[i + 7], 22, -45705983);\n a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416);\n d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417);\n c = md5ff(c, d, a, b, x[i + 10], 17, -42063);\n b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162);\n a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682);\n d = md5ff(d, a, b, c, x[i + 13], 12, -40341101);\n c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290);\n b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329);\n\n a = md5gg(a, b, c, d, x[i + 1], 5, -165796510);\n d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632);\n c = md5gg(c, d, a, b, x[i + 11], 14, 643717713);\n b = md5gg(b, c, d, a, x[i], 20, -373897302);\n a = md5gg(a, b, c, d, x[i + 5], 5, -701558691);\n d = md5gg(d, a, b, c, x[i + 10], 9, 38016083);\n c = md5gg(c, d, a, b, x[i + 15], 14, -660478335);\n b = md5gg(b, c, d, a, x[i + 4], 20, -405537848);\n a = md5gg(a, b, c, d, x[i + 9], 5, 568446438);\n d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690);\n c = md5gg(c, d, a, b, x[i + 3], 14, -187363961);\n b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501);\n a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467);\n d = md5gg(d, a, b, c, x[i + 2], 9, -51403784);\n c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473);\n b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734);\n\n a = md5hh(a, b, c, d, x[i + 5], 4, -378558);\n d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463);\n c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562);\n b = md5hh(b, c, d, a, x[i + 14], 23, -35309556);\n a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060);\n d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353);\n c = md5hh(c, d, a, b, x[i + 7], 16, -155497632);\n b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640);\n a = md5hh(a, b, c, d, x[i + 13], 4, 681279174);\n d = md5hh(d, a, b, c, x[i], 11, -358537222);\n c = md5hh(c, d, a, b, x[i + 3], 16, -722521979);\n b = md5hh(b, c, d, a, x[i + 6], 23, 76029189);\n a = md5hh(a, b, c, d, x[i + 9], 4, -640364487);\n d = md5hh(d, a, b, c, x[i + 12], 11, -421815835);\n c = md5hh(c, d, a, b, x[i + 15], 16, 530742520);\n b = md5hh(b, c, d, a, x[i + 2], 23, -995338651);\n\n a = md5ii(a, b, c, d, x[i], 6, -198630844);\n d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415);\n c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905);\n b = md5ii(b, c, d, a, x[i + 5], 21, -57434055);\n a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571);\n d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606);\n c = md5ii(c, d, a, b, x[i + 10], 15, -1051523);\n b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799);\n a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359);\n d = md5ii(d, a, b, c, x[i + 15], 10, -30611744);\n c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380);\n b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649);\n a = md5ii(a, b, c, d, x[i + 4], 6, -145523070);\n d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379);\n c = md5ii(c, d, a, b, x[i + 2], 15, 718787259);\n b = md5ii(b, c, d, a, x[i + 9], 21, -343485551);\n\n a = safeAdd(a, olda);\n b = safeAdd(b, oldb);\n c = safeAdd(c, oldc);\n d = safeAdd(d, oldd);\n }\n return [a, b, c, d];\n}\n\n/*\n* Convert an array of little-endian words to a string\n*/\nfunction binl2rstr(input) {\n var i;\n var output = '';\n var length32 = input.length * 32;\n for (i = 0; i < length32; i += 8) {\n output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xff);\n }\n return output;\n}\n\n/*\n* Convert a raw string to an array of little-endian words\n* Characters >255 have their high-byte silently ignored.\n*/\nfunction rstr2binl(input) {\n var i;\n var output = [];\n output[(input.length >> 2) - 1] = undefined;\n for (i = 0; i < output.length; i += 1) {\n output[i] = 0;\n }\n var length8 = input.length * 8;\n for (i = 0; i < length8; i += 8) {\n output[i >> 5] |= (input.charCodeAt(i / 8) & 0xff) << (i % 32);\n }\n return output;\n}\n\n/*\n* Calculate the MD5 of a raw string\n*/\nfunction rstrMD5(s) {\n return binl2rstr(binlMD5(rstr2binl(s), s.length * 8));\n}\n\n/*\n* Calculate the HMAC-MD5, of a key and some data (raw strings)\n*/\nfunction rstrHMACMD5(key, data) {\n var i;\n var bkey = rstr2binl(key);\n var ipad = [];\n var opad = [];\n var hash;\n ipad[15] = opad[15] = undefined;\n if (bkey.length > 16) {\n bkey = binlMD5(bkey, key.length * 8);\n }\n for (i = 0; i < 16; i += 1) {\n ipad[i] = bkey[i] ^ 0x36363636;\n opad[i] = bkey[i] ^ 0x5c5c5c5c;\n }\n hash = binlMD5(ipad.concat(rstr2binl(data)), 512 + data.length * 8);\n return binl2rstr(binlMD5(opad.concat(hash), 512 + 128));\n}\n\n/*\n* Convert a raw string to a hex string\n*/\nfunction rstr2hex(input) {\n var hexTab = '0123456789abcdef';\n var output = '';\n var x;\n var i;\n for (i = 0; i < input.length; i += 1) {\n x = input.charCodeAt(i);\n output += hexTab.charAt((x >>> 4) & 0x0f) + hexTab.charAt(x & 0x0f);\n }\n return output;\n}\n\n/*\n* Encode a string as utf-8\n*/\nfunction str2rstrUTF8(input) {\n return unescape(encodeURIComponent(input));\n}\n\n/*\n* Take string arguments and return either raw or hex encoded strings\n*/\nfunction rawMD5(s) {\n return rstrMD5(str2rstrUTF8(s));\n}\nfunction hexMD5(s) {\n return rstr2hex(rawMD5(s));\n}\nfunction rawHMACMD5(k, d) {\n return rstrHMACMD5(str2rstrUTF8(k), str2rstrUTF8(d));\n}\nfunction hexHMACMD5(k, d) {\n return rstr2hex(rawHMACMD5(k, d));\n}\n\nfunction md5(string, key, raw) {\n if (!key) {\n if (!raw) {\n return hexMD5(string);\n }\n return rawMD5(string);\n }\n if (!raw) {\n return hexHMACMD5(key, string);\n }\n return rawHMACMD5(key, string);\n}\n\nmodule.exports = md5;\n","function RavenConfigError(message) {\n this.name = 'RavenConfigError';\n this.message = message;\n}\nRavenConfigError.prototype = new Error();\nRavenConfigError.prototype.constructor = RavenConfigError;\n\nmodule.exports = RavenConfigError;\n","var utils = require('./utils');\n\nvar wrapMethod = function(console, level, callback) {\n var originalConsoleLevel = console[level];\n var originalConsole = console;\n\n if (!(level in console)) {\n return;\n }\n\n var sentryLevel = level === 'warn' ? 'warning' : level;\n\n console[level] = function() {\n var args = [].slice.call(arguments);\n\n var msg = utils.safeJoin(args, ' ');\n var data = {level: sentryLevel, logger: 'console', extra: {arguments: args}};\n\n if (level === 'assert') {\n if (args[0] === false) {\n // Default browsers message\n msg =\n 'Assertion failed: ' + (utils.safeJoin(args.slice(1), ' ') || 'console.assert');\n data.extra.arguments = args.slice(1);\n callback && callback(msg, data);\n }\n } else {\n callback && callback(msg, data);\n }\n\n // this fails for some browsers. :(\n if (originalConsoleLevel) {\n // IE9 doesn't allow calling apply on console functions directly\n // See: https://stackoverflow.com/questions/5472938/does-ie9-support-console-log-and-is-it-a-real-function#answer-5473193\n Function.prototype.apply.call(originalConsoleLevel, originalConsole, args);\n }\n };\n};\n\nmodule.exports = {\n wrapMethod: wrapMethod\n};\n","/*global XDomainRequest:false */\n\nvar TraceKit = require('../vendor/TraceKit/tracekit');\nvar stringify = require('../vendor/json-stringify-safe/stringify');\nvar md5 = require('../vendor/md5/md5');\nvar RavenConfigError = require('./configError');\n\nvar utils = require('./utils');\nvar isErrorEvent = utils.isErrorEvent;\nvar isDOMError = utils.isDOMError;\nvar isDOMException = utils.isDOMException;\nvar isError = utils.isError;\nvar isObject = utils.isObject;\nvar isPlainObject = utils.isPlainObject;\nvar isUndefined = utils.isUndefined;\nvar isFunction = utils.isFunction;\nvar isString = utils.isString;\nvar isArray = utils.isArray;\nvar isEmptyObject = utils.isEmptyObject;\nvar each = utils.each;\nvar objectMerge = utils.objectMerge;\nvar truncate = utils.truncate;\nvar objectFrozen = utils.objectFrozen;\nvar hasKey = utils.hasKey;\nvar joinRegExp = utils.joinRegExp;\nvar urlencode = utils.urlencode;\nvar uuid4 = utils.uuid4;\nvar htmlTreeAsString = utils.htmlTreeAsString;\nvar isSameException = utils.isSameException;\nvar isSameStacktrace = utils.isSameStacktrace;\nvar parseUrl = utils.parseUrl;\nvar fill = utils.fill;\nvar supportsFetch = utils.supportsFetch;\nvar supportsReferrerPolicy = utils.supportsReferrerPolicy;\nvar serializeKeysForMessage = utils.serializeKeysForMessage;\nvar serializeException = utils.serializeException;\nvar sanitize = utils.sanitize;\n\nvar wrapConsoleMethod = require('./console').wrapMethod;\n\nvar dsnKeys = 'source protocol user pass host port path'.split(' '),\n dsnPattern = /^(?:(\\w+):)?\\/\\/(?:(\\w+)(:\\w+)?@)?([\\w\\.-]+)(?::(\\d+))?(\\/.*)/;\n\nfunction now() {\n return +new Date();\n}\n\n// This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785)\nvar _window =\n typeof window !== 'undefined'\n ? window\n : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\nvar _document = _window.document;\nvar _navigator = _window.navigator;\n\nfunction keepOriginalCallback(original, callback) {\n return isFunction(callback)\n ? function(data) {\n return callback(data, original);\n }\n : callback;\n}\n\n// First, check for JSON support\n// If there is no JSON, we no-op the core features of Raven\n// since JSON is required to encode the payload\nfunction Raven() {\n this._hasJSON = !!(typeof JSON === 'object' && JSON.stringify);\n // Raven can run in contexts where there's no document (react-native)\n this._hasDocument = !isUndefined(_document);\n this._hasNavigator = !isUndefined(_navigator);\n this._lastCapturedException = null;\n this._lastData = null;\n this._lastEventId = null;\n this._globalServer = null;\n this._globalKey = null;\n this._globalProject = null;\n this._globalContext = {};\n this._globalOptions = {\n // SENTRY_RELEASE can be injected by https://github.com/getsentry/sentry-webpack-plugin\n release: _window.SENTRY_RELEASE && _window.SENTRY_RELEASE.id,\n logger: 'javascript',\n ignoreErrors: [],\n ignoreUrls: [],\n whitelistUrls: [],\n includePaths: [],\n headers: null,\n collectWindowErrors: true,\n captureUnhandledRejections: true,\n maxMessageLength: 0,\n // By default, truncates URL values to 250 chars\n maxUrlLength: 250,\n stackTraceLimit: 50,\n autoBreadcrumbs: true,\n instrument: true,\n sampleRate: 1,\n sanitizeKeys: []\n };\n this._fetchDefaults = {\n method: 'POST',\n keepalive: true,\n // Despite all stars in the sky saying that Edge supports old draft syntax, aka 'never', 'always', 'origin' and 'default\n // https://caniuse.com/#feat=referrer-policy\n // It doesn't. And it throw exception instead of ignoring this parameter...\n // REF: https://github.com/getsentry/raven-js/issues/1233\n referrerPolicy: supportsReferrerPolicy() ? 'origin' : ''\n };\n this._ignoreOnError = 0;\n this._isRavenInstalled = false;\n this._originalErrorStackTraceLimit = Error.stackTraceLimit;\n // capture references to window.console *and* all its methods first\n // before the console plugin has a chance to monkey patch\n this._originalConsole = _window.console || {};\n this._originalConsoleMethods = {};\n this._plugins = [];\n this._startTime = now();\n this._wrappedBuiltIns = [];\n this._breadcrumbs = [];\n this._lastCapturedEvent = null;\n this._keypressTimeout;\n this._location = _window.location;\n this._lastHref = this._location && this._location.href;\n this._resetBackoff();\n\n // eslint-disable-next-line guard-for-in\n for (var method in this._originalConsole) {\n this._originalConsoleMethods[method] = this._originalConsole[method];\n }\n}\n\n/*\n * The core Raven singleton\n *\n * @this {Raven}\n */\n\nRaven.prototype = {\n // Hardcode version string so that raven source can be loaded directly via\n // webpack (using a build step causes webpack #1617). Grunt verifies that\n // this value matches package.json during build.\n // See: https://github.com/getsentry/raven-js/issues/465\n VERSION: '3.26.1',\n\n debug: false,\n\n TraceKit: TraceKit, // alias to TraceKit\n\n /*\n * Configure Raven with a DSN and extra options\n *\n * @param {string} dsn The public Sentry DSN\n * @param {object} options Set of global options [optional]\n * @return {Raven}\n */\n config: function(dsn, options) {\n var self = this;\n\n if (self._globalServer) {\n this._logDebug('error', 'Error: Raven has already been configured');\n return self;\n }\n if (!dsn) return self;\n\n var globalOptions = self._globalOptions;\n\n // merge in options\n if (options) {\n each(options, function(key, value) {\n // tags and extra are special and need to be put into context\n if (key === 'tags' || key === 'extra' || key === 'user') {\n self._globalContext[key] = value;\n } else {\n globalOptions[key] = value;\n }\n });\n }\n\n self.setDSN(dsn);\n\n // \"Script error.\" is hard coded into browsers for errors that it can't read.\n // this is the result of a script being pulled in from an external domain and CORS.\n globalOptions.ignoreErrors.push(/^Script error\\.?$/);\n globalOptions.ignoreErrors.push(/^Javascript error: Script error\\.? on line 0$/);\n\n // join regexp rules into one big rule\n globalOptions.ignoreErrors = joinRegExp(globalOptions.ignoreErrors);\n globalOptions.ignoreUrls = globalOptions.ignoreUrls.length\n ? joinRegExp(globalOptions.ignoreUrls)\n : false;\n globalOptions.whitelistUrls = globalOptions.whitelistUrls.length\n ? joinRegExp(globalOptions.whitelistUrls)\n : false;\n globalOptions.includePaths = joinRegExp(globalOptions.includePaths);\n globalOptions.maxBreadcrumbs = Math.max(\n 0,\n Math.min(globalOptions.maxBreadcrumbs || 100, 100)\n ); // default and hard limit is 100\n\n var autoBreadcrumbDefaults = {\n xhr: true,\n console: true,\n dom: true,\n location: true,\n sentry: true\n };\n\n var autoBreadcrumbs = globalOptions.autoBreadcrumbs;\n if ({}.toString.call(autoBreadcrumbs) === '[object Object]') {\n autoBreadcrumbs = objectMerge(autoBreadcrumbDefaults, autoBreadcrumbs);\n } else if (autoBreadcrumbs !== false) {\n autoBreadcrumbs = autoBreadcrumbDefaults;\n }\n globalOptions.autoBreadcrumbs = autoBreadcrumbs;\n\n var instrumentDefaults = {\n tryCatch: true\n };\n\n var instrument = globalOptions.instrument;\n if ({}.toString.call(instrument) === '[object Object]') {\n instrument = objectMerge(instrumentDefaults, instrument);\n } else if (instrument !== false) {\n instrument = instrumentDefaults;\n }\n globalOptions.instrument = instrument;\n\n TraceKit.collectWindowErrors = !!globalOptions.collectWindowErrors;\n\n // return for chaining\n return self;\n },\n\n /*\n * Installs a global window.onerror error handler\n * to capture and report uncaught exceptions.\n * At this point, install() is required to be called due\n * to the way TraceKit is set up.\n *\n * @return {Raven}\n */\n install: function() {\n var self = this;\n if (self.isSetup() && !self._isRavenInstalled) {\n TraceKit.report.subscribe(function() {\n self._handleOnErrorStackInfo.apply(self, arguments);\n });\n\n if (self._globalOptions.captureUnhandledRejections) {\n self._attachPromiseRejectionHandler();\n }\n\n self._patchFunctionToString();\n\n if (self._globalOptions.instrument && self._globalOptions.instrument.tryCatch) {\n self._instrumentTryCatch();\n }\n\n if (self._globalOptions.autoBreadcrumbs) self._instrumentBreadcrumbs();\n\n // Install all of the plugins\n self._drainPlugins();\n\n self._isRavenInstalled = true;\n }\n\n Error.stackTraceLimit = self._globalOptions.stackTraceLimit;\n return this;\n },\n\n /*\n * Set the DSN (can be called multiple time unlike config)\n *\n * @param {string} dsn The public Sentry DSN\n */\n setDSN: function(dsn) {\n var self = this,\n uri = self._parseDSN(dsn),\n lastSlash = uri.path.lastIndexOf('/'),\n path = uri.path.substr(1, lastSlash);\n\n self._dsn = dsn;\n self._globalKey = uri.user;\n self._globalSecret = uri.pass && uri.pass.substr(1);\n self._globalProject = uri.path.substr(lastSlash + 1);\n\n self._globalServer = self._getGlobalServer(uri);\n\n self._globalEndpoint =\n self._globalServer + '/' + path + 'api/' + self._globalProject + '/store/';\n\n // Reset backoff state since we may be pointing at a\n // new project/server\n this._resetBackoff();\n },\n\n /*\n * Wrap code within a context so Raven can capture errors\n * reliably across domains that is executed immediately.\n *\n * @param {object} options A specific set of options for this context [optional]\n * @param {function} func The callback to be immediately executed within the context\n * @param {array} args An array of arguments to be called with the callback [optional]\n */\n context: function(options, func, args) {\n if (isFunction(options)) {\n args = func || [];\n func = options;\n options = {};\n }\n\n return this.wrap(options, func).apply(this, args);\n },\n\n /*\n * Wrap code within a context and returns back a new function to be executed\n *\n * @param {object} options A specific set of options for this context [optional]\n * @param {function} func The function to be wrapped in a new context\n * @param {function} _before A function to call before the try/catch wrapper [optional, private]\n * @return {function} The newly wrapped functions with a context\n */\n wrap: function(options, func, _before) {\n var self = this;\n // 1 argument has been passed, and it's not a function\n // so just return it\n if (isUndefined(func) && !isFunction(options)) {\n return options;\n }\n\n // options is optional\n if (isFunction(options)) {\n func = options;\n options = undefined;\n }\n\n // At this point, we've passed along 2 arguments, and the second one\n // is not a function either, so we'll just return the second argument.\n if (!isFunction(func)) {\n return func;\n }\n\n // We don't wanna wrap it twice!\n try {\n if (func.__raven__) {\n return func;\n }\n\n // If this has already been wrapped in the past, return that\n if (func.__raven_wrapper__) {\n return func.__raven_wrapper__;\n }\n } catch (e) {\n // Just accessing custom props in some Selenium environments\n // can cause a \"Permission denied\" exception (see raven-js#495).\n // Bail on wrapping and return the function as-is (defers to window.onerror).\n return func;\n }\n\n function wrapped() {\n var args = [],\n i = arguments.length,\n deep = !options || (options && options.deep !== false);\n\n if (_before && isFunction(_before)) {\n _before.apply(this, arguments);\n }\n\n // Recursively wrap all of a function's arguments that are\n // functions themselves.\n while (i--) args[i] = deep ? self.wrap(options, arguments[i]) : arguments[i];\n\n try {\n // Attempt to invoke user-land function\n // NOTE: If you are a Sentry user, and you are seeing this stack frame, it\n // means Raven caught an error invoking your application code. This is\n // expected behavior and NOT indicative of a bug with Raven.js.\n return func.apply(this, args);\n } catch (e) {\n self._ignoreNextOnError();\n self.captureException(e, options);\n throw e;\n }\n }\n\n // copy over properties of the old function\n for (var property in func) {\n if (hasKey(func, property)) {\n wrapped[property] = func[property];\n }\n }\n wrapped.prototype = func.prototype;\n\n func.__raven_wrapper__ = wrapped;\n // Signal that this function has been wrapped/filled already\n // for both debugging and to prevent it to being wrapped/filled twice\n wrapped.__raven__ = true;\n wrapped.__orig__ = func;\n\n return wrapped;\n },\n\n /**\n * Uninstalls the global error handler.\n *\n * @return {Raven}\n */\n uninstall: function() {\n TraceKit.report.uninstall();\n\n this._detachPromiseRejectionHandler();\n this._unpatchFunctionToString();\n this._restoreBuiltIns();\n this._restoreConsole();\n\n Error.stackTraceLimit = this._originalErrorStackTraceLimit;\n this._isRavenInstalled = false;\n\n return this;\n },\n\n /**\n * Callback used for `unhandledrejection` event\n *\n * @param {PromiseRejectionEvent} event An object containing\n * promise: the Promise that was rejected\n * reason: the value with which the Promise was rejected\n * @return void\n */\n _promiseRejectionHandler: function(event) {\n this._logDebug('debug', 'Raven caught unhandled promise rejection:', event);\n this.captureException(event.reason, {\n mechanism: {\n type: 'onunhandledrejection',\n handled: false\n }\n });\n },\n\n /**\n * Installs the global promise rejection handler.\n *\n * @return {raven}\n */\n _attachPromiseRejectionHandler: function() {\n this._promiseRejectionHandler = this._promiseRejectionHandler.bind(this);\n _window.addEventListener &&\n _window.addEventListener('unhandledrejection', this._promiseRejectionHandler);\n return this;\n },\n\n /**\n * Uninstalls the global promise rejection handler.\n *\n * @return {raven}\n */\n _detachPromiseRejectionHandler: function() {\n _window.removeEventListener &&\n _window.removeEventListener('unhandledrejection', this._promiseRejectionHandler);\n return this;\n },\n\n /**\n * Manually capture an exception and send it over to Sentry\n *\n * @param {error} ex An exception to be logged\n * @param {object} options A specific set of options for this error [optional]\n * @return {Raven}\n */\n captureException: function(ex, options) {\n options = objectMerge({trimHeadFrames: 0}, options ? options : {});\n\n if (isErrorEvent(ex) && ex.error) {\n // If it is an ErrorEvent with `error` property, extract it to get actual Error\n ex = ex.error;\n } else if (isDOMError(ex) || isDOMException(ex)) {\n // If it is a DOMError or DOMException (which are legacy APIs, but still supported in some browsers)\n // then we just extract the name and message, as they don't provide anything else\n // https://developer.mozilla.org/en-US/docs/Web/API/DOMError\n // https://developer.mozilla.org/en-US/docs/Web/API/DOMException\n var name = ex.name || (isDOMError(ex) ? 'DOMError' : 'DOMException');\n var message = ex.message ? name + ': ' + ex.message : name;\n\n return this.captureMessage(\n message,\n objectMerge(options, {\n // neither DOMError or DOMException provide stack trace and we most likely wont get it this way as well\n // but it's barely any overhead so we may at least try\n stacktrace: true,\n trimHeadFrames: options.trimHeadFrames + 1\n })\n );\n } else if (isError(ex)) {\n // we have a real Error object\n ex = ex;\n } else if (isPlainObject(ex)) {\n // If it is plain Object, serialize it manually and extract options\n // This will allow us to group events based on top-level keys\n // which is much better than creating new group when any key/value change\n options = this._getCaptureExceptionOptionsFromPlainObject(options, ex);\n ex = new Error(options.message);\n } else {\n // If none of previous checks were valid, then it means that\n // it's not a DOMError/DOMException\n // it's not a plain Object\n // it's not a valid ErrorEvent (one with an error property)\n // it's not an Error\n // So bail out and capture it as a simple message:\n return this.captureMessage(\n ex,\n objectMerge(options, {\n stacktrace: true, // if we fall back to captureMessage, default to attempting a new trace\n trimHeadFrames: options.trimHeadFrames + 1\n })\n );\n }\n\n // Store the raw exception object for potential debugging and introspection\n this._lastCapturedException = ex;\n\n // TraceKit.report will re-raise any exception passed to it,\n // which means you have to wrap it in try/catch. Instead, we\n // can wrap it here and only re-raise if TraceKit.report\n // raises an exception different from the one we asked to\n // report on.\n try {\n var stack = TraceKit.computeStackTrace(ex);\n this._handleStackInfo(stack, options);\n } catch (ex1) {\n if (ex !== ex1) {\n throw ex1;\n }\n }\n\n return this;\n },\n\n _getCaptureExceptionOptionsFromPlainObject: function(currentOptions, ex) {\n var exKeys = Object.keys(ex).sort();\n var options = objectMerge(currentOptions, {\n message:\n 'Non-Error exception captured with keys: ' + serializeKeysForMessage(exKeys),\n fingerprint: [md5(exKeys)],\n extra: currentOptions.extra || {}\n });\n options.extra.__serialized__ = serializeException(ex);\n\n return options;\n },\n\n /*\n * Manually send a message to Sentry\n *\n * @param {string} msg A plain message to be captured in Sentry\n * @param {object} options A specific set of options for this message [optional]\n * @return {Raven}\n */\n captureMessage: function(msg, options) {\n // config() automagically converts ignoreErrors from a list to a RegExp so we need to test for an\n // early call; we'll error on the side of logging anything called before configuration since it's\n // probably something you should see:\n if (\n !!this._globalOptions.ignoreErrors.test &&\n this._globalOptions.ignoreErrors.test(msg)\n ) {\n return;\n }\n\n options = options || {};\n msg = msg + ''; // Make sure it's actually a string\n\n var data = objectMerge(\n {\n message: msg\n },\n options\n );\n\n var ex;\n // Generate a \"synthetic\" stack trace from this point.\n // NOTE: If you are a Sentry user, and you are seeing this stack frame, it is NOT indicative\n // of a bug with Raven.js. Sentry generates synthetic traces either by configuration,\n // or if it catches a thrown object without a \"stack\" property.\n try {\n throw new Error(msg);\n } catch (ex1) {\n ex = ex1;\n }\n\n // null exception name so `Error` isn't prefixed to msg\n ex.name = null;\n var stack = TraceKit.computeStackTrace(ex);\n\n // stack[0] is `throw new Error(msg)` call itself, we are interested in the frame that was just before that, stack[1]\n var initialCall = isArray(stack.stack) && stack.stack[1];\n\n // if stack[1] is `Raven.captureException`, it means that someone passed a string to it and we redirected that call\n // to be handled by `captureMessage`, thus `initialCall` is the 3rd one, not 2nd\n // initialCall => captureException(string) => captureMessage(string)\n if (initialCall && initialCall.func === 'Raven.captureException') {\n initialCall = stack.stack[2];\n }\n\n var fileurl = (initialCall && initialCall.url) || '';\n\n if (\n !!this._globalOptions.ignoreUrls.test &&\n this._globalOptions.ignoreUrls.test(fileurl)\n ) {\n return;\n }\n\n if (\n !!this._globalOptions.whitelistUrls.test &&\n !this._globalOptions.whitelistUrls.test(fileurl)\n ) {\n return;\n }\n\n if (this._globalOptions.stacktrace || (options && options.stacktrace)) {\n // fingerprint on msg, not stack trace (legacy behavior, could be revisited)\n data.fingerprint = data.fingerprint == null ? msg : data.fingerprint;\n\n options = objectMerge(\n {\n trimHeadFrames: 0\n },\n options\n );\n // Since we know this is a synthetic trace, the top frame (this function call)\n // MUST be from Raven.js, so mark it for trimming\n // We add to the trim counter so that callers can choose to trim extra frames, such\n // as utility functions.\n options.trimHeadFrames += 1;\n\n var frames = this._prepareFrames(stack, options);\n data.stacktrace = {\n // Sentry expects frames oldest to newest\n frames: frames.reverse()\n };\n }\n\n // Make sure that fingerprint is always wrapped in an array\n if (data.fingerprint) {\n data.fingerprint = isArray(data.fingerprint)\n ? data.fingerprint\n : [data.fingerprint];\n }\n\n // Fire away!\n this._send(data);\n\n return this;\n },\n\n captureBreadcrumb: function(obj) {\n var crumb = objectMerge(\n {\n timestamp: now() / 1000\n },\n obj\n );\n\n if (isFunction(this._globalOptions.breadcrumbCallback)) {\n var result = this._globalOptions.breadcrumbCallback(crumb);\n\n if (isObject(result) && !isEmptyObject(result)) {\n crumb = result;\n } else if (result === false) {\n return this;\n }\n }\n\n this._breadcrumbs.push(crumb);\n if (this._breadcrumbs.length > this._globalOptions.maxBreadcrumbs) {\n this._breadcrumbs.shift();\n }\n return this;\n },\n\n addPlugin: function(plugin /*arg1, arg2, ... argN*/) {\n var pluginArgs = [].slice.call(arguments, 1);\n\n this._plugins.push([plugin, pluginArgs]);\n if (this._isRavenInstalled) {\n this._drainPlugins();\n }\n\n return this;\n },\n\n /*\n * Set/clear a user to be sent along with the payload.\n *\n * @param {object} user An object representing user data [optional]\n * @return {Raven}\n */\n setUserContext: function(user) {\n // Intentionally do not merge here since that's an unexpected behavior.\n this._globalContext.user = user;\n\n return this;\n },\n\n /*\n * Merge extra attributes to be sent along with the payload.\n *\n * @param {object} extra An object representing extra data [optional]\n * @return {Raven}\n */\n setExtraContext: function(extra) {\n this._mergeContext('extra', extra);\n\n return this;\n },\n\n /*\n * Merge tags to be sent along with the payload.\n *\n * @param {object} tags An object representing tags [optional]\n * @return {Raven}\n */\n setTagsContext: function(tags) {\n this._mergeContext('tags', tags);\n\n return this;\n },\n\n /*\n * Clear all of the context.\n *\n * @return {Raven}\n */\n clearContext: function() {\n this._globalContext = {};\n\n return this;\n },\n\n /*\n * Get a copy of the current context. This cannot be mutated.\n *\n * @return {object} copy of context\n */\n getContext: function() {\n // lol javascript\n return JSON.parse(stringify(this._globalContext));\n },\n\n /*\n * Set environment of application\n *\n * @param {string} environment Typically something like 'production'.\n * @return {Raven}\n */\n setEnvironment: function(environment) {\n this._globalOptions.environment = environment;\n\n return this;\n },\n\n /*\n * Set release version of application\n *\n * @param {string} release Typically something like a git SHA to identify version\n * @return {Raven}\n */\n setRelease: function(release) {\n this._globalOptions.release = release;\n\n return this;\n },\n\n /*\n * Set the dataCallback option\n *\n * @param {function} callback The callback to run which allows the\n * data blob to be mutated before sending\n * @return {Raven}\n */\n setDataCallback: function(callback) {\n var original = this._globalOptions.dataCallback;\n this._globalOptions.dataCallback = keepOriginalCallback(original, callback);\n return this;\n },\n\n /*\n * Set the breadcrumbCallback option\n *\n * @param {function} callback The callback to run which allows filtering\n * or mutating breadcrumbs\n * @return {Raven}\n */\n setBreadcrumbCallback: function(callback) {\n var original = this._globalOptions.breadcrumbCallback;\n this._globalOptions.breadcrumbCallback = keepOriginalCallback(original, callback);\n return this;\n },\n\n /*\n * Set the shouldSendCallback option\n *\n * @param {function} callback The callback to run which allows\n * introspecting the blob before sending\n * @return {Raven}\n */\n setShouldSendCallback: function(callback) {\n var original = this._globalOptions.shouldSendCallback;\n this._globalOptions.shouldSendCallback = keepOriginalCallback(original, callback);\n return this;\n },\n\n /**\n * Override the default HTTP transport mechanism that transmits data\n * to the Sentry server.\n *\n * @param {function} transport Function invoked instead of the default\n * `makeRequest` handler.\n *\n * @return {Raven}\n */\n setTransport: function(transport) {\n this._globalOptions.transport = transport;\n\n return this;\n },\n\n /*\n * Get the latest raw exception that was captured by Raven.\n *\n * @return {error}\n */\n lastException: function() {\n return this._lastCapturedException;\n },\n\n /*\n * Get the last event id\n *\n * @return {string}\n */\n lastEventId: function() {\n return this._lastEventId;\n },\n\n /*\n * Determine if Raven is setup and ready to go.\n *\n * @return {boolean}\n */\n isSetup: function() {\n if (!this._hasJSON) return false; // needs JSON support\n if (!this._globalServer) {\n if (!this.ravenNotConfiguredError) {\n this.ravenNotConfiguredError = true;\n this._logDebug('error', 'Error: Raven has not been configured.');\n }\n return false;\n }\n return true;\n },\n\n afterLoad: function() {\n // TODO: remove window dependence?\n\n // Attempt to initialize Raven on load\n var RavenConfig = _window.RavenConfig;\n if (RavenConfig) {\n this.config(RavenConfig.dsn, RavenConfig.config).install();\n }\n },\n\n showReportDialog: function(options) {\n if (\n !_document // doesn't work without a document (React native)\n )\n return;\n\n options = options || {};\n\n var lastEventId = options.eventId || this.lastEventId();\n if (!lastEventId) {\n throw new RavenConfigError('Missing eventId');\n }\n\n var dsn = options.dsn || this._dsn;\n if (!dsn) {\n throw new RavenConfigError('Missing DSN');\n }\n\n var encode = encodeURIComponent;\n var qs = '';\n qs += '?eventId=' + encode(lastEventId);\n qs += '&dsn=' + encode(dsn);\n\n var user = options.user || this._globalContext.user;\n if (user) {\n if (user.name) qs += '&name=' + encode(user.name);\n if (user.email) qs += '&email=' + encode(user.email);\n }\n\n var globalServer = this._getGlobalServer(this._parseDSN(dsn));\n\n var script = _document.createElement('script');\n script.async = true;\n script.src = globalServer + '/api/embed/error-page/' + qs;\n (_document.head || _document.body).appendChild(script);\n },\n\n /**** Private functions ****/\n _ignoreNextOnError: function() {\n var self = this;\n this._ignoreOnError += 1;\n setTimeout(function() {\n // onerror should trigger before setTimeout\n self._ignoreOnError -= 1;\n });\n },\n\n _triggerEvent: function(eventType, options) {\n // NOTE: `event` is a native browser thing, so let's avoid conflicting wiht it\n var evt, key;\n\n if (!this._hasDocument) return;\n\n options = options || {};\n\n eventType = 'raven' + eventType.substr(0, 1).toUpperCase() + eventType.substr(1);\n\n if (_document.createEvent) {\n evt = _document.createEvent('HTMLEvents');\n evt.initEvent(eventType, true, true);\n } else {\n evt = _document.createEventObject();\n evt.eventType = eventType;\n }\n\n for (key in options)\n if (hasKey(options, key)) {\n evt[key] = options[key];\n }\n\n if (_document.createEvent) {\n // IE9 if standards\n _document.dispatchEvent(evt);\n } else {\n // IE8 regardless of Quirks or Standards\n // IE9 if quirks\n try {\n _document.fireEvent('on' + evt.eventType.toLowerCase(), evt);\n } catch (e) {\n // Do nothing\n }\n }\n },\n\n /**\n * Wraps addEventListener to capture UI breadcrumbs\n * @param evtName the event name (e.g. \"click\")\n * @returns {Function}\n * @private\n */\n _breadcrumbEventHandler: function(evtName) {\n var self = this;\n return function(evt) {\n // reset keypress timeout; e.g. triggering a 'click' after\n // a 'keypress' will reset the keypress debounce so that a new\n // set of keypresses can be recorded\n self._keypressTimeout = null;\n\n // It's possible this handler might trigger multiple times for the same\n // event (e.g. event propagation through node ancestors). Ignore if we've\n // already captured the event.\n if (self._lastCapturedEvent === evt) return;\n\n self._lastCapturedEvent = evt;\n\n // try/catch both:\n // - accessing evt.target (see getsentry/raven-js#838, #768)\n // - `htmlTreeAsString` because it's complex, and just accessing the DOM incorrectly\n // can throw an exception in some circumstances.\n var target;\n try {\n target = htmlTreeAsString(evt.target);\n } catch (e) {\n target = '<unknown>';\n }\n\n self.captureBreadcrumb({\n category: 'ui.' + evtName, // e.g. ui.click, ui.input\n message: target\n });\n };\n },\n\n /**\n * Wraps addEventListener to capture keypress UI events\n * @returns {Function}\n * @private\n */\n _keypressEventHandler: function() {\n var self = this,\n debounceDuration = 1000; // milliseconds\n\n // TODO: if somehow user switches keypress target before\n // debounce timeout is triggered, we will only capture\n // a single breadcrumb from the FIRST target (acceptable?)\n return function(evt) {\n var target;\n try {\n target = evt.target;\n } catch (e) {\n // just accessing event properties can throw an exception in some rare circumstances\n // see: https://github.com/getsentry/raven-js/issues/838\n return;\n }\n var tagName = target && target.tagName;\n\n // only consider keypress events on actual input elements\n // this will disregard keypresses targeting body (e.g. tabbing\n // through elements, hotkeys, etc)\n if (\n !tagName ||\n (tagName !== 'INPUT' && tagName !== 'TEXTAREA' && !target.isContentEditable)\n )\n return;\n\n // record first keypress in a series, but ignore subsequent\n // keypresses until debounce clears\n var timeout = self._keypressTimeout;\n if (!timeout) {\n self._breadcrumbEventHandler('input')(evt);\n }\n clearTimeout(timeout);\n self._keypressTimeout = setTimeout(function() {\n self._keypressTimeout = null;\n }, debounceDuration);\n };\n },\n\n /**\n * Captures a breadcrumb of type \"navigation\", normalizing input URLs\n * @param to the originating URL\n * @param from the target URL\n * @private\n */\n _captureUrlChange: function(from, to) {\n var parsedLoc = parseUrl(this._location.href);\n var parsedTo = parseUrl(to);\n var parsedFrom = parseUrl(from);\n\n // because onpopstate only tells you the \"new\" (to) value of location.href, and\n // not the previous (from) value, we need to track the value of the current URL\n // state ourselves\n this._lastHref = to;\n\n // Use only the path component of the URL if the URL matches the current\n // document (almost all the time when using pushState)\n if (parsedLoc.protocol === parsedTo.protocol && parsedLoc.host === parsedTo.host)\n to = parsedTo.relative;\n if (parsedLoc.protocol === parsedFrom.protocol && parsedLoc.host === parsedFrom.host)\n from = parsedFrom.relative;\n\n this.captureBreadcrumb({\n category: 'navigation',\n data: {\n to: to,\n from: from\n }\n });\n },\n\n _patchFunctionToString: function() {\n var self = this;\n self._originalFunctionToString = Function.prototype.toString;\n // eslint-disable-next-line no-extend-native\n Function.prototype.toString = function() {\n if (typeof this === 'function' && this.__raven__) {\n return self._originalFunctionToString.apply(this.__orig__, arguments);\n }\n return self._originalFunctionToString.apply(this, arguments);\n };\n },\n\n _unpatchFunctionToString: function() {\n if (this._originalFunctionToString) {\n // eslint-disable-next-line no-extend-native\n Function.prototype.toString = this._originalFunctionToString;\n }\n },\n\n /**\n * Wrap timer functions and event targets to catch errors and provide\n * better metadata.\n */\n _instrumentTryCatch: function() {\n var self = this;\n\n var wrappedBuiltIns = self._wrappedBuiltIns;\n\n function wrapTimeFn(orig) {\n return function(fn, t) {\n // preserve arity\n // Make a copy of the arguments to prevent deoptimization\n // https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#32-leaking-arguments\n var args = new Array(arguments.length);\n for (var i = 0; i < args.length; ++i) {\n args[i] = arguments[i];\n }\n var originalCallback = args[0];\n if (isFunction(originalCallback)) {\n args[0] = self.wrap(\n {\n mechanism: {\n type: 'instrument',\n data: {function: orig.name}\n }\n },\n originalCallback\n );\n }\n\n // IE < 9 doesn't support .call/.apply on setInterval/setTimeout, but it\n // also supports only two arguments and doesn't care what this is, so we\n // can just call the original function directly.\n if (orig.apply) {\n return orig.apply(this, args);\n } else {\n return orig(args[0], args[1]);\n }\n };\n }\n\n var autoBreadcrumbs = this._globalOptions.autoBreadcrumbs;\n\n function wrapEventTarget(global) {\n var proto = _window[global] && _window[global].prototype;\n if (proto && proto.hasOwnProperty && proto.hasOwnProperty('addEventListener')) {\n fill(\n proto,\n 'addEventListener',\n function(orig) {\n return function(evtName, fn, capture, secure) {\n // preserve arity\n try {\n if (fn && fn.handleEvent) {\n fn.handleEvent = self.wrap(\n {\n mechanism: {\n type: 'instrument',\n data: {target: global, function: 'handleEvent', handler: fn.name}\n }\n },\n fn.handleEvent\n );\n }\n } catch (err) {\n // can sometimes get 'Permission denied to access property \"handle Event'\n }\n\n // More breadcrumb DOM capture ... done here and not in `_instrumentBreadcrumbs`\n // so that we don't have more than one wrapper function\n var before, clickHandler, keypressHandler;\n\n if (\n autoBreadcrumbs &&\n autoBreadcrumbs.dom &&\n (global === 'EventTarget' || global === 'Node')\n ) {\n // NOTE: generating multiple handlers per addEventListener invocation, should\n // revisit and verify we can just use one (almost certainly)\n clickHandler = self._breadcrumbEventHandler('click');\n keypressHandler = self._keypressEventHandler();\n before = function(evt) {\n // need to intercept every DOM event in `before` argument, in case that\n // same wrapped method is re-used for different events (e.g. mousemove THEN click)\n // see #724\n if (!evt) return;\n\n var eventType;\n try {\n eventType = evt.type;\n } catch (e) {\n // just accessing event properties can throw an exception in some rare circumstances\n // see: https://github.com/getsentry/raven-js/issues/838\n return;\n }\n if (eventType === 'click') return clickHandler(evt);\n else if (eventType === 'keypress') return keypressHandler(evt);\n };\n }\n return orig.call(\n this,\n evtName,\n self.wrap(\n {\n mechanism: {\n type: 'instrument',\n data: {\n target: global,\n function: 'addEventListener',\n handler: fn.name\n }\n }\n },\n fn,\n before\n ),\n capture,\n secure\n );\n };\n },\n wrappedBuiltIns\n );\n fill(\n proto,\n 'removeEventListener',\n function(orig) {\n return function(evt, fn, capture, secure) {\n try {\n fn = fn && (fn.__raven_wrapper__ ? fn.__raven_wrapper__ : fn);\n } catch (e) {\n // ignore, accessing __raven_wrapper__ will throw in some Selenium environments\n }\n return orig.call(this, evt, fn, capture, secure);\n };\n },\n wrappedBuiltIns\n );\n }\n }\n\n fill(_window, 'setTimeout', wrapTimeFn, wrappedBuiltIns);\n fill(_window, 'setInterval', wrapTimeFn, wrappedBuiltIns);\n if (_window.requestAnimationFrame) {\n fill(\n _window,\n 'requestAnimationFrame',\n function(orig) {\n return function(cb) {\n return orig(\n self.wrap(\n {\n mechanism: {\n type: 'instrument',\n data: {function: 'requestAnimationFrame', handler: orig.name}\n }\n },\n cb\n )\n );\n };\n },\n wrappedBuiltIns\n );\n }\n\n // event targets borrowed from bugsnag-js:\n // https://github.com/bugsnag/bugsnag-js/blob/master/src/bugsnag.js#L666\n var eventTargets = [\n 'EventTarget',\n 'Window',\n 'Node',\n 'ApplicationCache',\n 'AudioTrackList',\n 'ChannelMergerNode',\n 'CryptoOperation',\n 'EventSource',\n 'FileReader',\n 'HTMLUnknownElement',\n 'IDBDatabase',\n 'IDBRequest',\n 'IDBTransaction',\n 'KeyOperation',\n 'MediaController',\n 'MessagePort',\n 'ModalWindow',\n 'Notification',\n 'SVGElementInstance',\n 'Screen',\n 'TextTrack',\n 'TextTrackCue',\n 'TextTrackList',\n 'WebSocket',\n 'WebSocketWorker',\n 'Worker',\n 'XMLHttpRequest',\n 'XMLHttpRequestEventTarget',\n 'XMLHttpRequestUpload'\n ];\n for (var i = 0; i < eventTargets.length; i++) {\n wrapEventTarget(eventTargets[i]);\n }\n },\n\n /**\n * Instrument browser built-ins w/ breadcrumb capturing\n * - XMLHttpRequests\n * - DOM interactions (click/typing)\n * - window.location changes\n * - console\n *\n * Can be disabled or individually configured via the `autoBreadcrumbs` config option\n */\n _instrumentBreadcrumbs: function() {\n var self = this;\n var autoBreadcrumbs = this._globalOptions.autoBreadcrumbs;\n\n var wrappedBuiltIns = self._wrappedBuiltIns;\n\n function wrapProp(prop, xhr) {\n if (prop in xhr && isFunction(xhr[prop])) {\n fill(xhr, prop, function(orig) {\n return self.wrap(\n {\n mechanism: {\n type: 'instrument',\n data: {function: prop, handler: orig.name}\n }\n },\n orig\n );\n }); // intentionally don't track filled methods on XHR instances\n }\n }\n\n if (autoBreadcrumbs.xhr && 'XMLHttpRequest' in _window) {\n var xhrproto = _window.XMLHttpRequest && _window.XMLHttpRequest.prototype;\n fill(\n xhrproto,\n 'open',\n function(origOpen) {\n return function(method, url) {\n // preserve arity\n\n // if Sentry key appears in URL, don't capture\n if (isString(url) && url.indexOf(self._globalKey) === -1) {\n this.__raven_xhr = {\n method: method,\n url: url,\n status_code: null\n };\n }\n\n return origOpen.apply(this, arguments);\n };\n },\n wrappedBuiltIns\n );\n\n fill(\n xhrproto,\n 'send',\n function(origSend) {\n return function() {\n // preserve arity\n var xhr = this;\n\n function onreadystatechangeHandler() {\n if (xhr.__raven_xhr && xhr.readyState === 4) {\n try {\n // touching statusCode in some platforms throws\n // an exception\n xhr.__raven_xhr.status_code = xhr.status;\n } catch (e) {\n /* do nothing */\n }\n\n self.captureBreadcrumb({\n type: 'http',\n category: 'xhr',\n data: xhr.__raven_xhr\n });\n }\n }\n\n var props = ['onload', 'onerror', 'onprogress'];\n for (var j = 0; j < props.length; j++) {\n wrapProp(props[j], xhr);\n }\n\n if ('onreadystatechange' in xhr && isFunction(xhr.onreadystatechange)) {\n fill(\n xhr,\n 'onreadystatechange',\n function(orig) {\n return self.wrap(\n {\n mechanism: {\n type: 'instrument',\n data: {\n function: 'onreadystatechange',\n handler: orig.name\n }\n }\n },\n orig,\n onreadystatechangeHandler\n );\n } /* intentionally don't track this instrumentation */\n );\n } else {\n // if onreadystatechange wasn't actually set by the page on this xhr, we\n // are free to set our own and capture the breadcrumb\n xhr.onreadystatechange = onreadystatechangeHandler;\n }\n\n return origSend.apply(this, arguments);\n };\n },\n wrappedBuiltIns\n );\n }\n\n if (autoBreadcrumbs.xhr && supportsFetch()) {\n fill(\n _window,\n 'fetch',\n function(origFetch) {\n return function() {\n // preserve arity\n // Make a copy of the arguments to prevent deoptimization\n // https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#32-leaking-arguments\n var args = new Array(arguments.length);\n for (var i = 0; i < args.length; ++i) {\n args[i] = arguments[i];\n }\n\n var fetchInput = args[0];\n var method = 'GET';\n var url;\n\n if (typeof fetchInput === 'string') {\n url = fetchInput;\n } else if ('Request' in _window && fetchInput instanceof _window.Request) {\n url = fetchInput.url;\n if (fetchInput.method) {\n method = fetchInput.method;\n }\n } else {\n url = '' + fetchInput;\n }\n\n // if Sentry key appears in URL, don't capture, as it's our own request\n if (url.indexOf(self._globalKey) !== -1) {\n return origFetch.apply(this, args);\n }\n\n if (args[1] && args[1].method) {\n method = args[1].method;\n }\n\n var fetchData = {\n method: method,\n url: url,\n status_code: null\n };\n\n return origFetch\n .apply(this, args)\n .then(function(response) {\n fetchData.status_code = response.status;\n\n self.captureBreadcrumb({\n type: 'http',\n category: 'fetch',\n data: fetchData\n });\n\n return response;\n })\n ['catch'](function(err) {\n // if there is an error performing the request\n self.captureBreadcrumb({\n type: 'http',\n category: 'fetch',\n data: fetchData,\n level: 'error'\n });\n\n throw err;\n });\n };\n },\n wrappedBuiltIns\n );\n }\n\n // Capture breadcrumbs from any click that is unhandled / bubbled up all the way\n // to the document. Do this before we instrument addEventListener.\n if (autoBreadcrumbs.dom && this._hasDocument) {\n if (_document.addEventListener) {\n _document.addEventListener('click', self._breadcrumbEventHandler('click'), false);\n _document.addEventListener('keypress', self._keypressEventHandler(), false);\n } else if (_document.attachEvent) {\n // IE8 Compatibility\n _document.attachEvent('onclick', self._breadcrumbEventHandler('click'));\n _document.attachEvent('onkeypress', self._keypressEventHandler());\n }\n }\n\n // record navigation (URL) changes\n // NOTE: in Chrome App environment, touching history.pushState, *even inside\n // a try/catch block*, will cause Chrome to output an error to console.error\n // borrowed from: https://github.com/angular/angular.js/pull/13945/files\n var chrome = _window.chrome;\n var isChromePackagedApp = chrome && chrome.app && chrome.app.runtime;\n var hasPushAndReplaceState =\n !isChromePackagedApp &&\n _window.history &&\n _window.history.pushState &&\n _window.history.replaceState;\n if (autoBreadcrumbs.location && hasPushAndReplaceState) {\n // TODO: remove onpopstate handler on uninstall()\n var oldOnPopState = _window.onpopstate;\n _window.onpopstate = function() {\n var currentHref = self._location.href;\n self._captureUrlChange(self._lastHref, currentHref);\n\n if (oldOnPopState) {\n return oldOnPopState.apply(this, arguments);\n }\n };\n\n var historyReplacementFunction = function(origHistFunction) {\n // note history.pushState.length is 0; intentionally not declaring\n // params to preserve 0 arity\n return function(/* state, title, url */) {\n var url = arguments.length > 2 ? arguments[2] : undefined;\n\n // url argument is optional\n if (url) {\n // coerce to string (this is what pushState does)\n self._captureUrlChange(self._lastHref, url + '');\n }\n\n return origHistFunction.apply(this, arguments);\n };\n };\n\n fill(_window.history, 'pushState', historyReplacementFunction, wrappedBuiltIns);\n fill(_window.history, 'replaceState', historyReplacementFunction, wrappedBuiltIns);\n }\n\n if (autoBreadcrumbs.console && 'console' in _window && console.log) {\n // console\n var consoleMethodCallback = function(msg, data) {\n self.captureBreadcrumb({\n message: msg,\n level: data.level,\n category: 'console'\n });\n };\n\n each(['debug', 'info', 'warn', 'error', 'log'], function(_, level) {\n wrapConsoleMethod(console, level, consoleMethodCallback);\n });\n }\n },\n\n _restoreBuiltIns: function() {\n // restore any wrapped builtins\n var builtin;\n while (this._wrappedBuiltIns.length) {\n builtin = this._wrappedBuiltIns.shift();\n\n var obj = builtin[0],\n name = builtin[1],\n orig = builtin[2];\n\n obj[name] = orig;\n }\n },\n\n _restoreConsole: function() {\n // eslint-disable-next-line guard-for-in\n for (var method in this._originalConsoleMethods) {\n this._originalConsole[method] = this._originalConsoleMethods[method];\n }\n },\n\n _drainPlugins: function() {\n var self = this;\n\n // FIX ME TODO\n each(this._plugins, function(_, plugin) {\n var installer = plugin[0];\n var args = plugin[1];\n installer.apply(self, [self].concat(args));\n });\n },\n\n _parseDSN: function(str) {\n var m = dsnPattern.exec(str),\n dsn = {},\n i = 7;\n\n try {\n while (i--) dsn[dsnKeys[i]] = m[i] || '';\n } catch (e) {\n throw new RavenConfigError('Invalid DSN: ' + str);\n }\n\n if (dsn.pass && !this._globalOptions.allowSecretKey) {\n throw new RavenConfigError(\n 'Do not specify your secret key in the DSN. See: http://bit.ly/raven-secret-key'\n );\n }\n\n return dsn;\n },\n\n _getGlobalServer: function(uri) {\n // assemble the endpoint from the uri pieces\n var globalServer = '//' + uri.host + (uri.port ? ':' + uri.port : '');\n\n if (uri.protocol) {\n globalServer = uri.protocol + ':' + globalServer;\n }\n return globalServer;\n },\n\n _handleOnErrorStackInfo: function(stackInfo, options) {\n options = options || {};\n options.mechanism = options.mechanism || {\n type: 'onerror',\n handled: false\n };\n\n // if we are intentionally ignoring errors via onerror, bail out\n if (!this._ignoreOnError) {\n this._handleStackInfo(stackInfo, options);\n }\n },\n\n _handleStackInfo: function(stackInfo, options) {\n var frames = this._prepareFrames(stackInfo, options);\n\n this._triggerEvent('handle', {\n stackInfo: stackInfo,\n options: options\n });\n\n this._processException(\n stackInfo.name,\n stackInfo.message,\n stackInfo.url,\n stackInfo.lineno,\n frames,\n options\n );\n },\n\n _prepareFrames: function(stackInfo, options) {\n var self = this;\n var frames = [];\n if (stackInfo.stack && stackInfo.stack.length) {\n each(stackInfo.stack, function(i, stack) {\n var frame = self._normalizeFrame(stack, stackInfo.url);\n if (frame) {\n frames.push(frame);\n }\n });\n\n // e.g. frames captured via captureMessage throw\n if (options && options.trimHeadFrames) {\n for (var j = 0; j < options.trimHeadFrames && j < frames.length; j++) {\n frames[j].in_app = false;\n }\n }\n }\n frames = frames.slice(0, this._globalOptions.stackTraceLimit);\n return frames;\n },\n\n _normalizeFrame: function(frame, stackInfoUrl) {\n // normalize the frames data\n var normalized = {\n filename: frame.url,\n lineno: frame.line,\n colno: frame.column,\n function: frame.func || '?'\n };\n\n // Case when we don't have any information about the error\n // E.g. throwing a string or raw object, instead of an `Error` in Firefox\n // Generating synthetic error doesn't add any value here\n //\n // We should probably somehow let a user know that they should fix their code\n if (!frame.url) {\n normalized.filename = stackInfoUrl; // fallback to whole stacks url from onerror handler\n }\n\n normalized.in_app = !// determine if an exception came from outside of our app\n // first we check the global includePaths list.\n (\n (!!this._globalOptions.includePaths.test &&\n !this._globalOptions.includePaths.test(normalized.filename)) ||\n // Now we check for fun, if the function name is Raven or TraceKit\n /(Raven|TraceKit)\\./.test(normalized['function']) ||\n // finally, we do a last ditch effort and check for raven.min.js\n /raven\\.(min\\.)?js$/.test(normalized.filename)\n );\n\n return normalized;\n },\n\n _processException: function(type, message, fileurl, lineno, frames, options) {\n var prefixedMessage = (type ? type + ': ' : '') + (message || '');\n if (\n !!this._globalOptions.ignoreErrors.test &&\n (this._globalOptions.ignoreErrors.test(message) ||\n this._globalOptions.ignoreErrors.test(prefixedMessage))\n ) {\n return;\n }\n\n var stacktrace;\n\n if (frames && frames.length) {\n fileurl = frames[0].filename || fileurl;\n // Sentry expects frames oldest to newest\n // and JS sends them as newest to oldest\n frames.reverse();\n stacktrace = {frames: frames};\n } else if (fileurl) {\n stacktrace = {\n frames: [\n {\n filename: fileurl,\n lineno: lineno,\n in_app: true\n }\n ]\n };\n }\n\n if (\n !!this._globalOptions.ignoreUrls.test &&\n this._globalOptions.ignoreUrls.test(fileurl)\n ) {\n return;\n }\n\n if (\n !!this._globalOptions.whitelistUrls.test &&\n !this._globalOptions.whitelistUrls.test(fileurl)\n ) {\n return;\n }\n\n var data = objectMerge(\n {\n // sentry.interfaces.Exception\n exception: {\n values: [\n {\n type: type,\n value: message,\n stacktrace: stacktrace\n }\n ]\n },\n transaction: fileurl\n },\n options\n );\n\n // Move mechanism from options to exception interface\n // We do this, as requiring user to pass `{exception:{mechanism:{ ... }}}` would be\n // too much\n if (!data.exception.mechanism && data.mechanism) {\n data.exception.mechanism = data.mechanism;\n delete data.mechanism;\n }\n\n data.exception.mechanism = objectMerge(data.exception.mechanism || {}, {\n type: 'generic',\n handled: true\n });\n\n // Fire away!\n this._send(data);\n },\n\n _trimPacket: function(data) {\n // For now, we only want to truncate the two different messages\n // but this could/should be expanded to just trim everything\n var max = this._globalOptions.maxMessageLength;\n if (data.message) {\n data.message = truncate(data.message, max);\n }\n if (data.exception) {\n var exception = data.exception.values[0];\n exception.value = truncate(exception.value, max);\n }\n\n var request = data.request;\n if (request) {\n if (request.url) {\n request.url = truncate(request.url, this._globalOptions.maxUrlLength);\n }\n if (request.Referer) {\n request.Referer = truncate(request.Referer, this._globalOptions.maxUrlLength);\n }\n }\n\n if (data.breadcrumbs && data.breadcrumbs.values)\n this._trimBreadcrumbs(data.breadcrumbs);\n\n return data;\n },\n\n /**\n * Truncate breadcrumb values (right now just URLs)\n */\n _trimBreadcrumbs: function(breadcrumbs) {\n // known breadcrumb properties with urls\n // TODO: also consider arbitrary prop values that start with (https?)?://\n var urlProps = ['to', 'from', 'url'],\n urlProp,\n crumb,\n data;\n\n for (var i = 0; i < breadcrumbs.values.length; ++i) {\n crumb = breadcrumbs.values[i];\n if (\n !crumb.hasOwnProperty('data') ||\n !isObject(crumb.data) ||\n objectFrozen(crumb.data)\n )\n continue;\n\n data = objectMerge({}, crumb.data);\n for (var j = 0; j < urlProps.length; ++j) {\n urlProp = urlProps[j];\n if (data.hasOwnProperty(urlProp) && data[urlProp]) {\n data[urlProp] = truncate(data[urlProp], this._globalOptions.maxUrlLength);\n }\n }\n breadcrumbs.values[i].data = data;\n }\n },\n\n _getHttpData: function() {\n if (!this._hasNavigator && !this._hasDocument) return;\n var httpData = {};\n\n if (this._hasNavigator && _navigator.userAgent) {\n httpData.headers = {\n 'User-Agent': _navigator.userAgent\n };\n }\n\n // Check in `window` instead of `document`, as we may be in ServiceWorker environment\n if (_window.location && _window.location.href) {\n httpData.url = _window.location.href;\n }\n\n if (this._hasDocument && _document.referrer) {\n if (!httpData.headers) httpData.headers = {};\n httpData.headers.Referer = _document.referrer;\n }\n\n return httpData;\n },\n\n _resetBackoff: function() {\n this._backoffDuration = 0;\n this._backoffStart = null;\n },\n\n _shouldBackoff: function() {\n return this._backoffDuration && now() - this._backoffStart < this._backoffDuration;\n },\n\n /**\n * Returns true if the in-process data payload matches the signature\n * of the previously-sent data\n *\n * NOTE: This has to be done at this level because TraceKit can generate\n * data from window.onerror WITHOUT an exception object (IE8, IE9,\n * other old browsers). This can take the form of an \"exception\"\n * data object with a single frame (derived from the onerror args).\n */\n _isRepeatData: function(current) {\n var last = this._lastData;\n\n if (\n !last ||\n current.message !== last.message || // defined for captureMessage\n current.transaction !== last.transaction // defined for captureException/onerror\n )\n return false;\n\n // Stacktrace interface (i.e. from captureMessage)\n if (current.stacktrace || last.stacktrace) {\n return isSameStacktrace(current.stacktrace, last.stacktrace);\n } else if (current.exception || last.exception) {\n // Exception interface (i.e. from captureException/onerror)\n return isSameException(current.exception, last.exception);\n }\n\n return true;\n },\n\n _setBackoffState: function(request) {\n // If we are already in a backoff state, don't change anything\n if (this._shouldBackoff()) {\n return;\n }\n\n var status = request.status;\n\n // 400 - project_id doesn't exist or some other fatal\n // 401 - invalid/revoked dsn\n // 429 - too many requests\n if (!(status === 400 || status === 401 || status === 429)) return;\n\n var retry;\n try {\n // If Retry-After is not in Access-Control-Expose-Headers, most\n // browsers will throw an exception trying to access it\n if (supportsFetch()) {\n retry = request.headers.get('Retry-After');\n } else {\n retry = request.getResponseHeader('Retry-After');\n }\n\n // Retry-After is returned in seconds\n retry = parseInt(retry, 10) * 1000;\n } catch (e) {\n /* eslint no-empty:0 */\n }\n\n this._backoffDuration = retry\n ? // If Sentry server returned a Retry-After value, use it\n retry\n : // Otherwise, double the last backoff duration (starts at 1 sec)\n this._backoffDuration * 2 || 1000;\n\n this._backoffStart = now();\n },\n\n _send: function(data) {\n var globalOptions = this._globalOptions;\n\n var baseData = {\n project: this._globalProject,\n logger: globalOptions.logger,\n platform: 'javascript'\n },\n httpData = this._getHttpData();\n\n if (httpData) {\n baseData.request = httpData;\n }\n\n // HACK: delete `trimHeadFrames` to prevent from appearing in outbound payload\n if (data.trimHeadFrames) delete data.trimHeadFrames;\n\n data = objectMerge(baseData, data);\n\n // Merge in the tags and extra separately since objectMerge doesn't handle a deep merge\n data.tags = objectMerge(objectMerge({}, this._globalContext.tags), data.tags);\n data.extra = objectMerge(objectMerge({}, this._globalContext.extra), data.extra);\n\n // Send along our own collected metadata with extra\n data.extra['session:duration'] = now() - this._startTime;\n\n if (this._breadcrumbs && this._breadcrumbs.length > 0) {\n // intentionally make shallow copy so that additions\n // to breadcrumbs aren't accidentally sent in this request\n data.breadcrumbs = {\n values: [].slice.call(this._breadcrumbs, 0)\n };\n }\n\n if (this._globalContext.user) {\n // sentry.interfaces.User\n data.user = this._globalContext.user;\n }\n\n // Include the environment if it's defined in globalOptions\n if (globalOptions.environment) data.environment = globalOptions.environment;\n\n // Include the release if it's defined in globalOptions\n if (globalOptions.release) data.release = globalOptions.release;\n\n // Include server_name if it's defined in globalOptions\n if (globalOptions.serverName) data.server_name = globalOptions.serverName;\n\n data = this._sanitizeData(data);\n\n // Cleanup empty properties before sending them to the server\n Object.keys(data).forEach(function(key) {\n if (data[key] == null || data[key] === '' || isEmptyObject(data[key])) {\n delete data[key];\n }\n });\n\n if (isFunction(globalOptions.dataCallback)) {\n data = globalOptions.dataCallback(data) || data;\n }\n\n // Why??????????\n if (!data || isEmptyObject(data)) {\n return;\n }\n\n // Check if the request should be filtered or not\n if (\n isFunction(globalOptions.shouldSendCallback) &&\n !globalOptions.shouldSendCallback(data)\n ) {\n return;\n }\n\n // Backoff state: Sentry server previously responded w/ an error (e.g. 429 - too many requests),\n // so drop requests until \"cool-off\" period has elapsed.\n if (this._shouldBackoff()) {\n this._logDebug('warn', 'Raven dropped error due to backoff: ', data);\n return;\n }\n\n if (typeof globalOptions.sampleRate === 'number') {\n if (Math.random() < globalOptions.sampleRate) {\n this._sendProcessedPayload(data);\n }\n } else {\n this._sendProcessedPayload(data);\n }\n },\n\n _sanitizeData: function(data) {\n return sanitize(data, this._globalOptions.sanitizeKeys);\n },\n\n _getUuid: function() {\n return uuid4();\n },\n\n _sendProcessedPayload: function(data, callback) {\n var self = this;\n var globalOptions = this._globalOptions;\n\n if (!this.isSetup()) return;\n\n // Try and clean up the packet before sending by truncating long values\n data = this._trimPacket(data);\n\n // ideally duplicate error testing should occur *before* dataCallback/shouldSendCallback,\n // but this would require copying an un-truncated copy of the data packet, which can be\n // arbitrarily deep (extra_data) -- could be worthwhile? will revisit\n if (!this._globalOptions.allowDuplicates && this._isRepeatData(data)) {\n this._logDebug('warn', 'Raven dropped repeat event: ', data);\n return;\n }\n\n // Send along an event_id if not explicitly passed.\n // This event_id can be used to reference the error within Sentry itself.\n // Set lastEventId after we know the error should actually be sent\n this._lastEventId = data.event_id || (data.event_id = this._getUuid());\n\n // Store outbound payload after trim\n this._lastData = data;\n\n this._logDebug('debug', 'Raven about to send:', data);\n\n var auth = {\n sentry_version: '7',\n sentry_client: 'raven-js/' + this.VERSION,\n sentry_key: this._globalKey\n };\n\n if (this._globalSecret) {\n auth.sentry_secret = this._globalSecret;\n }\n\n var exception = data.exception && data.exception.values[0];\n\n // only capture 'sentry' breadcrumb is autoBreadcrumbs is truthy\n if (\n this._globalOptions.autoBreadcrumbs &&\n this._globalOptions.autoBreadcrumbs.sentry\n ) {\n this.captureBreadcrumb({\n category: 'sentry',\n message: exception\n ? (exception.type ? exception.type + ': ' : '') + exception.value\n : data.message,\n event_id: data.event_id,\n level: data.level || 'error' // presume error unless specified\n });\n }\n\n var url = this._globalEndpoint;\n (globalOptions.transport || this._makeRequest).call(this, {\n url: url,\n auth: auth,\n data: data,\n options: globalOptions,\n onSuccess: function success() {\n self._resetBackoff();\n\n self._triggerEvent('success', {\n data: data,\n src: url\n });\n callback && callback();\n },\n onError: function failure(error) {\n self._logDebug('error', 'Raven transport failed to send: ', error);\n\n if (error.request) {\n self._setBackoffState(error.request);\n }\n\n self._triggerEvent('failure', {\n data: data,\n src: url\n });\n error = error || new Error('Raven send failed (no additional details provided)');\n callback && callback(error);\n }\n });\n },\n\n _makeRequest: function(opts) {\n // Auth is intentionally sent as part of query string (NOT as custom HTTP header) to avoid preflight CORS requests\n var url = opts.url + '?' + urlencode(opts.auth);\n\n var evaluatedHeaders = null;\n var evaluatedFetchParameters = {};\n\n if (opts.options.headers) {\n evaluatedHeaders = this._evaluateHash(opts.options.headers);\n }\n\n if (opts.options.fetchParameters) {\n evaluatedFetchParameters = this._evaluateHash(opts.options.fetchParameters);\n }\n\n if (supportsFetch()) {\n evaluatedFetchParameters.body = stringify(opts.data);\n\n var defaultFetchOptions = objectMerge({}, this._fetchDefaults);\n var fetchOptions = objectMerge(defaultFetchOptions, evaluatedFetchParameters);\n\n if (evaluatedHeaders) {\n fetchOptions.headers = evaluatedHeaders;\n }\n\n return _window\n .fetch(url, fetchOptions)\n .then(function(response) {\n if (response.ok) {\n opts.onSuccess && opts.onSuccess();\n } else {\n var error = new Error('Sentry error code: ' + response.status);\n // It's called request only to keep compatibility with XHR interface\n // and not add more redundant checks in setBackoffState method\n error.request = response;\n opts.onError && opts.onError(error);\n }\n })\n ['catch'](function() {\n opts.onError &&\n opts.onError(new Error('Sentry error code: network unavailable'));\n });\n }\n\n var request = _window.XMLHttpRequest && new _window.XMLHttpRequest();\n if (!request) return;\n\n // if browser doesn't support CORS (e.g. IE7), we are out of luck\n var hasCORS = 'withCredentials' in request || typeof XDomainRequest !== 'undefined';\n\n if (!hasCORS) return;\n\n if ('withCredentials' in request) {\n request.onreadystatechange = function() {\n if (request.readyState !== 4) {\n return;\n } else if (request.status === 200) {\n opts.onSuccess && opts.onSuccess();\n } else if (opts.onError) {\n var err = new Error('Sentry error code: ' + request.status);\n err.request = request;\n opts.onError(err);\n }\n };\n } else {\n request = new XDomainRequest();\n // xdomainrequest cannot go http -> https (or vice versa),\n // so always use protocol relative\n url = url.replace(/^https?:/, '');\n\n // onreadystatechange not supported by XDomainRequest\n if (opts.onSuccess) {\n request.onload = opts.onSuccess;\n }\n if (opts.onError) {\n request.onerror = function() {\n var err = new Error('Sentry error code: XDomainRequest');\n err.request = request;\n opts.onError(err);\n };\n }\n }\n\n request.open('POST', url);\n\n if (evaluatedHeaders) {\n each(evaluatedHeaders, function(key, value) {\n request.setRequestHeader(key, value);\n });\n }\n\n request.send(stringify(opts.data));\n },\n\n _evaluateHash: function(hash) {\n var evaluated = {};\n\n for (var key in hash) {\n if (hash.hasOwnProperty(key)) {\n var value = hash[key];\n evaluated[key] = typeof value === 'function' ? value() : value;\n }\n }\n\n return evaluated;\n },\n\n _logDebug: function(level) {\n // We allow `Raven.debug` and `Raven.config(DSN, { debug: true })` to not make backward incompatible API change\n if (\n this._originalConsoleMethods[level] &&\n (this.debug || this._globalOptions.debug)\n ) {\n // In IE<10 console methods do not have their own 'apply' method\n Function.prototype.apply.call(\n this._originalConsoleMethods[level],\n this._originalConsole,\n [].slice.call(arguments, 1)\n );\n }\n },\n\n _mergeContext: function(key, context) {\n if (isUndefined(context)) {\n delete this._globalContext[key];\n } else {\n this._globalContext[key] = objectMerge(this._globalContext[key] || {}, context);\n }\n }\n};\n\n// Deprecations\nRaven.prototype.setUser = Raven.prototype.setUserContext;\nRaven.prototype.setReleaseContext = Raven.prototype.setRelease;\n\nmodule.exports = Raven;\n","/**\n * Enforces a single instance of the Raven client, and the\n * main entry point for Raven. If you are a consumer of the\n * Raven library, you SHOULD load this file (vs raven.js).\n **/\n\nvar RavenConstructor = require('./raven');\n\n// This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785)\nvar _window =\n typeof window !== 'undefined'\n ? window\n : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\nvar _Raven = _window.Raven;\n\nvar Raven = new RavenConstructor();\n\n/*\n * Allow multiple versions of Raven to be installed.\n * Strip Raven from the global context and returns the instance.\n *\n * @return {Raven}\n */\nRaven.noConflict = function() {\n _window.Raven = _Raven;\n return Raven;\n};\n\nRaven.afterLoad();\n\nmodule.exports = Raven;\n\n/**\n * DISCLAIMER:\n *\n * Expose `Client` constructor for cases where user want to track multiple \"sub-applications\" in one larger app.\n * It's not meant to be used by a wide audience, so pleaaase make sure that you know what you're doing before using it.\n * Accidentally calling `install` multiple times, may result in an unexpected behavior that's very hard to debug.\n *\n * It's called `Client' to be in-line with Raven Node implementation.\n *\n * HOWTO:\n *\n * import Raven from 'raven-js';\n *\n * const someAppReporter = new Raven.Client();\n * const someOtherAppReporter = new Raven.Client();\n *\n * someAppReporter.config('__DSN__', {\n * ...config goes here\n * });\n *\n * someOtherAppReporter.config('__OTHER_DSN__', {\n * ...config goes here\n * });\n *\n * someAppReporter.captureMessage(...);\n * someAppReporter.captureException(...);\n * someAppReporter.captureBreadcrumb(...);\n *\n * someOtherAppReporter.captureMessage(...);\n * someOtherAppReporter.captureException(...);\n * someOtherAppReporter.captureBreadcrumb(...);\n *\n * It should \"just work\".\n */\nmodule.exports.Client = RavenConstructor;\n","// ==========================================================================\n// Plyr.io demo\n// This code is purely for the https://plyr.io website\n// Please see readme.md in the root or github.com/sampotts/plyr\n// ==========================================================================\n\nimport Raven from 'raven-js';\n\n(() => {\n const isLive = window.location.host === 'plyr.io';\n\n // Raven / Sentry\n // For demo site (https://plyr.io) only\n if (isLive) {\n Raven.config('https://d4ad9866ad834437a4754e23937071e4@sentry.io/305555').install();\n }\n\n document.addEventListener('DOMContentLoaded', () => {\n Raven.context(() => {\n if (window.shr) {\n window.shr.setup({\n count: {\n classname: 'button__count',\n },\n });\n }\n\n // Setup tab focus\n const tabClassName = 'tab-focus';\n\n // Remove class on blur\n document.addEventListener('focusout', event => {\n event.target.classList.remove(tabClassName);\n });\n\n // Add classname to tabbed elements\n document.addEventListener('keydown', event => {\n if (event.keyCode !== 9) {\n return;\n }\n\n // Delay the adding of classname until the focus has changed\n // This event fires before the focusin event\n setTimeout(() => {\n document.activeElement.classList.add(tabClassName);\n }, 0);\n });\n\n // Setup the player\n const player = new Plyr('#player', {\n debug: true,\n title: 'View From A Blue Moon',\n iconUrl: '../dist/plyr.svg',\n keyboard: {\n global: true,\n },\n tooltips: {\n controls: true,\n },\n /* controls: [\n 'play-large',\n 'restart',\n 'rewind',\n 'play',\n 'fast-forward',\n 'progress',\n 'current-time',\n 'duration',\n 'mute',\n 'volume',\n 'captions',\n 'settings',\n 'pip',\n 'airplay',\n 'fullscreen',\n ], */\n /* i18n: {\n restart: '重新開始',\n rewind: '快退{seektime}秒',\n play: '播放',\n pause: '暫停',\n fastForward: '快進{seektime}秒',\n seek: '尋求',\n played: '發揮',\n buffered: '緩衝的',\n currentTime: '當前時間戳',\n duration: '長短',\n volume: '音量',\n mute: '靜音',\n unmute: '取消靜音',\n enableCaptions: '開啟字幕',\n disableCaptions: '關閉字幕',\n enterFullscreen: '進入全螢幕',\n exitFullscreen: '退出全螢幕',\n frameTitle: '球員為{title}',\n captions: '字幕',\n settings: '設定',\n speed: '速度',\n normal: '正常',\n quality: '質量',\n loop: '循環',\n start: 'Start',\n end: 'End',\n all: 'All',\n reset: '重啟',\n disabled: '殘',\n enabled: '啟用',\n advertisement: '廣告',\n }, */\n captions: {\n active: true,\n },\n keys: {\n google: 'AIzaSyDrNwtN3nLH_8rjCmu5Wq3ZCm4MNAVdc0c',\n },\n ads: {\n enabled: true,\n publisherId: '918848828995742',\n },\n });\n\n // Expose for tinkering in the console\n window.player = player;\n\n // Setup type toggle\n const buttons = document.querySelectorAll('[data-source]');\n const types = {\n video: 'video',\n audio: 'audio',\n youtube: 'youtube',\n vimeo: 'vimeo',\n };\n let currentType = window.location.hash.replace('#', '');\n const historySupport = window.history && window.history.pushState;\n\n // Toggle class on an element\n function toggleClass(element, className, state) {\n if (element) {\n element.classList[state ? 'add' : 'remove'](className);\n }\n }\n\n // Set a new source\n function newSource(type, init) {\n // Bail if new type isn't known, it's the current type, or current type is empty (video is default) and new type is video\n if (!(type in types) || (!init && type === currentType) || (!currentType.length && type === types.video)) {\n return;\n }\n\n switch (type) {\n case types.video:\n player.source = {\n type: 'video',\n title: 'View From A Blue Moon',\n sources: [\n {\n src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-576p.mp4',\n type: 'video/mp4',\n size: 576,\n },\n {\n src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-720p.mp4',\n type: 'video/mp4',\n size: 720,\n },\n {\n src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-1080p.mp4',\n type: 'video/mp4',\n size: 1080,\n },\n {\n src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-1440p.mp4',\n type: 'video/mp4',\n size: 1440,\n },\n ],\n poster: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg',\n tracks: [\n {\n kind: 'captions',\n label: 'English',\n srclang: 'en',\n src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt',\n default: true,\n },\n {\n kind: 'captions',\n label: 'French',\n srclang: 'fr',\n src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt',\n },\n ],\n };\n\n break;\n\n case types.audio:\n player.source = {\n type: 'audio',\n title: 'Kishi Bashi &ndash; &ldquo;It All Began With A Burst&rdquo;',\n sources: [\n {\n src: 'https://cdn.plyr.io/static/demo/Kishi_Bashi_-_It_All_Began_With_a_Burst.mp3',\n type: 'audio/mp3',\n },\n {\n src: 'https://cdn.plyr.io/static/demo/Kishi_Bashi_-_It_All_Began_With_a_Burst.ogg',\n type: 'audio/ogg',\n },\n ],\n };\n\n break;\n\n case types.youtube:\n player.source = {\n type: 'video',\n sources: [{\n src: 'https://youtube.com/watch?v=bTqVqk7FSmY',\n provider: 'youtube',\n }],\n };\n\n break;\n\n case types.vimeo:\n player.source = {\n type: 'video',\n sources: [{\n src: 'https://vimeo.com/76979871',\n provider: 'vimeo',\n }],\n };\n\n break;\n\n default:\n break;\n }\n\n // Set the current type for next time\n currentType = type;\n\n // Remove active classes\n Array.from(buttons).forEach(button => toggleClass(button.parentElement, 'active', false));\n\n // Set active on parent\n toggleClass(document.querySelector(`[data-source=\"${type}\"]`), 'active', true);\n\n // Show cite\n Array.from(document.querySelectorAll('.plyr__cite')).forEach(cite => {\n cite.setAttribute('hidden', '');\n });\n document.querySelector(`.plyr__cite--${type}`).removeAttribute('hidden');\n }\n\n // Bind to each button\n Array.from(buttons).forEach(button => {\n button.addEventListener('click', () => {\n const type = button.getAttribute('data-source');\n\n newSource(type);\n\n if (historySupport) {\n window.history.pushState({ type }, '', `#${type}`);\n }\n });\n });\n\n // List for backwards/forwards\n window.addEventListener('popstate', event => {\n if (event.state && 'type' in event.state) {\n newSource(event.state.type);\n }\n });\n\n // On load\n if (historySupport) {\n const video = !currentType.length;\n\n // If there's no current type set, assume video\n if (video) {\n currentType = types.video;\n }\n\n // Replace current history state\n if (currentType in types) {\n window.history.replaceState(\n {\n type: currentType,\n },\n '',\n video ? '' : `#${currentType}`,\n );\n }\n\n // If it's not video, load the source\n if (currentType !== types.video) {\n newSource(currentType, true);\n }\n }\n });\n });\n\n // Google analytics\n // For demo site (https://plyr.io) only\n /* eslint-disable */\n if (isLive) {\n (function(i, s, o, g, r, a, m) {\n i.GoogleAnalyticsObject = r;\n i[r] =\n i[r] ||\n function() {\n (i[r].q = i[r].q || []).push(arguments);\n };\n i[r].l = 1 * new Date();\n a = s.createElement(o);\n m = s.getElementsByTagName(o)[0];\n a.async = 1;\n a.src = g;\n m.parentNode.insertBefore(a, m);\n })(window, document, 'script', 'https://www.google-analytics.com/analytics.js', 'ga');\n window.ga('create', 'UA-40881672-11', 'auto');\n window.ga('send', 'pageview');\n }\n /* eslint-enable */\n})();\n"]} \ No newline at end of file
+{"version":3,"sources":["node_modules/raven-js/vendor/json-stringify-safe/stringify.js","node_modules/raven-js/src/utils.js","node_modules/raven-js/vendor/TraceKit/tracekit.js","node_modules/raven-js/vendor/md5/md5.js","node_modules/raven-js/src/configError.js","node_modules/raven-js/src/console.js","node_modules/raven-js/src/raven.js","node_modules/raven-js/src/singleton.js","demo/src/js/demo.js"],"names":["indexOf","haystack","needle","i","length","serializer","replacer","cycleReplacer","stack","keys","key","value","slice","join","thisPos","this","splice","push","Infinity","call","Error","err","message","name","Object","prototype","hasOwnProperty","stringifyError","module","exports","obj","spaces","JSON","stringify","getSerialize","_window","window","global","self","isUndefined","what","isPlainObject","toString","isString","isArray","supportsFetch","Headers","Request","Response","e","each","callback","j","hasKey","truncate","str","max","substr","object","joinRegExp","patterns","pattern","sources","len","replace","source","RegExp","htmlElementAsString","elem","className","classes","attr","out","tagName","toLowerCase","id","split","attrWhitelist","getAttribute","isOnlyOneTruthy","a","b","isSameStacktrace","stack1","stack2","frames1","frames","frames2","undefined","filename","lineno","colno","MAX_SERIALIZE_EXCEPTION_DEPTH","MAX_SERIALIZE_EXCEPTION_SIZE","MAX_SERIALIZE_KEYS_LENGTH","jsonSize","encodeURI","utf8Length","serializeValue","type","utils","isObject","isError","isErrorEvent","isDOMError","isDOMException","isFunction","isEmptyObject","_","supportsErrorEvent","ErrorEvent","supportsDOMError","DOMError","supportsDOMException","DOMException","supportsReferrerPolicy","referrerPolicy","supportsPromiseRejectionEvent","PromiseRejectionEvent","wrappedCallback","data","original","normalizedData","objectMerge","obj1","obj2","objectFrozen","isFrozen","urlencode","o","pairs","encodeURIComponent","uuid4","crypto","msCrypto","getRandomValues","arr","Uint16Array","pad","num","v","c","r","Math","random","htmlTreeAsString","nextStr","height","sepLength","parentNode","reverse","isSameException","ex1","ex2","values","stacktrace","parseUrl","url","match","query","fragment","protocol","host","path","relative","fill","replacement","track","orig","__raven__","__orig__","safeJoin","input","delimiter","output","String","serializeException","ex","depth","maxSize","serialized","serializeObject","reduce","acc","Array","map","val","serializeKeysForMessage","maxLength","filter","usedKeys","sanitize","sanitizeKeys","safeInput","sanitizeRegExp","sanitizeMask","parse","o_O","sanitizeWorker","workerInput","k","test","TraceKit","collectWindowErrors","debug","_slice","UNKNOWN_FUNCTION","ERROR_TYPES_RE","getLocationHref","document","location","href","report","_oldOnerrorHandler","_onErrorHandlerInstalled","handlers","lastArgs","lastException","lastExceptionStack","notifyHandlers","isWindowError","exception","apply","concat","arguments","inner","traceKitWindowOnError","msg","lineNo","colNo","error","computeStackTrace","augmentStackTraceWithInitialElement","processLastException","groups","line","column","func","_lastExceptionStack","_lastArgs","rethrow","args","setTimeout","incomplete","subscribe","handler","onerror","unsubscribe","uninstall","computeStackTraceFromStackProp","submatch","parts","element","chrome","winjs","gecko","geckoEval","chromeEval","lines","exec","isNative","columnNumber","xhr","XMLHttpRequest","open","send","status","responseText","sourceMaps","sourceMapAddress","charAt","origin","hostname","port","stackInfo","initial","unshift","partial","computeStackTraceByWalkingCallerChain","item","functionName","funcs","recursion","curr","caller","substring","result","sourceURL","fileName","lineNumber","description","tracekit","safeAdd","x","y","lsw","md5cmn","q","s","t","cnt","md5ff","d","md5gg","md5hh","md5ii","binlMD5","olda","oldb","oldc","oldd","binl2rstr","length32","fromCharCode","rstr2binl","length8","charCodeAt","rstr2hex","str2rstrUTF8","unescape","rawMD5","rstrMD5","rawHMACMD5","hash","bkey","ipad","opad","rstrHMACMD5","md5_1","string","raw","RavenConfigError","constructor","configError","console$1","console","level","originalConsoleLevel","originalConsole","sentryLevel","logger","extra","Function","wrapConsoleMethod","require$$0","dsnKeys","dsnPattern","now","Date","_document","_navigator","navigator","keepOriginalCallback","Raven","method","_hasJSON","_hasDocument","_hasNavigator","_lastCapturedException","_lastData","_lastEventId","_globalServer","_globalKey","_globalProject","_globalContext","_globalOptions","release","SENTRY_RELEASE","ignoreErrors","ignoreUrls","whitelistUrls","includePaths","headers","captureUnhandledRejections","maxMessageLength","maxUrlLength","stackTraceLimit","autoBreadcrumbs","instrument","sampleRate","_fetchDefaults","keepalive","_ignoreOnError","_isRavenInstalled","_originalErrorStackTraceLimit","_originalConsole","_originalConsoleMethods","_plugins","_startTime","_wrappedBuiltIns","_breadcrumbs","_lastCapturedEvent","_keypressTimeout","_location","_lastHref","_resetBackoff","VERSION","config","dsn","options","_logDebug","globalOptions","setDSN","maxBreadcrumbs","min","autoBreadcrumbDefaults","dom","sentry","instrumentDefaults","tryCatch","install","isSetup","_handleOnErrorStackInfo","_attachPromiseRejectionHandler","_patchFunctionToString","_instrumentTryCatch","_instrumentBreadcrumbs","_drainPlugins","uri","_parseDSN","lastSlash","lastIndexOf","_dsn","user","_globalSecret","pass","_getGlobalServer","_globalEndpoint","context","wrap","_before","__raven_wrapper__","wrapped","deep","_ignoreNextOnError","captureException","property","_detachPromiseRejectionHandler","_unpatchFunctionToString","_restoreBuiltIns","_restoreConsole","_promiseRejectionHandler","event","reason","mechanism","handled","bind","addEventListener","removeEventListener","trimHeadFrames","captureMessage","_getCaptureExceptionOptionsFromPlainObject","_handleStackInfo","currentOptions","exKeys","sort","fingerprint","md5","__serialized__","initialCall","fileurl","_prepareFrames","_send","captureBreadcrumb","crumb","timestamp","breadcrumbCallback","shift","addPlugin","plugin","pluginArgs","setUserContext","setExtraContext","_mergeContext","setTagsContext","tags","clearContext","getContext","setEnvironment","environment","setRelease","setDataCallback","dataCallback","setBreadcrumbCallback","setShouldSendCallback","shouldSendCallback","setTransport","transport","lastEventId","ravenNotConfiguredError","afterLoad","RavenConfig","showReportDialog","eventId","encode","qs","email","globalServer","script","createElement","async","src","head","body","appendChild","_triggerEvent","eventType","evt","toUpperCase","createEvent","initEvent","createEventObject","dispatchEvent","fireEvent","_breadcrumbEventHandler","evtName","target","category","_keypressEventHandler","isContentEditable","timeout","clearTimeout","_captureUrlChange","from","to","parsedLoc","parsedTo","parsedFrom","_originalFunctionToString","wrappedBuiltIns","wrapTimeFn","fn","originalCallback","function","wrapEventTarget","proto","capture","secure","handleEvent","before","clickHandler","keypressHandler","requestAnimationFrame","cb","eventTargets","wrapProp","prop","xhrproto","origOpen","__raven_xhr","status_code","origSend","onreadystatechangeHandler","readyState","props","onreadystatechange","origFetch","fetchInput","fetchData","then","response","attachEvent","hasPushAndReplaceState","app","runtime","history","pushState","replaceState","oldOnPopState","onpopstate","currentHref","historyReplacementFunction","origHistFunction","log","consoleMethodCallback","builtin","installer","m","allowSecretKey","_processException","frame","_normalizeFrame","in_app","stackInfoUrl","normalized","prefixedMessage","transaction","_trimPacket","request","Referer","breadcrumbs","_trimBreadcrumbs","urlProp","urlProps","_getHttpData","httpData","userAgent","User-Agent","referrer","_backoffDuration","_backoffStart","_shouldBackoff","_isRepeatData","current","last","_setBackoffState","retry","get","getResponseHeader","parseInt","baseData","project","platform","serverName","server_name","_sanitizeData","forEach","_sendProcessedPayload","_getUuid","allowDuplicates","event_id","auth","sentry_version","sentry_client","sentry_key","sentry_secret","_makeRequest","onSuccess","onError","opts","evaluatedHeaders","evaluatedFetchParameters","_evaluateHash","fetchParameters","defaultFetchOptions","fetchOptions","fetch","ok","XDomainRequest","onload","setRequestHeader","evaluated","setUser","setReleaseContext","raven","_Raven","RavenConstructor","noConflict","isLive","singleton","Client","shr","setup","count","classname","classList","remove","keyCode","activeElement","add","player","Plyr","title","iconUrl","keyboard","tooltips","controls","captions","active","google","ads","enabled","publisherId","buttons","querySelectorAll","types","video","audio","youtube","vimeo","currentType","historySupport","toggleClass","state","newSource","init","size","poster","tracks","kind","label","srclang","default","provider","button","parentElement","querySelector","cite","setAttribute","removeAttribute","GoogleAnalyticsObject","l","getElementsByTagName","insertBefore","ga"],"mappings":"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","file":"demo.min.js","sourcesContent":["/*\n json-stringify-safe\n Like JSON.stringify, but doesn't throw on circular references.\n\n Originally forked from https://github.com/isaacs/json-stringify-safe\n version 5.0.1 on 3/8/2017 and modified to handle Errors serialization\n and IE8 compatibility. Tests for this are in test/vendor.\n\n ISC license: https://github.com/isaacs/json-stringify-safe/blob/master/LICENSE\n*/\n\nexports = module.exports = stringify;\nexports.getSerialize = serializer;\n\nfunction indexOf(haystack, needle) {\n for (var i = 0; i < haystack.length; ++i) {\n if (haystack[i] === needle) return i;\n }\n return -1;\n}\n\nfunction stringify(obj, replacer, spaces, cycleReplacer) {\n return JSON.stringify(obj, serializer(replacer, cycleReplacer), spaces);\n}\n\n// https://github.com/ftlabs/js-abbreviate/blob/fa709e5f139e7770a71827b1893f22418097fbda/index.js#L95-L106\nfunction stringifyError(value) {\n var err = {\n // These properties are implemented as magical getters and don't show up in for in\n stack: value.stack,\n message: value.message,\n name: value.name\n };\n\n for (var i in value) {\n if (Object.prototype.hasOwnProperty.call(value, i)) {\n err[i] = value[i];\n }\n }\n\n return err;\n}\n\nfunction serializer(replacer, cycleReplacer) {\n var stack = [];\n var keys = [];\n\n if (cycleReplacer == null) {\n cycleReplacer = function(key, value) {\n if (stack[0] === value) {\n return '[Circular ~]';\n }\n return '[Circular ~.' + keys.slice(0, indexOf(stack, value)).join('.') + ']';\n };\n }\n\n return function(key, value) {\n if (stack.length > 0) {\n var thisPos = indexOf(stack, this);\n ~thisPos ? stack.splice(thisPos + 1) : stack.push(this);\n ~thisPos ? keys.splice(thisPos, Infinity, key) : keys.push(key);\n\n if (~indexOf(stack, value)) {\n value = cycleReplacer.call(this, key, value);\n }\n } else {\n stack.push(value);\n }\n\n return replacer == null\n ? value instanceof Error ? stringifyError(value) : value\n : replacer.call(this, key, value);\n };\n}\n","var stringify = require('../vendor/json-stringify-safe/stringify');\n\nvar _window =\n typeof window !== 'undefined'\n ? window\n : typeof global !== 'undefined'\n ? global\n : typeof self !== 'undefined'\n ? self\n : {};\n\nfunction isObject(what) {\n return typeof what === 'object' && what !== null;\n}\n\n// Yanked from https://git.io/vS8DV re-used under CC0\n// with some tiny modifications\nfunction isError(value) {\n switch (Object.prototype.toString.call(value)) {\n case '[object Error]':\n return true;\n case '[object Exception]':\n return true;\n case '[object DOMException]':\n return true;\n default:\n return value instanceof Error;\n }\n}\n\nfunction isErrorEvent(value) {\n return Object.prototype.toString.call(value) === '[object ErrorEvent]';\n}\n\nfunction isDOMError(value) {\n return Object.prototype.toString.call(value) === '[object DOMError]';\n}\n\nfunction isDOMException(value) {\n return Object.prototype.toString.call(value) === '[object DOMException]';\n}\n\nfunction isUndefined(what) {\n return what === void 0;\n}\n\nfunction isFunction(what) {\n return typeof what === 'function';\n}\n\nfunction isPlainObject(what) {\n return Object.prototype.toString.call(what) === '[object Object]';\n}\n\nfunction isString(what) {\n return Object.prototype.toString.call(what) === '[object String]';\n}\n\nfunction isArray(what) {\n return Object.prototype.toString.call(what) === '[object Array]';\n}\n\nfunction isEmptyObject(what) {\n if (!isPlainObject(what)) return false;\n\n for (var _ in what) {\n if (what.hasOwnProperty(_)) {\n return false;\n }\n }\n return true;\n}\n\nfunction supportsErrorEvent() {\n try {\n new ErrorEvent(''); // eslint-disable-line no-new\n return true;\n } catch (e) {\n return false;\n }\n}\n\nfunction supportsDOMError() {\n try {\n new DOMError(''); // eslint-disable-line no-new\n return true;\n } catch (e) {\n return false;\n }\n}\n\nfunction supportsDOMException() {\n try {\n new DOMException(''); // eslint-disable-line no-new\n return true;\n } catch (e) {\n return false;\n }\n}\n\nfunction supportsFetch() {\n if (!('fetch' in _window)) return false;\n\n try {\n new Headers(); // eslint-disable-line no-new\n new Request(''); // eslint-disable-line no-new\n new Response(); // eslint-disable-line no-new\n return true;\n } catch (e) {\n return false;\n }\n}\n\n// Despite all stars in the sky saying that Edge supports old draft syntax, aka 'never', 'always', 'origin' and 'default\n// https://caniuse.com/#feat=referrer-policy\n// It doesn't. And it throw exception instead of ignoring this parameter...\n// REF: https://github.com/getsentry/raven-js/issues/1233\nfunction supportsReferrerPolicy() {\n if (!supportsFetch()) return false;\n\n try {\n // eslint-disable-next-line no-new\n new Request('pickleRick', {\n referrerPolicy: 'origin'\n });\n return true;\n } catch (e) {\n return false;\n }\n}\n\nfunction supportsPromiseRejectionEvent() {\n return typeof PromiseRejectionEvent === 'function';\n}\n\nfunction wrappedCallback(callback) {\n function dataCallback(data, original) {\n var normalizedData = callback(data) || data;\n if (original) {\n return original(normalizedData) || normalizedData;\n }\n return normalizedData;\n }\n\n return dataCallback;\n}\n\nfunction each(obj, callback) {\n var i, j;\n\n if (isUndefined(obj.length)) {\n for (i in obj) {\n if (hasKey(obj, i)) {\n callback.call(null, i, obj[i]);\n }\n }\n } else {\n j = obj.length;\n if (j) {\n for (i = 0; i < j; i++) {\n callback.call(null, i, obj[i]);\n }\n }\n }\n}\n\nfunction objectMerge(obj1, obj2) {\n if (!obj2) {\n return obj1;\n }\n each(obj2, function(key, value) {\n obj1[key] = value;\n });\n return obj1;\n}\n\n/**\n * This function is only used for react-native.\n * react-native freezes object that have already been sent over the\n * js bridge. We need this function in order to check if the object is frozen.\n * So it's ok that objectFrozen returns false if Object.isFrozen is not\n * supported because it's not relevant for other \"platforms\". See related issue:\n * https://github.com/getsentry/react-native-sentry/issues/57\n */\nfunction objectFrozen(obj) {\n if (!Object.isFrozen) {\n return false;\n }\n return Object.isFrozen(obj);\n}\n\nfunction truncate(str, max) {\n if (typeof max !== 'number') {\n throw new Error('2nd argument to `truncate` function should be a number');\n }\n if (typeof str !== 'string' || max === 0) {\n return str;\n }\n return str.length <= max ? str : str.substr(0, max) + '\\u2026';\n}\n\n/**\n * hasKey, a better form of hasOwnProperty\n * Example: hasKey(MainHostObject, property) === true/false\n *\n * @param {Object} host object to check property\n * @param {string} key to check\n */\nfunction hasKey(object, key) {\n return Object.prototype.hasOwnProperty.call(object, key);\n}\n\nfunction joinRegExp(patterns) {\n // Combine an array of regular expressions and strings into one large regexp\n // Be mad.\n var sources = [],\n i = 0,\n len = patterns.length,\n pattern;\n\n for (; i < len; i++) {\n pattern = patterns[i];\n if (isString(pattern)) {\n // If it's a string, we need to escape it\n // Taken from: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions\n sources.push(pattern.replace(/([.*+?^=!:${}()|\\[\\]\\/\\\\])/g, '\\\\$1'));\n } else if (pattern && pattern.source) {\n // If it's a regexp already, we want to extract the source\n sources.push(pattern.source);\n }\n // Intentionally skip other cases\n }\n return new RegExp(sources.join('|'), 'i');\n}\n\nfunction urlencode(o) {\n var pairs = [];\n each(o, function(key, value) {\n pairs.push(encodeURIComponent(key) + '=' + encodeURIComponent(value));\n });\n return pairs.join('&');\n}\n\n// borrowed from https://tools.ietf.org/html/rfc3986#appendix-B\n// intentionally using regex and not <a/> href parsing trick because React Native and other\n// environments where DOM might not be available\nfunction parseUrl(url) {\n if (typeof url !== 'string') return {};\n var match = url.match(/^(([^:\\/?#]+):)?(\\/\\/([^\\/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?$/);\n\n // coerce to undefined values to empty string so we don't get 'undefined'\n var query = match[6] || '';\n var fragment = match[8] || '';\n return {\n protocol: match[2],\n host: match[4],\n path: match[5],\n relative: match[5] + query + fragment // everything minus origin\n };\n}\nfunction uuid4() {\n var crypto = _window.crypto || _window.msCrypto;\n\n if (!isUndefined(crypto) && crypto.getRandomValues) {\n // Use window.crypto API if available\n // eslint-disable-next-line no-undef\n var arr = new Uint16Array(8);\n crypto.getRandomValues(arr);\n\n // set 4 in byte 7\n arr[3] = (arr[3] & 0xfff) | 0x4000;\n // set 2 most significant bits of byte 9 to '10'\n arr[4] = (arr[4] & 0x3fff) | 0x8000;\n\n var pad = function(num) {\n var v = num.toString(16);\n while (v.length < 4) {\n v = '0' + v;\n }\n return v;\n };\n\n return (\n pad(arr[0]) +\n pad(arr[1]) +\n pad(arr[2]) +\n pad(arr[3]) +\n pad(arr[4]) +\n pad(arr[5]) +\n pad(arr[6]) +\n pad(arr[7])\n );\n } else {\n // http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#2117523\n return 'xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n var r = (Math.random() * 16) | 0,\n v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n}\n\n/**\n * Given a child DOM element, returns a query-selector statement describing that\n * and its ancestors\n * e.g. [HTMLElement] => body > div > input#foo.btn[name=baz]\n * @param elem\n * @returns {string}\n */\nfunction htmlTreeAsString(elem) {\n /* eslint no-extra-parens:0*/\n var MAX_TRAVERSE_HEIGHT = 5,\n MAX_OUTPUT_LEN = 80,\n out = [],\n height = 0,\n len = 0,\n separator = ' > ',\n sepLength = separator.length,\n nextStr;\n\n while (elem && height++ < MAX_TRAVERSE_HEIGHT) {\n nextStr = htmlElementAsString(elem);\n // bail out if\n // - nextStr is the 'html' element\n // - the length of the string that would be created exceeds MAX_OUTPUT_LEN\n // (ignore this limit if we are on the first iteration)\n if (\n nextStr === 'html' ||\n (height > 1 && len + out.length * sepLength + nextStr.length >= MAX_OUTPUT_LEN)\n ) {\n break;\n }\n\n out.push(nextStr);\n\n len += nextStr.length;\n elem = elem.parentNode;\n }\n\n return out.reverse().join(separator);\n}\n\n/**\n * Returns a simple, query-selector representation of a DOM element\n * e.g. [HTMLElement] => input#foo.btn[name=baz]\n * @param HTMLElement\n * @returns {string}\n */\nfunction htmlElementAsString(elem) {\n var out = [],\n className,\n classes,\n key,\n attr,\n i;\n\n if (!elem || !elem.tagName) {\n return '';\n }\n\n out.push(elem.tagName.toLowerCase());\n if (elem.id) {\n out.push('#' + elem.id);\n }\n\n className = elem.className;\n if (className && isString(className)) {\n classes = className.split(/\\s+/);\n for (i = 0; i < classes.length; i++) {\n out.push('.' + classes[i]);\n }\n }\n var attrWhitelist = ['type', 'name', 'title', 'alt'];\n for (i = 0; i < attrWhitelist.length; i++) {\n key = attrWhitelist[i];\n attr = elem.getAttribute(key);\n if (attr) {\n out.push('[' + key + '=\"' + attr + '\"]');\n }\n }\n return out.join('');\n}\n\n/**\n * Returns true if either a OR b is truthy, but not both\n */\nfunction isOnlyOneTruthy(a, b) {\n return !!(!!a ^ !!b);\n}\n\n/**\n * Returns true if both parameters are undefined\n */\nfunction isBothUndefined(a, b) {\n return isUndefined(a) && isUndefined(b);\n}\n\n/**\n * Returns true if the two input exception interfaces have the same content\n */\nfunction isSameException(ex1, ex2) {\n if (isOnlyOneTruthy(ex1, ex2)) return false;\n\n ex1 = ex1.values[0];\n ex2 = ex2.values[0];\n\n if (ex1.type !== ex2.type || ex1.value !== ex2.value) return false;\n\n // in case both stacktraces are undefined, we can't decide so default to false\n if (isBothUndefined(ex1.stacktrace, ex2.stacktrace)) return false;\n\n return isSameStacktrace(ex1.stacktrace, ex2.stacktrace);\n}\n\n/**\n * Returns true if the two input stack trace interfaces have the same content\n */\nfunction isSameStacktrace(stack1, stack2) {\n if (isOnlyOneTruthy(stack1, stack2)) return false;\n\n var frames1 = stack1.frames;\n var frames2 = stack2.frames;\n\n // Exit early if stacktrace is malformed\n if (frames1 === undefined || frames2 === undefined) return false;\n\n // Exit early if frame count differs\n if (frames1.length !== frames2.length) return false;\n\n // Iterate through every frame; bail out if anything differs\n var a, b;\n for (var i = 0; i < frames1.length; i++) {\n a = frames1[i];\n b = frames2[i];\n if (\n a.filename !== b.filename ||\n a.lineno !== b.lineno ||\n a.colno !== b.colno ||\n a['function'] !== b['function']\n )\n return false;\n }\n return true;\n}\n\n/**\n * Polyfill a method\n * @param obj object e.g. `document`\n * @param name method name present on object e.g. `addEventListener`\n * @param replacement replacement function\n * @param track {optional} record instrumentation to an array\n */\nfunction fill(obj, name, replacement, track) {\n if (obj == null) return;\n var orig = obj[name];\n obj[name] = replacement(orig);\n obj[name].__raven__ = true;\n obj[name].__orig__ = orig;\n if (track) {\n track.push([obj, name, orig]);\n }\n}\n\n/**\n * Join values in array\n * @param input array of values to be joined together\n * @param delimiter string to be placed in-between values\n * @returns {string}\n */\nfunction safeJoin(input, delimiter) {\n if (!isArray(input)) return '';\n\n var output = [];\n\n for (var i = 0; i < input.length; i++) {\n try {\n output.push(String(input[i]));\n } catch (e) {\n output.push('[value cannot be serialized]');\n }\n }\n\n return output.join(delimiter);\n}\n\n// Default Node.js REPL depth\nvar MAX_SERIALIZE_EXCEPTION_DEPTH = 3;\n// 50kB, as 100kB is max payload size, so half sounds reasonable\nvar MAX_SERIALIZE_EXCEPTION_SIZE = 50 * 1024;\nvar MAX_SERIALIZE_KEYS_LENGTH = 40;\n\nfunction utf8Length(value) {\n return ~-encodeURI(value).split(/%..|./).length;\n}\n\nfunction jsonSize(value) {\n return utf8Length(JSON.stringify(value));\n}\n\nfunction serializeValue(value) {\n if (typeof value === 'string') {\n var maxLength = 40;\n return truncate(value, maxLength);\n } else if (\n typeof value === 'number' ||\n typeof value === 'boolean' ||\n typeof value === 'undefined'\n ) {\n return value;\n }\n\n var type = Object.prototype.toString.call(value);\n\n // Node.js REPL notation\n if (type === '[object Object]') return '[Object]';\n if (type === '[object Array]') return '[Array]';\n if (type === '[object Function]')\n return value.name ? '[Function: ' + value.name + ']' : '[Function]';\n\n return value;\n}\n\nfunction serializeObject(value, depth) {\n if (depth === 0) return serializeValue(value);\n\n if (isPlainObject(value)) {\n return Object.keys(value).reduce(function(acc, key) {\n acc[key] = serializeObject(value[key], depth - 1);\n return acc;\n }, {});\n } else if (Array.isArray(value)) {\n return value.map(function(val) {\n return serializeObject(val, depth - 1);\n });\n }\n\n return serializeValue(value);\n}\n\nfunction serializeException(ex, depth, maxSize) {\n if (!isPlainObject(ex)) return ex;\n\n depth = typeof depth !== 'number' ? MAX_SERIALIZE_EXCEPTION_DEPTH : depth;\n maxSize = typeof depth !== 'number' ? MAX_SERIALIZE_EXCEPTION_SIZE : maxSize;\n\n var serialized = serializeObject(ex, depth);\n\n if (jsonSize(stringify(serialized)) > maxSize) {\n return serializeException(ex, depth - 1);\n }\n\n return serialized;\n}\n\nfunction serializeKeysForMessage(keys, maxLength) {\n if (typeof keys === 'number' || typeof keys === 'string') return keys.toString();\n if (!Array.isArray(keys)) return '';\n\n keys = keys.filter(function(key) {\n return typeof key === 'string';\n });\n if (keys.length === 0) return '[object has no keys]';\n\n maxLength = typeof maxLength !== 'number' ? MAX_SERIALIZE_KEYS_LENGTH : maxLength;\n if (keys[0].length >= maxLength) return keys[0];\n\n for (var usedKeys = keys.length; usedKeys > 0; usedKeys--) {\n var serialized = keys.slice(0, usedKeys).join(', ');\n if (serialized.length > maxLength) continue;\n if (usedKeys === keys.length) return serialized;\n return serialized + '\\u2026';\n }\n\n return '';\n}\n\nfunction sanitize(input, sanitizeKeys) {\n if (!isArray(sanitizeKeys) || (isArray(sanitizeKeys) && sanitizeKeys.length === 0))\n return input;\n\n var sanitizeRegExp = joinRegExp(sanitizeKeys);\n var sanitizeMask = '********';\n var safeInput;\n\n try {\n safeInput = JSON.parse(stringify(input));\n } catch (o_O) {\n return input;\n }\n\n function sanitizeWorker(workerInput) {\n if (isArray(workerInput)) {\n return workerInput.map(function(val) {\n return sanitizeWorker(val);\n });\n }\n\n if (isPlainObject(workerInput)) {\n return Object.keys(workerInput).reduce(function(acc, k) {\n if (sanitizeRegExp.test(k)) {\n acc[k] = sanitizeMask;\n } else {\n acc[k] = sanitizeWorker(workerInput[k]);\n }\n return acc;\n }, {});\n }\n\n return workerInput;\n }\n\n return sanitizeWorker(safeInput);\n}\n\nmodule.exports = {\n isObject: isObject,\n isError: isError,\n isErrorEvent: isErrorEvent,\n isDOMError: isDOMError,\n isDOMException: isDOMException,\n isUndefined: isUndefined,\n isFunction: isFunction,\n isPlainObject: isPlainObject,\n isString: isString,\n isArray: isArray,\n isEmptyObject: isEmptyObject,\n supportsErrorEvent: supportsErrorEvent,\n supportsDOMError: supportsDOMError,\n supportsDOMException: supportsDOMException,\n supportsFetch: supportsFetch,\n supportsReferrerPolicy: supportsReferrerPolicy,\n supportsPromiseRejectionEvent: supportsPromiseRejectionEvent,\n wrappedCallback: wrappedCallback,\n each: each,\n objectMerge: objectMerge,\n truncate: truncate,\n objectFrozen: objectFrozen,\n hasKey: hasKey,\n joinRegExp: joinRegExp,\n urlencode: urlencode,\n uuid4: uuid4,\n htmlTreeAsString: htmlTreeAsString,\n htmlElementAsString: htmlElementAsString,\n isSameException: isSameException,\n isSameStacktrace: isSameStacktrace,\n parseUrl: parseUrl,\n fill: fill,\n safeJoin: safeJoin,\n serializeException: serializeException,\n serializeKeysForMessage: serializeKeysForMessage,\n sanitize: sanitize\n};\n","var utils = require('../../src/utils');\n\n/*\n TraceKit - Cross brower stack traces\n\n This was originally forked from github.com/occ/TraceKit, but has since been\n largely re-written and is now maintained as part of raven-js. Tests for\n this are in test/vendor.\n\n MIT license\n*/\n\nvar TraceKit = {\n collectWindowErrors: true,\n debug: false\n};\n\n// This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785)\nvar _window =\n typeof window !== 'undefined'\n ? window\n : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\n// global reference to slice\nvar _slice = [].slice;\nvar UNKNOWN_FUNCTION = '?';\n\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error#Error_types\nvar ERROR_TYPES_RE = /^(?:[Uu]ncaught (?:exception: )?)?(?:((?:Eval|Internal|Range|Reference|Syntax|Type|URI|)Error): )?(.*)$/;\n\nfunction getLocationHref() {\n if (typeof document === 'undefined' || document.location == null) return '';\n return document.location.href;\n}\n\nfunction getLocationOrigin() {\n if (typeof document === 'undefined' || document.location == null) return '';\n\n // Oh dear IE10...\n if (!document.location.origin) {\n return (\n document.location.protocol +\n '//' +\n document.location.hostname +\n (document.location.port ? ':' + document.location.port : '')\n );\n }\n\n return document.location.origin;\n}\n\n/**\n * TraceKit.report: cross-browser processing of unhandled exceptions\n *\n * Syntax:\n * TraceKit.report.subscribe(function(stackInfo) { ... })\n * TraceKit.report.unsubscribe(function(stackInfo) { ... })\n * TraceKit.report(exception)\n * try { ...code... } catch(ex) { TraceKit.report(ex); }\n *\n * Supports:\n * - Firefox: full stack trace with line numbers, plus column number\n * on top frame; column number is not guaranteed\n * - Opera: full stack trace with line and column numbers\n * - Chrome: full stack trace with line and column numbers\n * - Safari: line and column number for the top frame only; some frames\n * may be missing, and column number is not guaranteed\n * - IE: line and column number for the top frame only; some frames\n * may be missing, and column number is not guaranteed\n *\n * In theory, TraceKit should work on all of the following versions:\n * - IE5.5+ (only 8.0 tested)\n * - Firefox 0.9+ (only 3.5+ tested)\n * - Opera 7+ (only 10.50 tested; versions 9 and earlier may require\n * Exceptions Have Stacktrace to be enabled in opera:config)\n * - Safari 3+ (only 4+ tested)\n * - Chrome 1+ (only 5+ tested)\n * - Konqueror 3.5+ (untested)\n *\n * Requires TraceKit.computeStackTrace.\n *\n * Tries to catch all unhandled exceptions and report them to the\n * subscribed handlers. Please note that TraceKit.report will rethrow the\n * exception. This is REQUIRED in order to get a useful stack trace in IE.\n * If the exception does not reach the top of the browser, you will only\n * get a stack trace from the point where TraceKit.report was called.\n *\n * Handlers receive a stackInfo object as described in the\n * TraceKit.computeStackTrace docs.\n */\nTraceKit.report = (function reportModuleWrapper() {\n var handlers = [],\n lastArgs = null,\n lastException = null,\n lastExceptionStack = null;\n\n /**\n * Add a crash handler.\n * @param {Function} handler\n */\n function subscribe(handler) {\n installGlobalHandler();\n handlers.push(handler);\n }\n\n /**\n * Remove a crash handler.\n * @param {Function} handler\n */\n function unsubscribe(handler) {\n for (var i = handlers.length - 1; i >= 0; --i) {\n if (handlers[i] === handler) {\n handlers.splice(i, 1);\n }\n }\n }\n\n /**\n * Remove all crash handlers.\n */\n function unsubscribeAll() {\n uninstallGlobalHandler();\n handlers = [];\n }\n\n /**\n * Dispatch stack information to all handlers.\n * @param {Object.<string, *>} stack\n */\n function notifyHandlers(stack, isWindowError) {\n var exception = null;\n if (isWindowError && !TraceKit.collectWindowErrors) {\n return;\n }\n for (var i in handlers) {\n if (handlers.hasOwnProperty(i)) {\n try {\n handlers[i].apply(null, [stack].concat(_slice.call(arguments, 2)));\n } catch (inner) {\n exception = inner;\n }\n }\n }\n\n if (exception) {\n throw exception;\n }\n }\n\n var _oldOnerrorHandler, _onErrorHandlerInstalled;\n\n /**\n * Ensures all global unhandled exceptions are recorded.\n * Supported by Gecko and IE.\n * @param {string} msg Error message.\n * @param {string} url URL of script that generated the exception.\n * @param {(number|string)} lineNo The line number at which the error\n * occurred.\n * @param {?(number|string)} colNo The column number at which the error\n * occurred.\n * @param {?Error} ex The actual Error object.\n */\n function traceKitWindowOnError(msg, url, lineNo, colNo, ex) {\n var stack = null;\n // If 'ex' is ErrorEvent, get real Error from inside\n var exception = utils.isErrorEvent(ex) ? ex.error : ex;\n // If 'msg' is ErrorEvent, get real message from inside\n var message = utils.isErrorEvent(msg) ? msg.message : msg;\n\n if (lastExceptionStack) {\n TraceKit.computeStackTrace.augmentStackTraceWithInitialElement(\n lastExceptionStack,\n url,\n lineNo,\n message\n );\n processLastException();\n } else if (exception && utils.isError(exception)) {\n // non-string `exception` arg; attempt to extract stack trace\n\n // New chrome and blink send along a real error object\n // Let's just report that like a normal error.\n // See: https://mikewest.org/2013/08/debugging-runtime-errors-with-window-onerror\n stack = TraceKit.computeStackTrace(exception);\n notifyHandlers(stack, true);\n } else {\n var location = {\n url: url,\n line: lineNo,\n column: colNo\n };\n\n var name = undefined;\n var groups;\n\n if ({}.toString.call(message) === '[object String]') {\n var groups = message.match(ERROR_TYPES_RE);\n if (groups) {\n name = groups[1];\n message = groups[2];\n }\n }\n\n location.func = UNKNOWN_FUNCTION;\n\n stack = {\n name: name,\n message: message,\n url: getLocationHref(),\n stack: [location]\n };\n notifyHandlers(stack, true);\n }\n\n if (_oldOnerrorHandler) {\n return _oldOnerrorHandler.apply(this, arguments);\n }\n\n return false;\n }\n\n function installGlobalHandler() {\n if (_onErrorHandlerInstalled) {\n return;\n }\n _oldOnerrorHandler = _window.onerror;\n _window.onerror = traceKitWindowOnError;\n _onErrorHandlerInstalled = true;\n }\n\n function uninstallGlobalHandler() {\n if (!_onErrorHandlerInstalled) {\n return;\n }\n _window.onerror = _oldOnerrorHandler;\n _onErrorHandlerInstalled = false;\n _oldOnerrorHandler = undefined;\n }\n\n function processLastException() {\n var _lastExceptionStack = lastExceptionStack,\n _lastArgs = lastArgs;\n lastArgs = null;\n lastExceptionStack = null;\n lastException = null;\n notifyHandlers.apply(null, [_lastExceptionStack, false].concat(_lastArgs));\n }\n\n /**\n * Reports an unhandled Error to TraceKit.\n * @param {Error} ex\n * @param {?boolean} rethrow If false, do not re-throw the exception.\n * Only used for window.onerror to not cause an infinite loop of\n * rethrowing.\n */\n function report(ex, rethrow) {\n var args = _slice.call(arguments, 1);\n if (lastExceptionStack) {\n if (lastException === ex) {\n return; // already caught by an inner catch block, ignore\n } else {\n processLastException();\n }\n }\n\n var stack = TraceKit.computeStackTrace(ex);\n lastExceptionStack = stack;\n lastException = ex;\n lastArgs = args;\n\n // If the stack trace is incomplete, wait for 2 seconds for\n // slow slow IE to see if onerror occurs or not before reporting\n // this exception; otherwise, we will end up with an incomplete\n // stack trace\n setTimeout(function() {\n if (lastException === ex) {\n processLastException();\n }\n }, stack.incomplete ? 2000 : 0);\n\n if (rethrow !== false) {\n throw ex; // re-throw to propagate to the top level (and cause window.onerror)\n }\n }\n\n report.subscribe = subscribe;\n report.unsubscribe = unsubscribe;\n report.uninstall = unsubscribeAll;\n return report;\n})();\n\n/**\n * TraceKit.computeStackTrace: cross-browser stack traces in JavaScript\n *\n * Syntax:\n * s = TraceKit.computeStackTrace(exception) // consider using TraceKit.report instead (see below)\n * Returns:\n * s.name - exception name\n * s.message - exception message\n * s.stack[i].url - JavaScript or HTML file URL\n * s.stack[i].func - function name, or empty for anonymous functions (if guessing did not work)\n * s.stack[i].args - arguments passed to the function, if known\n * s.stack[i].line - line number, if known\n * s.stack[i].column - column number, if known\n *\n * Supports:\n * - Firefox: full stack trace with line numbers and unreliable column\n * number on top frame\n * - Opera 10: full stack trace with line and column numbers\n * - Opera 9-: full stack trace with line numbers\n * - Chrome: full stack trace with line and column numbers\n * - Safari: line and column number for the topmost stacktrace element\n * only\n * - IE: no line numbers whatsoever\n *\n * Tries to guess names of anonymous functions by looking for assignments\n * in the source code. In IE and Safari, we have to guess source file names\n * by searching for function bodies inside all page scripts. This will not\n * work for scripts that are loaded cross-domain.\n * Here be dragons: some function names may be guessed incorrectly, and\n * duplicate functions may be mismatched.\n *\n * TraceKit.computeStackTrace should only be used for tracing purposes.\n * Logging of unhandled exceptions should be done with TraceKit.report,\n * which builds on top of TraceKit.computeStackTrace and provides better\n * IE support by utilizing the window.onerror event to retrieve information\n * about the top of the stack.\n *\n * Note: In IE and Safari, no stack trace is recorded on the Error object,\n * so computeStackTrace instead walks its *own* chain of callers.\n * This means that:\n * * in Safari, some methods may be missing from the stack trace;\n * * in IE, the topmost function in the stack trace will always be the\n * caller of computeStackTrace.\n *\n * This is okay for tracing (because you are likely to be calling\n * computeStackTrace from the function you want to be the topmost element\n * of the stack trace anyway), but not okay for logging unhandled\n * exceptions (because your catch block will likely be far away from the\n * inner function that actually caused the exception).\n *\n */\nTraceKit.computeStackTrace = (function computeStackTraceWrapper() {\n // Contents of Exception in various browsers.\n //\n // SAFARI:\n // ex.message = Can't find variable: qq\n // ex.line = 59\n // ex.sourceId = 580238192\n // ex.sourceURL = http://...\n // ex.expressionBeginOffset = 96\n // ex.expressionCaretOffset = 98\n // ex.expressionEndOffset = 98\n // ex.name = ReferenceError\n //\n // FIREFOX:\n // ex.message = qq is not defined\n // ex.fileName = http://...\n // ex.lineNumber = 59\n // ex.columnNumber = 69\n // ex.stack = ...stack trace... (see the example below)\n // ex.name = ReferenceError\n //\n // CHROME:\n // ex.message = qq is not defined\n // ex.name = ReferenceError\n // ex.type = not_defined\n // ex.arguments = ['aa']\n // ex.stack = ...stack trace...\n //\n // INTERNET EXPLORER:\n // ex.message = ...\n // ex.name = ReferenceError\n //\n // OPERA:\n // ex.message = ...message... (see the example below)\n // ex.name = ReferenceError\n // ex.opera#sourceloc = 11 (pretty much useless, duplicates the info in ex.message)\n // ex.stacktrace = n/a; see 'opera:config#UserPrefs|Exceptions Have Stacktrace'\n\n /**\n * Computes stack trace information from the stack property.\n * Chrome and Gecko use this property.\n * @param {Error} ex\n * @return {?Object.<string, *>} Stack trace information.\n */\n function computeStackTraceFromStackProp(ex) {\n if (typeof ex.stack === 'undefined' || !ex.stack) return;\n\n var chrome = /^\\s*at (?:(.*?) ?\\()?((?:file|https?|blob|chrome-extension|native|eval|webpack|<anonymous>|[a-z]:|\\/).*?)(?::(\\d+))?(?::(\\d+))?\\)?\\s*$/i;\n var winjs = /^\\s*at (?:((?:\\[object object\\])?.+) )?\\(?((?:file|ms-appx(?:-web)|https?|webpack|blob):.*?):(\\d+)(?::(\\d+))?\\)?\\s*$/i;\n // NOTE: blob urls are now supposed to always have an origin, therefore it's format\n // which is `blob:http://url/path/with-some-uuid`, is matched by `blob.*?:\\/` as well\n var gecko = /^\\s*(.*?)(?:\\((.*?)\\))?(?:^|@)((?:file|https?|blob|chrome|webpack|resource|moz-extension).*?:\\/.*?|\\[native code\\]|[^@]*bundle)(?::(\\d+))?(?::(\\d+))?\\s*$/i;\n // Used to additionally parse URL/line/column from eval frames\n var geckoEval = /(\\S+) line (\\d+)(?: > eval line \\d+)* > eval/i;\n var chromeEval = /\\((\\S*)(?::(\\d+))(?::(\\d+))\\)/;\n var lines = ex.stack.split('\\n');\n var stack = [];\n var submatch;\n var parts;\n var element;\n var reference = /^(.*) is undefined$/.exec(ex.message);\n\n for (var i = 0, j = lines.length; i < j; ++i) {\n if ((parts = chrome.exec(lines[i]))) {\n var isNative = parts[2] && parts[2].indexOf('native') === 0; // start of line\n var isEval = parts[2] && parts[2].indexOf('eval') === 0; // start of line\n if (isEval && (submatch = chromeEval.exec(parts[2]))) {\n // throw out eval line/column and use top-most line/column number\n parts[2] = submatch[1]; // url\n parts[3] = submatch[2]; // line\n parts[4] = submatch[3]; // column\n }\n element = {\n url: !isNative ? parts[2] : null,\n func: parts[1] || UNKNOWN_FUNCTION,\n args: isNative ? [parts[2]] : [],\n line: parts[3] ? +parts[3] : null,\n column: parts[4] ? +parts[4] : null\n };\n } else if ((parts = winjs.exec(lines[i]))) {\n element = {\n url: parts[2],\n func: parts[1] || UNKNOWN_FUNCTION,\n args: [],\n line: +parts[3],\n column: parts[4] ? +parts[4] : null\n };\n } else if ((parts = gecko.exec(lines[i]))) {\n var isEval = parts[3] && parts[3].indexOf(' > eval') > -1;\n if (isEval && (submatch = geckoEval.exec(parts[3]))) {\n // throw out eval line/column and use top-most line number\n parts[3] = submatch[1];\n parts[4] = submatch[2];\n parts[5] = null; // no column when eval\n } else if (i === 0 && !parts[5] && typeof ex.columnNumber !== 'undefined') {\n // FireFox uses this awesome columnNumber property for its top frame\n // Also note, Firefox's column number is 0-based and everything else expects 1-based,\n // so adding 1\n // NOTE: this hack doesn't work if top-most frame is eval\n stack[0].column = ex.columnNumber + 1;\n }\n element = {\n url: parts[3],\n func: parts[1] || UNKNOWN_FUNCTION,\n args: parts[2] ? parts[2].split(',') : [],\n line: parts[4] ? +parts[4] : null,\n column: parts[5] ? +parts[5] : null\n };\n } else {\n continue;\n }\n\n if (!element.func && element.line) {\n element.func = UNKNOWN_FUNCTION;\n }\n\n if (element.url && element.url.substr(0, 5) === 'blob:') {\n // Special case for handling JavaScript loaded into a blob.\n // We use a synchronous AJAX request here as a blob is already in\n // memory - it's not making a network request. This will generate a warning\n // in the browser console, but there has already been an error so that's not\n // that much of an issue.\n var xhr = new XMLHttpRequest();\n xhr.open('GET', element.url, false);\n xhr.send(null);\n\n // If we failed to download the source, skip this patch\n if (xhr.status === 200) {\n var source = xhr.responseText || '';\n\n // We trim the source down to the last 300 characters as sourceMappingURL is always at the end of the file.\n // Why 300? To be in line with: https://github.com/getsentry/sentry/blob/4af29e8f2350e20c28a6933354e4f42437b4ba42/src/sentry/lang/javascript/processor.py#L164-L175\n source = source.slice(-300);\n\n // Now we dig out the source map URL\n var sourceMaps = source.match(/\\/\\/# sourceMappingURL=(.*)$/);\n\n // If we don't find a source map comment or we find more than one, continue on to the next element.\n if (sourceMaps) {\n var sourceMapAddress = sourceMaps[1];\n\n // Now we check to see if it's a relative URL.\n // If it is, convert it to an absolute one.\n if (sourceMapAddress.charAt(0) === '~') {\n sourceMapAddress = getLocationOrigin() + sourceMapAddress.slice(1);\n }\n\n // Now we strip the '.map' off of the end of the URL and update the\n // element so that Sentry can match the map to the blob.\n element.url = sourceMapAddress.slice(0, -4);\n }\n }\n }\n\n stack.push(element);\n }\n\n if (!stack.length) {\n return null;\n }\n\n return {\n name: ex.name,\n message: ex.message,\n url: getLocationHref(),\n stack: stack\n };\n }\n\n /**\n * Adds information about the first frame to incomplete stack traces.\n * Safari and IE require this to get complete data on the first frame.\n * @param {Object.<string, *>} stackInfo Stack trace information from\n * one of the compute* methods.\n * @param {string} url The URL of the script that caused an error.\n * @param {(number|string)} lineNo The line number of the script that\n * caused an error.\n * @param {string=} message The error generated by the browser, which\n * hopefully contains the name of the object that caused the error.\n * @return {boolean} Whether or not the stack information was\n * augmented.\n */\n function augmentStackTraceWithInitialElement(stackInfo, url, lineNo, message) {\n var initial = {\n url: url,\n line: lineNo\n };\n\n if (initial.url && initial.line) {\n stackInfo.incomplete = false;\n\n if (!initial.func) {\n initial.func = UNKNOWN_FUNCTION;\n }\n\n if (stackInfo.stack.length > 0) {\n if (stackInfo.stack[0].url === initial.url) {\n if (stackInfo.stack[0].line === initial.line) {\n return false; // already in stack trace\n } else if (\n !stackInfo.stack[0].line &&\n stackInfo.stack[0].func === initial.func\n ) {\n stackInfo.stack[0].line = initial.line;\n return false;\n }\n }\n }\n\n stackInfo.stack.unshift(initial);\n stackInfo.partial = true;\n return true;\n } else {\n stackInfo.incomplete = true;\n }\n\n return false;\n }\n\n /**\n * Computes stack trace information by walking the arguments.caller\n * chain at the time the exception occurred. This will cause earlier\n * frames to be missed but is the only way to get any stack trace in\n * Safari and IE. The top frame is restored by\n * {@link augmentStackTraceWithInitialElement}.\n * @param {Error} ex\n * @return {?Object.<string, *>} Stack trace information.\n */\n function computeStackTraceByWalkingCallerChain(ex, depth) {\n var functionName = /function\\s+([_$a-zA-Z\\xA0-\\uFFFF][_$a-zA-Z0-9\\xA0-\\uFFFF]*)?\\s*\\(/i,\n stack = [],\n funcs = {},\n recursion = false,\n parts,\n item,\n source;\n\n for (\n var curr = computeStackTraceByWalkingCallerChain.caller;\n curr && !recursion;\n curr = curr.caller\n ) {\n if (curr === computeStackTrace || curr === TraceKit.report) {\n // console.log('skipping internal function');\n continue;\n }\n\n item = {\n url: null,\n func: UNKNOWN_FUNCTION,\n line: null,\n column: null\n };\n\n if (curr.name) {\n item.func = curr.name;\n } else if ((parts = functionName.exec(curr.toString()))) {\n item.func = parts[1];\n }\n\n if (typeof item.func === 'undefined') {\n try {\n item.func = parts.input.substring(0, parts.input.indexOf('{'));\n } catch (e) {}\n }\n\n if (funcs['' + curr]) {\n recursion = true;\n } else {\n funcs['' + curr] = true;\n }\n\n stack.push(item);\n }\n\n if (depth) {\n // console.log('depth is ' + depth);\n // console.log('stack is ' + stack.length);\n stack.splice(0, depth);\n }\n\n var result = {\n name: ex.name,\n message: ex.message,\n url: getLocationHref(),\n stack: stack\n };\n augmentStackTraceWithInitialElement(\n result,\n ex.sourceURL || ex.fileName,\n ex.line || ex.lineNumber,\n ex.message || ex.description\n );\n return result;\n }\n\n /**\n * Computes a stack trace for an exception.\n * @param {Error} ex\n * @param {(string|number)=} depth\n */\n function computeStackTrace(ex, depth) {\n var stack = null;\n depth = depth == null ? 0 : +depth;\n\n try {\n stack = computeStackTraceFromStackProp(ex);\n if (stack) {\n return stack;\n }\n } catch (e) {\n if (TraceKit.debug) {\n throw e;\n }\n }\n\n try {\n stack = computeStackTraceByWalkingCallerChain(ex, depth + 1);\n if (stack) {\n return stack;\n }\n } catch (e) {\n if (TraceKit.debug) {\n throw e;\n }\n }\n return {\n name: ex.name,\n message: ex.message,\n url: getLocationHref()\n };\n }\n\n computeStackTrace.augmentStackTraceWithInitialElement = augmentStackTraceWithInitialElement;\n computeStackTrace.computeStackTraceFromStackProp = computeStackTraceFromStackProp;\n\n return computeStackTrace;\n})();\n\nmodule.exports = TraceKit;\n","/*\n * JavaScript MD5\n * https://github.com/blueimp/JavaScript-MD5\n *\n * Copyright 2011, Sebastian Tschan\n * https://blueimp.net\n *\n * Licensed under the MIT license:\n * https://opensource.org/licenses/MIT\n *\n * Based on\n * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message\n * Digest Algorithm, as defined in RFC 1321.\n * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009\n * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet\n * Distributed under the BSD License\n * See http://pajhome.org.uk/crypt/md5 for more info.\n */\n\n/*\n* Add integers, wrapping at 2^32. This uses 16-bit operations internally\n* to work around bugs in some JS interpreters.\n*/\nfunction safeAdd(x, y) {\n var lsw = (x & 0xffff) + (y & 0xffff);\n var msw = (x >> 16) + (y >> 16) + (lsw >> 16);\n return (msw << 16) | (lsw & 0xffff);\n}\n\n/*\n* Bitwise rotate a 32-bit number to the left.\n*/\nfunction bitRotateLeft(num, cnt) {\n return (num << cnt) | (num >>> (32 - cnt));\n}\n\n/*\n* These functions implement the four basic operations the algorithm uses.\n*/\nfunction md5cmn(q, a, b, x, s, t) {\n return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b);\n}\nfunction md5ff(a, b, c, d, x, s, t) {\n return md5cmn((b & c) | (~b & d), a, b, x, s, t);\n}\nfunction md5gg(a, b, c, d, x, s, t) {\n return md5cmn((b & d) | (c & ~d), a, b, x, s, t);\n}\nfunction md5hh(a, b, c, d, x, s, t) {\n return md5cmn(b ^ c ^ d, a, b, x, s, t);\n}\nfunction md5ii(a, b, c, d, x, s, t) {\n return md5cmn(c ^ (b | ~d), a, b, x, s, t);\n}\n\n/*\n* Calculate the MD5 of an array of little-endian words, and a bit length.\n*/\nfunction binlMD5(x, len) {\n /* append padding */\n x[len >> 5] |= 0x80 << (len % 32);\n x[(((len + 64) >>> 9) << 4) + 14] = len;\n\n var i;\n var olda;\n var oldb;\n var oldc;\n var oldd;\n var a = 1732584193;\n var b = -271733879;\n var c = -1732584194;\n var d = 271733878;\n\n for (i = 0; i < x.length; i += 16) {\n olda = a;\n oldb = b;\n oldc = c;\n oldd = d;\n\n a = md5ff(a, b, c, d, x[i], 7, -680876936);\n d = md5ff(d, a, b, c, x[i + 1], 12, -389564586);\n c = md5ff(c, d, a, b, x[i + 2], 17, 606105819);\n b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330);\n a = md5ff(a, b, c, d, x[i + 4], 7, -176418897);\n d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426);\n c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341);\n b = md5ff(b, c, d, a, x[i + 7], 22, -45705983);\n a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416);\n d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417);\n c = md5ff(c, d, a, b, x[i + 10], 17, -42063);\n b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162);\n a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682);\n d = md5ff(d, a, b, c, x[i + 13], 12, -40341101);\n c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290);\n b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329);\n\n a = md5gg(a, b, c, d, x[i + 1], 5, -165796510);\n d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632);\n c = md5gg(c, d, a, b, x[i + 11], 14, 643717713);\n b = md5gg(b, c, d, a, x[i], 20, -373897302);\n a = md5gg(a, b, c, d, x[i + 5], 5, -701558691);\n d = md5gg(d, a, b, c, x[i + 10], 9, 38016083);\n c = md5gg(c, d, a, b, x[i + 15], 14, -660478335);\n b = md5gg(b, c, d, a, x[i + 4], 20, -405537848);\n a = md5gg(a, b, c, d, x[i + 9], 5, 568446438);\n d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690);\n c = md5gg(c, d, a, b, x[i + 3], 14, -187363961);\n b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501);\n a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467);\n d = md5gg(d, a, b, c, x[i + 2], 9, -51403784);\n c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473);\n b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734);\n\n a = md5hh(a, b, c, d, x[i + 5], 4, -378558);\n d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463);\n c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562);\n b = md5hh(b, c, d, a, x[i + 14], 23, -35309556);\n a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060);\n d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353);\n c = md5hh(c, d, a, b, x[i + 7], 16, -155497632);\n b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640);\n a = md5hh(a, b, c, d, x[i + 13], 4, 681279174);\n d = md5hh(d, a, b, c, x[i], 11, -358537222);\n c = md5hh(c, d, a, b, x[i + 3], 16, -722521979);\n b = md5hh(b, c, d, a, x[i + 6], 23, 76029189);\n a = md5hh(a, b, c, d, x[i + 9], 4, -640364487);\n d = md5hh(d, a, b, c, x[i + 12], 11, -421815835);\n c = md5hh(c, d, a, b, x[i + 15], 16, 530742520);\n b = md5hh(b, c, d, a, x[i + 2], 23, -995338651);\n\n a = md5ii(a, b, c, d, x[i], 6, -198630844);\n d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415);\n c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905);\n b = md5ii(b, c, d, a, x[i + 5], 21, -57434055);\n a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571);\n d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606);\n c = md5ii(c, d, a, b, x[i + 10], 15, -1051523);\n b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799);\n a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359);\n d = md5ii(d, a, b, c, x[i + 15], 10, -30611744);\n c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380);\n b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649);\n a = md5ii(a, b, c, d, x[i + 4], 6, -145523070);\n d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379);\n c = md5ii(c, d, a, b, x[i + 2], 15, 718787259);\n b = md5ii(b, c, d, a, x[i + 9], 21, -343485551);\n\n a = safeAdd(a, olda);\n b = safeAdd(b, oldb);\n c = safeAdd(c, oldc);\n d = safeAdd(d, oldd);\n }\n return [a, b, c, d];\n}\n\n/*\n* Convert an array of little-endian words to a string\n*/\nfunction binl2rstr(input) {\n var i;\n var output = '';\n var length32 = input.length * 32;\n for (i = 0; i < length32; i += 8) {\n output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xff);\n }\n return output;\n}\n\n/*\n* Convert a raw string to an array of little-endian words\n* Characters >255 have their high-byte silently ignored.\n*/\nfunction rstr2binl(input) {\n var i;\n var output = [];\n output[(input.length >> 2) - 1] = undefined;\n for (i = 0; i < output.length; i += 1) {\n output[i] = 0;\n }\n var length8 = input.length * 8;\n for (i = 0; i < length8; i += 8) {\n output[i >> 5] |= (input.charCodeAt(i / 8) & 0xff) << (i % 32);\n }\n return output;\n}\n\n/*\n* Calculate the MD5 of a raw string\n*/\nfunction rstrMD5(s) {\n return binl2rstr(binlMD5(rstr2binl(s), s.length * 8));\n}\n\n/*\n* Calculate the HMAC-MD5, of a key and some data (raw strings)\n*/\nfunction rstrHMACMD5(key, data) {\n var i;\n var bkey = rstr2binl(key);\n var ipad = [];\n var opad = [];\n var hash;\n ipad[15] = opad[15] = undefined;\n if (bkey.length > 16) {\n bkey = binlMD5(bkey, key.length * 8);\n }\n for (i = 0; i < 16; i += 1) {\n ipad[i] = bkey[i] ^ 0x36363636;\n opad[i] = bkey[i] ^ 0x5c5c5c5c;\n }\n hash = binlMD5(ipad.concat(rstr2binl(data)), 512 + data.length * 8);\n return binl2rstr(binlMD5(opad.concat(hash), 512 + 128));\n}\n\n/*\n* Convert a raw string to a hex string\n*/\nfunction rstr2hex(input) {\n var hexTab = '0123456789abcdef';\n var output = '';\n var x;\n var i;\n for (i = 0; i < input.length; i += 1) {\n x = input.charCodeAt(i);\n output += hexTab.charAt((x >>> 4) & 0x0f) + hexTab.charAt(x & 0x0f);\n }\n return output;\n}\n\n/*\n* Encode a string as utf-8\n*/\nfunction str2rstrUTF8(input) {\n return unescape(encodeURIComponent(input));\n}\n\n/*\n* Take string arguments and return either raw or hex encoded strings\n*/\nfunction rawMD5(s) {\n return rstrMD5(str2rstrUTF8(s));\n}\nfunction hexMD5(s) {\n return rstr2hex(rawMD5(s));\n}\nfunction rawHMACMD5(k, d) {\n return rstrHMACMD5(str2rstrUTF8(k), str2rstrUTF8(d));\n}\nfunction hexHMACMD5(k, d) {\n return rstr2hex(rawHMACMD5(k, d));\n}\n\nfunction md5(string, key, raw) {\n if (!key) {\n if (!raw) {\n return hexMD5(string);\n }\n return rawMD5(string);\n }\n if (!raw) {\n return hexHMACMD5(key, string);\n }\n return rawHMACMD5(key, string);\n}\n\nmodule.exports = md5;\n","function RavenConfigError(message) {\n this.name = 'RavenConfigError';\n this.message = message;\n}\nRavenConfigError.prototype = new Error();\nRavenConfigError.prototype.constructor = RavenConfigError;\n\nmodule.exports = RavenConfigError;\n","var utils = require('./utils');\n\nvar wrapMethod = function(console, level, callback) {\n var originalConsoleLevel = console[level];\n var originalConsole = console;\n\n if (!(level in console)) {\n return;\n }\n\n var sentryLevel = level === 'warn' ? 'warning' : level;\n\n console[level] = function() {\n var args = [].slice.call(arguments);\n\n var msg = utils.safeJoin(args, ' ');\n var data = {level: sentryLevel, logger: 'console', extra: {arguments: args}};\n\n if (level === 'assert') {\n if (args[0] === false) {\n // Default browsers message\n msg =\n 'Assertion failed: ' + (utils.safeJoin(args.slice(1), ' ') || 'console.assert');\n data.extra.arguments = args.slice(1);\n callback && callback(msg, data);\n }\n } else {\n callback && callback(msg, data);\n }\n\n // this fails for some browsers. :(\n if (originalConsoleLevel) {\n // IE9 doesn't allow calling apply on console functions directly\n // See: https://stackoverflow.com/questions/5472938/does-ie9-support-console-log-and-is-it-a-real-function#answer-5473193\n Function.prototype.apply.call(originalConsoleLevel, originalConsole, args);\n }\n };\n};\n\nmodule.exports = {\n wrapMethod: wrapMethod\n};\n","/*global XDomainRequest:false */\n\nvar TraceKit = require('../vendor/TraceKit/tracekit');\nvar stringify = require('../vendor/json-stringify-safe/stringify');\nvar md5 = require('../vendor/md5/md5');\nvar RavenConfigError = require('./configError');\n\nvar utils = require('./utils');\nvar isErrorEvent = utils.isErrorEvent;\nvar isDOMError = utils.isDOMError;\nvar isDOMException = utils.isDOMException;\nvar isError = utils.isError;\nvar isObject = utils.isObject;\nvar isPlainObject = utils.isPlainObject;\nvar isUndefined = utils.isUndefined;\nvar isFunction = utils.isFunction;\nvar isString = utils.isString;\nvar isArray = utils.isArray;\nvar isEmptyObject = utils.isEmptyObject;\nvar each = utils.each;\nvar objectMerge = utils.objectMerge;\nvar truncate = utils.truncate;\nvar objectFrozen = utils.objectFrozen;\nvar hasKey = utils.hasKey;\nvar joinRegExp = utils.joinRegExp;\nvar urlencode = utils.urlencode;\nvar uuid4 = utils.uuid4;\nvar htmlTreeAsString = utils.htmlTreeAsString;\nvar isSameException = utils.isSameException;\nvar isSameStacktrace = utils.isSameStacktrace;\nvar parseUrl = utils.parseUrl;\nvar fill = utils.fill;\nvar supportsFetch = utils.supportsFetch;\nvar supportsReferrerPolicy = utils.supportsReferrerPolicy;\nvar serializeKeysForMessage = utils.serializeKeysForMessage;\nvar serializeException = utils.serializeException;\nvar sanitize = utils.sanitize;\n\nvar wrapConsoleMethod = require('./console').wrapMethod;\n\nvar dsnKeys = 'source protocol user pass host port path'.split(' '),\n dsnPattern = /^(?:(\\w+):)?\\/\\/(?:(\\w+)(:\\w+)?@)?([\\w\\.-]+)(?::(\\d+))?(\\/.*)/;\n\nfunction now() {\n return +new Date();\n}\n\n// This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785)\nvar _window =\n typeof window !== 'undefined'\n ? window\n : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\nvar _document = _window.document;\nvar _navigator = _window.navigator;\n\nfunction keepOriginalCallback(original, callback) {\n return isFunction(callback)\n ? function(data) {\n return callback(data, original);\n }\n : callback;\n}\n\n// First, check for JSON support\n// If there is no JSON, we no-op the core features of Raven\n// since JSON is required to encode the payload\nfunction Raven() {\n this._hasJSON = !!(typeof JSON === 'object' && JSON.stringify);\n // Raven can run in contexts where there's no document (react-native)\n this._hasDocument = !isUndefined(_document);\n this._hasNavigator = !isUndefined(_navigator);\n this._lastCapturedException = null;\n this._lastData = null;\n this._lastEventId = null;\n this._globalServer = null;\n this._globalKey = null;\n this._globalProject = null;\n this._globalContext = {};\n this._globalOptions = {\n // SENTRY_RELEASE can be injected by https://github.com/getsentry/sentry-webpack-plugin\n release: _window.SENTRY_RELEASE && _window.SENTRY_RELEASE.id,\n logger: 'javascript',\n ignoreErrors: [],\n ignoreUrls: [],\n whitelistUrls: [],\n includePaths: [],\n headers: null,\n collectWindowErrors: true,\n captureUnhandledRejections: true,\n maxMessageLength: 0,\n // By default, truncates URL values to 250 chars\n maxUrlLength: 250,\n stackTraceLimit: 50,\n autoBreadcrumbs: true,\n instrument: true,\n sampleRate: 1,\n sanitizeKeys: []\n };\n this._fetchDefaults = {\n method: 'POST',\n keepalive: true,\n // Despite all stars in the sky saying that Edge supports old draft syntax, aka 'never', 'always', 'origin' and 'default\n // https://caniuse.com/#feat=referrer-policy\n // It doesn't. And it throw exception instead of ignoring this parameter...\n // REF: https://github.com/getsentry/raven-js/issues/1233\n referrerPolicy: supportsReferrerPolicy() ? 'origin' : ''\n };\n this._ignoreOnError = 0;\n this._isRavenInstalled = false;\n this._originalErrorStackTraceLimit = Error.stackTraceLimit;\n // capture references to window.console *and* all its methods first\n // before the console plugin has a chance to monkey patch\n this._originalConsole = _window.console || {};\n this._originalConsoleMethods = {};\n this._plugins = [];\n this._startTime = now();\n this._wrappedBuiltIns = [];\n this._breadcrumbs = [];\n this._lastCapturedEvent = null;\n this._keypressTimeout;\n this._location = _window.location;\n this._lastHref = this._location && this._location.href;\n this._resetBackoff();\n\n // eslint-disable-next-line guard-for-in\n for (var method in this._originalConsole) {\n this._originalConsoleMethods[method] = this._originalConsole[method];\n }\n}\n\n/*\n * The core Raven singleton\n *\n * @this {Raven}\n */\n\nRaven.prototype = {\n // Hardcode version string so that raven source can be loaded directly via\n // webpack (using a build step causes webpack #1617). Grunt verifies that\n // this value matches package.json during build.\n // See: https://github.com/getsentry/raven-js/issues/465\n VERSION: '3.26.2',\n\n debug: false,\n\n TraceKit: TraceKit, // alias to TraceKit\n\n /*\n * Configure Raven with a DSN and extra options\n *\n * @param {string} dsn The public Sentry DSN\n * @param {object} options Set of global options [optional]\n * @return {Raven}\n */\n config: function(dsn, options) {\n var self = this;\n\n if (self._globalServer) {\n this._logDebug('error', 'Error: Raven has already been configured');\n return self;\n }\n if (!dsn) return self;\n\n var globalOptions = self._globalOptions;\n\n // merge in options\n if (options) {\n each(options, function(key, value) {\n // tags and extra are special and need to be put into context\n if (key === 'tags' || key === 'extra' || key === 'user') {\n self._globalContext[key] = value;\n } else {\n globalOptions[key] = value;\n }\n });\n }\n\n self.setDSN(dsn);\n\n // \"Script error.\" is hard coded into browsers for errors that it can't read.\n // this is the result of a script being pulled in from an external domain and CORS.\n globalOptions.ignoreErrors.push(/^Script error\\.?$/);\n globalOptions.ignoreErrors.push(/^Javascript error: Script error\\.? on line 0$/);\n\n // join regexp rules into one big rule\n globalOptions.ignoreErrors = joinRegExp(globalOptions.ignoreErrors);\n globalOptions.ignoreUrls = globalOptions.ignoreUrls.length\n ? joinRegExp(globalOptions.ignoreUrls)\n : false;\n globalOptions.whitelistUrls = globalOptions.whitelistUrls.length\n ? joinRegExp(globalOptions.whitelistUrls)\n : false;\n globalOptions.includePaths = joinRegExp(globalOptions.includePaths);\n globalOptions.maxBreadcrumbs = Math.max(\n 0,\n Math.min(globalOptions.maxBreadcrumbs || 100, 100)\n ); // default and hard limit is 100\n\n var autoBreadcrumbDefaults = {\n xhr: true,\n console: true,\n dom: true,\n location: true,\n sentry: true\n };\n\n var autoBreadcrumbs = globalOptions.autoBreadcrumbs;\n if ({}.toString.call(autoBreadcrumbs) === '[object Object]') {\n autoBreadcrumbs = objectMerge(autoBreadcrumbDefaults, autoBreadcrumbs);\n } else if (autoBreadcrumbs !== false) {\n autoBreadcrumbs = autoBreadcrumbDefaults;\n }\n globalOptions.autoBreadcrumbs = autoBreadcrumbs;\n\n var instrumentDefaults = {\n tryCatch: true\n };\n\n var instrument = globalOptions.instrument;\n if ({}.toString.call(instrument) === '[object Object]') {\n instrument = objectMerge(instrumentDefaults, instrument);\n } else if (instrument !== false) {\n instrument = instrumentDefaults;\n }\n globalOptions.instrument = instrument;\n\n TraceKit.collectWindowErrors = !!globalOptions.collectWindowErrors;\n\n // return for chaining\n return self;\n },\n\n /*\n * Installs a global window.onerror error handler\n * to capture and report uncaught exceptions.\n * At this point, install() is required to be called due\n * to the way TraceKit is set up.\n *\n * @return {Raven}\n */\n install: function() {\n var self = this;\n if (self.isSetup() && !self._isRavenInstalled) {\n TraceKit.report.subscribe(function() {\n self._handleOnErrorStackInfo.apply(self, arguments);\n });\n\n if (self._globalOptions.captureUnhandledRejections) {\n self._attachPromiseRejectionHandler();\n }\n\n self._patchFunctionToString();\n\n if (self._globalOptions.instrument && self._globalOptions.instrument.tryCatch) {\n self._instrumentTryCatch();\n }\n\n if (self._globalOptions.autoBreadcrumbs) self._instrumentBreadcrumbs();\n\n // Install all of the plugins\n self._drainPlugins();\n\n self._isRavenInstalled = true;\n }\n\n Error.stackTraceLimit = self._globalOptions.stackTraceLimit;\n return this;\n },\n\n /*\n * Set the DSN (can be called multiple time unlike config)\n *\n * @param {string} dsn The public Sentry DSN\n */\n setDSN: function(dsn) {\n var self = this,\n uri = self._parseDSN(dsn),\n lastSlash = uri.path.lastIndexOf('/'),\n path = uri.path.substr(1, lastSlash);\n\n self._dsn = dsn;\n self._globalKey = uri.user;\n self._globalSecret = uri.pass && uri.pass.substr(1);\n self._globalProject = uri.path.substr(lastSlash + 1);\n\n self._globalServer = self._getGlobalServer(uri);\n\n self._globalEndpoint =\n self._globalServer + '/' + path + 'api/' + self._globalProject + '/store/';\n\n // Reset backoff state since we may be pointing at a\n // new project/server\n this._resetBackoff();\n },\n\n /*\n * Wrap code within a context so Raven can capture errors\n * reliably across domains that is executed immediately.\n *\n * @param {object} options A specific set of options for this context [optional]\n * @param {function} func The callback to be immediately executed within the context\n * @param {array} args An array of arguments to be called with the callback [optional]\n */\n context: function(options, func, args) {\n if (isFunction(options)) {\n args = func || [];\n func = options;\n options = {};\n }\n\n return this.wrap(options, func).apply(this, args);\n },\n\n /*\n * Wrap code within a context and returns back a new function to be executed\n *\n * @param {object} options A specific set of options for this context [optional]\n * @param {function} func The function to be wrapped in a new context\n * @param {function} _before A function to call before the try/catch wrapper [optional, private]\n * @return {function} The newly wrapped functions with a context\n */\n wrap: function(options, func, _before) {\n var self = this;\n // 1 argument has been passed, and it's not a function\n // so just return it\n if (isUndefined(func) && !isFunction(options)) {\n return options;\n }\n\n // options is optional\n if (isFunction(options)) {\n func = options;\n options = undefined;\n }\n\n // At this point, we've passed along 2 arguments, and the second one\n // is not a function either, so we'll just return the second argument.\n if (!isFunction(func)) {\n return func;\n }\n\n // We don't wanna wrap it twice!\n try {\n if (func.__raven__) {\n return func;\n }\n\n // If this has already been wrapped in the past, return that\n if (func.__raven_wrapper__) {\n return func.__raven_wrapper__;\n }\n } catch (e) {\n // Just accessing custom props in some Selenium environments\n // can cause a \"Permission denied\" exception (see raven-js#495).\n // Bail on wrapping and return the function as-is (defers to window.onerror).\n return func;\n }\n\n function wrapped() {\n var args = [],\n i = arguments.length,\n deep = !options || (options && options.deep !== false);\n\n if (_before && isFunction(_before)) {\n _before.apply(this, arguments);\n }\n\n // Recursively wrap all of a function's arguments that are\n // functions themselves.\n while (i--) args[i] = deep ? self.wrap(options, arguments[i]) : arguments[i];\n\n try {\n // Attempt to invoke user-land function\n // NOTE: If you are a Sentry user, and you are seeing this stack frame, it\n // means Raven caught an error invoking your application code. This is\n // expected behavior and NOT indicative of a bug with Raven.js.\n return func.apply(this, args);\n } catch (e) {\n self._ignoreNextOnError();\n self.captureException(e, options);\n throw e;\n }\n }\n\n // copy over properties of the old function\n for (var property in func) {\n if (hasKey(func, property)) {\n wrapped[property] = func[property];\n }\n }\n wrapped.prototype = func.prototype;\n\n func.__raven_wrapper__ = wrapped;\n // Signal that this function has been wrapped/filled already\n // for both debugging and to prevent it to being wrapped/filled twice\n wrapped.__raven__ = true;\n wrapped.__orig__ = func;\n\n return wrapped;\n },\n\n /**\n * Uninstalls the global error handler.\n *\n * @return {Raven}\n */\n uninstall: function() {\n TraceKit.report.uninstall();\n\n this._detachPromiseRejectionHandler();\n this._unpatchFunctionToString();\n this._restoreBuiltIns();\n this._restoreConsole();\n\n Error.stackTraceLimit = this._originalErrorStackTraceLimit;\n this._isRavenInstalled = false;\n\n return this;\n },\n\n /**\n * Callback used for `unhandledrejection` event\n *\n * @param {PromiseRejectionEvent} event An object containing\n * promise: the Promise that was rejected\n * reason: the value with which the Promise was rejected\n * @return void\n */\n _promiseRejectionHandler: function(event) {\n this._logDebug('debug', 'Raven caught unhandled promise rejection:', event);\n this.captureException(event.reason, {\n mechanism: {\n type: 'onunhandledrejection',\n handled: false\n }\n });\n },\n\n /**\n * Installs the global promise rejection handler.\n *\n * @return {raven}\n */\n _attachPromiseRejectionHandler: function() {\n this._promiseRejectionHandler = this._promiseRejectionHandler.bind(this);\n _window.addEventListener &&\n _window.addEventListener('unhandledrejection', this._promiseRejectionHandler);\n return this;\n },\n\n /**\n * Uninstalls the global promise rejection handler.\n *\n * @return {raven}\n */\n _detachPromiseRejectionHandler: function() {\n _window.removeEventListener &&\n _window.removeEventListener('unhandledrejection', this._promiseRejectionHandler);\n return this;\n },\n\n /**\n * Manually capture an exception and send it over to Sentry\n *\n * @param {error} ex An exception to be logged\n * @param {object} options A specific set of options for this error [optional]\n * @return {Raven}\n */\n captureException: function(ex, options) {\n options = objectMerge({trimHeadFrames: 0}, options ? options : {});\n\n if (isErrorEvent(ex) && ex.error) {\n // If it is an ErrorEvent with `error` property, extract it to get actual Error\n ex = ex.error;\n } else if (isDOMError(ex) || isDOMException(ex)) {\n // If it is a DOMError or DOMException (which are legacy APIs, but still supported in some browsers)\n // then we just extract the name and message, as they don't provide anything else\n // https://developer.mozilla.org/en-US/docs/Web/API/DOMError\n // https://developer.mozilla.org/en-US/docs/Web/API/DOMException\n var name = ex.name || (isDOMError(ex) ? 'DOMError' : 'DOMException');\n var message = ex.message ? name + ': ' + ex.message : name;\n\n return this.captureMessage(\n message,\n objectMerge(options, {\n // neither DOMError or DOMException provide stack trace and we most likely wont get it this way as well\n // but it's barely any overhead so we may at least try\n stacktrace: true,\n trimHeadFrames: options.trimHeadFrames + 1\n })\n );\n } else if (isError(ex)) {\n // we have a real Error object\n ex = ex;\n } else if (isPlainObject(ex)) {\n // If it is plain Object, serialize it manually and extract options\n // This will allow us to group events based on top-level keys\n // which is much better than creating new group when any key/value change\n options = this._getCaptureExceptionOptionsFromPlainObject(options, ex);\n ex = new Error(options.message);\n } else {\n // If none of previous checks were valid, then it means that\n // it's not a DOMError/DOMException\n // it's not a plain Object\n // it's not a valid ErrorEvent (one with an error property)\n // it's not an Error\n // So bail out and capture it as a simple message:\n return this.captureMessage(\n ex,\n objectMerge(options, {\n stacktrace: true, // if we fall back to captureMessage, default to attempting a new trace\n trimHeadFrames: options.trimHeadFrames + 1\n })\n );\n }\n\n // Store the raw exception object for potential debugging and introspection\n this._lastCapturedException = ex;\n\n // TraceKit.report will re-raise any exception passed to it,\n // which means you have to wrap it in try/catch. Instead, we\n // can wrap it here and only re-raise if TraceKit.report\n // raises an exception different from the one we asked to\n // report on.\n try {\n var stack = TraceKit.computeStackTrace(ex);\n this._handleStackInfo(stack, options);\n } catch (ex1) {\n if (ex !== ex1) {\n throw ex1;\n }\n }\n\n return this;\n },\n\n _getCaptureExceptionOptionsFromPlainObject: function(currentOptions, ex) {\n var exKeys = Object.keys(ex).sort();\n var options = objectMerge(currentOptions, {\n message:\n 'Non-Error exception captured with keys: ' + serializeKeysForMessage(exKeys),\n fingerprint: [md5(exKeys)],\n extra: currentOptions.extra || {}\n });\n options.extra.__serialized__ = serializeException(ex);\n\n return options;\n },\n\n /*\n * Manually send a message to Sentry\n *\n * @param {string} msg A plain message to be captured in Sentry\n * @param {object} options A specific set of options for this message [optional]\n * @return {Raven}\n */\n captureMessage: function(msg, options) {\n // config() automagically converts ignoreErrors from a list to a RegExp so we need to test for an\n // early call; we'll error on the side of logging anything called before configuration since it's\n // probably something you should see:\n if (\n !!this._globalOptions.ignoreErrors.test &&\n this._globalOptions.ignoreErrors.test(msg)\n ) {\n return;\n }\n\n options = options || {};\n msg = msg + ''; // Make sure it's actually a string\n\n var data = objectMerge(\n {\n message: msg\n },\n options\n );\n\n var ex;\n // Generate a \"synthetic\" stack trace from this point.\n // NOTE: If you are a Sentry user, and you are seeing this stack frame, it is NOT indicative\n // of a bug with Raven.js. Sentry generates synthetic traces either by configuration,\n // or if it catches a thrown object without a \"stack\" property.\n try {\n throw new Error(msg);\n } catch (ex1) {\n ex = ex1;\n }\n\n // null exception name so `Error` isn't prefixed to msg\n ex.name = null;\n var stack = TraceKit.computeStackTrace(ex);\n\n // stack[0] is `throw new Error(msg)` call itself, we are interested in the frame that was just before that, stack[1]\n var initialCall = isArray(stack.stack) && stack.stack[1];\n\n // if stack[1] is `Raven.captureException`, it means that someone passed a string to it and we redirected that call\n // to be handled by `captureMessage`, thus `initialCall` is the 3rd one, not 2nd\n // initialCall => captureException(string) => captureMessage(string)\n if (initialCall && initialCall.func === 'Raven.captureException') {\n initialCall = stack.stack[2];\n }\n\n var fileurl = (initialCall && initialCall.url) || '';\n\n if (\n !!this._globalOptions.ignoreUrls.test &&\n this._globalOptions.ignoreUrls.test(fileurl)\n ) {\n return;\n }\n\n if (\n !!this._globalOptions.whitelistUrls.test &&\n !this._globalOptions.whitelistUrls.test(fileurl)\n ) {\n return;\n }\n\n if (this._globalOptions.stacktrace || (options && options.stacktrace)) {\n // fingerprint on msg, not stack trace (legacy behavior, could be revisited)\n data.fingerprint = data.fingerprint == null ? msg : data.fingerprint;\n\n options = objectMerge(\n {\n trimHeadFrames: 0\n },\n options\n );\n // Since we know this is a synthetic trace, the top frame (this function call)\n // MUST be from Raven.js, so mark it for trimming\n // We add to the trim counter so that callers can choose to trim extra frames, such\n // as utility functions.\n options.trimHeadFrames += 1;\n\n var frames = this._prepareFrames(stack, options);\n data.stacktrace = {\n // Sentry expects frames oldest to newest\n frames: frames.reverse()\n };\n }\n\n // Make sure that fingerprint is always wrapped in an array\n if (data.fingerprint) {\n data.fingerprint = isArray(data.fingerprint)\n ? data.fingerprint\n : [data.fingerprint];\n }\n\n // Fire away!\n this._send(data);\n\n return this;\n },\n\n captureBreadcrumb: function(obj) {\n var crumb = objectMerge(\n {\n timestamp: now() / 1000\n },\n obj\n );\n\n if (isFunction(this._globalOptions.breadcrumbCallback)) {\n var result = this._globalOptions.breadcrumbCallback(crumb);\n\n if (isObject(result) && !isEmptyObject(result)) {\n crumb = result;\n } else if (result === false) {\n return this;\n }\n }\n\n this._breadcrumbs.push(crumb);\n if (this._breadcrumbs.length > this._globalOptions.maxBreadcrumbs) {\n this._breadcrumbs.shift();\n }\n return this;\n },\n\n addPlugin: function(plugin /*arg1, arg2, ... argN*/) {\n var pluginArgs = [].slice.call(arguments, 1);\n\n this._plugins.push([plugin, pluginArgs]);\n if (this._isRavenInstalled) {\n this._drainPlugins();\n }\n\n return this;\n },\n\n /*\n * Set/clear a user to be sent along with the payload.\n *\n * @param {object} user An object representing user data [optional]\n * @return {Raven}\n */\n setUserContext: function(user) {\n // Intentionally do not merge here since that's an unexpected behavior.\n this._globalContext.user = user;\n\n return this;\n },\n\n /*\n * Merge extra attributes to be sent along with the payload.\n *\n * @param {object} extra An object representing extra data [optional]\n * @return {Raven}\n */\n setExtraContext: function(extra) {\n this._mergeContext('extra', extra);\n\n return this;\n },\n\n /*\n * Merge tags to be sent along with the payload.\n *\n * @param {object} tags An object representing tags [optional]\n * @return {Raven}\n */\n setTagsContext: function(tags) {\n this._mergeContext('tags', tags);\n\n return this;\n },\n\n /*\n * Clear all of the context.\n *\n * @return {Raven}\n */\n clearContext: function() {\n this._globalContext = {};\n\n return this;\n },\n\n /*\n * Get a copy of the current context. This cannot be mutated.\n *\n * @return {object} copy of context\n */\n getContext: function() {\n // lol javascript\n return JSON.parse(stringify(this._globalContext));\n },\n\n /*\n * Set environment of application\n *\n * @param {string} environment Typically something like 'production'.\n * @return {Raven}\n */\n setEnvironment: function(environment) {\n this._globalOptions.environment = environment;\n\n return this;\n },\n\n /*\n * Set release version of application\n *\n * @param {string} release Typically something like a git SHA to identify version\n * @return {Raven}\n */\n setRelease: function(release) {\n this._globalOptions.release = release;\n\n return this;\n },\n\n /*\n * Set the dataCallback option\n *\n * @param {function} callback The callback to run which allows the\n * data blob to be mutated before sending\n * @return {Raven}\n */\n setDataCallback: function(callback) {\n var original = this._globalOptions.dataCallback;\n this._globalOptions.dataCallback = keepOriginalCallback(original, callback);\n return this;\n },\n\n /*\n * Set the breadcrumbCallback option\n *\n * @param {function} callback The callback to run which allows filtering\n * or mutating breadcrumbs\n * @return {Raven}\n */\n setBreadcrumbCallback: function(callback) {\n var original = this._globalOptions.breadcrumbCallback;\n this._globalOptions.breadcrumbCallback = keepOriginalCallback(original, callback);\n return this;\n },\n\n /*\n * Set the shouldSendCallback option\n *\n * @param {function} callback The callback to run which allows\n * introspecting the blob before sending\n * @return {Raven}\n */\n setShouldSendCallback: function(callback) {\n var original = this._globalOptions.shouldSendCallback;\n this._globalOptions.shouldSendCallback = keepOriginalCallback(original, callback);\n return this;\n },\n\n /**\n * Override the default HTTP transport mechanism that transmits data\n * to the Sentry server.\n *\n * @param {function} transport Function invoked instead of the default\n * `makeRequest` handler.\n *\n * @return {Raven}\n */\n setTransport: function(transport) {\n this._globalOptions.transport = transport;\n\n return this;\n },\n\n /*\n * Get the latest raw exception that was captured by Raven.\n *\n * @return {error}\n */\n lastException: function() {\n return this._lastCapturedException;\n },\n\n /*\n * Get the last event id\n *\n * @return {string}\n */\n lastEventId: function() {\n return this._lastEventId;\n },\n\n /*\n * Determine if Raven is setup and ready to go.\n *\n * @return {boolean}\n */\n isSetup: function() {\n if (!this._hasJSON) return false; // needs JSON support\n if (!this._globalServer) {\n if (!this.ravenNotConfiguredError) {\n this.ravenNotConfiguredError = true;\n this._logDebug('error', 'Error: Raven has not been configured.');\n }\n return false;\n }\n return true;\n },\n\n afterLoad: function() {\n // TODO: remove window dependence?\n\n // Attempt to initialize Raven on load\n var RavenConfig = _window.RavenConfig;\n if (RavenConfig) {\n this.config(RavenConfig.dsn, RavenConfig.config).install();\n }\n },\n\n showReportDialog: function(options) {\n if (\n !_document // doesn't work without a document (React native)\n )\n return;\n\n options = options || {};\n\n var lastEventId = options.eventId || this.lastEventId();\n if (!lastEventId) {\n throw new RavenConfigError('Missing eventId');\n }\n\n var dsn = options.dsn || this._dsn;\n if (!dsn) {\n throw new RavenConfigError('Missing DSN');\n }\n\n var encode = encodeURIComponent;\n var qs = '';\n qs += '?eventId=' + encode(lastEventId);\n qs += '&dsn=' + encode(dsn);\n\n var user = options.user || this._globalContext.user;\n if (user) {\n if (user.name) qs += '&name=' + encode(user.name);\n if (user.email) qs += '&email=' + encode(user.email);\n }\n\n var globalServer = this._getGlobalServer(this._parseDSN(dsn));\n\n var script = _document.createElement('script');\n script.async = true;\n script.src = globalServer + '/api/embed/error-page/' + qs;\n (_document.head || _document.body).appendChild(script);\n },\n\n /**** Private functions ****/\n _ignoreNextOnError: function() {\n var self = this;\n this._ignoreOnError += 1;\n setTimeout(function() {\n // onerror should trigger before setTimeout\n self._ignoreOnError -= 1;\n });\n },\n\n _triggerEvent: function(eventType, options) {\n // NOTE: `event` is a native browser thing, so let's avoid conflicting wiht it\n var evt, key;\n\n if (!this._hasDocument) return;\n\n options = options || {};\n\n eventType = 'raven' + eventType.substr(0, 1).toUpperCase() + eventType.substr(1);\n\n if (_document.createEvent) {\n evt = _document.createEvent('HTMLEvents');\n evt.initEvent(eventType, true, true);\n } else {\n evt = _document.createEventObject();\n evt.eventType = eventType;\n }\n\n for (key in options)\n if (hasKey(options, key)) {\n evt[key] = options[key];\n }\n\n if (_document.createEvent) {\n // IE9 if standards\n _document.dispatchEvent(evt);\n } else {\n // IE8 regardless of Quirks or Standards\n // IE9 if quirks\n try {\n _document.fireEvent('on' + evt.eventType.toLowerCase(), evt);\n } catch (e) {\n // Do nothing\n }\n }\n },\n\n /**\n * Wraps addEventListener to capture UI breadcrumbs\n * @param evtName the event name (e.g. \"click\")\n * @returns {Function}\n * @private\n */\n _breadcrumbEventHandler: function(evtName) {\n var self = this;\n return function(evt) {\n // reset keypress timeout; e.g. triggering a 'click' after\n // a 'keypress' will reset the keypress debounce so that a new\n // set of keypresses can be recorded\n self._keypressTimeout = null;\n\n // It's possible this handler might trigger multiple times for the same\n // event (e.g. event propagation through node ancestors). Ignore if we've\n // already captured the event.\n if (self._lastCapturedEvent === evt) return;\n\n self._lastCapturedEvent = evt;\n\n // try/catch both:\n // - accessing evt.target (see getsentry/raven-js#838, #768)\n // - `htmlTreeAsString` because it's complex, and just accessing the DOM incorrectly\n // can throw an exception in some circumstances.\n var target;\n try {\n target = htmlTreeAsString(evt.target);\n } catch (e) {\n target = '<unknown>';\n }\n\n self.captureBreadcrumb({\n category: 'ui.' + evtName, // e.g. ui.click, ui.input\n message: target\n });\n };\n },\n\n /**\n * Wraps addEventListener to capture keypress UI events\n * @returns {Function}\n * @private\n */\n _keypressEventHandler: function() {\n var self = this,\n debounceDuration = 1000; // milliseconds\n\n // TODO: if somehow user switches keypress target before\n // debounce timeout is triggered, we will only capture\n // a single breadcrumb from the FIRST target (acceptable?)\n return function(evt) {\n var target;\n try {\n target = evt.target;\n } catch (e) {\n // just accessing event properties can throw an exception in some rare circumstances\n // see: https://github.com/getsentry/raven-js/issues/838\n return;\n }\n var tagName = target && target.tagName;\n\n // only consider keypress events on actual input elements\n // this will disregard keypresses targeting body (e.g. tabbing\n // through elements, hotkeys, etc)\n if (\n !tagName ||\n (tagName !== 'INPUT' && tagName !== 'TEXTAREA' && !target.isContentEditable)\n )\n return;\n\n // record first keypress in a series, but ignore subsequent\n // keypresses until debounce clears\n var timeout = self._keypressTimeout;\n if (!timeout) {\n self._breadcrumbEventHandler('input')(evt);\n }\n clearTimeout(timeout);\n self._keypressTimeout = setTimeout(function() {\n self._keypressTimeout = null;\n }, debounceDuration);\n };\n },\n\n /**\n * Captures a breadcrumb of type \"navigation\", normalizing input URLs\n * @param to the originating URL\n * @param from the target URL\n * @private\n */\n _captureUrlChange: function(from, to) {\n var parsedLoc = parseUrl(this._location.href);\n var parsedTo = parseUrl(to);\n var parsedFrom = parseUrl(from);\n\n // because onpopstate only tells you the \"new\" (to) value of location.href, and\n // not the previous (from) value, we need to track the value of the current URL\n // state ourselves\n this._lastHref = to;\n\n // Use only the path component of the URL if the URL matches the current\n // document (almost all the time when using pushState)\n if (parsedLoc.protocol === parsedTo.protocol && parsedLoc.host === parsedTo.host)\n to = parsedTo.relative;\n if (parsedLoc.protocol === parsedFrom.protocol && parsedLoc.host === parsedFrom.host)\n from = parsedFrom.relative;\n\n this.captureBreadcrumb({\n category: 'navigation',\n data: {\n to: to,\n from: from\n }\n });\n },\n\n _patchFunctionToString: function() {\n var self = this;\n self._originalFunctionToString = Function.prototype.toString;\n // eslint-disable-next-line no-extend-native\n Function.prototype.toString = function() {\n if (typeof this === 'function' && this.__raven__) {\n return self._originalFunctionToString.apply(this.__orig__, arguments);\n }\n return self._originalFunctionToString.apply(this, arguments);\n };\n },\n\n _unpatchFunctionToString: function() {\n if (this._originalFunctionToString) {\n // eslint-disable-next-line no-extend-native\n Function.prototype.toString = this._originalFunctionToString;\n }\n },\n\n /**\n * Wrap timer functions and event targets to catch errors and provide\n * better metadata.\n */\n _instrumentTryCatch: function() {\n var self = this;\n\n var wrappedBuiltIns = self._wrappedBuiltIns;\n\n function wrapTimeFn(orig) {\n return function(fn, t) {\n // preserve arity\n // Make a copy of the arguments to prevent deoptimization\n // https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#32-leaking-arguments\n var args = new Array(arguments.length);\n for (var i = 0; i < args.length; ++i) {\n args[i] = arguments[i];\n }\n var originalCallback = args[0];\n if (isFunction(originalCallback)) {\n args[0] = self.wrap(\n {\n mechanism: {\n type: 'instrument',\n data: {function: orig.name || '<anonymous>'}\n }\n },\n originalCallback\n );\n }\n\n // IE < 9 doesn't support .call/.apply on setInterval/setTimeout, but it\n // also supports only two arguments and doesn't care what this is, so we\n // can just call the original function directly.\n if (orig.apply) {\n return orig.apply(this, args);\n } else {\n return orig(args[0], args[1]);\n }\n };\n }\n\n var autoBreadcrumbs = this._globalOptions.autoBreadcrumbs;\n\n function wrapEventTarget(global) {\n var proto = _window[global] && _window[global].prototype;\n if (proto && proto.hasOwnProperty && proto.hasOwnProperty('addEventListener')) {\n fill(\n proto,\n 'addEventListener',\n function(orig) {\n return function(evtName, fn, capture, secure) {\n // preserve arity\n try {\n if (fn && fn.handleEvent) {\n fn.handleEvent = self.wrap(\n {\n mechanism: {\n type: 'instrument',\n data: {\n target: global,\n function: 'handleEvent',\n handler: (fn && fn.name) || '<anonymous>'\n }\n }\n },\n fn.handleEvent\n );\n }\n } catch (err) {\n // can sometimes get 'Permission denied to access property \"handle Event'\n }\n\n // More breadcrumb DOM capture ... done here and not in `_instrumentBreadcrumbs`\n // so that we don't have more than one wrapper function\n var before, clickHandler, keypressHandler;\n\n if (\n autoBreadcrumbs &&\n autoBreadcrumbs.dom &&\n (global === 'EventTarget' || global === 'Node')\n ) {\n // NOTE: generating multiple handlers per addEventListener invocation, should\n // revisit and verify we can just use one (almost certainly)\n clickHandler = self._breadcrumbEventHandler('click');\n keypressHandler = self._keypressEventHandler();\n before = function(evt) {\n // need to intercept every DOM event in `before` argument, in case that\n // same wrapped method is re-used for different events (e.g. mousemove THEN click)\n // see #724\n if (!evt) return;\n\n var eventType;\n try {\n eventType = evt.type;\n } catch (e) {\n // just accessing event properties can throw an exception in some rare circumstances\n // see: https://github.com/getsentry/raven-js/issues/838\n return;\n }\n if (eventType === 'click') return clickHandler(evt);\n else if (eventType === 'keypress') return keypressHandler(evt);\n };\n }\n return orig.call(\n this,\n evtName,\n self.wrap(\n {\n mechanism: {\n type: 'instrument',\n data: {\n target: global,\n function: 'addEventListener',\n handler: (fn && fn.name) || '<anonymous>'\n }\n }\n },\n fn,\n before\n ),\n capture,\n secure\n );\n };\n },\n wrappedBuiltIns\n );\n fill(\n proto,\n 'removeEventListener',\n function(orig) {\n return function(evt, fn, capture, secure) {\n try {\n fn = fn && (fn.__raven_wrapper__ ? fn.__raven_wrapper__ : fn);\n } catch (e) {\n // ignore, accessing __raven_wrapper__ will throw in some Selenium environments\n }\n return orig.call(this, evt, fn, capture, secure);\n };\n },\n wrappedBuiltIns\n );\n }\n }\n\n fill(_window, 'setTimeout', wrapTimeFn, wrappedBuiltIns);\n fill(_window, 'setInterval', wrapTimeFn, wrappedBuiltIns);\n if (_window.requestAnimationFrame) {\n fill(\n _window,\n 'requestAnimationFrame',\n function(orig) {\n return function(cb) {\n return orig(\n self.wrap(\n {\n mechanism: {\n type: 'instrument',\n data: {\n function: 'requestAnimationFrame',\n handler: (orig && orig.name) || '<anonymous>'\n }\n }\n },\n cb\n )\n );\n };\n },\n wrappedBuiltIns\n );\n }\n\n // event targets borrowed from bugsnag-js:\n // https://github.com/bugsnag/bugsnag-js/blob/master/src/bugsnag.js#L666\n var eventTargets = [\n 'EventTarget',\n 'Window',\n 'Node',\n 'ApplicationCache',\n 'AudioTrackList',\n 'ChannelMergerNode',\n 'CryptoOperation',\n 'EventSource',\n 'FileReader',\n 'HTMLUnknownElement',\n 'IDBDatabase',\n 'IDBRequest',\n 'IDBTransaction',\n 'KeyOperation',\n 'MediaController',\n 'MessagePort',\n 'ModalWindow',\n 'Notification',\n 'SVGElementInstance',\n 'Screen',\n 'TextTrack',\n 'TextTrackCue',\n 'TextTrackList',\n 'WebSocket',\n 'WebSocketWorker',\n 'Worker',\n 'XMLHttpRequest',\n 'XMLHttpRequestEventTarget',\n 'XMLHttpRequestUpload'\n ];\n for (var i = 0; i < eventTargets.length; i++) {\n wrapEventTarget(eventTargets[i]);\n }\n },\n\n /**\n * Instrument browser built-ins w/ breadcrumb capturing\n * - XMLHttpRequests\n * - DOM interactions (click/typing)\n * - window.location changes\n * - console\n *\n * Can be disabled or individually configured via the `autoBreadcrumbs` config option\n */\n _instrumentBreadcrumbs: function() {\n var self = this;\n var autoBreadcrumbs = this._globalOptions.autoBreadcrumbs;\n\n var wrappedBuiltIns = self._wrappedBuiltIns;\n\n function wrapProp(prop, xhr) {\n if (prop in xhr && isFunction(xhr[prop])) {\n fill(xhr, prop, function(orig) {\n return self.wrap(\n {\n mechanism: {\n type: 'instrument',\n data: {function: prop, handler: (orig && orig.name) || '<anonymous>'}\n }\n },\n orig\n );\n }); // intentionally don't track filled methods on XHR instances\n }\n }\n\n if (autoBreadcrumbs.xhr && 'XMLHttpRequest' in _window) {\n var xhrproto = _window.XMLHttpRequest && _window.XMLHttpRequest.prototype;\n fill(\n xhrproto,\n 'open',\n function(origOpen) {\n return function(method, url) {\n // preserve arity\n\n // if Sentry key appears in URL, don't capture\n if (isString(url) && url.indexOf(self._globalKey) === -1) {\n this.__raven_xhr = {\n method: method,\n url: url,\n status_code: null\n };\n }\n\n return origOpen.apply(this, arguments);\n };\n },\n wrappedBuiltIns\n );\n\n fill(\n xhrproto,\n 'send',\n function(origSend) {\n return function() {\n // preserve arity\n var xhr = this;\n\n function onreadystatechangeHandler() {\n if (xhr.__raven_xhr && xhr.readyState === 4) {\n try {\n // touching statusCode in some platforms throws\n // an exception\n xhr.__raven_xhr.status_code = xhr.status;\n } catch (e) {\n /* do nothing */\n }\n\n self.captureBreadcrumb({\n type: 'http',\n category: 'xhr',\n data: xhr.__raven_xhr\n });\n }\n }\n\n var props = ['onload', 'onerror', 'onprogress'];\n for (var j = 0; j < props.length; j++) {\n wrapProp(props[j], xhr);\n }\n\n if ('onreadystatechange' in xhr && isFunction(xhr.onreadystatechange)) {\n fill(\n xhr,\n 'onreadystatechange',\n function(orig) {\n return self.wrap(\n {\n mechanism: {\n type: 'instrument',\n data: {\n function: 'onreadystatechange',\n handler: (orig && orig.name) || '<anonymous>'\n }\n }\n },\n orig,\n onreadystatechangeHandler\n );\n } /* intentionally don't track this instrumentation */\n );\n } else {\n // if onreadystatechange wasn't actually set by the page on this xhr, we\n // are free to set our own and capture the breadcrumb\n xhr.onreadystatechange = onreadystatechangeHandler;\n }\n\n return origSend.apply(this, arguments);\n };\n },\n wrappedBuiltIns\n );\n }\n\n if (autoBreadcrumbs.xhr && supportsFetch()) {\n fill(\n _window,\n 'fetch',\n function(origFetch) {\n return function() {\n // preserve arity\n // Make a copy of the arguments to prevent deoptimization\n // https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#32-leaking-arguments\n var args = new Array(arguments.length);\n for (var i = 0; i < args.length; ++i) {\n args[i] = arguments[i];\n }\n\n var fetchInput = args[0];\n var method = 'GET';\n var url;\n\n if (typeof fetchInput === 'string') {\n url = fetchInput;\n } else if ('Request' in _window && fetchInput instanceof _window.Request) {\n url = fetchInput.url;\n if (fetchInput.method) {\n method = fetchInput.method;\n }\n } else {\n url = '' + fetchInput;\n }\n\n // if Sentry key appears in URL, don't capture, as it's our own request\n if (url.indexOf(self._globalKey) !== -1) {\n return origFetch.apply(this, args);\n }\n\n if (args[1] && args[1].method) {\n method = args[1].method;\n }\n\n var fetchData = {\n method: method,\n url: url,\n status_code: null\n };\n\n return origFetch\n .apply(this, args)\n .then(function(response) {\n fetchData.status_code = response.status;\n\n self.captureBreadcrumb({\n type: 'http',\n category: 'fetch',\n data: fetchData\n });\n\n return response;\n })\n ['catch'](function(err) {\n // if there is an error performing the request\n self.captureBreadcrumb({\n type: 'http',\n category: 'fetch',\n data: fetchData,\n level: 'error'\n });\n\n throw err;\n });\n };\n },\n wrappedBuiltIns\n );\n }\n\n // Capture breadcrumbs from any click that is unhandled / bubbled up all the way\n // to the document. Do this before we instrument addEventListener.\n if (autoBreadcrumbs.dom && this._hasDocument) {\n if (_document.addEventListener) {\n _document.addEventListener('click', self._breadcrumbEventHandler('click'), false);\n _document.addEventListener('keypress', self._keypressEventHandler(), false);\n } else if (_document.attachEvent) {\n // IE8 Compatibility\n _document.attachEvent('onclick', self._breadcrumbEventHandler('click'));\n _document.attachEvent('onkeypress', self._keypressEventHandler());\n }\n }\n\n // record navigation (URL) changes\n // NOTE: in Chrome App environment, touching history.pushState, *even inside\n // a try/catch block*, will cause Chrome to output an error to console.error\n // borrowed from: https://github.com/angular/angular.js/pull/13945/files\n var chrome = _window.chrome;\n var isChromePackagedApp = chrome && chrome.app && chrome.app.runtime;\n var hasPushAndReplaceState =\n !isChromePackagedApp &&\n _window.history &&\n _window.history.pushState &&\n _window.history.replaceState;\n if (autoBreadcrumbs.location && hasPushAndReplaceState) {\n // TODO: remove onpopstate handler on uninstall()\n var oldOnPopState = _window.onpopstate;\n _window.onpopstate = function() {\n var currentHref = self._location.href;\n self._captureUrlChange(self._lastHref, currentHref);\n\n if (oldOnPopState) {\n return oldOnPopState.apply(this, arguments);\n }\n };\n\n var historyReplacementFunction = function(origHistFunction) {\n // note history.pushState.length is 0; intentionally not declaring\n // params to preserve 0 arity\n return function(/* state, title, url */) {\n var url = arguments.length > 2 ? arguments[2] : undefined;\n\n // url argument is optional\n if (url) {\n // coerce to string (this is what pushState does)\n self._captureUrlChange(self._lastHref, url + '');\n }\n\n return origHistFunction.apply(this, arguments);\n };\n };\n\n fill(_window.history, 'pushState', historyReplacementFunction, wrappedBuiltIns);\n fill(_window.history, 'replaceState', historyReplacementFunction, wrappedBuiltIns);\n }\n\n if (autoBreadcrumbs.console && 'console' in _window && console.log) {\n // console\n var consoleMethodCallback = function(msg, data) {\n self.captureBreadcrumb({\n message: msg,\n level: data.level,\n category: 'console'\n });\n };\n\n each(['debug', 'info', 'warn', 'error', 'log'], function(_, level) {\n wrapConsoleMethod(console, level, consoleMethodCallback);\n });\n }\n },\n\n _restoreBuiltIns: function() {\n // restore any wrapped builtins\n var builtin;\n while (this._wrappedBuiltIns.length) {\n builtin = this._wrappedBuiltIns.shift();\n\n var obj = builtin[0],\n name = builtin[1],\n orig = builtin[2];\n\n obj[name] = orig;\n }\n },\n\n _restoreConsole: function() {\n // eslint-disable-next-line guard-for-in\n for (var method in this._originalConsoleMethods) {\n this._originalConsole[method] = this._originalConsoleMethods[method];\n }\n },\n\n _drainPlugins: function() {\n var self = this;\n\n // FIX ME TODO\n each(this._plugins, function(_, plugin) {\n var installer = plugin[0];\n var args = plugin[1];\n installer.apply(self, [self].concat(args));\n });\n },\n\n _parseDSN: function(str) {\n var m = dsnPattern.exec(str),\n dsn = {},\n i = 7;\n\n try {\n while (i--) dsn[dsnKeys[i]] = m[i] || '';\n } catch (e) {\n throw new RavenConfigError('Invalid DSN: ' + str);\n }\n\n if (dsn.pass && !this._globalOptions.allowSecretKey) {\n throw new RavenConfigError(\n 'Do not specify your secret key in the DSN. See: http://bit.ly/raven-secret-key'\n );\n }\n\n return dsn;\n },\n\n _getGlobalServer: function(uri) {\n // assemble the endpoint from the uri pieces\n var globalServer = '//' + uri.host + (uri.port ? ':' + uri.port : '');\n\n if (uri.protocol) {\n globalServer = uri.protocol + ':' + globalServer;\n }\n return globalServer;\n },\n\n _handleOnErrorStackInfo: function(stackInfo, options) {\n options = options || {};\n options.mechanism = options.mechanism || {\n type: 'onerror',\n handled: false\n };\n\n // if we are intentionally ignoring errors via onerror, bail out\n if (!this._ignoreOnError) {\n this._handleStackInfo(stackInfo, options);\n }\n },\n\n _handleStackInfo: function(stackInfo, options) {\n var frames = this._prepareFrames(stackInfo, options);\n\n this._triggerEvent('handle', {\n stackInfo: stackInfo,\n options: options\n });\n\n this._processException(\n stackInfo.name,\n stackInfo.message,\n stackInfo.url,\n stackInfo.lineno,\n frames,\n options\n );\n },\n\n _prepareFrames: function(stackInfo, options) {\n var self = this;\n var frames = [];\n if (stackInfo.stack && stackInfo.stack.length) {\n each(stackInfo.stack, function(i, stack) {\n var frame = self._normalizeFrame(stack, stackInfo.url);\n if (frame) {\n frames.push(frame);\n }\n });\n\n // e.g. frames captured via captureMessage throw\n if (options && options.trimHeadFrames) {\n for (var j = 0; j < options.trimHeadFrames && j < frames.length; j++) {\n frames[j].in_app = false;\n }\n }\n }\n frames = frames.slice(0, this._globalOptions.stackTraceLimit);\n return frames;\n },\n\n _normalizeFrame: function(frame, stackInfoUrl) {\n // normalize the frames data\n var normalized = {\n filename: frame.url,\n lineno: frame.line,\n colno: frame.column,\n function: frame.func || '?'\n };\n\n // Case when we don't have any information about the error\n // E.g. throwing a string or raw object, instead of an `Error` in Firefox\n // Generating synthetic error doesn't add any value here\n //\n // We should probably somehow let a user know that they should fix their code\n if (!frame.url) {\n normalized.filename = stackInfoUrl; // fallback to whole stacks url from onerror handler\n }\n\n normalized.in_app = !// determine if an exception came from outside of our app\n // first we check the global includePaths list.\n (\n (!!this._globalOptions.includePaths.test &&\n !this._globalOptions.includePaths.test(normalized.filename)) ||\n // Now we check for fun, if the function name is Raven or TraceKit\n /(Raven|TraceKit)\\./.test(normalized['function']) ||\n // finally, we do a last ditch effort and check for raven.min.js\n /raven\\.(min\\.)?js$/.test(normalized.filename)\n );\n\n return normalized;\n },\n\n _processException: function(type, message, fileurl, lineno, frames, options) {\n var prefixedMessage = (type ? type + ': ' : '') + (message || '');\n if (\n !!this._globalOptions.ignoreErrors.test &&\n (this._globalOptions.ignoreErrors.test(message) ||\n this._globalOptions.ignoreErrors.test(prefixedMessage))\n ) {\n return;\n }\n\n var stacktrace;\n\n if (frames && frames.length) {\n fileurl = frames[0].filename || fileurl;\n // Sentry expects frames oldest to newest\n // and JS sends them as newest to oldest\n frames.reverse();\n stacktrace = {frames: frames};\n } else if (fileurl) {\n stacktrace = {\n frames: [\n {\n filename: fileurl,\n lineno: lineno,\n in_app: true\n }\n ]\n };\n }\n\n if (\n !!this._globalOptions.ignoreUrls.test &&\n this._globalOptions.ignoreUrls.test(fileurl)\n ) {\n return;\n }\n\n if (\n !!this._globalOptions.whitelistUrls.test &&\n !this._globalOptions.whitelistUrls.test(fileurl)\n ) {\n return;\n }\n\n var data = objectMerge(\n {\n // sentry.interfaces.Exception\n exception: {\n values: [\n {\n type: type,\n value: message,\n stacktrace: stacktrace\n }\n ]\n },\n transaction: fileurl\n },\n options\n );\n\n // Move mechanism from options to exception interface\n // We do this, as requiring user to pass `{exception:{mechanism:{ ... }}}` would be\n // too much\n if (!data.exception.mechanism && data.mechanism) {\n data.exception.mechanism = data.mechanism;\n delete data.mechanism;\n }\n\n data.exception.mechanism = objectMerge(\n {\n type: 'generic',\n handled: true\n },\n data.exception.mechanism || {}\n );\n\n // Fire away!\n this._send(data);\n },\n\n _trimPacket: function(data) {\n // For now, we only want to truncate the two different messages\n // but this could/should be expanded to just trim everything\n var max = this._globalOptions.maxMessageLength;\n if (data.message) {\n data.message = truncate(data.message, max);\n }\n if (data.exception) {\n var exception = data.exception.values[0];\n exception.value = truncate(exception.value, max);\n }\n\n var request = data.request;\n if (request) {\n if (request.url) {\n request.url = truncate(request.url, this._globalOptions.maxUrlLength);\n }\n if (request.Referer) {\n request.Referer = truncate(request.Referer, this._globalOptions.maxUrlLength);\n }\n }\n\n if (data.breadcrumbs && data.breadcrumbs.values)\n this._trimBreadcrumbs(data.breadcrumbs);\n\n return data;\n },\n\n /**\n * Truncate breadcrumb values (right now just URLs)\n */\n _trimBreadcrumbs: function(breadcrumbs) {\n // known breadcrumb properties with urls\n // TODO: also consider arbitrary prop values that start with (https?)?://\n var urlProps = ['to', 'from', 'url'],\n urlProp,\n crumb,\n data;\n\n for (var i = 0; i < breadcrumbs.values.length; ++i) {\n crumb = breadcrumbs.values[i];\n if (\n !crumb.hasOwnProperty('data') ||\n !isObject(crumb.data) ||\n objectFrozen(crumb.data)\n )\n continue;\n\n data = objectMerge({}, crumb.data);\n for (var j = 0; j < urlProps.length; ++j) {\n urlProp = urlProps[j];\n if (data.hasOwnProperty(urlProp) && data[urlProp]) {\n data[urlProp] = truncate(data[urlProp], this._globalOptions.maxUrlLength);\n }\n }\n breadcrumbs.values[i].data = data;\n }\n },\n\n _getHttpData: function() {\n if (!this._hasNavigator && !this._hasDocument) return;\n var httpData = {};\n\n if (this._hasNavigator && _navigator.userAgent) {\n httpData.headers = {\n 'User-Agent': _navigator.userAgent\n };\n }\n\n // Check in `window` instead of `document`, as we may be in ServiceWorker environment\n if (_window.location && _window.location.href) {\n httpData.url = _window.location.href;\n }\n\n if (this._hasDocument && _document.referrer) {\n if (!httpData.headers) httpData.headers = {};\n httpData.headers.Referer = _document.referrer;\n }\n\n return httpData;\n },\n\n _resetBackoff: function() {\n this._backoffDuration = 0;\n this._backoffStart = null;\n },\n\n _shouldBackoff: function() {\n return this._backoffDuration && now() - this._backoffStart < this._backoffDuration;\n },\n\n /**\n * Returns true if the in-process data payload matches the signature\n * of the previously-sent data\n *\n * NOTE: This has to be done at this level because TraceKit can generate\n * data from window.onerror WITHOUT an exception object (IE8, IE9,\n * other old browsers). This can take the form of an \"exception\"\n * data object with a single frame (derived from the onerror args).\n */\n _isRepeatData: function(current) {\n var last = this._lastData;\n\n if (\n !last ||\n current.message !== last.message || // defined for captureMessage\n current.transaction !== last.transaction // defined for captureException/onerror\n )\n return false;\n\n // Stacktrace interface (i.e. from captureMessage)\n if (current.stacktrace || last.stacktrace) {\n return isSameStacktrace(current.stacktrace, last.stacktrace);\n } else if (current.exception || last.exception) {\n // Exception interface (i.e. from captureException/onerror)\n return isSameException(current.exception, last.exception);\n }\n\n return true;\n },\n\n _setBackoffState: function(request) {\n // If we are already in a backoff state, don't change anything\n if (this._shouldBackoff()) {\n return;\n }\n\n var status = request.status;\n\n // 400 - project_id doesn't exist or some other fatal\n // 401 - invalid/revoked dsn\n // 429 - too many requests\n if (!(status === 400 || status === 401 || status === 429)) return;\n\n var retry;\n try {\n // If Retry-After is not in Access-Control-Expose-Headers, most\n // browsers will throw an exception trying to access it\n if (supportsFetch()) {\n retry = request.headers.get('Retry-After');\n } else {\n retry = request.getResponseHeader('Retry-After');\n }\n\n // Retry-After is returned in seconds\n retry = parseInt(retry, 10) * 1000;\n } catch (e) {\n /* eslint no-empty:0 */\n }\n\n this._backoffDuration = retry\n ? // If Sentry server returned a Retry-After value, use it\n retry\n : // Otherwise, double the last backoff duration (starts at 1 sec)\n this._backoffDuration * 2 || 1000;\n\n this._backoffStart = now();\n },\n\n _send: function(data) {\n var globalOptions = this._globalOptions;\n\n var baseData = {\n project: this._globalProject,\n logger: globalOptions.logger,\n platform: 'javascript'\n },\n httpData = this._getHttpData();\n\n if (httpData) {\n baseData.request = httpData;\n }\n\n // HACK: delete `trimHeadFrames` to prevent from appearing in outbound payload\n if (data.trimHeadFrames) delete data.trimHeadFrames;\n\n data = objectMerge(baseData, data);\n\n // Merge in the tags and extra separately since objectMerge doesn't handle a deep merge\n data.tags = objectMerge(objectMerge({}, this._globalContext.tags), data.tags);\n data.extra = objectMerge(objectMerge({}, this._globalContext.extra), data.extra);\n\n // Send along our own collected metadata with extra\n data.extra['session:duration'] = now() - this._startTime;\n\n if (this._breadcrumbs && this._breadcrumbs.length > 0) {\n // intentionally make shallow copy so that additions\n // to breadcrumbs aren't accidentally sent in this request\n data.breadcrumbs = {\n values: [].slice.call(this._breadcrumbs, 0)\n };\n }\n\n if (this._globalContext.user) {\n // sentry.interfaces.User\n data.user = this._globalContext.user;\n }\n\n // Include the environment if it's defined in globalOptions\n if (globalOptions.environment) data.environment = globalOptions.environment;\n\n // Include the release if it's defined in globalOptions\n if (globalOptions.release) data.release = globalOptions.release;\n\n // Include server_name if it's defined in globalOptions\n if (globalOptions.serverName) data.server_name = globalOptions.serverName;\n\n data = this._sanitizeData(data);\n\n // Cleanup empty properties before sending them to the server\n Object.keys(data).forEach(function(key) {\n if (data[key] == null || data[key] === '' || isEmptyObject(data[key])) {\n delete data[key];\n }\n });\n\n if (isFunction(globalOptions.dataCallback)) {\n data = globalOptions.dataCallback(data) || data;\n }\n\n // Why??????????\n if (!data || isEmptyObject(data)) {\n return;\n }\n\n // Check if the request should be filtered or not\n if (\n isFunction(globalOptions.shouldSendCallback) &&\n !globalOptions.shouldSendCallback(data)\n ) {\n return;\n }\n\n // Backoff state: Sentry server previously responded w/ an error (e.g. 429 - too many requests),\n // so drop requests until \"cool-off\" period has elapsed.\n if (this._shouldBackoff()) {\n this._logDebug('warn', 'Raven dropped error due to backoff: ', data);\n return;\n }\n\n if (typeof globalOptions.sampleRate === 'number') {\n if (Math.random() < globalOptions.sampleRate) {\n this._sendProcessedPayload(data);\n }\n } else {\n this._sendProcessedPayload(data);\n }\n },\n\n _sanitizeData: function(data) {\n return sanitize(data, this._globalOptions.sanitizeKeys);\n },\n\n _getUuid: function() {\n return uuid4();\n },\n\n _sendProcessedPayload: function(data, callback) {\n var self = this;\n var globalOptions = this._globalOptions;\n\n if (!this.isSetup()) return;\n\n // Try and clean up the packet before sending by truncating long values\n data = this._trimPacket(data);\n\n // ideally duplicate error testing should occur *before* dataCallback/shouldSendCallback,\n // but this would require copying an un-truncated copy of the data packet, which can be\n // arbitrarily deep (extra_data) -- could be worthwhile? will revisit\n if (!this._globalOptions.allowDuplicates && this._isRepeatData(data)) {\n this._logDebug('warn', 'Raven dropped repeat event: ', data);\n return;\n }\n\n // Send along an event_id if not explicitly passed.\n // This event_id can be used to reference the error within Sentry itself.\n // Set lastEventId after we know the error should actually be sent\n this._lastEventId = data.event_id || (data.event_id = this._getUuid());\n\n // Store outbound payload after trim\n this._lastData = data;\n\n this._logDebug('debug', 'Raven about to send:', data);\n\n var auth = {\n sentry_version: '7',\n sentry_client: 'raven-js/' + this.VERSION,\n sentry_key: this._globalKey\n };\n\n if (this._globalSecret) {\n auth.sentry_secret = this._globalSecret;\n }\n\n var exception = data.exception && data.exception.values[0];\n\n // only capture 'sentry' breadcrumb is autoBreadcrumbs is truthy\n if (\n this._globalOptions.autoBreadcrumbs &&\n this._globalOptions.autoBreadcrumbs.sentry\n ) {\n this.captureBreadcrumb({\n category: 'sentry',\n message: exception\n ? (exception.type ? exception.type + ': ' : '') + exception.value\n : data.message,\n event_id: data.event_id,\n level: data.level || 'error' // presume error unless specified\n });\n }\n\n var url = this._globalEndpoint;\n (globalOptions.transport || this._makeRequest).call(this, {\n url: url,\n auth: auth,\n data: data,\n options: globalOptions,\n onSuccess: function success() {\n self._resetBackoff();\n\n self._triggerEvent('success', {\n data: data,\n src: url\n });\n callback && callback();\n },\n onError: function failure(error) {\n self._logDebug('error', 'Raven transport failed to send: ', error);\n\n if (error.request) {\n self._setBackoffState(error.request);\n }\n\n self._triggerEvent('failure', {\n data: data,\n src: url\n });\n error = error || new Error('Raven send failed (no additional details provided)');\n callback && callback(error);\n }\n });\n },\n\n _makeRequest: function(opts) {\n // Auth is intentionally sent as part of query string (NOT as custom HTTP header) to avoid preflight CORS requests\n var url = opts.url + '?' + urlencode(opts.auth);\n\n var evaluatedHeaders = null;\n var evaluatedFetchParameters = {};\n\n if (opts.options.headers) {\n evaluatedHeaders = this._evaluateHash(opts.options.headers);\n }\n\n if (opts.options.fetchParameters) {\n evaluatedFetchParameters = this._evaluateHash(opts.options.fetchParameters);\n }\n\n if (supportsFetch()) {\n evaluatedFetchParameters.body = stringify(opts.data);\n\n var defaultFetchOptions = objectMerge({}, this._fetchDefaults);\n var fetchOptions = objectMerge(defaultFetchOptions, evaluatedFetchParameters);\n\n if (evaluatedHeaders) {\n fetchOptions.headers = evaluatedHeaders;\n }\n\n return _window\n .fetch(url, fetchOptions)\n .then(function(response) {\n if (response.ok) {\n opts.onSuccess && opts.onSuccess();\n } else {\n var error = new Error('Sentry error code: ' + response.status);\n // It's called request only to keep compatibility with XHR interface\n // and not add more redundant checks in setBackoffState method\n error.request = response;\n opts.onError && opts.onError(error);\n }\n })\n ['catch'](function() {\n opts.onError &&\n opts.onError(new Error('Sentry error code: network unavailable'));\n });\n }\n\n var request = _window.XMLHttpRequest && new _window.XMLHttpRequest();\n if (!request) return;\n\n // if browser doesn't support CORS (e.g. IE7), we are out of luck\n var hasCORS = 'withCredentials' in request || typeof XDomainRequest !== 'undefined';\n\n if (!hasCORS) return;\n\n if ('withCredentials' in request) {\n request.onreadystatechange = function() {\n if (request.readyState !== 4) {\n return;\n } else if (request.status === 200) {\n opts.onSuccess && opts.onSuccess();\n } else if (opts.onError) {\n var err = new Error('Sentry error code: ' + request.status);\n err.request = request;\n opts.onError(err);\n }\n };\n } else {\n request = new XDomainRequest();\n // xdomainrequest cannot go http -> https (or vice versa),\n // so always use protocol relative\n url = url.replace(/^https?:/, '');\n\n // onreadystatechange not supported by XDomainRequest\n if (opts.onSuccess) {\n request.onload = opts.onSuccess;\n }\n if (opts.onError) {\n request.onerror = function() {\n var err = new Error('Sentry error code: XDomainRequest');\n err.request = request;\n opts.onError(err);\n };\n }\n }\n\n request.open('POST', url);\n\n if (evaluatedHeaders) {\n each(evaluatedHeaders, function(key, value) {\n request.setRequestHeader(key, value);\n });\n }\n\n request.send(stringify(opts.data));\n },\n\n _evaluateHash: function(hash) {\n var evaluated = {};\n\n for (var key in hash) {\n if (hash.hasOwnProperty(key)) {\n var value = hash[key];\n evaluated[key] = typeof value === 'function' ? value() : value;\n }\n }\n\n return evaluated;\n },\n\n _logDebug: function(level) {\n // We allow `Raven.debug` and `Raven.config(DSN, { debug: true })` to not make backward incompatible API change\n if (\n this._originalConsoleMethods[level] &&\n (this.debug || this._globalOptions.debug)\n ) {\n // In IE<10 console methods do not have their own 'apply' method\n Function.prototype.apply.call(\n this._originalConsoleMethods[level],\n this._originalConsole,\n [].slice.call(arguments, 1)\n );\n }\n },\n\n _mergeContext: function(key, context) {\n if (isUndefined(context)) {\n delete this._globalContext[key];\n } else {\n this._globalContext[key] = objectMerge(this._globalContext[key] || {}, context);\n }\n }\n};\n\n// Deprecations\nRaven.prototype.setUser = Raven.prototype.setUserContext;\nRaven.prototype.setReleaseContext = Raven.prototype.setRelease;\n\nmodule.exports = Raven;\n","/**\n * Enforces a single instance of the Raven client, and the\n * main entry point for Raven. If you are a consumer of the\n * Raven library, you SHOULD load this file (vs raven.js).\n **/\n\nvar RavenConstructor = require('./raven');\n\n// This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785)\nvar _window =\n typeof window !== 'undefined'\n ? window\n : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\nvar _Raven = _window.Raven;\n\nvar Raven = new RavenConstructor();\n\n/*\n * Allow multiple versions of Raven to be installed.\n * Strip Raven from the global context and returns the instance.\n *\n * @return {Raven}\n */\nRaven.noConflict = function() {\n _window.Raven = _Raven;\n return Raven;\n};\n\nRaven.afterLoad();\n\nmodule.exports = Raven;\n\n/**\n * DISCLAIMER:\n *\n * Expose `Client` constructor for cases where user want to track multiple \"sub-applications\" in one larger app.\n * It's not meant to be used by a wide audience, so pleaaase make sure that you know what you're doing before using it.\n * Accidentally calling `install` multiple times, may result in an unexpected behavior that's very hard to debug.\n *\n * It's called `Client' to be in-line with Raven Node implementation.\n *\n * HOWTO:\n *\n * import Raven from 'raven-js';\n *\n * const someAppReporter = new Raven.Client();\n * const someOtherAppReporter = new Raven.Client();\n *\n * someAppReporter.config('__DSN__', {\n * ...config goes here\n * });\n *\n * someOtherAppReporter.config('__OTHER_DSN__', {\n * ...config goes here\n * });\n *\n * someAppReporter.captureMessage(...);\n * someAppReporter.captureException(...);\n * someAppReporter.captureBreadcrumb(...);\n *\n * someOtherAppReporter.captureMessage(...);\n * someOtherAppReporter.captureException(...);\n * someOtherAppReporter.captureBreadcrumb(...);\n *\n * It should \"just work\".\n */\nmodule.exports.Client = RavenConstructor;\n","// ==========================================================================\n// Plyr.io demo\n// This code is purely for the https://plyr.io website\n// Please see readme.md in the root or github.com/sampotts/plyr\n// ==========================================================================\n\nimport Raven from 'raven-js';\n\n(() => {\n const isLive = window.location.host === 'plyr.io';\n\n // Raven / Sentry\n // For demo site (https://plyr.io) only\n if (isLive) {\n Raven.config('https://d4ad9866ad834437a4754e23937071e4@sentry.io/305555').install();\n }\n\n document.addEventListener('DOMContentLoaded', () => {\n Raven.context(() => {\n if (window.shr) {\n window.shr.setup({\n count: {\n classname: 'button__count',\n },\n });\n }\n\n // Setup tab focus\n const tabClassName = 'tab-focus';\n\n // Remove class on blur\n document.addEventListener('focusout', event => {\n event.target.classList.remove(tabClassName);\n });\n\n // Add classname to tabbed elements\n document.addEventListener('keydown', event => {\n if (event.keyCode !== 9) {\n return;\n }\n\n // Delay the adding of classname until the focus has changed\n // This event fires before the focusin event\n setTimeout(() => {\n document.activeElement.classList.add(tabClassName);\n }, 0);\n });\n\n // Setup the player\n const player = new Plyr('#player', {\n debug: true,\n title: 'View From A Blue Moon',\n iconUrl: '../dist/plyr.svg',\n keyboard: {\n global: true,\n },\n tooltips: {\n controls: true,\n },\n /* controls: [\n 'play-large',\n 'restart',\n 'rewind',\n 'play',\n 'fast-forward',\n 'progress',\n 'current-time',\n 'duration',\n 'mute',\n 'volume',\n 'captions',\n 'settings',\n 'pip',\n 'airplay',\n 'fullscreen',\n ], */\n /* i18n: {\n restart: '重新開始',\n rewind: '快退{seektime}秒',\n play: '播放',\n pause: '暫停',\n fastForward: '快進{seektime}秒',\n seek: '尋求',\n played: '發揮',\n buffered: '緩衝的',\n currentTime: '當前時間戳',\n duration: '長短',\n volume: '音量',\n mute: '靜音',\n unmute: '取消靜音',\n enableCaptions: '開啟字幕',\n disableCaptions: '關閉字幕',\n enterFullscreen: '進入全螢幕',\n exitFullscreen: '退出全螢幕',\n frameTitle: '球員為{title}',\n captions: '字幕',\n settings: '設定',\n speed: '速度',\n normal: '正常',\n quality: '質量',\n loop: '循環',\n start: 'Start',\n end: 'End',\n all: 'All',\n reset: '重啟',\n disabled: '殘',\n enabled: '啟用',\n advertisement: '廣告',\n }, */\n captions: {\n active: true,\n },\n keys: {\n google: 'AIzaSyDrNwtN3nLH_8rjCmu5Wq3ZCm4MNAVdc0c',\n },\n ads: {\n enabled: true,\n publisherId: '918848828995742',\n },\n });\n\n // Expose for tinkering in the console\n window.player = player;\n\n // Setup type toggle\n const buttons = document.querySelectorAll('[data-source]');\n const types = {\n video: 'video',\n audio: 'audio',\n youtube: 'youtube',\n vimeo: 'vimeo',\n };\n let currentType = window.location.hash.replace('#', '');\n const historySupport = window.history && window.history.pushState;\n\n // Toggle class on an element\n function toggleClass(element, className, state) {\n if (element) {\n element.classList[state ? 'add' : 'remove'](className);\n }\n }\n\n // Set a new source\n function newSource(type, init) {\n // Bail if new type isn't known, it's the current type, or current type is empty (video is default) and new type is video\n if (!(type in types) || (!init && type === currentType) || (!currentType.length && type === types.video)) {\n return;\n }\n\n switch (type) {\n case types.video:\n player.source = {\n type: 'video',\n title: 'View From A Blue Moon',\n sources: [\n {\n src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-576p.mp4',\n type: 'video/mp4',\n size: 576,\n },\n {\n src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-720p.mp4',\n type: 'video/mp4',\n size: 720,\n },\n {\n src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-1080p.mp4',\n type: 'video/mp4',\n size: 1080,\n },\n {\n src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-1440p.mp4',\n type: 'video/mp4',\n size: 1440,\n },\n ],\n poster: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg',\n tracks: [\n {\n kind: 'captions',\n label: 'English',\n srclang: 'en',\n src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt',\n default: true,\n },\n {\n kind: 'captions',\n label: 'French',\n srclang: 'fr',\n src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt',\n },\n ],\n };\n\n break;\n\n case types.audio:\n player.source = {\n type: 'audio',\n title: 'Kishi Bashi &ndash; &ldquo;It All Began With A Burst&rdquo;',\n sources: [\n {\n src: 'https://cdn.plyr.io/static/demo/Kishi_Bashi_-_It_All_Began_With_a_Burst.mp3',\n type: 'audio/mp3',\n },\n {\n src: 'https://cdn.plyr.io/static/demo/Kishi_Bashi_-_It_All_Began_With_a_Burst.ogg',\n type: 'audio/ogg',\n },\n ],\n };\n\n break;\n\n case types.youtube:\n player.source = {\n type: 'video',\n sources: [{\n src: 'https://youtube.com/watch?v=bTqVqk7FSmY',\n provider: 'youtube',\n }],\n };\n\n break;\n\n case types.vimeo:\n player.source = {\n type: 'video',\n sources: [{\n src: 'https://vimeo.com/76979871',\n provider: 'vimeo',\n }],\n };\n\n break;\n\n default:\n break;\n }\n\n // Set the current type for next time\n currentType = type;\n\n // Remove active classes\n Array.from(buttons).forEach(button => toggleClass(button.parentElement, 'active', false));\n\n // Set active on parent\n toggleClass(document.querySelector(`[data-source=\"${type}\"]`), 'active', true);\n\n // Show cite\n Array.from(document.querySelectorAll('.plyr__cite')).forEach(cite => {\n cite.setAttribute('hidden', '');\n });\n document.querySelector(`.plyr__cite--${type}`).removeAttribute('hidden');\n }\n\n // Bind to each button\n Array.from(buttons).forEach(button => {\n button.addEventListener('click', () => {\n const type = button.getAttribute('data-source');\n\n newSource(type);\n\n if (historySupport) {\n window.history.pushState({ type }, '', `#${type}`);\n }\n });\n });\n\n // List for backwards/forwards\n window.addEventListener('popstate', event => {\n if (event.state && 'type' in event.state) {\n newSource(event.state.type);\n }\n });\n\n // On load\n if (historySupport) {\n const video = !currentType.length;\n\n // If there's no current type set, assume video\n if (video) {\n currentType = types.video;\n }\n\n // Replace current history state\n if (currentType in types) {\n window.history.replaceState(\n {\n type: currentType,\n },\n '',\n video ? '' : `#${currentType}`,\n );\n }\n\n // If it's not video, load the source\n if (currentType !== types.video) {\n newSource(currentType, true);\n }\n }\n });\n });\n\n // Google analytics\n // For demo site (https://plyr.io) only\n /* eslint-disable */\n if (isLive) {\n (function(i, s, o, g, r, a, m) {\n i.GoogleAnalyticsObject = r;\n i[r] =\n i[r] ||\n function() {\n (i[r].q = i[r].q || []).push(arguments);\n };\n i[r].l = 1 * new Date();\n a = s.createElement(o);\n m = s.getElementsByTagName(o)[0];\n a.async = 1;\n a.src = g;\n m.parentNode.insertBefore(a, m);\n })(window, document, 'script', 'https://www.google-analytics.com/analytics.js', 'ga');\n window.ga('create', 'UA-40881672-11', 'auto');\n window.ga('send', 'pageview');\n }\n /* eslint-enable */\n})();\n"]} \ No newline at end of file
diff --git a/dist/plyr.js b/dist/plyr.js
index 14939c62..62b32344 100644
--- a/dist/plyr.js
+++ b/dist/plyr.js
@@ -1,713 +1,317 @@
typeof navigator === "object" && (function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define('Plyr', factory) :
- (global.Plyr = factory());
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+ typeof define === 'function' && define.amd ? define('Plyr', factory) :
+ (global.Plyr = factory());
}(this, (function () { 'use strict';
-var commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
-
-function createCommonjsModule(fn, module) {
- return module = { exports: {} }, fn(module, module.exports), module.exports;
-}
-
-var loadjs_umd = createCommonjsModule(function (module, exports) {
-(function(root, factory) {
- if (typeof undefined === 'function' && undefined.amd) {
- undefined([], factory);
- } else {
- module.exports = factory();
- }
-}(commonjsGlobal, function() {
-/**
- * Global dependencies.
- * @global {Object} document - DOM
- */
-
-var devnull = function() {},
- bundleIdCache = {},
- bundleResultCache = {},
- bundleCallbackQueue = {};
-
-
-/**
- * Subscribe to bundle load event.
- * @param {string[]} bundleIds - Bundle ids
- * @param {Function} callbackFn - The callback function
- */
-function subscribe(bundleIds, callbackFn) {
- // listify
- bundleIds = bundleIds.push ? bundleIds : [bundleIds];
-
- var depsNotFound = [],
- i = bundleIds.length,
- numWaiting = i,
- fn,
- bundleId,
- r,
- q;
-
- // define callback function
- fn = function (bundleId, pathsNotFound) {
- if (pathsNotFound.length) depsNotFound.push(bundleId);
-
- numWaiting--;
- if (!numWaiting) callbackFn(depsNotFound);
- };
-
- // register callback
- while (i--) {
- bundleId = bundleIds[i];
-
- // execute callback if in result cache
- r = bundleResultCache[bundleId];
- if (r) {
- fn(bundleId, r);
- continue;
- }
-
- // add to callback queue
- q = bundleCallbackQueue[bundleId] = bundleCallbackQueue[bundleId] || [];
- q.push(fn);
- }
-}
-
-
-/**
- * Publish bundle load event.
- * @param {string} bundleId - Bundle id
- * @param {string[]} pathsNotFound - List of files not found
- */
-function publish(bundleId, pathsNotFound) {
- // exit if id isn't defined
- if (!bundleId) return;
-
- var q = bundleCallbackQueue[bundleId];
-
- // cache result
- bundleResultCache[bundleId] = pathsNotFound;
-
- // exit if queue is empty
- if (!q) return;
-
- // empty callback queue
- while (q.length) {
- q[0](bundleId, pathsNotFound);
- q.splice(0, 1);
- }
-}
-
-
-/**
- * Execute callbacks.
- * @param {Object or Function} args - The callback args
- * @param {string[]} depsNotFound - List of dependencies not found
- */
-function executeCallbacks(args, depsNotFound) {
- // accept function as argument
- if (args.call) args = {success: args};
-
- // success and error callbacks
- if (depsNotFound.length) (args.error || devnull)(depsNotFound);
- else (args.success || devnull)(args);
-}
-
-
-/**
- * Load individual file.
- * @param {string} path - The file path
- * @param {Function} callbackFn - The callback function
- */
-function loadFile(path, callbackFn, args, numTries) {
- var doc = document,
- async = args.async,
- maxTries = (args.numRetries || 0) + 1,
- beforeCallbackFn = args.before || devnull,
- pathStripped = path.replace(/^(css|img)!/, ''),
- isCss,
- e;
-
- numTries = numTries || 0;
-
- if (/(^css!|\.css$)/.test(path)) {
- isCss = true;
-
- // css
- e = doc.createElement('link');
- e.rel = 'stylesheet';
- e.href = pathStripped; //.replace(/^css!/, ''); // remove "css!" prefix
- } else if (/(^img!|\.(png|gif|jpg|svg)$)/.test(path)) {
- // image
- e = doc.createElement('img');
- e.src = pathStripped;
- } else {
- // javascript
- e = doc.createElement('script');
- e.src = path;
- e.async = async === undefined ? true : async;
- }
-
- e.onload = e.onerror = e.onbeforeload = function (ev) {
- var result = ev.type[0];
-
- // Note: The following code isolates IE using `hideFocus` and treats empty
- // stylesheets as failures to get around lack of onerror support
- if (isCss && 'hideFocus' in e) {
- try {
- if (!e.sheet.cssText.length) result = 'e';
- } catch (x) {
- // sheets objects created from load errors don't allow access to
- // `cssText`
- result = 'e';
- }
- }
-
- // handle retries in case of load failure
- if (result == 'e') {
- // increment counter
- numTries += 1;
-
- // exit function and try again
- if (numTries < maxTries) {
- return loadFile(path, callbackFn, args, numTries);
- }
- }
-
- // execute callback
- callbackFn(path, result, ev.defaultPrevented);
- };
-
- // add to document (unless callback returns `false`)
- if (beforeCallbackFn(path, e) !== false) doc.head.appendChild(e);
-}
-
-
-/**
- * Load multiple files.
- * @param {string[]} paths - The file paths
- * @param {Function} callbackFn - The callback function
- */
-function loadFiles(paths, callbackFn, args) {
- // listify paths
- paths = paths.push ? paths : [paths];
-
- var numWaiting = paths.length,
- x = numWaiting,
- pathsNotFound = [],
- fn,
- i;
-
- // define callback function
- fn = function(path, result, defaultPrevented) {
- // handle error
- if (result == 'e') pathsNotFound.push(path);
-
- // handle beforeload event. If defaultPrevented then that means the load
- // will be blocked (ex. Ghostery/ABP on Safari)
- if (result == 'b') {
- if (defaultPrevented) pathsNotFound.push(path);
- else return;
- }
-
- numWaiting--;
- if (!numWaiting) callbackFn(pathsNotFound);
- };
-
- // load scripts
- for (i=0; i < x; i++) loadFile(paths[i], fn, args);
-}
-
-
-/**
- * Initiate script load and register bundle.
- * @param {(string|string[])} paths - The file paths
- * @param {(string|Function)} [arg1] - The bundleId or success callback
- * @param {Function} [arg2] - The success or error callback
- * @param {Function} [arg3] - The error callback
- */
-function loadjs(paths, arg1, arg2) {
- var bundleId,
- args;
-
- // bundleId (if string)
- if (arg1 && arg1.trim) bundleId = arg1;
-
- // args (default is {})
- args = (bundleId ? arg2 : arg1) || {};
-
- // throw error if bundle is already defined
- if (bundleId) {
- if (bundleId in bundleIdCache) {
- throw "LoadJS";
- } else {
- bundleIdCache[bundleId] = true;
- }
- }
-
- // load scripts
- loadFiles(paths, function (pathsNotFound) {
- // execute callbacks
- executeCallbacks(args, pathsNotFound);
-
- // publish bundle load event
- publish(bundleId, pathsNotFound);
- }, args);
-}
-
-
-/**
- * Execute callbacks when dependencies have been satisfied.
- * @param {(string|string[])} deps - List of bundle ids
- * @param {Object} args - success/error arguments
- */
-loadjs.ready = function ready(deps, args) {
- // subscribe to bundle load event
- subscribe(deps, function (depsNotFound) {
- // execute callbacks
- executeCallbacks(args, depsNotFound);
- });
-
- return loadjs;
-};
-
-
-/**
- * Manually satisfy bundle dependencies.
- * @param {string} bundleId - The bundle id
- */
-loadjs.done = function done(bundleId) {
- publish(bundleId, []);
-};
-
-
-/**
- * Reset loadjs dependencies statuses
- */
-loadjs.reset = function reset() {
- bundleIdCache = {};
- bundleResultCache = {};
- bundleCallbackQueue = {};
-};
-
-
-/**
- * Determine if bundle has already been defined
- * @param String} bundleId - The bundle id
- */
-loadjs.isDefined = function isDefined(bundleId) {
- return bundleId in bundleIdCache;
-};
-
-
-// export
-return loadjs;
-
-}));
-});
-
-var classCallCheck = function (instance, Constructor) {
- if (!(instance instanceof Constructor)) {
- throw new TypeError("Cannot call a class as a function");
- }
-};
-
-var 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;
- };
-}();
-
-var defineProperty = function (obj, key, value) {
- if (key in obj) {
- Object.defineProperty(obj, key, {
- value: value,
- enumerable: true,
- configurable: true,
- writable: true
- });
- } else {
- obj[key] = value;
- }
-
- return obj;
-};
-
-var slicedToArray = function () {
- function sliceIterator(arr, i) {
- var _arr = [];
- var _n = true;
- var _d = false;
- var _e = undefined;
-
- try {
- for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {
- _arr.push(_s.value);
-
- if (i && _arr.length === i) break;
- }
- } catch (err) {
- _d = true;
- _e = err;
- } finally {
- try {
- if (!_n && _i["return"]) _i["return"]();
- } finally {
- if (_d) throw _e;
- }
- }
-
- return _arr;
- }
-
- return function (arr, i) {
- if (Array.isArray(arr)) {
- return arr;
- } else if (Symbol.iterator in Object(arr)) {
- return sliceIterator(arr, i);
- } else {
- throw new TypeError("Invalid attempt to destructure non-iterable instance");
- }
- };
-}();
+ // ==========================================================================
+ // Type checking utils
+ // ==========================================================================
-var toConsumableArray = function (arr) {
- if (Array.isArray(arr)) {
- for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];
+ var getConstructor = function getConstructor(input) {
+ return input !== null && typeof input !== 'undefined' ? input.constructor : null;
+ };
- return arr2;
- } else {
- return Array.from(arr);
- }
-};
+ var instanceOf = function instanceOf(input, constructor) {
+ return Boolean(input && constructor && input instanceof constructor);
+ };
-// ==========================================================================
-
-var Storage = function () {
- function Storage(player) {
- classCallCheck(this, Storage);
-
- this.enabled = player.config.storage.enabled;
- this.key = player.config.storage.key;
- }
-
- // Check for actual support (see if we can use it)
-
-
- createClass(Storage, [{
- key: 'get',
- value: function get$$1(key) {
- if (!Storage.supported || !this.enabled) {
- return null;
- }
-
- var store = window.localStorage.getItem(this.key);
-
- if (utils.is.empty(store)) {
- return null;
- }
-
- var json = JSON.parse(store);
-
- return utils.is.string(key) && key.length ? json[key] : json;
- }
- }, {
- key: 'set',
- value: function set$$1(object) {
- // Bail if we don't have localStorage support or it's disabled
- if (!Storage.supported || !this.enabled) {
- return;
- }
-
- // Can only store objectst
- if (!utils.is.object(object)) {
- return;
- }
-
- // Get current storage
- var storage = this.get();
-
- // Default to empty object
- if (utils.is.empty(storage)) {
- storage = {};
- }
-
- // Update the working copy of the values
- utils.extend(storage, object);
-
- // Update storage
- window.localStorage.setItem(this.key, JSON.stringify(storage));
- }
- }], [{
- key: 'supported',
- get: function get$$1() {
- try {
- if (!('localStorage' in window)) {
- return false;
- }
-
- var test = '___test';
-
- // Try to use it (it might be disabled, e.g. user is in private mode)
- // see: https://github.com/sampotts/plyr/issues/131
- window.localStorage.setItem(test, test);
- window.localStorage.removeItem(test);
-
- return true;
- } catch (e) {
- return false;
- }
- }
- }]);
- return Storage;
-}();
-
-// ==========================================================================
-// Plyr supported types and providers
-// ==========================================================================
-
-var providers = {
- html5: 'html5',
- youtube: 'youtube',
- vimeo: 'vimeo'
-};
-
-var types = {
- audio: 'audio',
- video: 'video'
-};
-
-// ==========================================================================
-
-var utils = {
- // Check variable types
- is: {
+ var is = {
object: function object(input) {
- return utils.getConstructor(input) === Object;
+ return getConstructor(input) === Object;
},
number: function number(input) {
- return utils.getConstructor(input) === Number && !Number.isNaN(input);
+ return getConstructor(input) === Number && !Number.isNaN(input);
},
string: function string(input) {
- return utils.getConstructor(input) === String;
+ return getConstructor(input) === String;
},
boolean: function boolean(input) {
- return utils.getConstructor(input) === Boolean;
+ return getConstructor(input) === Boolean;
},
function: function _function(input) {
- return utils.getConstructor(input) === Function;
+ return getConstructor(input) === Function;
},
array: function array(input) {
- return !utils.is.nullOrUndefined(input) && Array.isArray(input);
+ return !is.nullOrUndefined(input) && Array.isArray(input);
},
weakMap: function weakMap(input) {
- return utils.is.instanceof(input, WeakMap);
+ return instanceOf(input, WeakMap);
},
nodeList: function nodeList(input) {
- return utils.is.instanceof(input, NodeList);
+ return instanceOf(input, NodeList);
},
element: function element(input) {
- return utils.is.instanceof(input, Element);
+ return instanceOf(input, Element);
},
textNode: function textNode(input) {
- return utils.getConstructor(input) === Text;
+ return getConstructor(input) === Text;
},
event: function event(input) {
- return utils.is.instanceof(input, Event);
+ return instanceOf(input, Event);
},
cue: function cue(input) {
- return utils.is.instanceof(input, window.TextTrackCue) || utils.is.instanceof(input, window.VTTCue);
+ return instanceOf(input, window.TextTrackCue) || instanceOf(input, window.VTTCue);
},
track: function track(input) {
- return utils.is.instanceof(input, TextTrack) || !utils.is.nullOrUndefined(input) && utils.is.string(input.kind);
+ return instanceOf(input, TextTrack) || !is.nullOrUndefined(input) && is.string(input.kind);
},
url: function url(input) {
- return !utils.is.nullOrUndefined(input) && /(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-/]))?/.test(input);
+ return !is.nullOrUndefined(input) && /(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-/]))?/.test(input);
},
nullOrUndefined: function nullOrUndefined(input) {
return input === null || typeof input === 'undefined';
},
empty: function empty(input) {
- return utils.is.nullOrUndefined(input) || (utils.is.string(input) || utils.is.array(input) || utils.is.nodeList(input)) && !input.length || utils.is.object(input) && !Object.keys(input).length;
- },
- instanceof: function _instanceof$$1(input, constructor) {
- return Boolean(input && constructor && input instanceof constructor);
+ return is.nullOrUndefined(input) || (is.string(input) || is.array(input) || is.nodeList(input)) && !input.length || is.object(input) && !Object.keys(input).length;
}
- },
-
- getConstructor: function getConstructor(input) {
- return !utils.is.nullOrUndefined(input) ? input.constructor : null;
- },
+ };
+ // ==========================================================================
- // Unfortunately, due to mixed support, UA sniffing is required
- getBrowser: function getBrowser() {
- return {
- isIE: /* @cc_on!@ */false || !!document.documentMode,
- isWebkit: 'WebkitAppearance' in document.documentElement.style && !/Edge/.test(navigator.userAgent),
- isIPhone: /(iPhone|iPod)/gi.test(navigator.platform),
- isIos: /(iPad|iPhone|iPod)/gi.test(navigator.platform)
- };
- },
+ // Check for passive event listener support
+ // https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md
+ // https://www.youtube.com/watch?v=NPM6172J22g
+ var supportsPassiveListeners = function () {
+ // Test via a getter in the options object to see if the passive property is accessed
+ var supported = false;
+ try {
+ var options = Object.defineProperty({}, 'passive', {
+ get: function get() {
+ supported = true;
+ return null;
+ }
+ });
+ window.addEventListener('test', null, options);
+ window.removeEventListener('test', null, options);
+ } catch (e) {
+ // Do nothing
+ }
+ return supported;
+ }();
- // Fetch wrapper
- // Using XHR to avoid issues with older browsers
- fetch: function fetch(url) {
- var responseType = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'text';
+ // Toggle event listener
+ function toggleListener(element, event, callback) {
+ var toggle = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
- return new Promise(function (resolve, reject) {
- try {
- var request = new XMLHttpRequest();
+ var _this = this;
- // Check for CORS support
- if (!('withCredentials' in request)) {
- return;
- }
+ var passive = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;
+ var capture = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : false;
- request.addEventListener('load', function () {
- if (responseType === 'text') {
- try {
- resolve(JSON.parse(request.responseText));
- } catch (e) {
- resolve(request.responseText);
- }
- } else {
- resolve(request.response);
- }
- });
+ // Bail if no element, event, or callback
+ if (!element || !('addEventListener' in element) || is.empty(event) || !is.function(callback)) {
+ return;
+ }
- request.addEventListener('error', function () {
- throw new Error(request.statusText);
- });
+ // Allow multiple events
+ var events = event.split(' ');
- request.open('GET', url, true);
+ // Build options
+ // Default to just the capture boolean for browsers with no passive listener support
+ var options = capture;
- // Set the required response type
- request.responseType = responseType;
+ // If passive events listeners are supported
+ if (supportsPassiveListeners) {
+ options = {
+ // Whether the listener can be passive (i.e. default never prevented)
+ passive: passive,
+ // Whether the listener is a capturing listener or not
+ capture: capture
+ };
+ }
- request.send();
- } catch (e) {
- reject(e);
+ // If a single node is passed, bind the event listener
+ events.forEach(function (type) {
+ if (_this && _this.eventListeners && toggle) {
+ // Cache event listener
+ _this.eventListeners.push({ element: element, type: type, callback: callback, options: options });
}
+
+ element[toggle ? 'addEventListener' : 'removeEventListener'](type, callback, options);
});
- },
+ }
+ // Bind event handler
+ function on(element) {
+ var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
+ var callback = arguments[2];
+ var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;
+ var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
- // Load image avoiding xhr/fetch CORS issues
- // Server status can't be obtained this way unfortunately, so this uses "naturalWidth" to determine if the image has loaded.
- // By default it checks if it is at least 1px, but you can add a second argument to change this.
- loadImage: function loadImage(src) {
- var minWidth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
+ toggleListener.call(this, element, events, callback, true, passive, capture);
+ }
- return new Promise(function (resolve, reject) {
- var image = new Image();
- var handler = function handler() {
- delete image.onload;
- delete image.onerror;
- (image.naturalWidth >= minWidth ? resolve : reject)(image);
- };
- Object.assign(image, { onload: handler, onerror: handler, src: src });
- });
- },
+ // Unbind event handler
+ function off(element) {
+ var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
+ var callback = arguments[2];
+ var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;
+ var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
+ toggleListener.call(this, element, events, callback, false, passive, capture);
+ }
- // Load an external script
- loadScript: function loadScript(url) {
- return new Promise(function (resolve, reject) {
- loadjs_umd(url, {
- success: resolve,
- error: reject
- });
- });
- },
+ // Bind once-only event handler
+ function once(element) {
+ var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
+ var callback = arguments[2];
+ var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;
+ var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
+ function onceCallback() {
+ off(element, events, onceCallback, passive, capture);
- // Load an external SVG sprite
- loadSprite: function loadSprite(url, id) {
- if (!utils.is.string(url)) {
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+ args[_key] = arguments[_key];
+ }
+
+ callback.apply(this, args);
+ }
+
+ toggleListener.call(this, element, events, onceCallback, true, passive, capture);
+ }
+
+ // Trigger event
+ function triggerEvent(element) {
+ var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
+ var bubbles = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
+ var detail = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
+
+ // Bail if no element
+ if (!is.element(element) || is.empty(type)) {
return;
}
- var prefix = 'cache';
- var hasId = utils.is.string(id);
- var isCached = false;
+ // Create and dispatch the event
+ var event = new CustomEvent(type, {
+ bubbles: bubbles,
+ detail: Object.assign({}, detail, {
+ plyr: this
+ })
+ });
- var exists = function exists() {
- return document.getElementById(id) !== null;
- };
+ // Dispatch the event
+ element.dispatchEvent(event);
+ }
- var update = function update(container, data) {
- container.innerHTML = data;
+ // Unbind all cached event listeners
+ function unbindListeners() {
+ if (this && this.eventListeners) {
+ this.eventListeners.forEach(function (item) {
+ var element = item.element,
+ type = item.type,
+ callback = item.callback,
+ options = item.options;
- // Check again incase of race condition
- if (hasId && exists()) {
- return;
- }
+ element.removeEventListener(type, callback, options);
+ });
- // Inject the SVG to the body
- document.body.insertAdjacentElement('afterbegin', container);
- };
+ this.eventListeners = [];
+ }
+ }
- // Only load once if ID set
- if (!hasId || !exists()) {
- var useStorage = Storage.supported;
+ // Run method when / if player is ready
+ function ready() {
+ var _this2 = this;
- // Create container
- var container = document.createElement('div');
- utils.toggleHidden(container, true);
+ return new Promise(function (resolve) {
+ return _this2.ready ? setTimeout(resolve, 0) : on.call(_this2, _this2.elements.container, 'ready', resolve);
+ }).then(function () {});
+ }
- if (hasId) {
- container.setAttribute('id', id);
- }
+ var classCallCheck = function (instance, Constructor) {
+ if (!(instance instanceof Constructor)) {
+ throw new TypeError("Cannot call a class as a function");
+ }
+ };
- // Check in cache
- if (useStorage) {
- var cached = window.localStorage.getItem(prefix + '-' + id);
- isCached = cached !== null;
+ var 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);
+ }
+ }
- if (isCached) {
- var data = JSON.parse(cached);
- update(container, data.content);
- }
- }
+ return function (Constructor, protoProps, staticProps) {
+ if (protoProps) defineProperties(Constructor.prototype, protoProps);
+ if (staticProps) defineProperties(Constructor, staticProps);
+ return Constructor;
+ };
+ }();
+
+ var defineProperty = function (obj, key, value) {
+ if (key in obj) {
+ Object.defineProperty(obj, key, {
+ value: value,
+ enumerable: true,
+ configurable: true,
+ writable: true
+ });
+ } else {
+ obj[key] = value;
+ }
- // Get the sprite
- utils.fetch(url).then(function (result) {
- if (utils.is.empty(result)) {
- return;
- }
+ return obj;
+ };
- if (useStorage) {
- window.localStorage.setItem(prefix + '-' + id, JSON.stringify({
- content: result
- }));
- }
+ var slicedToArray = function () {
+ function sliceIterator(arr, i) {
+ var _arr = [];
+ var _n = true;
+ var _d = false;
+ var _e = undefined;
- update(container, result);
- }).catch(function () {});
+ try {
+ for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {
+ _arr.push(_s.value);
+
+ if (i && _arr.length === i) break;
+ }
+ } catch (err) {
+ _d = true;
+ _e = err;
+ } finally {
+ try {
+ if (!_n && _i["return"]) _i["return"]();
+ } finally {
+ if (_d) throw _e;
+ }
+ }
+
+ return _arr;
+ }
+
+ return function (arr, i) {
+ if (Array.isArray(arr)) {
+ return arr;
+ } else if (Symbol.iterator in Object(arr)) {
+ return sliceIterator(arr, i);
+ } else {
+ throw new TypeError("Invalid attempt to destructure non-iterable instance");
}
- },
+ };
+ }();
+ var toConsumableArray = function (arr) {
+ if (Array.isArray(arr)) {
+ for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];
- // Generate a random ID
- generateId: function generateId(prefix) {
- return prefix + '-' + Math.floor(Math.random() * 10000);
- },
+ return arr2;
+ } else {
+ return Array.from(arr);
+ }
+ };
+ // ==========================================================================
// Wrap an element
- wrap: function wrap(elements, wrapper) {
+ function wrap(elements, wrapper) {
// Convert `elements` to an array, if necessary.
var targets = elements.length ? elements : [elements];
@@ -733,59 +337,76 @@ var utils = {
parent.appendChild(child);
}
});
- },
+ }
+
+ // Set attributes
+ function setAttributes(element, attributes) {
+ if (!is.element(element) || is.empty(attributes)) {
+ return;
+ }
+
+ // Assume null and undefined attributes should be left out,
+ // Setting them would otherwise convert them to "null" and "undefined"
+ Object.entries(attributes).filter(function (_ref) {
+ var _ref2 = slicedToArray(_ref, 2),
+ value = _ref2[1];
+
+ return !is.nullOrUndefined(value);
+ }).forEach(function (_ref3) {
+ var _ref4 = slicedToArray(_ref3, 2),
+ key = _ref4[0],
+ value = _ref4[1];
+ return element.setAttribute(key, value);
+ });
+ }
// Create a DocumentFragment
- createElement: function createElement(type, attributes, text) {
+ function createElement(type, attributes, text) {
// Create a new <element>
var element = document.createElement(type);
// Set all passed attributes
- if (utils.is.object(attributes)) {
- utils.setAttributes(element, attributes);
+ if (is.object(attributes)) {
+ setAttributes(element, attributes);
}
// Add text node
- if (utils.is.string(text)) {
+ if (is.string(text)) {
element.innerText = text;
}
// Return built element
return element;
- },
-
+ }
// Inaert an element after another
- insertAfter: function insertAfter(element, target) {
+ function insertAfter(element, target) {
target.parentNode.insertBefore(element, target.nextSibling);
- },
-
+ }
// Insert a DocumentFragment
- insertElement: function insertElement(type, parent, attributes, text) {
+ function insertElement(type, parent, attributes, text) {
// Inject the new <element>
- parent.appendChild(utils.createElement(type, attributes, text));
- },
-
+ parent.appendChild(createElement(type, attributes, text));
+ }
// Remove element(s)
- removeElement: function removeElement(element) {
- if (utils.is.nodeList(element) || utils.is.array(element)) {
- Array.from(element).forEach(utils.removeElement);
+ function removeElement(element) {
+ if (is.nodeList(element) || is.array(element)) {
+ Array.from(element).forEach(removeElement);
return;
}
- if (!utils.is.element(element) || !utils.is.element(element.parentNode)) {
+ if (!is.element(element) || !is.element(element.parentNode)) {
return;
}
element.parentNode.removeChild(element);
- },
-
+ }
// Remove all child elements
- emptyElement: function emptyElement(element) {
+ function emptyElement(element) {
var length = element.childNodes.length;
@@ -793,45 +414,27 @@ var utils = {
element.removeChild(element.lastChild);
length -= 1;
}
- },
-
+ }
// Replace element
- replaceElement: function replaceElement(newChild, oldChild) {
- if (!utils.is.element(oldChild) || !utils.is.element(oldChild.parentNode) || !utils.is.element(newChild)) {
+ function replaceElement(newChild, oldChild) {
+ if (!is.element(oldChild) || !is.element(oldChild.parentNode) || !is.element(newChild)) {
return null;
}
oldChild.parentNode.replaceChild(newChild, oldChild);
return newChild;
- },
-
-
- // Set attributes
- setAttributes: function setAttributes(element, attributes) {
- if (!utils.is.element(element) || utils.is.empty(attributes)) {
- return;
- }
-
- Object.entries(attributes).forEach(function (_ref) {
- var _ref2 = slicedToArray(_ref, 2),
- key = _ref2[0],
- value = _ref2[1];
-
- element.setAttribute(key, value);
- });
- },
-
+ }
// Get an attribute object from a string selector
- getAttributesFromSelector: function getAttributesFromSelector(sel, existingAttributes) {
+ function getAttributesFromSelector(sel, existingAttributes) {
// For example:
// '.test' to { class: 'test' }
// '#test' to { id: 'test' }
// '[data-test="test"]' to { 'data-test': 'test' }
- if (!utils.is.string(sel) || utils.is.empty(sel)) {
+ if (!is.string(sel) || is.empty(sel)) {
return {};
}
@@ -855,7 +458,7 @@ var utils = {
switch (start) {
case '.':
// Add to existing classname
- if (utils.is.object(existing) && utils.is.string(existing.class)) {
+ if (is.object(existing) && is.string(existing.class)) {
existing.class += ' ' + className;
}
@@ -879,18 +482,17 @@ var utils = {
});
return attributes;
- },
-
+ }
// Toggle hidden
- toggleHidden: function toggleHidden(element, hidden) {
- if (!utils.is.element(element)) {
+ function toggleHidden(element, hidden) {
+ if (!is.element(element)) {
return;
}
var hide = hidden;
- if (!utils.is.boolean(hide)) {
+ if (!is.boolean(hide)) {
hide = !element.hasAttribute('hidden');
}
@@ -899,12 +501,11 @@ var utils = {
} else {
element.removeAttribute('hidden');
}
- },
-
+ }
// Mirror Element.classList.toggle, with IE compatibility for "force" argument
- toggleClass: function toggleClass(element, className, force) {
- if (utils.is.element(element)) {
+ function toggleClass(element, className, force) {
+ if (is.element(element)) {
var method = 'toggle';
if (typeof force !== 'undefined') {
method = force ? 'add' : 'remove';
@@ -915,17 +516,15 @@ var utils = {
}
return null;
- },
-
+ }
// Has class name
- hasClass: function hasClass(element, className) {
- return utils.is.element(element) && element.classList.contains(className);
- },
-
+ function hasClass(element, className) {
+ return is.element(element) && element.classList.contains(className);
+ }
// Element matches selector
- matches: function matches(element, selector) {
+ function matches(element, selector) {
var prototype = { Element: Element };
function match() {
@@ -935,23 +534,20 @@ var utils = {
var matches = prototype.matches || prototype.webkitMatchesSelector || prototype.mozMatchesSelector || prototype.msMatchesSelector || match;
return matches.call(element, selector);
- },
-
+ }
// Find all elements
- getElements: function getElements(selector) {
+ function getElements(selector) {
return this.elements.container.querySelectorAll(selector);
- },
-
+ }
// Find a single element
- getElement: function getElement(selector) {
+ function getElement(selector) {
return this.elements.container.querySelector(selector);
- },
-
+ }
// Get the focused element
- getFocusElement: function getFocusElement() {
+ function getFocusElement() {
var focused = document.activeElement;
if (!focused || focused === document.body) {
@@ -961,19 +557,18 @@ var utils = {
}
return focused;
- },
-
+ }
// Trap focus inside container
- trapFocus: function trapFocus() {
+ function trapFocus() {
var element = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
var toggle = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
- if (!utils.is.element(element)) {
+ if (!is.element(element)) {
return;
}
- var focusable = utils.getElements.call(this, 'button:not(:disabled), input:not(:disabled), [tabindex]');
+ var focusable = getElements.call(this, 'button:not(:disabled), input:not(:disabled), [tabindex]');
var first = focusable[0];
var last = focusable[focusable.length - 1];
@@ -984,7 +579,7 @@ var utils = {
}
// Get the current focused element
- var focused = utils.getFocusElement();
+ var focused = getFocusElement();
if (focused === last && !event.shiftKey) {
// Move focus to first element that can be tabbed if Shift isn't used
@@ -997,238 +592,288 @@ var utils = {
}
};
- if (toggle) {
- utils.on(this.elements.container, 'keydown', trap, false);
- } else {
- utils.off(this.elements.container, 'keydown', trap, false);
- }
- },
+ toggleListener.call(this, this.elements.container, 'keydown', trap, toggle, false);
+ }
+ // ==========================================================================
- // Toggle event listener
- toggleListener: function toggleListener(elements, event, callback) {
- var toggle = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
- var passive = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;
- var capture = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : false;
+ var transitionEndEvent = function () {
+ var element = document.createElement('span');
- // Bail if no elemetns, event, or callback
- if (utils.is.empty(elements) || utils.is.empty(event) || !utils.is.function(callback)) {
- return;
- }
+ var events = {
+ WebkitTransition: 'webkitTransitionEnd',
+ MozTransition: 'transitionend',
+ OTransition: 'oTransitionEnd otransitionend',
+ transition: 'transitionend'
+ };
- // If a nodelist is passed, call itself on each node
- if (utils.is.nodeList(elements) || utils.is.array(elements)) {
- // Create listener for each node
- Array.from(elements).forEach(function (element) {
- if (element instanceof Node) {
- utils.toggleListener.call(null, element, event, callback, toggle, passive, capture);
- }
- });
+ var type = Object.keys(events).find(function (event) {
+ return element.style[event] !== undefined;
+ });
- return;
- }
+ return is.string(type) ? events[type] : false;
+ }();
- // Allow multiple events
- var events = event.split(' ');
+ // Force repaint of element
+ function repaint(element) {
+ setTimeout(function () {
+ toggleHidden(element, true);
+ element.offsetHeight; // eslint-disable-line
+ toggleHidden(element, false);
+ }, 0);
+ }
- // Build options
- // Default to just the capture boolean for browsers with no passive listener support
- var options = capture;
+ // ==========================================================================
+ // Browser sniffing
+ // Unfortunately, due to mixed support, UA sniffing is required
+ // ==========================================================================
+
+ var browser = {
+ isIE: /* @cc_on!@ */!!document.documentMode,
+ isWebkit: 'WebkitAppearance' in document.documentElement.style && !/Edge/.test(navigator.userAgent),
+ isIPhone: /(iPhone|iPod)/gi.test(navigator.platform),
+ isIos: /(iPad|iPhone|iPod)/gi.test(navigator.platform)
+ };
+
+ // ==========================================================================
+
+ // Default codecs for checking mimetype support
+ var defaultCodecs = {
+ 'audio/ogg': 'vorbis',
+ 'audio/wav': '1',
+ 'video/webm': 'vp8, vorbis',
+ 'video/mp4': 'avc1.42E01E, mp4a.40.2',
+ 'video/ogg': 'theora'
+ };
+
+ // Check for feature support
+ var support = {
+ // Basic support
+ audio: 'canPlayType' in document.createElement('audio'),
+ video: 'canPlayType' in document.createElement('video'),
+
+ // Check for support
+ // Basic functionality vs full UI
+ check: function check(type, provider, playsinline) {
+ var canPlayInline = browser.isIPhone && playsinline && support.playsinline;
+ var api = support[type] || provider !== 'html5';
+ var ui = api && support.rangeInput && (type !== 'video' || !browser.isIPhone || canPlayInline);
- // If passive events listeners are supported
- if (support.passiveListeners) {
- options = {
- // Whether the listener can be passive (i.e. default never prevented)
- passive: passive,
- // Whether the listener is a capturing listener or not
- capture: capture
+ return {
+ api: api,
+ ui: ui
};
- }
-
- // If a single node is passed, bind the event listener
- events.forEach(function (type) {
- elements[toggle ? 'addEventListener' : 'removeEventListener'](type, callback, options);
- });
- },
-
+ },
- // Bind event handler
- on: function on(element) {
- var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
- var callback = arguments[2];
- var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;
- var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
- utils.toggleListener(element, events, callback, true, passive, capture);
- },
+ // Picture-in-picture support
+ // Safari only currently
+ pip: function () {
+ return !browser.isIPhone && is.function(createElement('video').webkitSetPresentationMode);
+ }(),
+ // Airplay support
+ // Safari only currently
+ airplay: is.function(window.WebKitPlaybackTargetAvailabilityEvent),
- // Unbind event handler
- off: function off(element) {
- var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
- var callback = arguments[2];
- var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;
- var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
+ // Inline playback support
+ // https://webkit.org/blog/6784/new-video-policies-for-ios/
+ playsinline: 'playsInline' in document.createElement('video'),
- utils.toggleListener(element, events, callback, false, passive, capture);
- },
+ // Check for mime type support against a player instance
+ // Credits: http://diveintohtml5.info/everything.html
+ // Related: http://www.leanbackplayer.com/test/h5mt.html
+ mime: function mime(inputType) {
+ var _inputType$split = inputType.split('/'),
+ _inputType$split2 = slicedToArray(_inputType$split, 1),
+ mediaType = _inputType$split2[0];
+ if (!this.isHTML5 || mediaType !== this.type) {
+ return false;
+ }
- // Trigger event
- dispatchEvent: function dispatchEvent(element) {
- var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
- var bubbles = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
- var detail = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
+ var type = void 0;
+ if (inputType && inputType.includes('codecs=')) {
+ // Use input directly
+ type = inputType;
+ } else if (inputType === 'audio/mpeg') {
+ // Skip codec
+ type = 'audio/mpeg;';
+ } else if (inputType in defaultCodecs) {
+ // Use codec
+ type = inputType + '; codecs="' + defaultCodecs[inputType] + '"';
+ }
- // Bail if no element
- if (!utils.is.element(element) || utils.is.empty(type)) {
- return;
- }
+ try {
+ return Boolean(type && this.media.canPlayType(type).replace(/no/, ''));
+ } catch (err) {
+ return false;
+ }
+ },
- // Create and dispatch the event
- var event = new CustomEvent(type, {
- bubbles: bubbles,
- detail: Object.assign({}, detail, {
- plyr: this
- })
- });
- // Dispatch the event
- element.dispatchEvent(event);
- },
+ // Check for textTracks support
+ textTracks: 'textTracks' in document.createElement('video'),
+ // <input type="range"> Sliders
+ rangeInput: function () {
+ var range = document.createElement('input');
+ range.type = 'range';
+ return range.type === 'range';
+ }(),
- // Format string
- format: function format(input) {
- for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
- args[_key - 1] = arguments[_key];
- }
+ // Touch
+ // NOTE: Remember a device can be mouse + touch enabled so we check on first touch event
+ touch: 'ontouchstart' in document.documentElement,
- if (utils.is.empty(input)) {
- return input;
- }
+ // Detect transitions support
+ transitions: transitionEndEvent !== false,
- return input.toString().replace(/{(\d+)}/g, function (match, i) {
- return utils.is.string(args[i]) ? args[i] : '';
- });
- },
+ // Reduced motion iOS & MacOS setting
+ // https://webkit.org/blog/7551/responsive-design-for-motion/
+ reducedMotion: 'matchMedia' in window && window.matchMedia('(prefers-reduced-motion)').matches
+ };
+ // ==========================================================================
- // Get percentage
- getPercentage: function getPercentage(current, max) {
- if (current === 0 || max === 0 || Number.isNaN(current) || Number.isNaN(max)) {
- return 0;
- }
+ var html5 = {
+ getSources: function getSources() {
+ var _this = this;
- return (current / max * 100).toFixed(2);
- },
+ if (!this.isHTML5) {
+ return [];
+ }
+ var sources = Array.from(this.media.querySelectorAll('source'));
- // Time helpers
- getHours: function getHours(value) {
- return parseInt(value / 60 / 60 % 60, 10);
- },
- getMinutes: function getMinutes(value) {
- return parseInt(value / 60 % 60, 10);
- },
- getSeconds: function getSeconds(value) {
- return parseInt(value % 60, 10);
- },
+ // Filter out unsupported sources
+ return sources.filter(function (source) {
+ return support.mime.call(_this, source.getAttribute('type'));
+ });
+ },
- // Format time to UI friendly string
- formatTime: function formatTime() {
- var time = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
- var displayHours = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
- var inverted = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
+ // Get quality levels
+ getQualityOptions: function getQualityOptions() {
+ // Get sizes from <source> elements
+ return html5.getSources.call(this).map(function (source) {
+ return Number(source.getAttribute('size'));
+ }).filter(Boolean);
+ },
+ extend: function extend() {
+ if (!this.isHTML5) {
+ return;
+ }
- // Bail if the value isn't a number
- if (!utils.is.number(time)) {
- return utils.formatTime(null, displayHours, inverted);
- }
+ var player = this;
- // Format time component to add leading zero
- var format = function format(value) {
- return ('0' + value).slice(-2);
- };
+ // Quality
+ Object.defineProperty(player.media, 'quality', {
+ get: function get$$1() {
+ // Get sources
+ var sources = html5.getSources.call(player);
- // Breakdown to hours, mins, secs
- var hours = utils.getHours(time);
- var mins = utils.getMinutes(time);
- var secs = utils.getSeconds(time);
+ var _sources$filter = sources.filter(function (source) {
+ return source.getAttribute('src') === player.source;
+ }),
+ _sources$filter2 = slicedToArray(_sources$filter, 1),
+ source = _sources$filter2[0];
- // Do we need to display hours?
- if (displayHours || hours > 0) {
- hours = hours + ':';
- } else {
- hours = '';
- }
+ // Return size, if match is found
- // Render
- return '' + (inverted ? '-' : '') + hours + format(mins) + ':' + format(secs);
- },
+ return source && Number(source.getAttribute('size'));
+ },
+ set: function set$$1(input) {
+ // Get sources
+ var sources = html5.getSources.call(player);
- // Replace all occurances of a string in a string
- replaceAll: function replaceAll() {
- var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
- var find = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
- var replace = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';
+ // Get first match for requested size
+ var source = sources.find(function (source) {
+ return Number(source.getAttribute('size')) === input;
+ });
- return input.replace(new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\]/\\])/g, '\\$1'), 'g'), replace.toString());
- },
+ // No matching source found
+ if (!source) {
+ return;
+ }
+ // Get current state
+ var currentTime = player.currentTime,
+ playing = player.playing;
- // Convert to title case
- toTitleCase: function toTitleCase() {
- var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
+ // Set new source
- return input.toString().replace(/\w\S*/g, function (text) {
- return text.charAt(0).toUpperCase() + text.substr(1).toLowerCase();
- });
- },
+ player.media.src = source.getAttribute('src');
+ // Restore time
+ var onLoadedMetaData = function onLoadedMetaData() {
+ player.currentTime = currentTime;
+ };
+ player.once('loadedmetadata', onLoadedMetaData);
- // Convert string to pascalCase
- toPascalCase: function toPascalCase() {
- var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
+ // Load new source
+ player.media.load();
- var string = input.toString();
+ // Resume playing
+ if (playing) {
+ player.play();
+ }
- // Convert kebab case
- string = utils.replaceAll(string, '-', ' ');
+ // Trigger change event
+ triggerEvent.call(player, player.media, 'qualitychange', false, {
+ quality: input
+ });
+ }
+ });
+ },
- // Convert snake case
- string = utils.replaceAll(string, '_', ' ');
- // Convert to title case
- string = utils.toTitleCase(string);
+ // Cancel current network requests
+ // See https://github.com/sampotts/plyr/issues/174
+ cancelRequests: function cancelRequests() {
+ if (!this.isHTML5) {
+ return;
+ }
- // Convert to pascal case
- return utils.replaceAll(string, ' ', '');
- },
+ // Remove child sources
+ removeElement(html5.getSources.call(this));
+ // Set blank video src attribute
+ // This is to prevent a MEDIA_ERR_SRC_NOT_SUPPORTED error
+ // Info: http://stackoverflow.com/questions/32231579/how-to-properly-dispose-of-an-html5-video-and-close-socket-or-connection
+ this.media.setAttribute('src', this.config.blankVideo);
- // Convert string to pascalCase
- toCamelCase: function toCamelCase() {
- var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
+ // Load the new empty source
+ // This will cancel existing requests
+ // See https://github.com/sampotts/plyr/issues/174
+ this.media.load();
- var string = input.toString();
+ // Debugging
+ this.debug.log('Cancelled network requests');
+ }
+ };
- // Convert to pascal case
- string = utils.toPascalCase(string);
+ // ==========================================================================
- // Convert first character to lowercase
- return string.charAt(0).toLowerCase() + string.slice(1);
- },
+ // Clone nested objects
+ function cloneDeep(object) {
+ return JSON.parse(JSON.stringify(object));
+ }
+ // Get a nested value in an object
+ function getDeep(object, path) {
+ return path.split('.').reduce(function (obj, key) {
+ return obj && obj[key];
+ }, object);
+ }
// Deep extend destination object with N more objects
- extend: function extend() {
+ function extend() {
var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
- for (var _len2 = arguments.length, sources = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
- sources[_key2 - 1] = arguments[_key2];
+ for (var _len = arguments.length, sources = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
+ sources[_key - 1] = arguments[_key];
}
if (!sources.length) {
@@ -1237,1330 +882,1117 @@ var utils = {
var source = sources.shift();
- if (!utils.is.object(source)) {
+ if (!is.object(source)) {
return target;
}
Object.keys(source).forEach(function (key) {
- if (utils.is.object(source[key])) {
+ if (is.object(source[key])) {
if (!Object.keys(target).includes(key)) {
Object.assign(target, defineProperty({}, key, {}));
}
- utils.extend(target[key], source[key]);
+ extend(target[key], source[key]);
} else {
Object.assign(target, defineProperty({}, key, source[key]));
}
});
- return utils.extend.apply(utils, [target].concat(toConsumableArray(sources)));
- },
-
-
- // Remove duplicates in an array
- dedupe: function dedupe(array) {
- if (!utils.is.array(array)) {
- return array;
- }
-
- return array.filter(function (item, index) {
- return array.indexOf(item) === index;
- });
- },
-
-
- // Clone nested objects
- cloneDeep: function cloneDeep(object) {
- return JSON.parse(JSON.stringify(object));
- },
-
-
- // Get a nested value in an object
- getDeep: function getDeep(object, path) {
- return path.split('.').reduce(function (obj, key) {
- return obj && obj[key];
- }, object);
- },
-
-
- // Get the closest value in an array
- closest: function closest(array, value) {
- if (!utils.is.array(array) || !array.length) {
- return null;
- }
-
- return array.reduce(function (prev, curr) {
- return Math.abs(curr - value) < Math.abs(prev - value) ? curr : prev;
- });
- },
+ return extend.apply(undefined, [target].concat(sources));
+ }
+ // ==========================================================================
- // Get the provider for a given URL
- getProviderByUrl: function getProviderByUrl(url) {
- // YouTube
- if (/^(https?:\/\/)?(www\.)?(youtube\.com|youtu\.?be)\/.+$/.test(url)) {
- return providers.youtube;
- }
+ // Generate a random ID
+ function generateId(prefix) {
+ return prefix + '-' + Math.floor(Math.random() * 10000);
+ }
- // Vimeo
- if (/^https?:\/\/player.vimeo.com\/video\/\d{0,9}(?=\b|\/)/.test(url)) {
- return providers.vimeo;
+ // Format string
+ function format(input) {
+ for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
+ args[_key - 1] = arguments[_key];
}
- return null;
- },
-
-
- // Parse YouTube ID from URL
- parseYouTubeId: function parseYouTubeId(url) {
- if (utils.is.empty(url)) {
- return null;
+ if (is.empty(input)) {
+ return input;
}
- var regex = /^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|&v=)([^#&?]*).*/;
- return url.match(regex) ? RegExp.$2 : url;
- },
-
-
- // Parse Vimeo ID from URL
- parseVimeoId: function parseVimeoId(url) {
- if (utils.is.empty(url)) {
- return null;
- }
+ return input.toString().replace(/{(\d+)}/g, function (match, i) {
+ return args[i].toString();
+ });
+ }
- if (utils.is.number(Number(url))) {
- return url;
+ // Get percentage
+ function getPercentage(current, max) {
+ if (current === 0 || max === 0 || Number.isNaN(current) || Number.isNaN(max)) {
+ return 0;
}
- var regex = /^.*(vimeo.com\/|video\/)(\d+).*/;
- return url.match(regex) ? RegExp.$2 : url;
- },
+ return (current / max * 100).toFixed(2);
+ }
+ // Replace all occurances of a string in a string
+ function replaceAll() {
+ var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
+ var find = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
+ var replace = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';
- // Convert a URL to a location object
- parseUrl: function parseUrl(url) {
- var parser = document.createElement('a');
- parser.href = url;
- return parser;
- },
+ return input.replace(new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\]/\\])/g, '\\$1'), 'g'), replace.toString());
+ }
+ // Convert to title case
+ function toTitleCase() {
+ var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
- // Get URL query parameters
- getUrlParams: function getUrlParams(input) {
- var search = input;
+ return input.toString().replace(/\w\S*/g, function (text) {
+ return text.charAt(0).toUpperCase() + text.substr(1).toLowerCase();
+ });
+ }
- // Parse URL if needed
- if (input.startsWith('http://') || input.startsWith('https://')) {
- var _utils$parseUrl = utils.parseUrl(input);
+ // Convert string to pascalCase
+ function toPascalCase() {
+ var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
- search = _utils$parseUrl.search;
- }
+ var string = input.toString();
- if (utils.is.empty(search)) {
- return null;
- }
+ // Convert kebab case
+ string = replaceAll(string, '-', ' ');
- var hashes = search.slice(search.indexOf('?') + 1).split('&');
+ // Convert snake case
+ string = replaceAll(string, '_', ' ');
- return hashes.reduce(function (params, hash) {
- var _hash$split = hash.split('='),
- _hash$split2 = slicedToArray(_hash$split, 2),
- key = _hash$split2[0],
- val = _hash$split2[1];
+ // Convert to title case
+ string = toTitleCase(string);
- return Object.assign(params, defineProperty({}, key, decodeURIComponent(val)));
- }, {});
- },
+ // Convert to pascal case
+ return replaceAll(string, ' ', '');
+ }
+ // Convert string to pascalCase
+ function toCamelCase() {
+ var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
- // Convert object to URL parameters
- buildUrlParams: function buildUrlParams(input) {
- if (!utils.is.object(input)) {
- return '';
- }
+ var string = input.toString();
- return Object.keys(input).map(function (key) {
- return encodeURIComponent(key) + '=' + encodeURIComponent(input[key]);
- }).join('&');
- },
+ // Convert to pascal case
+ string = toPascalCase(string);
+ // Convert first character to lowercase
+ return string.charAt(0).toLowerCase() + string.slice(1);
+ }
// Remove HTML from a string
- stripHTML: function stripHTML(source) {
+ function stripHTML(source) {
var fragment = document.createDocumentFragment();
var element = document.createElement('div');
fragment.appendChild(element);
element.innerHTML = source;
return fragment.firstChild.innerText;
- },
-
+ }
// Like outerHTML, but also works for DocumentFragment
- getHTML: function getHTML(element) {
+ function getHTML(element) {
var wrapper = document.createElement('div');
wrapper.appendChild(element);
return wrapper.innerHTML;
- },
-
-
- // Get aspect ratio for dimensions
- getAspectRatio: function getAspectRatio(width, height) {
- var getRatio = function getRatio(w, h) {
- return h === 0 ? w : getRatio(h, w % h);
- };
- var ratio = getRatio(width, height);
- return width / ratio + ':' + height / ratio;
- },
-
-
- // Get the transition end event
- get transitionEndEvent() {
- var element = document.createElement('span');
-
- var events = {
- WebkitTransition: 'webkitTransitionEnd',
- MozTransition: 'transitionend',
- OTransition: 'oTransitionEnd otransitionend',
- transition: 'transitionend'
- };
-
- var type = Object.keys(events).find(function (event) {
- return element.style[event] !== undefined;
- });
-
- return utils.is.string(type) ? events[type] : false;
- },
-
- // Force repaint of element
- repaint: function repaint(element) {
- setTimeout(function () {
- utils.toggleHidden(element, true);
- element.offsetHeight; // eslint-disable-line
- utils.toggleHidden(element, false);
- }, 0);
}
-};
-
-// ==========================================================================
-
-// Check for feature support
-var support = {
- // Basic support
- audio: 'canPlayType' in document.createElement('audio'),
- video: 'canPlayType' in document.createElement('video'),
-
- // Check for support
- // Basic functionality vs full UI
- check: function check(type, provider, playsinline) {
- var api = false;
- var ui = false;
- var browser = utils.getBrowser();
- var canPlayInline = browser.isIPhone && playsinline && support.playsinline;
-
- switch (provider + ':' + type) {
- case 'html5:video':
- api = support.video;
- ui = api && support.rangeInput && (!browser.isIPhone || canPlayInline);
- break;
-
- case 'html5:audio':
- api = support.audio;
- ui = api && support.rangeInput;
- break;
-
- case 'youtube:video':
- case 'vimeo:video':
- api = true;
- ui = support.rangeInput && (!browser.isIPhone || canPlayInline);
- break;
-
- default:
- api = support.audio && support.video;
- ui = api && support.rangeInput;
- }
- return {
- api: api,
- ui: ui
- };
- },
+ // ==========================================================================
+ var i18n = {
+ get: function get$$1() {
+ var key = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
+ var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
- // Picture-in-picture support
- // Safari only currently
- pip: function () {
- var browser = utils.getBrowser();
- return !browser.isIPhone && utils.is.function(utils.createElement('video').webkitSetPresentationMode);
- }(),
-
- // Airplay support
- // Safari only currently
- airplay: utils.is.function(window.WebKitPlaybackTargetAvailabilityEvent),
-
- // Inline playback support
- // https://webkit.org/blog/6784/new-video-policies-for-ios/
- playsinline: 'playsInline' in document.createElement('video'),
-
- // Check for mime type support against a player instance
- // Credits: http://diveintohtml5.info/everything.html
- // Related: http://www.leanbackplayer.com/test/h5mt.html
- mime: function mime(type) {
- var media = this.media;
-
-
- try {
- // Bail if no checking function
- if (!this.isHTML5 || !utils.is.function(media.canPlayType)) {
- return false;
- }
-
- // Check directly if codecs specified
- if (type.includes('codecs=')) {
- return media.canPlayType(type).replace(/no/, '');
+ if (is.empty(key) || is.empty(config)) {
+ return '';
}
- // Type specific checks
- if (this.isVideo) {
- switch (type) {
- case 'video/webm':
- return media.canPlayType('video/webm; codecs="vp8, vorbis"').replace(/no/, '');
+ var string = getDeep(config.i18n, key);
- case 'video/mp4':
- return media.canPlayType('video/mp4; codecs="avc1.42E01E, mp4a.40.2"').replace(/no/, '');
-
- case 'video/ogg':
- return media.canPlayType('video/ogg; codecs="theora"').replace(/no/, '');
-
- default:
- return false;
- }
- } else if (this.isAudio) {
- switch (type) {
- case 'audio/mpeg':
- return media.canPlayType('audio/mpeg;').replace(/no/, '');
-
- case 'audio/ogg':
- return media.canPlayType('audio/ogg; codecs="vorbis"').replace(/no/, '');
-
- case 'audio/wav':
- return media.canPlayType('audio/wav; codecs="1"').replace(/no/, '');
-
- default:
- return false;
- }
+ if (is.empty(string)) {
+ return '';
}
- } catch (e) {
- return false;
- }
-
- // If we got this far, we're stuffed
- return false;
- },
+ var replace = {
+ '{seektime}': config.seekTime,
+ '{title}': config.title
+ };
- // Check for textTracks support
- textTracks: 'textTracks' in document.createElement('video'),
+ Object.entries(replace).forEach(function (_ref) {
+ var _ref2 = slicedToArray(_ref, 2),
+ key = _ref2[0],
+ value = _ref2[1];
- // Check for passive event listener support
- // https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md
- // https://www.youtube.com/watch?v=NPM6172J22g
- passiveListeners: function () {
- // Test via a getter in the options object to see if the passive property is accessed
- var supported = false;
- try {
- var options = Object.defineProperty({}, 'passive', {
- get: function get() {
- supported = true;
- return null;
- }
+ string = replaceAll(string, key, value);
});
- window.addEventListener('test', null, options);
- window.removeEventListener('test', null, options);
- } catch (e) {
- // Do nothing
- }
-
- return supported;
- }(),
- // <input type="range"> Sliders
- rangeInput: function () {
- var range = document.createElement('input');
- range.type = 'range';
- return range.type === 'range';
- }(),
-
- // Touch
- // NOTE: Remember a device can be mouse + touch enabled so we check on first touch event
- touch: 'ontouchstart' in document.documentElement,
-
- // Detect transitions support
- transitions: utils.transitionEndEvent !== false,
-
- // Reduced motion iOS & MacOS setting
- // https://webkit.org/blog/7551/responsive-design-for-motion/
- reducedMotion: 'matchMedia' in window && window.matchMedia('(prefers-reduced-motion)').matches
-};
-
-// ==========================================================================
-
-var html5 = {
- getSources: function getSources() {
- if (!this.isHTML5) {
- return null;
+ return string;
}
+ };
- return this.media.querySelectorAll('source');
- },
+ // ==========================================================================
-
- // Get quality levels
- getQualityOptions: function getQualityOptions() {
- if (!this.isHTML5) {
- return null;
+ // Remove duplicates in an array
+ function dedupe(array) {
+ if (!is.array(array)) {
+ return array;
}
- // Get sources
- var sources = html5.getSources.call(this);
+ return array.filter(function (item, index) {
+ return array.indexOf(item) === index;
+ });
+ }
- if (utils.is.empty(sources)) {
+ // Get the closest value in an array
+ function closest(array, value) {
+ if (!is.array(array) || !array.length) {
return null;
}
- // Get <source> with size attribute
- var sizes = Array.from(sources).filter(function (source) {
- return !utils.is.empty(source.getAttribute('size'));
+ return array.reduce(function (prev, curr) {
+ return Math.abs(curr - value) < Math.abs(prev - value) ? curr : prev;
});
+ }
- // If none, bail
- if (utils.is.empty(sizes)) {
- return null;
- }
+ // ==========================================================================
- // Reduce to unique list
- return utils.dedupe(sizes.map(function (source) {
- return Number(source.getAttribute('size'));
- }));
- },
- extend: function extend() {
- if (!this.isHTML5) {
- return;
+ var Storage = function () {
+ function Storage(player) {
+ classCallCheck(this, Storage);
+
+ this.enabled = player.config.storage.enabled;
+ this.key = player.config.storage.key;
}
- var player = this;
+ // Check for actual support (see if we can use it)
- // Quality
- Object.defineProperty(player.media, 'quality', {
- get: function get() {
- // Get sources
- var sources = html5.getSources.call(player);
- if (utils.is.empty(sources)) {
+ createClass(Storage, [{
+ key: 'get',
+ value: function get$$1(key) {
+ if (!Storage.supported || !this.enabled) {
return null;
}
- var matches = Array.from(sources).filter(function (source) {
- return source.getAttribute('src') === player.source;
- });
+ var store = window.localStorage.getItem(this.key);
- if (utils.is.empty(matches)) {
+ if (is.empty(store)) {
return null;
}
- return Number(matches[0].getAttribute('size'));
- },
- set: function set(input) {
- // Get sources
- var sources = html5.getSources.call(player);
+ var json = JSON.parse(store);
- if (utils.is.empty(sources)) {
+ return is.string(key) && key.length ? json[key] : json;
+ }
+ }, {
+ key: 'set',
+ value: function set$$1(object) {
+ // Bail if we don't have localStorage support or it's disabled
+ if (!Storage.supported || !this.enabled) {
return;
}
- // Get matches for requested size
- var matches = Array.from(sources).filter(function (source) {
- return Number(source.getAttribute('size')) === input;
- });
-
- // No matches for requested size
- if (utils.is.empty(matches)) {
+ // Can only store objectst
+ if (!is.object(object)) {
return;
}
- // Get supported sources
- var supported = matches.filter(function (source) {
- return support.mime.call(player, source.getAttribute('type'));
- });
+ // Get current storage
+ var storage = this.get();
- // No supported sources
- if (utils.is.empty(supported)) {
- return;
+ // Default to empty object
+ if (is.empty(storage)) {
+ storage = {};
}
- // Trigger change event
- utils.dispatchEvent.call(player, player.media, 'qualityrequested', false, {
- quality: input
- });
-
- // Get current state
- var currentTime = player.currentTime,
- playing = player.playing;
+ // Update the working copy of the values
+ extend(storage, object);
- // Set new source
-
- player.media.src = supported[0].getAttribute('src');
+ // Update storage
+ window.localStorage.setItem(this.key, JSON.stringify(storage));
+ }
+ }], [{
+ key: 'supported',
+ get: function get$$1() {
+ try {
+ if (!('localStorage' in window)) {
+ return false;
+ }
- // Restore time
- var onLoadedMetaData = function onLoadedMetaData() {
- player.currentTime = currentTime;
- player.off('loadedmetadata', onLoadedMetaData);
- };
- player.on('loadedmetadata', onLoadedMetaData);
+ var test = '___test';
- // Load new source
- player.media.load();
+ // Try to use it (it might be disabled, e.g. user is in private mode)
+ // see: https://github.com/sampotts/plyr/issues/131
+ window.localStorage.setItem(test, test);
+ window.localStorage.removeItem(test);
- // Resume playing
- if (playing) {
- player.play();
+ return true;
+ } catch (e) {
+ return false;
}
-
- // Trigger change event
- utils.dispatchEvent.call(player, player.media, 'qualitychange', false, {
- quality: input
- });
}
- });
- },
+ }]);
+ return Storage;
+ }();
+ // ==========================================================================
- // Cancel current network requests
- // See https://github.com/sampotts/plyr/issues/174
- cancelRequests: function cancelRequests() {
- if (!this.isHTML5) {
+ // Load an external SVG sprite
+ function loadSprite(url, id) {
+ if (!is.string(url)) {
return;
}
- // Remove child sources
- utils.removeElement(html5.getSources());
+ var prefix = 'cache';
+ var hasId = is.string(id);
+ var isCached = false;
+
+ var exists = function exists() {
+ return document.getElementById(id) !== null;
+ };
- // Set blank video src attribute
- // This is to prevent a MEDIA_ERR_SRC_NOT_SUPPORTED error
- // Info: http://stackoverflow.com/questions/32231579/how-to-properly-dispose-of-an-html5-video-and-close-socket-or-connection
- this.media.setAttribute('src', this.config.blankVideo);
+ var update = function update(container, data) {
+ container.innerHTML = data;
- // Load the new empty source
- // This will cancel existing requests
- // See https://github.com/sampotts/plyr/issues/174
- this.media.load();
+ // Check again incase of race condition
+ if (hasId && exists()) {
+ return;
+ }
- // Debugging
- this.debug.log('Cancelled network requests');
- }
-};
+ // Inject the SVG to the body
+ document.body.insertAdjacentElement('afterbegin', container);
+ };
+
+ // Only load once if ID set
+ if (!hasId || !exists()) {
+ var useStorage = Storage.supported;
+
+ // Create container
+ var container = document.createElement('div');
+ container.setAttribute('hidden', '');
-// ==========================================================================
+ if (hasId) {
+ container.setAttribute('id', id);
+ }
+
+ // Check in cache
+ if (useStorage) {
+ var cached = window.localStorage.getItem(prefix + '-' + id);
+ isCached = cached !== null;
-var i18n = {
- get: function get$$1() {
- var key = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
- var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+ if (isCached) {
+ var data = JSON.parse(cached);
+ update(container, data.content);
+ }
+ }
+
+ // Get the sprite
+ fetch(url).then(function (result) {
+ if (is.empty(result)) {
+ return;
+ }
+
+ if (useStorage) {
+ window.localStorage.setItem(prefix + '-' + id, JSON.stringify({
+ content: result
+ }));
+ }
- if (utils.is.empty(key) || utils.is.empty(config)) {
- return '';
+ update(container, result);
+ }).catch(function () {});
}
+ }
+
+ // ==========================================================================
+
+ // Time helpers
+ var getHours = function getHours(value) {
+ return parseInt(value / 60 / 60 % 60, 10);
+ };
+ var getMinutes = function getMinutes(value) {
+ return parseInt(value / 60 % 60, 10);
+ };
+ var getSeconds = function getSeconds(value) {
+ return parseInt(value % 60, 10);
+ };
- var string = utils.getDeep(config.i18n, key);
+ // Format time to UI friendly string
+ function formatTime() {
+ var time = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
+ var displayHours = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
+ var inverted = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
- if (utils.is.empty(string)) {
- return '';
+ // Bail if the value isn't a number
+ if (!is.number(time)) {
+ return formatTime(null, displayHours, inverted);
}
- var replace = {
- '{seektime}': config.seekTime,
- '{title}': config.title
+ // Format time component to add leading zero
+ var format = function format(value) {
+ return ('0' + value).slice(-2);
};
- Object.entries(replace).forEach(function (_ref) {
- var _ref2 = slicedToArray(_ref, 2),
- key = _ref2[0],
- value = _ref2[1];
+ // Breakdown to hours, mins, secs
+ var hours = getHours(time);
+ var mins = getMinutes(time);
+ var secs = getSeconds(time);
- string = utils.replaceAll(string, key, value);
- });
+ // Do we need to display hours?
+ if (displayHours || hours > 0) {
+ hours = hours + ':';
+ } else {
+ hours = '';
+ }
- return string;
+ // Render
+ return '' + (inverted && time > 0 ? '-' : '') + hours + format(mins) + ':' + format(secs);
}
-};
-// ==========================================================================
+ // ==========================================================================
-// Sniff out the browser
-var browser = utils.getBrowser();
+ // TODO: Don't export a massive object - break down and create class
+ var controls = {
+ // Get icon URL
+ getIconUrl: function getIconUrl() {
+ var url = new URL(this.config.iconUrl, window.location);
+ var cors = url.host !== window.location.host || browser.isIE && !window.svg4everybody;
-var controls = {
- // Get icon URL
- getIconUrl: function getIconUrl() {
- var url = new URL(this.config.iconUrl, window.location);
- var cors = url.host !== window.location.host || browser.isIE && !window.svg4everybody;
+ return {
+ url: this.config.iconUrl,
+ cors: cors
+ };
+ },
- return {
- url: this.config.iconUrl,
- cors: cors
- };
- },
+ // Find the UI controls
+ findElements: function findElements() {
+ try {
+ this.elements.controls = getElement.call(this, this.config.selectors.controls.wrapper);
+
+ // Buttons
+ this.elements.buttons = {
+ play: getElements.call(this, this.config.selectors.buttons.play),
+ pause: getElement.call(this, this.config.selectors.buttons.pause),
+ restart: getElement.call(this, this.config.selectors.buttons.restart),
+ rewind: getElement.call(this, this.config.selectors.buttons.rewind),
+ fastForward: getElement.call(this, this.config.selectors.buttons.fastForward),
+ mute: getElement.call(this, this.config.selectors.buttons.mute),
+ pip: getElement.call(this, this.config.selectors.buttons.pip),
+ airplay: getElement.call(this, this.config.selectors.buttons.airplay),
+ settings: getElement.call(this, this.config.selectors.buttons.settings),
+ captions: getElement.call(this, this.config.selectors.buttons.captions),
+ fullscreen: getElement.call(this, this.config.selectors.buttons.fullscreen)
+ };
- // Find the UI controls and store references in custom controls
- // TODO: Allow settings menus with custom controls
- findElements: function findElements() {
- try {
- this.elements.controls = utils.getElement.call(this, this.config.selectors.controls.wrapper);
-
- // Buttons
- this.elements.buttons = {
- play: utils.getElements.call(this, this.config.selectors.buttons.play),
- pause: utils.getElement.call(this, this.config.selectors.buttons.pause),
- restart: utils.getElement.call(this, this.config.selectors.buttons.restart),
- rewind: utils.getElement.call(this, this.config.selectors.buttons.rewind),
- fastForward: utils.getElement.call(this, this.config.selectors.buttons.fastForward),
- mute: utils.getElement.call(this, this.config.selectors.buttons.mute),
- pip: utils.getElement.call(this, this.config.selectors.buttons.pip),
- airplay: utils.getElement.call(this, this.config.selectors.buttons.airplay),
- settings: utils.getElement.call(this, this.config.selectors.buttons.settings),
- captions: utils.getElement.call(this, this.config.selectors.buttons.captions),
- fullscreen: utils.getElement.call(this, this.config.selectors.buttons.fullscreen)
- };
+ // Progress
+ this.elements.progress = getElement.call(this, this.config.selectors.progress);
- // Progress
- this.elements.progress = utils.getElement.call(this, this.config.selectors.progress);
+ // Inputs
+ this.elements.inputs = {
+ seek: getElement.call(this, this.config.selectors.inputs.seek),
+ volume: getElement.call(this, this.config.selectors.inputs.volume)
+ };
- // Inputs
- this.elements.inputs = {
- seek: utils.getElement.call(this, this.config.selectors.inputs.seek),
- volume: utils.getElement.call(this, this.config.selectors.inputs.volume)
- };
+ // Display
+ this.elements.display = {
+ buffer: getElement.call(this, this.config.selectors.display.buffer),
+ currentTime: getElement.call(this, this.config.selectors.display.currentTime),
+ duration: getElement.call(this, this.config.selectors.display.duration)
+ };
- // Display
- this.elements.display = {
- buffer: utils.getElement.call(this, this.config.selectors.display.buffer),
- currentTime: utils.getElement.call(this, this.config.selectors.display.currentTime),
- duration: utils.getElement.call(this, this.config.selectors.display.duration)
- };
+ // Seek tooltip
+ if (is.element(this.elements.progress)) {
+ this.elements.display.seekTooltip = this.elements.progress.querySelector('.' + this.config.classNames.tooltip);
+ }
- // Seek tooltip
- if (utils.is.element(this.elements.progress)) {
- this.elements.display.seekTooltip = this.elements.progress.querySelector('.' + this.config.classNames.tooltip);
+ return true;
+ } catch (error) {
+ // Log it
+ this.debug.warn('It looks like there is a problem with your custom controls HTML', error);
+
+ // Restore native video controls
+ this.toggleNativeControls(true);
+
+ return false;
}
+ },
- return true;
- } catch (error) {
- // Log it
- this.debug.warn('It looks like there is a problem with your custom controls HTML', error);
- // Restore native video controls
- this.toggleNativeControls(true);
+ // Create <svg> icon
+ createIcon: function createIcon(type, attributes) {
+ var namespace = 'http://www.w3.org/2000/svg';
+ var iconUrl = controls.getIconUrl.call(this);
+ var iconPath = (!iconUrl.cors ? iconUrl.url : '') + '#' + this.config.iconPrefix;
- return false;
- }
- },
+ // Create <svg>
+ var icon = document.createElementNS(namespace, 'svg');
+ setAttributes(icon, extend(attributes, {
+ role: 'presentation',
+ focusable: 'false'
+ }));
+ // Create the <use> to reference sprite
+ var use = document.createElementNS(namespace, 'use');
+ var path = iconPath + '-' + type;
- // Create <svg> icon
- createIcon: function createIcon(type, attributes) {
- var namespace = 'http://www.w3.org/2000/svg';
- var iconUrl = controls.getIconUrl.call(this);
- var iconPath = (!iconUrl.cors ? iconUrl.url : '') + '#' + this.config.iconPrefix;
+ // Set `href` attributes
+ // https://github.com/sampotts/plyr/issues/460
+ // https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/xlink:href
+ if ('href' in use) {
+ use.setAttributeNS('http://www.w3.org/1999/xlink', 'href', path);
+ } else {
+ use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path);
+ }
- // Create <svg>
- var icon = document.createElementNS(namespace, 'svg');
- utils.setAttributes(icon, utils.extend(attributes, {
- role: 'presentation',
- focusable: 'false'
- }));
+ // Add <use> to <svg>
+ icon.appendChild(use);
- // Create the <use> to reference sprite
- var use = document.createElementNS(namespace, 'use');
- var path = iconPath + '-' + type;
+ return icon;
+ },
- // Set `href` attributes
- // https://github.com/sampotts/plyr/issues/460
- // https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/xlink:href
- if ('href' in use) {
- use.setAttributeNS('http://www.w3.org/1999/xlink', 'href', path);
- } else {
- use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path);
- }
- // Add <use> to <svg>
- icon.appendChild(use);
+ // Create hidden text label
+ createLabel: function createLabel(type) {
+ var attr = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
- return icon;
- },
+ // Skip i18n for abbreviations and brand names
+ var universals = {
+ pip: 'PIP',
+ airplay: 'AirPlay'
+ };
+ var text = universals[type] || i18n.get(type, this.config);
+ var attributes = Object.assign({}, attr, {
+ class: [attr.class, this.config.classNames.hidden].filter(Boolean).join(' ')
+ });
+ return createElement('span', attributes, text);
+ },
- // Create hidden text label
- createLabel: function createLabel(type, attr) {
- var text = i18n.get(type, this.config);
- var attributes = Object.assign({}, attr);
- switch (type) {
- case 'pip':
- text = 'PIP';
- break;
+ // Create a badge
+ createBadge: function createBadge(text) {
+ if (is.empty(text)) {
+ return null;
+ }
- case 'airplay':
- text = 'AirPlay';
- break;
+ var badge = createElement('span', {
+ class: this.config.classNames.menu.value
+ });
- default:
- break;
- }
+ badge.appendChild(createElement('span', {
+ class: this.config.classNames.menu.badge
+ }, text));
- if ('class' in attributes) {
- attributes.class += ' ' + this.config.classNames.hidden;
- } else {
- attributes.class = this.config.classNames.hidden;
- }
+ return badge;
+ },
- return utils.createElement('span', attributes, text);
- },
+ // Create a <button>
+ createButton: function createButton(buttonType, attr) {
+ var button = createElement('button');
+ var attributes = Object.assign({}, attr);
+ var type = toCamelCase(buttonType);
- // Create a badge
- createBadge: function createBadge(text) {
- if (utils.is.empty(text)) {
- return null;
- }
+ var toggle = false;
+ var label = void 0;
+ var icon = void 0;
+ var labelPressed = void 0;
+ var iconPressed = void 0;
- var badge = utils.createElement('span', {
- class: this.config.classNames.menu.value
- });
+ if (!('type' in attributes)) {
+ attributes.type = 'button';
+ }
- badge.appendChild(utils.createElement('span', {
- class: this.config.classNames.menu.badge
- }, text));
+ if ('class' in attributes) {
+ if (attributes.class.includes(this.config.classNames.control)) {
+ attributes.class += ' ' + this.config.classNames.control;
+ }
+ } else {
+ attributes.class = this.config.classNames.control;
+ }
- return badge;
- },
+ // Large play button
+ switch (buttonType) {
+ case 'play':
+ toggle = true;
+ label = 'play';
+ labelPressed = 'pause';
+ icon = 'play';
+ iconPressed = 'pause';
+ break;
+ case 'mute':
+ toggle = true;
+ label = 'mute';
+ labelPressed = 'unmute';
+ icon = 'volume';
+ iconPressed = 'muted';
+ break;
- // Create a <button>
- createButton: function createButton(buttonType, attr) {
- var button = utils.createElement('button');
- var attributes = Object.assign({}, attr);
- var type = utils.toCamelCase(buttonType);
+ case 'captions':
+ toggle = true;
+ label = 'enableCaptions';
+ labelPressed = 'disableCaptions';
+ icon = 'captions-off';
+ iconPressed = 'captions-on';
+ break;
- var toggle = false;
- var label = void 0;
- var icon = void 0;
- var labelPressed = void 0;
- var iconPressed = void 0;
+ case 'fullscreen':
+ toggle = true;
+ label = 'enterFullscreen';
+ labelPressed = 'exitFullscreen';
+ icon = 'enter-fullscreen';
+ iconPressed = 'exit-fullscreen';
+ break;
- if (!('type' in attributes)) {
- attributes.type = 'button';
- }
+ case 'play-large':
+ attributes.class += ' ' + this.config.classNames.control + '--overlaid';
+ type = 'play';
+ label = 'play';
+ icon = 'play';
+ break;
- if ('class' in attributes) {
- if (attributes.class.includes(this.config.classNames.control)) {
- attributes.class += ' ' + this.config.classNames.control;
+ default:
+ label = type;
+ icon = buttonType;
}
- } else {
- attributes.class = this.config.classNames.control;
- }
- // Large play button
- switch (buttonType) {
- case 'play':
- toggle = true;
- label = 'play';
- labelPressed = 'pause';
- icon = 'play';
- iconPressed = 'pause';
- break;
-
- case 'mute':
- toggle = true;
- label = 'mute';
- labelPressed = 'unmute';
- icon = 'volume';
- iconPressed = 'muted';
- break;
-
- case 'captions':
- toggle = true;
- label = 'enableCaptions';
- labelPressed = 'disableCaptions';
- icon = 'captions-off';
- iconPressed = 'captions-on';
- break;
-
- case 'fullscreen':
- toggle = true;
- label = 'enterFullscreen';
- labelPressed = 'exitFullscreen';
- icon = 'enter-fullscreen';
- iconPressed = 'exit-fullscreen';
- break;
-
- case 'play-large':
- attributes.class += ' ' + this.config.classNames.control + '--overlaid';
- type = 'play';
- label = 'play';
- icon = 'play';
- break;
-
- default:
- label = type;
- icon = buttonType;
- }
+ // Setup toggle icon and labels
+ if (toggle) {
+ // Icon
+ button.appendChild(controls.createIcon.call(this, iconPressed, { class: 'icon--pressed' }));
+ button.appendChild(controls.createIcon.call(this, icon, { class: 'icon--not-pressed' }));
- // Setup toggle icon and labels
- if (toggle) {
- // Icon
- button.appendChild(controls.createIcon.call(this, iconPressed, { class: 'icon--pressed' }));
- button.appendChild(controls.createIcon.call(this, icon, { class: 'icon--not-pressed' }));
+ // Label/Tooltip
+ button.appendChild(controls.createLabel.call(this, labelPressed, { class: 'label--pressed' }));
+ button.appendChild(controls.createLabel.call(this, label, { class: 'label--not-pressed' }));
+ } else {
+ button.appendChild(controls.createIcon.call(this, icon));
+ button.appendChild(controls.createLabel.call(this, label));
+ }
- // Label/Tooltip
- button.appendChild(controls.createLabel.call(this, labelPressed, { class: 'label--pressed' }));
- button.appendChild(controls.createLabel.call(this, label, { class: 'label--not-pressed' }));
- } else {
- button.appendChild(controls.createIcon.call(this, icon));
- button.appendChild(controls.createLabel.call(this, label));
- }
+ // Merge attributes
+ extend(attributes, getAttributesFromSelector(this.config.selectors.buttons[type], attributes));
- // Merge attributes
- utils.extend(attributes, utils.getAttributesFromSelector(this.config.selectors.buttons[type], attributes));
+ setAttributes(button, attributes);
- utils.setAttributes(button, attributes);
+ // We have multiple play buttons
+ if (type === 'play') {
+ if (!is.array(this.elements.buttons[type])) {
+ this.elements.buttons[type] = [];
+ }
- // We have multiple play buttons
- if (type === 'play') {
- if (!utils.is.array(this.elements.buttons[type])) {
- this.elements.buttons[type] = [];
+ this.elements.buttons[type].push(button);
+ } else {
+ this.elements.buttons[type] = button;
}
- this.elements.buttons[type].push(button);
- } else {
- this.elements.buttons[type] = button;
- }
+ // Toggle classname when pressed property is set
+ var className = this.config.classNames.controlPressed;
+ Object.defineProperty(button, 'pressed', {
+ enumerable: true,
+ get: function get$$1() {
+ return hasClass(button, className);
+ },
+ set: function set$$1() {
+ var pressed = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
- // Toggle classname when pressed property is set
- var className = this.config.classNames.controlPressed;
- Object.defineProperty(button, 'pressed', {
- enumerable: true,
- get: function get$$1() {
- return utils.hasClass(button, className);
- },
- set: function set$$1() {
- var pressed = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
+ toggleClass(button, className, pressed);
+ }
+ });
- utils.toggleClass(button, className, pressed);
- }
- });
+ return button;
+ },
- return button;
- },
-
-
- // Create an <input type='range'>
- createRange: function createRange(type, attributes) {
- // Seek input
- var input = utils.createElement('input', utils.extend(utils.getAttributesFromSelector(this.config.selectors.inputs[type]), {
- type: 'range',
- min: 0,
- max: 100,
- step: 0.01,
- value: 0,
- autocomplete: 'off',
- // A11y fixes for https://github.com/sampotts/plyr/issues/905
- role: 'slider',
- 'aria-label': i18n.get(type, this.config),
- 'aria-valuemin': 0,
- 'aria-valuemax': 100,
- 'aria-valuenow': 0
- }, attributes));
-
- this.elements.inputs[type] = input;
-
- // Set the fill for webkit now
- controls.updateRangeFill.call(this, input);
-
- return input;
- },
-
-
- // Create a <progress>
- createProgress: function createProgress(type, attributes) {
- var progress = utils.createElement('progress', utils.extend(utils.getAttributesFromSelector(this.config.selectors.display[type]), {
- min: 0,
- max: 100,
- value: 0,
- role: 'presentation',
- 'aria-hidden': true
- }, attributes));
-
- // Create the label inside
- if (type !== 'volume') {
- progress.appendChild(utils.createElement('span', null, '0'));
-
- var suffix = '';
- switch (type) {
- case 'played':
- suffix = i18n.get('played', this.config);
- break;
- case 'buffer':
- suffix = i18n.get('buffered', this.config);
- break;
+ // Create an <input type='range'>
+ createRange: function createRange(type, attributes) {
+ // Seek input
+ var input = createElement('input', extend(getAttributesFromSelector(this.config.selectors.inputs[type]), {
+ type: 'range',
+ min: 0,
+ max: 100,
+ step: 0.01,
+ value: 0,
+ autocomplete: 'off',
+ // A11y fixes for https://github.com/sampotts/plyr/issues/905
+ role: 'slider',
+ 'aria-label': i18n.get(type, this.config),
+ 'aria-valuemin': 0,
+ 'aria-valuemax': 100,
+ 'aria-valuenow': 0
+ }, attributes));
+
+ this.elements.inputs[type] = input;
+
+ // Set the fill for webkit now
+ controls.updateRangeFill.call(this, input);
- default:
- break;
- }
+ return input;
+ },
- progress.innerText = '% ' + suffix.toLowerCase();
- }
- this.elements.display[type] = progress;
+ // Create a <progress>
+ createProgress: function createProgress(type, attributes) {
+ var progress = createElement('progress', extend(getAttributesFromSelector(this.config.selectors.display[type]), {
+ min: 0,
+ max: 100,
+ value: 0,
+ role: 'presentation',
+ 'aria-hidden': true
+ }, attributes));
- return progress;
- },
+ // Create the label inside
+ if (type !== 'volume') {
+ progress.appendChild(createElement('span', null, '0'));
+ var suffixKey = {
+ played: 'played',
+ buffer: 'buffered'
+ }[type];
+ var suffix = suffixKey ? i18n.get(suffixKey, this.config) : '';
- // Create time display
- createTime: function createTime(type) {
- var attributes = utils.getAttributesFromSelector(this.config.selectors.display[type]);
+ progress.innerText = '% ' + suffix.toLowerCase();
+ }
- var container = utils.createElement('div', utils.extend(attributes, {
- class: 'plyr__time ' + attributes.class,
- 'aria-label': i18n.get(type, this.config)
- }), '00:00');
+ this.elements.display[type] = progress;
- // Reference for updates
- this.elements.display[type] = container;
+ return progress;
+ },
- return container;
- },
+ // Create time display
+ createTime: function createTime(type) {
+ var attributes = getAttributesFromSelector(this.config.selectors.display[type]);
- // Create a settings menu item
- createMenuItem: function createMenuItem(_ref) {
- var value = _ref.value,
- list = _ref.list,
- type = _ref.type,
- title = _ref.title,
- _ref$badge = _ref.badge,
- badge = _ref$badge === undefined ? null : _ref$badge,
- _ref$checked = _ref.checked,
- checked = _ref$checked === undefined ? false : _ref$checked;
+ var container = createElement('div', extend(attributes, {
+ class: 'plyr__time ' + attributes.class,
+ 'aria-label': i18n.get(type, this.config)
+ }), '00:00');
- var item = utils.createElement('li');
+ // Reference for updates
+ this.elements.display[type] = container;
- var label = utils.createElement('label', {
- class: this.config.classNames.control
- });
+ return container;
+ },
- var radio = utils.createElement('input', utils.extend(utils.getAttributesFromSelector(this.config.selectors.inputs[type]), {
- type: 'radio',
- name: 'plyr-' + type,
- value: value,
- checked: checked,
- class: 'plyr__sr-only'
- }));
- var faux = utils.createElement('span', { hidden: '' });
+ // Create a settings menu item
+ createMenuItem: function createMenuItem(_ref) {
+ var value = _ref.value,
+ list = _ref.list,
+ type = _ref.type,
+ title = _ref.title,
+ _ref$badge = _ref.badge,
+ badge = _ref$badge === undefined ? null : _ref$badge,
+ _ref$checked = _ref.checked,
+ checked = _ref$checked === undefined ? false : _ref$checked;
- label.appendChild(radio);
- label.appendChild(faux);
- label.insertAdjacentHTML('beforeend', title);
+ var item = createElement('li');
- if (utils.is.element(badge)) {
- label.appendChild(badge);
- }
+ var label = createElement('label', {
+ class: this.config.classNames.control
+ });
- item.appendChild(label);
- list.appendChild(item);
- },
+ var radio = createElement('input', extend(getAttributesFromSelector(this.config.selectors.inputs[type]), {
+ type: 'radio',
+ name: 'plyr-' + type,
+ value: value,
+ checked: checked,
+ class: 'plyr__sr-only'
+ }));
+ var faux = createElement('span', { hidden: '' });
- // Format a time for display
- formatTime: function formatTime() {
- var time = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
- var inverted = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
+ label.appendChild(radio);
+ label.appendChild(faux);
+ label.insertAdjacentHTML('beforeend', title);
- // Bail if the value isn't a number
- if (!utils.is.number(time)) {
- return time;
- }
+ if (is.element(badge)) {
+ label.appendChild(badge);
+ }
- // Always display hours if duration is over an hour
- var forceHours = utils.getHours(this.duration) > 0;
+ item.appendChild(label);
+ list.appendChild(item);
+ },
- return utils.formatTime(time, forceHours, inverted);
- },
+ // Format a time for display
+ formatTime: function formatTime$$1() {
+ var time = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
+ var inverted = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
- // Update the displayed time
- updateTimeDisplay: function updateTimeDisplay() {
- var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
- var time = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
- var inverted = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
+ // Bail if the value isn't a number
+ if (!is.number(time)) {
+ return time;
+ }
- // Bail if there's no element to display or the value isn't a number
- if (!utils.is.element(target) || !utils.is.number(time)) {
- return;
- }
+ // Always display hours if duration is over an hour
+ var forceHours = getHours(this.duration) > 0;
- // eslint-disable-next-line no-param-reassign
- target.innerText = controls.formatTime(time, inverted);
- },
+ return formatTime(time, forceHours, inverted);
+ },
- // Update volume UI and storage
- updateVolume: function updateVolume() {
- if (!this.supported.ui) {
- return;
- }
+ // Update the displayed time
+ updateTimeDisplay: function updateTimeDisplay() {
+ var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
+ var time = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
+ var inverted = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
- // Update range
- if (utils.is.element(this.elements.inputs.volume)) {
- controls.setRange.call(this, this.elements.inputs.volume, this.muted ? 0 : this.volume);
- }
+ // Bail if there's no element to display or the value isn't a number
+ if (!is.element(target) || !is.number(time)) {
+ return;
+ }
- // Update mute state
- if (utils.is.element(this.elements.buttons.mute)) {
- this.elements.buttons.mute.pressed = this.muted || this.volume === 0;
- }
- },
+ // eslint-disable-next-line no-param-reassign
+ target.innerText = controls.formatTime(time, inverted);
+ },
- // Update seek value and lower fill
- setRange: function setRange(target) {
- var value = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
+ // Update volume UI and storage
+ updateVolume: function updateVolume() {
+ if (!this.supported.ui) {
+ return;
+ }
- if (!utils.is.element(target)) {
- return;
- }
+ // Update range
+ if (is.element(this.elements.inputs.volume)) {
+ controls.setRange.call(this, this.elements.inputs.volume, this.muted ? 0 : this.volume);
+ }
- // eslint-disable-next-line
- target.value = value;
+ // Update mute state
+ if (is.element(this.elements.buttons.mute)) {
+ this.elements.buttons.mute.pressed = this.muted || this.volume === 0;
+ }
+ },
- // Webkit range fill
- controls.updateRangeFill.call(this, target);
- },
+ // Update seek value and lower fill
+ setRange: function setRange(target) {
+ var value = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
- // Update <progress> elements
- updateProgress: function updateProgress(event) {
- var _this = this;
+ if (!is.element(target)) {
+ return;
+ }
- if (!this.supported.ui || !utils.is.event(event)) {
- return;
- }
+ // eslint-disable-next-line
+ target.value = value;
- var value = 0;
+ // Webkit range fill
+ controls.updateRangeFill.call(this, target);
+ },
- var setProgress = function setProgress(target, input) {
- var value = utils.is.number(input) ? input : 0;
- var progress = utils.is.element(target) ? target : _this.elements.display.buffer;
- // Update value and label
- if (utils.is.element(progress)) {
- progress.value = value;
+ // Update <progress> elements
+ updateProgress: function updateProgress(event) {
+ var _this = this;
- // Update text label inside
- var label = progress.getElementsByTagName('span')[0];
- if (utils.is.element(label)) {
- label.childNodes[0].nodeValue = value;
- }
+ if (!this.supported.ui || !is.event(event)) {
+ return;
}
- };
- if (event) {
- switch (event.type) {
- // Video playing
- case 'timeupdate':
- case 'seeking':
- case 'seeked':
- value = utils.getPercentage(this.currentTime, this.duration);
-
- // Set seek range value only if it's a 'natural' time event
- if (event.type === 'timeupdate') {
- controls.setRange.call(this, this.elements.inputs.seek, value);
+ var value = 0;
+
+ var setProgress = function setProgress(target, input) {
+ var value = is.number(input) ? input : 0;
+ var progress = is.element(target) ? target : _this.elements.display.buffer;
+
+ // Update value and label
+ if (is.element(progress)) {
+ progress.value = value;
+
+ // Update text label inside
+ var label = progress.getElementsByTagName('span')[0];
+ if (is.element(label)) {
+ label.childNodes[0].nodeValue = value;
}
+ }
+ };
- break;
+ if (event) {
+ switch (event.type) {
+ // Video playing
+ case 'timeupdate':
+ case 'seeking':
+ case 'seeked':
+ value = getPercentage(this.currentTime, this.duration);
+
+ // Set seek range value only if it's a 'natural' time event
+ if (event.type === 'timeupdate') {
+ controls.setRange.call(this, this.elements.inputs.seek, value);
+ }
- // Check buffer status
- case 'playing':
- case 'progress':
- setProgress(this.elements.display.buffer, this.buffered * 100);
+ break;
- break;
+ // Check buffer status
+ case 'playing':
+ case 'progress':
+ setProgress(this.elements.display.buffer, this.buffered * 100);
- default:
- break;
+ break;
+
+ default:
+ break;
+ }
}
- }
- },
+ },
- // Webkit polyfill for lower fill range
- updateRangeFill: function updateRangeFill(target) {
- // Get range from event if event passed
- var range = utils.is.event(target) ? target.target : target;
+ // Webkit polyfill for lower fill range
+ updateRangeFill: function updateRangeFill(target) {
+ // Get range from event if event passed
+ var range = is.event(target) ? target.target : target;
- // Needs to be a valid <input type='range'>
- if (!utils.is.element(range) || range.getAttribute('type') !== 'range') {
- return;
- }
+ // Needs to be a valid <input type='range'>
+ if (!is.element(range) || range.getAttribute('type') !== 'range') {
+ return;
+ }
- // Set aria values for https://github.com/sampotts/plyr/issues/905
- if (utils.matches(range, this.config.selectors.inputs.seek)) {
- range.setAttribute('aria-valuenow', this.currentTime);
- var currentTime = controls.formatTime(this.currentTime);
- var duration = controls.formatTime(this.duration);
- var format = i18n.get('seekLabel', this.config);
- range.setAttribute('aria-valuetext', format.replace('{currentTime}', currentTime).replace('{duration}', duration));
- } else if (utils.matches(range, this.config.selectors.inputs.volume)) {
- var percent = range.value * 100;
- range.setAttribute('aria-valuenow', percent);
- range.setAttribute('aria-valuetext', percent + '%');
- } else {
- range.setAttribute('aria-valuenow', range.value);
- }
+ // Set aria values for https://github.com/sampotts/plyr/issues/905
+ if (matches(range, this.config.selectors.inputs.seek)) {
+ range.setAttribute('aria-valuenow', this.currentTime);
+ var currentTime = controls.formatTime(this.currentTime);
+ var duration = controls.formatTime(this.duration);
+ var format$$1 = i18n.get('seekLabel', this.config);
+ range.setAttribute('aria-valuetext', format$$1.replace('{currentTime}', currentTime).replace('{duration}', duration));
+ } else if (matches(range, this.config.selectors.inputs.volume)) {
+ var percent = range.value * 100;
+ range.setAttribute('aria-valuenow', percent);
+ range.setAttribute('aria-valuetext', percent + '%');
+ } else {
+ range.setAttribute('aria-valuenow', range.value);
+ }
- // WebKit only
- if (!browser.isWebkit) {
- return;
- }
+ // WebKit only
+ if (!browser.isWebkit) {
+ return;
+ }
- // Set CSS custom property
- range.style.setProperty('--value', range.value / range.max * 100 + '%');
- },
+ // Set CSS custom property
+ range.style.setProperty('--value', range.value / range.max * 100 + '%');
+ },
- // Update hover tooltip for seeking
- updateSeekTooltip: function updateSeekTooltip(event) {
- var _this2 = this;
+ // Update hover tooltip for seeking
+ updateSeekTooltip: function updateSeekTooltip(event) {
+ var _this2 = this;
- // Bail if setting not true
- if (!this.config.tooltips.seek || !utils.is.element(this.elements.inputs.seek) || !utils.is.element(this.elements.display.seekTooltip) || this.duration === 0) {
- return;
- }
+ // Bail if setting not true
+ if (!this.config.tooltips.seek || !is.element(this.elements.inputs.seek) || !is.element(this.elements.display.seekTooltip) || this.duration === 0) {
+ return;
+ }
- // Calculate percentage
- var percent = 0;
- var clientRect = this.elements.progress.getBoundingClientRect();
- var visible = this.config.classNames.tooltip + '--visible';
+ // Calculate percentage
+ var percent = 0;
+ var clientRect = this.elements.progress.getBoundingClientRect();
+ var visible = this.config.classNames.tooltip + '--visible';
- var toggle = function toggle(_toggle) {
- utils.toggleClass(_this2.elements.display.seekTooltip, visible, _toggle);
- };
+ var toggle = function toggle(_toggle) {
+ toggleClass(_this2.elements.display.seekTooltip, visible, _toggle);
+ };
- // Hide on touch
- if (this.touch) {
- toggle(false);
- return;
- }
+ // Hide on touch
+ if (this.touch) {
+ toggle(false);
+ return;
+ }
- // Determine percentage, if already visible
- if (utils.is.event(event)) {
- percent = 100 / clientRect.width * (event.pageX - clientRect.left);
- } else if (utils.hasClass(this.elements.display.seekTooltip, visible)) {
- percent = parseFloat(this.elements.display.seekTooltip.style.left, 10);
- } else {
- return;
- }
+ // Determine percentage, if already visible
+ if (is.event(event)) {
+ percent = 100 / clientRect.width * (event.pageX - clientRect.left);
+ } else if (hasClass(this.elements.display.seekTooltip, visible)) {
+ percent = parseFloat(this.elements.display.seekTooltip.style.left, 10);
+ } else {
+ return;
+ }
- // Set bounds
- if (percent < 0) {
- percent = 0;
- } else if (percent > 100) {
- percent = 100;
- }
+ // Set bounds
+ if (percent < 0) {
+ percent = 0;
+ } else if (percent > 100) {
+ percent = 100;
+ }
- // Display the time a click would seek to
- controls.updateTimeDisplay.call(this, this.elements.display.seekTooltip, this.duration / 100 * percent);
+ // Display the time a click would seek to
+ controls.updateTimeDisplay.call(this, this.elements.display.seekTooltip, this.duration / 100 * percent);
- // Set position
- this.elements.display.seekTooltip.style.left = percent + '%';
+ // Set position
+ this.elements.display.seekTooltip.style.left = percent + '%';
- // Show/hide the tooltip
- // If the event is a moues in/out and percentage is inside bounds
- if (utils.is.event(event) && ['mouseenter', 'mouseleave'].includes(event.type)) {
- toggle(event.type === 'mouseenter');
- }
- },
+ // Show/hide the tooltip
+ // If the event is a moues in/out and percentage is inside bounds
+ if (is.event(event) && ['mouseenter', 'mouseleave'].includes(event.type)) {
+ toggle(event.type === 'mouseenter');
+ }
+ },
- // Handle time change event
- timeUpdate: function timeUpdate(event) {
- // Only invert if only one time element is displayed and used for both duration and currentTime
- var invert = !utils.is.element(this.elements.display.duration) && this.config.invertTime;
+ // Handle time change event
+ timeUpdate: function timeUpdate(event) {
+ // Only invert if only one time element is displayed and used for both duration and currentTime
+ var invert = !is.element(this.elements.display.duration) && this.config.invertTime;
- // Duration
- controls.updateTimeDisplay.call(this, this.elements.display.currentTime, invert ? this.duration - this.currentTime : this.currentTime, invert);
+ // Duration
+ controls.updateTimeDisplay.call(this, this.elements.display.currentTime, invert ? this.duration - this.currentTime : this.currentTime, invert);
- // Ignore updates while seeking
- if (event && event.type === 'timeupdate' && this.media.seeking) {
- return;
- }
+ // Ignore updates while seeking
+ if (event && event.type === 'timeupdate' && this.media.seeking) {
+ return;
+ }
- // Playing progress
- controls.updateProgress.call(this, event);
- },
+ // Playing progress
+ controls.updateProgress.call(this, event);
+ },
- // Show the duration on metadataloaded or durationchange events
- durationUpdate: function durationUpdate() {
- // Bail if no UI or durationchange event triggered after playing/seek when invertTime is false
- if (!this.supported.ui || !this.config.invertTime && this.currentTime) {
- return;
- }
+ // Show the duration on metadataloaded or durationchange events
+ durationUpdate: function durationUpdate() {
+ // Bail if no UI or durationchange event triggered after playing/seek when invertTime is false
+ if (!this.supported.ui || !this.config.invertTime && this.currentTime) {
+ return;
+ }
- // Update ARIA values
- if (utils.is.element(this.elements.inputs.seek)) {
- this.elements.inputs.seek.setAttribute('aria-valuemax', this.duration);
- }
+ // Update ARIA values
+ if (is.element(this.elements.inputs.seek)) {
+ this.elements.inputs.seek.setAttribute('aria-valuemax', this.duration);
+ }
- // If there's a spot to display duration
- var hasDuration = utils.is.element(this.elements.display.duration);
+ // If there's a spot to display duration
+ var hasDuration = is.element(this.elements.display.duration);
- // If there's only one time display, display duration there
- if (!hasDuration && this.config.displayDuration && this.paused) {
- controls.updateTimeDisplay.call(this, this.elements.display.currentTime, this.duration);
- }
+ // If there's only one time display, display duration there
+ if (!hasDuration && this.config.displayDuration && this.paused) {
+ controls.updateTimeDisplay.call(this, this.elements.display.currentTime, this.duration);
+ }
- // If there's a duration element, update content
- if (hasDuration) {
- controls.updateTimeDisplay.call(this, this.elements.display.duration, this.duration);
- }
+ // If there's a duration element, update content
+ if (hasDuration) {
+ controls.updateTimeDisplay.call(this, this.elements.display.duration, this.duration);
+ }
- // Update the tooltip (if visible)
- controls.updateSeekTooltip.call(this);
- },
+ // Update the tooltip (if visible)
+ controls.updateSeekTooltip.call(this);
+ },
- // Hide/show a tab
- toggleTab: function toggleTab(setting, toggle) {
- utils.toggleHidden(this.elements.settings.tabs[setting], !toggle);
- },
+ // Hide/show a tab
+ toggleTab: function toggleTab(setting, toggle) {
+ toggleHidden(this.elements.settings.tabs[setting], !toggle);
+ },
- // Set the quality menu
- // TODO: Vimeo support
- setQualityMenu: function setQualityMenu(options) {
- var _this3 = this;
+ // Set the quality menu
+ setQualityMenu: function setQualityMenu(options) {
+ var _this3 = this;
- // Menu required
- if (!utils.is.element(this.elements.settings.panes.quality)) {
- return;
- }
+ // Menu required
+ if (!is.element(this.elements.settings.panes.quality)) {
+ return;
+ }
- var type = 'quality';
- var list = this.elements.settings.panes.quality.querySelector('ul');
+ var type = 'quality';
+ var list = this.elements.settings.panes.quality.querySelector('ul');
- // Set options if passed and filter based on config
- if (utils.is.array(options)) {
- this.options.quality = options.filter(function (quality) {
- return _this3.config.quality.options.includes(quality);
- });
- }
+ // Set options if passed and filter based on uniqueness and config
+ if (is.array(options)) {
+ this.options.quality = dedupe(options).filter(function (quality) {
+ return _this3.config.quality.options.includes(quality);
+ });
+ }
- // Toggle the pane and tab
- var toggle = !utils.is.empty(this.options.quality) && this.options.quality.length > 1;
- controls.toggleTab.call(this, type, toggle);
+ // Toggle the pane and tab
+ var toggle = !is.empty(this.options.quality) && this.options.quality.length > 1;
+ controls.toggleTab.call(this, type, toggle);
- // Check if we need to toggle the parent
- controls.checkMenu.call(this);
+ // Check if we need to toggle the parent
+ controls.checkMenu.call(this);
- // If we're hiding, nothing more to do
- if (!toggle) {
- return;
- }
+ // If we're hiding, nothing more to do
+ if (!toggle) {
+ return;
+ }
- // Empty the menu
- utils.emptyElement(list);
+ // Empty the menu
+ emptyElement(list);
- // Get the badge HTML for HD, 4K etc
- var getBadge = function getBadge(quality) {
- var label = i18n.get('qualityBadge.' + quality, _this3.config);
+ // Get the badge HTML for HD, 4K etc
+ var getBadge = function getBadge(quality) {
+ var label = i18n.get('qualityBadge.' + quality, _this3.config);
- if (!label.length) {
- return null;
- }
+ if (!label.length) {
+ return null;
+ }
- return controls.createBadge.call(_this3, label);
- };
+ return controls.createBadge.call(_this3, label);
+ };
- // Sort options by the config and then render options
- this.options.quality.sort(function (a, b) {
- var sorting = _this3.config.quality.options;
- return sorting.indexOf(a) > sorting.indexOf(b) ? 1 : -1;
- }).forEach(function (quality) {
- controls.createMenuItem.call(_this3, {
- value: quality,
- list: list,
- type: type,
- title: controls.getLabel.call(_this3, 'quality', quality),
- badge: getBadge(quality)
+ // Sort options by the config and then render options
+ this.options.quality.sort(function (a, b) {
+ var sorting = _this3.config.quality.options;
+ return sorting.indexOf(a) > sorting.indexOf(b) ? 1 : -1;
+ }).forEach(function (quality) {
+ controls.createMenuItem.call(_this3, {
+ value: quality,
+ list: list,
+ type: type,
+ title: controls.getLabel.call(_this3, 'quality', quality),
+ badge: getBadge(quality)
+ });
});
- });
- controls.updateSetting.call(this, type, list);
- },
+ controls.updateSetting.call(this, type, list);
+ },
- // Translate a value into a nice label
- getLabel: function getLabel(setting, value) {
- switch (setting) {
- case 'speed':
- return value === 1 ? i18n.get('normal', this.config) : value + '&times;';
+ // Translate a value into a nice label
+ getLabel: function getLabel(setting, value) {
+ switch (setting) {
+ case 'speed':
+ return value === 1 ? i18n.get('normal', this.config) : value + '&times;';
- case 'quality':
- if (utils.is.number(value)) {
- var label = i18n.get('qualityLabel.' + value, this.config);
+ case 'quality':
+ if (is.number(value)) {
+ var label = i18n.get('qualityLabel.' + value, this.config);
- if (!label.length) {
- return value + 'p';
- }
+ if (!label.length) {
+ return value + 'p';
+ }
- return label;
- }
+ return label;
+ }
- return utils.toTitleCase(value);
+ return toTitleCase(value);
- case 'captions':
- return captions.getLabel.call(this);
+ case 'captions':
+ return captions.getLabel.call(this);
- default:
- return null;
- }
- },
+ default:
+ return null;
+ }
+ },
- // Update the selected setting
- updateSetting: function updateSetting(setting, container, input) {
- var pane = this.elements.settings.panes[setting];
- var value = null;
- var list = container;
+ // Update the selected setting
+ updateSetting: function updateSetting(setting, container, input) {
+ var pane = this.elements.settings.panes[setting];
+ var value = null;
+ var list = container;
- switch (setting) {
- case 'captions':
+ if (setting === 'captions') {
value = this.currentTrack;
- break;
-
- default:
- value = !utils.is.empty(input) ? input : this[setting];
+ } else {
+ value = !is.empty(input) ? input : this[setting];
// Get default
- if (utils.is.empty(value)) {
+ if (is.empty(value)) {
value = this.config[setting].default;
}
// Unsupported value
- if (!utils.is.empty(this.options[setting]) && !this.options[setting].includes(value)) {
+ if (!is.empty(this.options[setting]) && !this.options[setting].includes(value)) {
this.debug.warn('Unsupported value of \'' + value + '\' for ' + setting);
return;
}
@@ -2570,5005 +2002,5501 @@ var controls = {
this.debug.warn('Disabled value of \'' + value + '\' for ' + setting);
return;
}
+ }
- break;
- }
+ // Get the list if we need to
+ if (!is.element(list)) {
+ list = pane && pane.querySelector('ul');
+ }
- // Get the list if we need to
- if (!utils.is.element(list)) {
- list = pane && pane.querySelector('ul');
- }
+ // If there's no list it means it's not been rendered...
+ if (!is.element(list)) {
+ return;
+ }
- // If there's no list it means it's not been rendered...
- if (!utils.is.element(list)) {
- return;
- }
+ // Update the label
+ var label = this.elements.settings.tabs[setting].querySelector('.' + this.config.classNames.menu.value);
+ label.innerHTML = controls.getLabel.call(this, setting, value);
- // Update the label
- var label = this.elements.settings.tabs[setting].querySelector('.' + this.config.classNames.menu.value);
- label.innerHTML = controls.getLabel.call(this, setting, value);
+ // Find the radio option and check it
+ var target = list && list.querySelector('input[value="' + value + '"]');
- // Find the radio option and check it
- var target = list && list.querySelector('input[value="' + value + '"]');
+ if (is.element(target)) {
+ target.checked = true;
+ }
+ },
- if (utils.is.element(target)) {
- target.checked = true;
- }
- },
+ // Set the looping options
+ /* setLoopMenu() {
+ // Menu required
+ if (!is.element(this.elements.settings.panes.loop)) {
+ return;
+ }
+ const options = ['start', 'end', 'all', 'reset'];
+ const list = this.elements.settings.panes.loop.querySelector('ul');
+ // Show the pane and tab
+ toggleHidden(this.elements.settings.tabs.loop, false);
+ toggleHidden(this.elements.settings.panes.loop, false);
+ // Toggle the pane and tab
+ const toggle = !is.empty(this.loop.options);
+ controls.toggleTab.call(this, 'loop', toggle);
+ // Empty the menu
+ emptyElement(list);
+ options.forEach(option => {
+ const item = createElement('li');
+ const button = createElement(
+ 'button',
+ extend(getAttributesFromSelector(this.config.selectors.buttons.loop), {
+ type: 'button',
+ class: this.config.classNames.control,
+ 'data-plyr-loop-action': option,
+ }),
+ i18n.get(option, this.config)
+ );
+ if (['start', 'end'].includes(option)) {
+ const badge = controls.createBadge.call(this, '00:00');
+ button.appendChild(badge);
+ }
+ item.appendChild(button);
+ list.appendChild(item);
+ });
+ }, */
- // Set the looping options
- /* setLoopMenu() {
- // Menu required
- if (!utils.is.element(this.elements.settings.panes.loop)) {
- return;
- }
- const options = ['start', 'end', 'all', 'reset'];
- const list = this.elements.settings.panes.loop.querySelector('ul');
- // Show the pane and tab
- utils.toggleHidden(this.elements.settings.tabs.loop, false);
- utils.toggleHidden(this.elements.settings.panes.loop, false);
- // Toggle the pane and tab
- const toggle = !utils.is.empty(this.loop.options);
- controls.toggleTab.call(this, 'loop', toggle);
- // Empty the menu
- utils.emptyElement(list);
- options.forEach(option => {
- const item = utils.createElement('li');
- const button = utils.createElement(
- 'button',
- utils.extend(utils.getAttributesFromSelector(this.config.selectors.buttons.loop), {
- type: 'button',
- class: this.config.classNames.control,
- 'data-plyr-loop-action': option,
- }),
- i18n.get(option, this.config)
- );
- if (['start', 'end'].includes(option)) {
- const badge = controls.createBadge.call(this, '00:00');
- button.appendChild(badge);
- }
- item.appendChild(button);
- list.appendChild(item);
- });
- }, */
+ // Get current selected caption language
+ // TODO: rework this to user the getter in the API?
- // Get current selected caption language
- // TODO: rework this to user the getter in the API?
+ // Set a list of available captions languages
+ setCaptionsMenu: function setCaptionsMenu() {
+ var _this4 = this;
- // Set a list of available captions languages
- setCaptionsMenu: function setCaptionsMenu() {
- var _this4 = this;
+ // TODO: Captions or language? Currently it's mixed
+ var type = 'captions';
+ var list = this.elements.settings.panes.captions.querySelector('ul');
+ var tracks = captions.getTracks.call(this);
- // TODO: Captions or language? Currently it's mixed
- var type = 'captions';
- var list = this.elements.settings.panes.captions.querySelector('ul');
- var tracks = captions.getTracks.call(this);
+ // Toggle the pane and tab
+ controls.toggleTab.call(this, type, tracks.length);
- // Toggle the pane and tab
- controls.toggleTab.call(this, type, tracks.length);
+ // Empty the menu
+ emptyElement(list);
- // Empty the menu
- utils.emptyElement(list);
+ // Check if we need to toggle the parent
+ controls.checkMenu.call(this);
- // Check if we need to toggle the parent
- controls.checkMenu.call(this);
+ // If there's no captions, bail
+ if (!tracks.length) {
+ return;
+ }
- // If there's no captions, bail
- if (!tracks.length) {
- return;
- }
+ // Generate options data
+ var options = tracks.map(function (track, value) {
+ return {
+ value: value,
+ checked: _this4.captions.toggled && _this4.currentTrack === value,
+ title: captions.getLabel.call(_this4, track),
+ badge: track.language && controls.createBadge.call(_this4, track.language.toUpperCase()),
+ list: list,
+ type: 'language'
+ };
+ });
- // Generate options data
- var options = tracks.map(function (track, value) {
- return {
- value: value,
- checked: _this4.captions.active && _this4.currentTrack === value,
- title: captions.getLabel.call(_this4, track),
- badge: track.language && controls.createBadge.call(_this4, track.language.toUpperCase()),
+ // Add the "Disabled" option to turn off captions
+ options.unshift({
+ value: -1,
+ checked: !this.captions.toggled,
+ title: i18n.get('disabled', this.config),
list: list,
type: 'language'
- };
- });
-
- // Add the "Disabled" option to turn off captions
- options.unshift({
- value: -1,
- checked: !this.captions.active,
- title: i18n.get('disabled', this.config),
- list: list,
- type: 'language'
- });
+ });
- // Generate options
- options.forEach(controls.createMenuItem.bind(this));
+ // Generate options
+ options.forEach(controls.createMenuItem.bind(this));
- controls.updateSetting.call(this, type, list);
- },
+ controls.updateSetting.call(this, type, list);
+ },
- // Set a list of available captions languages
- setSpeedMenu: function setSpeedMenu(options) {
- var _this5 = this;
+ // Set a list of available captions languages
+ setSpeedMenu: function setSpeedMenu(options) {
+ var _this5 = this;
- // Do nothing if not selected
- if (!this.config.controls.includes('settings') || !this.config.settings.includes('speed')) {
- return;
- }
+ // Do nothing if not selected
+ if (!this.config.controls.includes('settings') || !this.config.settings.includes('speed')) {
+ return;
+ }
- // Menu required
- if (!utils.is.element(this.elements.settings.panes.speed)) {
- return;
- }
+ // Menu required
+ if (!is.element(this.elements.settings.panes.speed)) {
+ return;
+ }
- var type = 'speed';
+ var type = 'speed';
- // Set the speed options
- if (utils.is.array(options)) {
- this.options.speed = options;
- } else if (this.isHTML5 || this.isVimeo) {
- this.options.speed = [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2];
- }
+ // Set the speed options
+ if (is.array(options)) {
+ this.options.speed = options;
+ } else if (this.isHTML5 || this.isVimeo) {
+ this.options.speed = [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2];
+ }
- // Set options if passed and filter based on config
- this.options.speed = this.options.speed.filter(function (speed) {
- return _this5.config.speed.options.includes(speed);
- });
+ // Set options if passed and filter based on config
+ this.options.speed = this.options.speed.filter(function (speed) {
+ return _this5.config.speed.options.includes(speed);
+ });
- // Toggle the pane and tab
- var toggle = !utils.is.empty(this.options.speed) && this.options.speed.length > 1;
- controls.toggleTab.call(this, type, toggle);
+ // Toggle the pane and tab
+ var toggle = !is.empty(this.options.speed) && this.options.speed.length > 1;
+ controls.toggleTab.call(this, type, toggle);
- // Check if we need to toggle the parent
- controls.checkMenu.call(this);
+ // Check if we need to toggle the parent
+ controls.checkMenu.call(this);
- // If we're hiding, nothing more to do
- if (!toggle) {
- return;
- }
+ // If we're hiding, nothing more to do
+ if (!toggle) {
+ return;
+ }
- // Get the list to populate
- var list = this.elements.settings.panes.speed.querySelector('ul');
+ // Get the list to populate
+ var list = this.elements.settings.panes.speed.querySelector('ul');
- // Empty the menu
- utils.emptyElement(list);
+ // Empty the menu
+ emptyElement(list);
- // Create items
- this.options.speed.forEach(function (speed) {
- controls.createMenuItem.call(_this5, {
- value: speed,
- list: list,
- type: type,
- title: controls.getLabel.call(_this5, 'speed', speed)
+ // Create items
+ this.options.speed.forEach(function (speed) {
+ controls.createMenuItem.call(_this5, {
+ value: speed,
+ list: list,
+ type: type,
+ title: controls.getLabel.call(_this5, 'speed', speed)
+ });
});
- });
-
- controls.updateSetting.call(this, type, list);
- },
-
-
- // Check if we need to hide/show the settings menu
- checkMenu: function checkMenu() {
- var tabs = this.elements.settings.tabs;
- var visible = !utils.is.empty(tabs) && Object.values(tabs).some(function (tab) {
- return !tab.hidden;
- });
+ controls.updateSetting.call(this, type, list);
+ },
- utils.toggleHidden(this.elements.settings.menu, !visible);
- },
+ // Check if we need to hide/show the settings menu
+ checkMenu: function checkMenu() {
+ var tabs = this.elements.settings.tabs;
- // Show/hide menu
- toggleMenu: function toggleMenu(event) {
- var form = this.elements.settings.form;
+ var visible = !is.empty(tabs) && Object.values(tabs).some(function (tab) {
+ return !tab.hidden;
+ });
- var button = this.elements.buttons.settings;
+ toggleHidden(this.elements.settings.menu, !visible);
+ },
- // Menu and button are required
- if (!utils.is.element(form) || !utils.is.element(button)) {
- return;
- }
- var show = utils.is.boolean(event) ? event : utils.is.element(form) && form.hasAttribute('hidden');
+ // Show/hide menu
+ toggleMenu: function toggleMenu(event) {
+ var form = this.elements.settings.form;
- if (utils.is.event(event)) {
- var isMenuItem = utils.is.element(form) && form.contains(event.target);
- var isButton = event.target === this.elements.buttons.settings;
+ var button = this.elements.buttons.settings;
- // If the click was inside the form or if the click
- // wasn't the button or menu item and we're trying to
- // show the menu (a doc click shouldn't show the menu)
- if (isMenuItem || !isMenuItem && !isButton && show) {
+ // Menu and button are required
+ if (!is.element(form) || !is.element(button)) {
return;
}
- // Prevent the toggle being caught by the doc listener
- if (isButton) {
- event.stopPropagation();
- }
- }
+ var show = is.boolean(event) ? event : is.element(form) && form.hasAttribute('hidden');
- // Set form and button attributes
- if (utils.is.element(button)) {
- button.setAttribute('aria-expanded', show);
- }
+ if (is.event(event)) {
+ var isMenuItem = is.element(form) && form.contains(event.target);
+ var isButton = event.target === this.elements.buttons.settings;
- if (utils.is.element(form)) {
- utils.toggleHidden(form, !show);
- utils.toggleClass(this.elements.container, this.config.classNames.menu.open, show);
+ // If the click was inside the form or if the click
+ // wasn't the button or menu item and we're trying to
+ // show the menu (a doc click shouldn't show the menu)
+ if (isMenuItem || !isMenuItem && !isButton && show) {
+ return;
+ }
- if (show) {
- form.removeAttribute('tabindex');
- } else {
- form.setAttribute('tabindex', -1);
+ // Prevent the toggle being caught by the doc listener
+ if (isButton) {
+ event.stopPropagation();
+ }
}
- }
- },
-
-
- // Get the natural size of a tab
- getTabSize: function getTabSize(tab) {
- var clone = tab.cloneNode(true);
- clone.style.position = 'absolute';
- clone.style.opacity = 0;
- clone.removeAttribute('hidden');
- // Prevent input's being unchecked due to the name being identical
- Array.from(clone.querySelectorAll('input[name]')).forEach(function (input) {
- var name = input.getAttribute('name');
- input.setAttribute('name', name + '-clone');
- });
+ // Set form and button attributes
+ if (is.element(button)) {
+ button.setAttribute('aria-expanded', show);
+ }
- // Append to parent so we get the "real" size
- tab.parentNode.appendChild(clone);
+ if (is.element(form)) {
+ toggleHidden(form, !show);
+ toggleClass(this.elements.container, this.config.classNames.menu.open, show);
- // Get the sizes before we remove
- var width = clone.scrollWidth;
- var height = clone.scrollHeight;
+ if (show) {
+ form.removeAttribute('tabindex');
+ } else {
+ form.setAttribute('tabindex', -1);
+ }
+ }
+ },
- // Remove from the DOM
- utils.removeElement(clone);
- return {
- width: width,
- height: height
- };
- },
+ // Get the natural size of a tab
+ getTabSize: function getTabSize(tab) {
+ var clone = tab.cloneNode(true);
+ clone.style.position = 'absolute';
+ clone.style.opacity = 0;
+ clone.removeAttribute('hidden');
+ // Prevent input's being unchecked due to the name being identical
+ Array.from(clone.querySelectorAll('input[name]')).forEach(function (input) {
+ var name = input.getAttribute('name');
+ input.setAttribute('name', name + '-clone');
+ });
- // Toggle Menu
- showTab: function showTab() {
- var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
- var menu = this.elements.settings.menu;
+ // Append to parent so we get the "real" size
+ tab.parentNode.appendChild(clone);
- var pane = document.getElementById(target);
+ // Get the sizes before we remove
+ var width = clone.scrollWidth;
+ var height = clone.scrollHeight;
- // Nothing to show, bail
- if (!utils.is.element(pane)) {
- return;
- }
+ // Remove from the DOM
+ removeElement(clone);
- // Are we targetting a tab? If not, bail
- var isTab = pane.getAttribute('role') === 'tabpanel';
- if (!isTab) {
- return;
- }
+ return {
+ width: width,
+ height: height
+ };
+ },
- // Hide all other tabs
- // Get other tabs
- var current = menu.querySelector('[role="tabpanel"]:not([hidden])');
- var container = current.parentNode;
- // Set other toggles to be expanded false
- Array.from(menu.querySelectorAll('[aria-controls="' + current.getAttribute('id') + '"]')).forEach(function (toggle) {
- toggle.setAttribute('aria-expanded', false);
- });
+ // Toggle Menu
+ showTab: function showTab() {
+ var _this6 = this;
- // If we can do fancy animations, we'll animate the height/width
- if (support.transitions && !support.reducedMotion) {
- // Set the current width as a base
- container.style.width = current.scrollWidth + 'px';
- container.style.height = current.scrollHeight + 'px';
+ var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
+ var menu = this.elements.settings.menu;
- // Get potential sizes
- var size = controls.getTabSize.call(this, pane);
+ var pane = document.getElementById(target);
- // Restore auto height/width
- var restore = function restore(e) {
- // We're only bothered about height and width on the container
- if (e.target !== container || !['width', 'height'].includes(e.propertyName)) {
- return;
- }
+ // Nothing to show, bail
+ if (!is.element(pane)) {
+ return;
+ }
- // Revert back to auto
- container.style.width = '';
- container.style.height = '';
+ // Are we targeting a tab? If not, bail
+ var isTab = pane.getAttribute('role') === 'tabpanel';
+ if (!isTab) {
+ return;
+ }
- // Only listen once
- utils.off(container, utils.transitionEndEvent, restore);
- };
+ // Hide all other tabs
+ // Get other tabs
+ var current = menu.querySelector('[role="tabpanel"]:not([hidden])');
+ var container = current.parentNode;
- // Listen for the transition finishing and restore auto height/width
- utils.on(container, utils.transitionEndEvent, restore);
+ // Set other toggles to be expanded false
+ Array.from(menu.querySelectorAll('[aria-controls="' + current.getAttribute('id') + '"]')).forEach(function (toggle) {
+ toggle.setAttribute('aria-expanded', false);
+ });
- // Set dimensions to target
- container.style.width = size.width + 'px';
- container.style.height = size.height + 'px';
- }
+ // If we can do fancy animations, we'll animate the height/width
+ if (support.transitions && !support.reducedMotion) {
+ // Set the current width as a base
+ container.style.width = current.scrollWidth + 'px';
+ container.style.height = current.scrollHeight + 'px';
- // Set attributes on current tab
- utils.toggleHidden(current, true);
- current.setAttribute('tabindex', -1);
+ // Get potential sizes
+ var size = controls.getTabSize.call(this, pane);
- // Set attributes on target
- utils.toggleHidden(pane, false);
+ // Restore auto height/width
+ var restore = function restore(e) {
+ // We're only bothered about height and width on the container
+ if (e.target !== container || !['width', 'height'].includes(e.propertyName)) {
+ return;
+ }
- var tabs = utils.getElements.call(this, '[aria-controls="' + target + '"]');
- Array.from(tabs).forEach(function (tab) {
- tab.setAttribute('aria-expanded', true);
- });
- pane.removeAttribute('tabindex');
+ // Revert back to auto
+ container.style.width = '';
+ container.style.height = '';
- // Focus the first item
- pane.querySelectorAll('button:not(:disabled), input:not(:disabled), [tabindex]')[0].focus();
- },
+ // Only listen once
+ off.call(_this6, container, transitionEndEvent, restore);
+ };
+ // Listen for the transition finishing and restore auto height/width
+ on.call(this, container, transitionEndEvent, restore);
- // Build the default HTML
- // TODO: Set order based on order in the config.controls array?
- create: function create(data) {
- var _this6 = this;
+ // Set dimensions to target
+ container.style.width = size.width + 'px';
+ container.style.height = size.height + 'px';
+ }
- // Do nothing if we want no controls
- if (utils.is.empty(this.config.controls)) {
- return null;
- }
+ // Set attributes on current tab
+ toggleHidden(current, true);
+ current.setAttribute('tabindex', -1);
- // Create the container
- var container = utils.createElement('div', utils.getAttributesFromSelector(this.config.selectors.controls.wrapper));
+ // Set attributes on target
+ toggleHidden(pane, false);
- // Restart button
- if (this.config.controls.includes('restart')) {
- container.appendChild(controls.createButton.call(this, 'restart'));
- }
+ var tabs = getElements.call(this, '[aria-controls="' + target + '"]');
+ Array.from(tabs).forEach(function (tab) {
+ tab.setAttribute('aria-expanded', true);
+ });
+ pane.removeAttribute('tabindex');
- // Rewind button
- if (this.config.controls.includes('rewind')) {
- container.appendChild(controls.createButton.call(this, 'rewind'));
- }
+ // Focus the first item
+ pane.querySelectorAll('button:not(:disabled), input:not(:disabled), [tabindex]')[0].focus();
+ },
- // Play/Pause button
- if (this.config.controls.includes('play')) {
- container.appendChild(controls.createButton.call(this, 'play'));
- }
- // Fast forward button
- if (this.config.controls.includes('fast-forward')) {
- container.appendChild(controls.createButton.call(this, 'fast-forward'));
- }
+ // Build the default HTML
+ // TODO: Set order based on order in the config.controls array?
+ create: function create(data) {
+ var _this7 = this;
- // Progress
- if (this.config.controls.includes('progress')) {
- var progress = utils.createElement('div', utils.getAttributesFromSelector(this.config.selectors.progress));
+ // Do nothing if we want no controls
+ if (is.empty(this.config.controls)) {
+ return null;
+ }
- // Seek range slider
- progress.appendChild(controls.createRange.call(this, 'seek', {
- id: 'plyr-seek-' + data.id
- }));
+ // Create the container
+ var container = createElement('div', getAttributesFromSelector(this.config.selectors.controls.wrapper));
- // Buffer progress
- progress.appendChild(controls.createProgress.call(this, 'buffer'));
+ // Restart button
+ if (this.config.controls.includes('restart')) {
+ container.appendChild(controls.createButton.call(this, 'restart'));
+ }
- // TODO: Add loop display indicator
+ // Rewind button
+ if (this.config.controls.includes('rewind')) {
+ container.appendChild(controls.createButton.call(this, 'rewind'));
+ }
- // Seek tooltip
- if (this.config.tooltips.seek) {
- var tooltip = utils.createElement('span', {
- class: this.config.classNames.tooltip
- }, '00:00');
+ // Play/Pause button
+ if (this.config.controls.includes('play')) {
+ container.appendChild(controls.createButton.call(this, 'play'));
+ }
- progress.appendChild(tooltip);
- this.elements.display.seekTooltip = tooltip;
+ // Fast forward button
+ if (this.config.controls.includes('fast-forward')) {
+ container.appendChild(controls.createButton.call(this, 'fast-forward'));
}
- this.elements.progress = progress;
- container.appendChild(this.elements.progress);
- }
+ // Progress
+ if (this.config.controls.includes('progress')) {
+ var progress = createElement('div', getAttributesFromSelector(this.config.selectors.progress));
- // Media current time display
- if (this.config.controls.includes('current-time')) {
- container.appendChild(controls.createTime.call(this, 'currentTime'));
- }
+ // Seek range slider
+ progress.appendChild(controls.createRange.call(this, 'seek', {
+ id: 'plyr-seek-' + data.id
+ }));
- // Media duration display
- if (this.config.controls.includes('duration')) {
- container.appendChild(controls.createTime.call(this, 'duration'));
- }
+ // Buffer progress
+ progress.appendChild(controls.createProgress.call(this, 'buffer'));
- // Toggle mute button
- if (this.config.controls.includes('mute')) {
- container.appendChild(controls.createButton.call(this, 'mute'));
- }
+ // TODO: Add loop display indicator
- // Volume range control
- if (this.config.controls.includes('volume')) {
- var volume = utils.createElement('div', {
- class: 'plyr__volume'
- });
+ // Seek tooltip
+ if (this.config.tooltips.seek) {
+ var tooltip = createElement('span', {
+ class: this.config.classNames.tooltip
+ }, '00:00');
- // Set the attributes
- var attributes = {
- max: 1,
- step: 0.05,
- value: this.config.volume
- };
+ progress.appendChild(tooltip);
+ this.elements.display.seekTooltip = tooltip;
+ }
- // Create the volume range slider
- volume.appendChild(controls.createRange.call(this, 'volume', utils.extend(attributes, {
- id: 'plyr-volume-' + data.id
- })));
+ this.elements.progress = progress;
+ container.appendChild(this.elements.progress);
+ }
- this.elements.volume = volume;
+ // Media current time display
+ if (this.config.controls.includes('current-time')) {
+ container.appendChild(controls.createTime.call(this, 'currentTime'));
+ }
- container.appendChild(volume);
- }
+ // Media duration display
+ if (this.config.controls.includes('duration')) {
+ container.appendChild(controls.createTime.call(this, 'duration'));
+ }
- // Toggle captions button
- if (this.config.controls.includes('captions')) {
- container.appendChild(controls.createButton.call(this, 'captions'));
- }
+ // Toggle mute button
+ if (this.config.controls.includes('mute')) {
+ container.appendChild(controls.createButton.call(this, 'mute'));
+ }
- // Settings button / menu
- if (this.config.controls.includes('settings') && !utils.is.empty(this.config.settings)) {
- var menu = utils.createElement('div', {
- class: 'plyr__menu',
- hidden: ''
- });
+ // Volume range control
+ if (this.config.controls.includes('volume')) {
+ var volume = createElement('div', {
+ class: 'plyr__volume'
+ });
- menu.appendChild(controls.createButton.call(this, 'settings', {
- id: 'plyr-settings-toggle-' + data.id,
- 'aria-haspopup': true,
- 'aria-controls': 'plyr-settings-' + data.id,
- 'aria-expanded': false
- }));
+ // Set the attributes
+ var attributes = {
+ max: 1,
+ step: 0.05,
+ value: this.config.volume
+ };
- var form = utils.createElement('form', {
- class: 'plyr__menu__container',
- id: 'plyr-settings-' + data.id,
- hidden: '',
- 'aria-labelled-by': 'plyr-settings-toggle-' + data.id,
- role: 'tablist',
- tabindex: -1
- });
+ // Create the volume range slider
+ volume.appendChild(controls.createRange.call(this, 'volume', extend(attributes, {
+ id: 'plyr-volume-' + data.id
+ })));
- var inner = utils.createElement('div');
+ this.elements.volume = volume;
- var home = utils.createElement('div', {
- id: 'plyr-settings-' + data.id + '-home',
- 'aria-labelled-by': 'plyr-settings-toggle-' + data.id,
- role: 'tabpanel'
- });
+ container.appendChild(volume);
+ }
- // Create the tab list
- var tabs = utils.createElement('ul', {
- role: 'tablist'
- });
+ // Toggle captions button
+ if (this.config.controls.includes('captions')) {
+ container.appendChild(controls.createButton.call(this, 'captions'));
+ }
- // Build the tabs
- this.config.settings.forEach(function (type) {
- var tab = utils.createElement('li', {
- role: 'tab',
+ // Settings button / menu
+ if (this.config.controls.includes('settings') && !is.empty(this.config.settings)) {
+ var menu = createElement('div', {
+ class: 'plyr__menu',
hidden: ''
});
- var button = utils.createElement('button', utils.extend(utils.getAttributesFromSelector(_this6.config.selectors.buttons.settings), {
- type: 'button',
- class: _this6.config.classNames.control + ' ' + _this6.config.classNames.control + '--forward',
- id: 'plyr-settings-' + data.id + '-' + type + '-tab',
+ menu.appendChild(controls.createButton.call(this, 'settings', {
+ id: 'plyr-settings-toggle-' + data.id,
'aria-haspopup': true,
- 'aria-controls': 'plyr-settings-' + data.id + '-' + type,
+ 'aria-controls': 'plyr-settings-' + data.id,
'aria-expanded': false
- }), i18n.get(type, _this6.config));
+ }));
- var value = utils.createElement('span', {
- class: _this6.config.classNames.menu.value
+ var form = createElement('form', {
+ class: 'plyr__menu__container',
+ id: 'plyr-settings-' + data.id,
+ hidden: '',
+ 'aria-labelled-by': 'plyr-settings-toggle-' + data.id,
+ role: 'tablist',
+ tabindex: -1
});
- // Speed contains HTML entities
- value.innerHTML = data[type];
+ var inner = createElement('div');
- button.appendChild(value);
- tab.appendChild(button);
- tabs.appendChild(tab);
+ var home = createElement('div', {
+ id: 'plyr-settings-' + data.id + '-home',
+ 'aria-labelled-by': 'plyr-settings-toggle-' + data.id,
+ role: 'tabpanel'
+ });
- _this6.elements.settings.tabs[type] = tab;
- });
+ // Create the tab list
+ var tabs = createElement('ul', {
+ role: 'tablist'
+ });
- home.appendChild(tabs);
- inner.appendChild(home);
+ // Build the tabs
+ this.config.settings.forEach(function (type) {
+ var tab = createElement('li', {
+ role: 'tab',
+ hidden: ''
+ });
- // Build the panes
- this.config.settings.forEach(function (type) {
- var pane = utils.createElement('div', {
- id: 'plyr-settings-' + data.id + '-' + type,
- hidden: '',
- 'aria-labelled-by': 'plyr-settings-' + data.id + '-' + type + '-tab',
- role: 'tabpanel',
- tabindex: -1
+ var button = createElement('button', extend(getAttributesFromSelector(_this7.config.selectors.buttons.settings), {
+ type: 'button',
+ class: _this7.config.classNames.control + ' ' + _this7.config.classNames.control + '--forward',
+ id: 'plyr-settings-' + data.id + '-' + type + '-tab',
+ 'aria-haspopup': true,
+ 'aria-controls': 'plyr-settings-' + data.id + '-' + type,
+ 'aria-expanded': false
+ }), i18n.get(type, _this7.config));
+
+ var value = createElement('span', {
+ class: _this7.config.classNames.menu.value
+ });
+
+ // Speed contains HTML entities
+ value.innerHTML = data[type];
+
+ button.appendChild(value);
+ tab.appendChild(button);
+ tabs.appendChild(tab);
+
+ _this7.elements.settings.tabs[type] = tab;
});
- var back = utils.createElement('button', {
- type: 'button',
- class: _this6.config.classNames.control + ' ' + _this6.config.classNames.control + '--back',
- 'aria-haspopup': true,
- 'aria-controls': 'plyr-settings-' + data.id + '-home',
- 'aria-expanded': false
- }, i18n.get(type, _this6.config));
+ home.appendChild(tabs);
+ inner.appendChild(home);
+
+ // Build the panes
+ this.config.settings.forEach(function (type) {
+ var pane = createElement('div', {
+ id: 'plyr-settings-' + data.id + '-' + type,
+ hidden: '',
+ 'aria-labelled-by': 'plyr-settings-' + data.id + '-' + type + '-tab',
+ role: 'tabpanel',
+ tabindex: -1
+ });
- pane.appendChild(back);
+ var back = createElement('button', {
+ type: 'button',
+ class: _this7.config.classNames.control + ' ' + _this7.config.classNames.control + '--back',
+ 'aria-haspopup': true,
+ 'aria-controls': 'plyr-settings-' + data.id + '-home',
+ 'aria-expanded': false
+ }, i18n.get(type, _this7.config));
- var options = utils.createElement('ul');
+ pane.appendChild(back);
- pane.appendChild(options);
- inner.appendChild(pane);
+ var options = createElement('ul');
- _this6.elements.settings.panes[type] = pane;
- });
+ pane.appendChild(options);
+ inner.appendChild(pane);
- form.appendChild(inner);
- menu.appendChild(form);
- container.appendChild(menu);
+ _this7.elements.settings.panes[type] = pane;
+ });
- this.elements.settings.form = form;
- this.elements.settings.menu = menu;
- }
+ form.appendChild(inner);
+ menu.appendChild(form);
+ container.appendChild(menu);
- // Picture in picture button
- if (this.config.controls.includes('pip') && support.pip) {
- container.appendChild(controls.createButton.call(this, 'pip'));
- }
+ this.elements.settings.form = form;
+ this.elements.settings.menu = menu;
+ }
- // Airplay button
- if (this.config.controls.includes('airplay') && support.airplay) {
- container.appendChild(controls.createButton.call(this, 'airplay'));
- }
+ // Picture in picture button
+ if (this.config.controls.includes('pip') && support.pip) {
+ container.appendChild(controls.createButton.call(this, 'pip'));
+ }
- // Toggle fullscreen button
- if (this.config.controls.includes('fullscreen')) {
- container.appendChild(controls.createButton.call(this, 'fullscreen'));
- }
+ // Airplay button
+ if (this.config.controls.includes('airplay') && support.airplay) {
+ container.appendChild(controls.createButton.call(this, 'airplay'));
+ }
- // Larger overlaid play button
- if (this.config.controls.includes('play-large')) {
- this.elements.container.appendChild(controls.createButton.call(this, 'play-large'));
- }
+ // Toggle fullscreen button
+ if (this.config.controls.includes('fullscreen')) {
+ container.appendChild(controls.createButton.call(this, 'fullscreen'));
+ }
- this.elements.controls = container;
+ // Larger overlaid play button
+ if (this.config.controls.includes('play-large')) {
+ this.elements.container.appendChild(controls.createButton.call(this, 'play-large'));
+ }
- if (this.isHTML5) {
- controls.setQualityMenu.call(this, html5.getQualityOptions.call(this));
- }
+ this.elements.controls = container;
- controls.setSpeedMenu.call(this);
+ if (this.isHTML5) {
+ controls.setQualityMenu.call(this, html5.getQualityOptions.call(this));
+ }
- return container;
- },
+ controls.setSpeedMenu.call(this);
+ return container;
+ },
- // Insert controls
- inject: function inject() {
- var _this7 = this;
- // Sprite
- if (this.config.loadSprite) {
- var icon = controls.getIconUrl.call(this);
+ // Insert controls
+ inject: function inject() {
+ var _this8 = this;
- // Only load external sprite using AJAX
- if (icon.cors) {
- utils.loadSprite(icon.url, 'sprite-plyr');
+ // Sprite
+ if (this.config.loadSprite) {
+ var icon = controls.getIconUrl.call(this);
+
+ // Only load external sprite using AJAX
+ if (icon.cors) {
+ loadSprite(icon.url, 'sprite-plyr');
+ }
}
- }
- // Create a unique ID
- this.id = Math.floor(Math.random() * 10000);
+ // Create a unique ID
+ this.id = Math.floor(Math.random() * 10000);
- // Null by default
- var container = null;
- this.elements.controls = null;
+ // Null by default
+ var container = null;
+ this.elements.controls = null;
- // Set template properties
- var props = {
- id: this.id,
- seektime: this.config.seekTime,
- title: this.config.title
- };
- var update = true;
-
- if (utils.is.string(this.config.controls) || utils.is.element(this.config.controls)) {
- // String or HTMLElement passed as the option
- container = this.config.controls;
- } else if (utils.is.function(this.config.controls)) {
- // A custom function to build controls
- // The function can return a HTMLElement or String
- container = this.config.controls.call(this, props);
- } else {
- // Create controls
- container = controls.create.call(this, {
+ // Set template properties
+ var props = {
id: this.id,
seektime: this.config.seekTime,
- speed: this.speed,
- quality: this.quality,
- captions: captions.getLabel.call(this)
- // TODO: Looping
- // loop: 'None',
- });
- update = false;
- }
+ title: this.config.title
+ };
+ var update = true;
+
+ if (is.string(this.config.controls) || is.element(this.config.controls)) {
+ // String or HTMLElement passed as the option
+ container = this.config.controls;
+ } else if (is.function(this.config.controls)) {
+ // A custom function to build controls
+ // The function can return a HTMLElement or String
+ container = this.config.controls.call(this, props);
+ } else {
+ // Create controls
+ container = controls.create.call(this, {
+ id: this.id,
+ seektime: this.config.seekTime,
+ speed: this.speed,
+ quality: this.quality,
+ captions: captions.getLabel.call(this)
+ // TODO: Looping
+ // loop: 'None',
+ });
+ update = false;
+ }
- // Replace props with their value
- var replace = function replace(input) {
- var result = input;
+ // Replace props with their value
+ var replace = function replace(input) {
+ var result = input;
- Object.entries(props).forEach(function (_ref2) {
- var _ref3 = slicedToArray(_ref2, 2),
- key = _ref3[0],
- value = _ref3[1];
+ Object.entries(props).forEach(function (_ref2) {
+ var _ref3 = slicedToArray(_ref2, 2),
+ key = _ref3[0],
+ value = _ref3[1];
- result = utils.replaceAll(result, '{' + key + '}', value);
- });
+ result = replaceAll(result, '{' + key + '}', value);
+ });
- return result;
- };
+ return result;
+ };
- // Update markup
- if (update) {
- if (utils.is.string(this.config.controls)) {
- container = replace(container);
- } else if (utils.is.element(container)) {
- container.innerHTML = replace(container.innerHTML);
+ // Update markup
+ if (update) {
+ if (is.string(this.config.controls)) {
+ container = replace(container);
+ } else if (is.element(container)) {
+ container.innerHTML = replace(container.innerHTML);
+ }
}
- }
- // Controls container
- var target = void 0;
+ // Controls container
+ var target = void 0;
- // Inject to custom location
- if (utils.is.string(this.config.selectors.controls.container)) {
- target = document.querySelector(this.config.selectors.controls.container);
- }
-
- // Inject into the container by default
- if (!utils.is.element(target)) {
- target = this.elements.container;
- }
+ // Inject to custom location
+ if (is.string(this.config.selectors.controls.container)) {
+ target = document.querySelector(this.config.selectors.controls.container);
+ }
- // Inject controls HTML
- if (utils.is.element(container)) {
- target.appendChild(container);
- } else if (container) {
- target.insertAdjacentHTML('beforeend', container);
- }
+ // Inject into the container by default
+ if (!is.element(target)) {
+ target = this.elements.container;
+ }
- // Find the elements if need be
- if (!utils.is.element(this.elements.controls)) {
- controls.findElements.call(this);
- }
+ // Inject controls HTML
+ if (is.element(container)) {
+ target.appendChild(container);
+ } else if (container) {
+ target.insertAdjacentHTML('beforeend', container);
+ }
- // Edge sometimes doesn't finish the paint so force a redraw
- if (window.navigator.userAgent.includes('Edge')) {
- utils.repaint(target);
- }
+ // Find the elements if need be
+ if (!is.element(this.elements.controls)) {
+ controls.findElements.call(this);
+ }
- // Setup tooltips
- if (this.config.tooltips.controls) {
- var labels = utils.getElements.call(this, [this.config.selectors.controls.wrapper, ' ', this.config.selectors.labels, ' .', this.config.classNames.hidden].join(''));
+ // Edge sometimes doesn't finish the paint so force a redraw
+ if (window.navigator.userAgent.includes('Edge')) {
+ repaint(target);
+ }
- Array.from(labels).forEach(function (label) {
- utils.toggleClass(label, _this7.config.classNames.hidden, false);
- utils.toggleClass(label, _this7.config.classNames.tooltip, true);
- });
- }
- }
-};
+ // Setup tooltips
+ if (this.config.tooltips.controls) {
+ var _config = this.config,
+ classNames = _config.classNames,
+ selectors = _config.selectors;
-// ==========================================================================
+ var selector = selectors.controls.wrapper + ' ' + selectors.labels + ' .' + classNames.hidden;
+ var labels = getElements.call(this, selector);
-var captions = {
- // Setup captions
- setup: function setup() {
- // Requires UI support
- if (!this.supported.ui) {
- return;
+ Array.from(labels).forEach(function (label) {
+ toggleClass(label, _this8.config.classNames.hidden, false);
+ toggleClass(label, _this8.config.classNames.tooltip, true);
+ });
+ }
}
+ };
- // Only Vimeo and HTML5 video supported at this point
- if (!this.isVideo || this.isYouTube || this.isHTML5 && !support.textTracks) {
- // Clear menu and hide
- if (utils.is.array(this.config.controls) && this.config.controls.includes('settings') && this.config.settings.includes('captions')) {
- controls.setCaptionsMenu.call(this);
- }
+ // ==========================================================================
+ // Fetch wrapper
+ // Using XHR to avoid issues with older browsers
+ // ==========================================================================
- return;
- }
+ function fetch$1(url) {
+ var responseType = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'text';
- // Inject the container
- if (!utils.is.element(this.elements.captions)) {
- this.elements.captions = utils.createElement('div', utils.getAttributesFromSelector(this.config.selectors.captions));
+ return new Promise(function (resolve, reject) {
+ try {
+ var request = new XMLHttpRequest();
- utils.insertAfter(this.elements.captions, this.elements.wrapper);
- }
+ // Check for CORS support
+ if (!('withCredentials' in request)) {
+ return;
+ }
- // Get browser info
- var browser = utils.getBrowser();
+ request.addEventListener('load', function () {
+ if (responseType === 'text') {
+ try {
+ resolve(JSON.parse(request.responseText));
+ } catch (e) {
+ resolve(request.responseText);
+ }
+ } else {
+ resolve(request.response);
+ }
+ });
- // Fix IE captions if CORS is used
- // Fetch captions and inject as blobs instead (data URIs not supported!)
- if (browser.isIE && window.URL) {
- var elements = this.media.querySelectorAll('track');
+ request.addEventListener('error', function () {
+ throw new Error(request.statusText);
+ });
- Array.from(elements).forEach(function (track) {
- var src = track.getAttribute('src');
- var href = utils.parseUrl(src);
+ request.open('GET', url, true);
- if (href.hostname !== window.location.href.hostname && ['http:', 'https:'].includes(href.protocol)) {
- utils.fetch(src, 'blob').then(function (blob) {
- track.setAttribute('src', window.URL.createObjectURL(blob));
- }).catch(function () {
- utils.removeElement(track);
- });
- }
- });
- }
+ // Set the required response type
+ request.responseType = responseType;
- // Try to load the value from storage
- var active = this.storage.get('captions');
+ request.send();
+ } catch (e) {
+ reject(e);
+ }
+ });
+ }
- // Otherwise fall back to the default config
- if (!utils.is.boolean(active)) {
- active = this.config.captions.active;
- }
+ // ==========================================================================
- // Get language from storage, fallback to config
- var language = this.storage.get('language') || this.config.captions.language;
- if (language === 'auto') {
- var _split = (navigator.language || navigator.userLanguage).split('-');
+ /**
+ * Parse a string to a URL object
+ * @param {string} input - the URL to be parsed
+ * @param {boolean} safe - failsafe parsing
+ */
+ function parseUrl(input) {
+ var safe = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
- var _split2 = slicedToArray(_split, 1);
+ var url = input;
- language = _split2[0];
+ if (safe) {
+ var parser = document.createElement('a');
+ parser.href = url;
+ url = parser.href;
}
- // Set language and show if active
- captions.setLanguage.call(this, language, active);
- // Watch changes to textTracks and update captions menu
- if (this.isHTML5) {
- var trackEvents = this.config.captions.update ? 'addtrack removetrack' : 'removetrack';
- utils.on(this.media.textTracks, trackEvents, captions.update.bind(this));
+ try {
+ return new URL(url);
+ } catch (e) {
+ return null;
}
+ }
- // Update available languages in list next tick (the event must not be triggered before the listeners)
- setTimeout(captions.update.bind(this), 0);
- },
- update: function update() {
- var _this = this;
-
- var tracks = captions.getTracks.call(this, true);
- // Get the wanted language
- var _captions = this.captions,
- language = _captions.language,
- meta = _captions.meta;
-
- // Handle tracks (add event listener and "pseudo"-default)
-
- if (this.isHTML5 && this.isVideo) {
- tracks.filter(function (track) {
- return !meta.get(track);
- }).forEach(function (track) {
- _this.debug.log('Track added', track);
- // Attempt to store if the original dom element was "default"
- meta.set(track, {
- default: track.mode === 'showing'
- });
+ // Convert object to URLSearchParams
+ function buildUrlParams(input) {
+ var params = new URLSearchParams();
- // Turn off native caption rendering to avoid double captions
- track.mode = 'hidden';
+ if (is.object(input)) {
+ Object.entries(input).forEach(function (_ref) {
+ var _ref2 = slicedToArray(_ref, 2),
+ key = _ref2[0],
+ value = _ref2[1];
- // Add event listener for cue changes
- utils.on(track, 'cuechange', function () {
- return captions.updateCues.call(_this);
- });
+ params.set(key, value);
});
}
- var trackRemoved = !tracks.find(function (track) {
- return track === _this.captions.currentTrackNode;
- });
- var firstMatch = this.language !== language && tracks.find(function (track) {
- return track.language === language;
- });
+ return params;
+ }
- // Update language if removed or first matching track added
- if (trackRemoved || firstMatch) {
- captions.setLanguage.call(this, language, this.config.captions.active);
- }
+ // ==========================================================================
+
+ var captions = {
+ // Setup captions
+ setup: function setup() {
+ // Requires UI support
+ if (!this.supported.ui) {
+ return;
+ }
- // Enable or disable captions based on track length
- utils.toggleClass(this.elements.container, this.config.classNames.captions.enabled, !utils.is.empty(tracks));
+ // Only Vimeo and HTML5 video supported at this point
+ if (!this.isVideo || this.isYouTube || this.isHTML5 && !support.textTracks) {
+ // Clear menu and hide
+ if (is.array(this.config.controls) && this.config.controls.includes('settings') && this.config.settings.includes('captions')) {
+ controls.setCaptionsMenu.call(this);
+ }
- // Update available languages in list
- if ((this.config.controls || []).includes('settings') && this.config.settings.includes('captions')) {
- controls.setCaptionsMenu.call(this);
- }
- },
- set: function set$$1(index) {
- var setLanguage = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
- var show = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
+ return;
+ }
- var tracks = captions.getTracks.call(this);
+ // Inject the container
+ if (!is.element(this.elements.captions)) {
+ this.elements.captions = createElement('div', getAttributesFromSelector(this.config.selectors.captions));
- // Disable captions if setting to -1
- if (index === -1) {
- this.toggleCaptions(false);
- return;
- }
+ insertAfter(this.elements.captions, this.elements.wrapper);
+ }
- if (!utils.is.number(index)) {
- this.debug.warn('Invalid caption argument', index);
- return;
- }
+ // Fix IE captions if CORS is used
+ // Fetch captions and inject as blobs instead (data URIs not supported!)
+ if (browser.isIE && window.URL) {
+ var elements = this.media.querySelectorAll('track');
- if (!(index in tracks)) {
- this.debug.warn('Track not found', index);
- return;
- }
+ Array.from(elements).forEach(function (track) {
+ var src = track.getAttribute('src');
+ var url = parseUrl(src);
- if (this.captions.currentTrack !== index) {
- this.captions.currentTrack = index;
- var track = captions.getCurrentTrack.call(this);
+ if (url !== null && url.hostname !== window.location.href.hostname && ['http:', 'https:'].includes(url.protocol)) {
+ fetch$1(src, 'blob').then(function (blob) {
+ track.setAttribute('src', window.URL.createObjectURL(blob));
+ }).catch(function () {
+ removeElement(track);
+ });
+ }
+ });
+ }
- var _ref = track || {},
- language = _ref.language;
+ // Get and set initial data
+ // The "preferred" options are not realized unless / until the wanted language has a match
+ // * languages: Array of user's browser languages.
+ // * language: The language preferred by user settings or config
+ // * active: The state preferred by user settings or config
+ // * toggled: The real captions state
- // Store reference to node for invalidation on remove
+ var languages = dedupe(Array.from(navigator.languages || navigator.userLanguage).map(function (language) {
+ return language.split('-')[0];
+ }));
+ var language = (this.storage.get('language') || this.config.captions.language || 'auto').toLowerCase();
- this.captions.currentTrackNode = track;
+ // Use first browser language when language is 'auto'
+ if (language === 'auto') {
+ var _languages = slicedToArray(languages, 1);
- // Prevent setting language in some cases, since it can violate user's intentions
- if (setLanguage) {
- this.captions.language = language;
+ language = _languages[0];
}
- // Handle Vimeo captions
- if (this.isVimeo) {
- this.embed.enableTextTrack(language);
+ var active = this.storage.get('captions');
+ if (!is.boolean(active)) {
+ active = this.config.captions.active;
}
- // Trigger event
- utils.dispatchEvent.call(this, this.media, 'languagechange');
- }
-
- if (this.isHTML5 && this.isVideo) {
- // If we change the active track while a cue is already displayed we need to update it
- captions.updateCues.call(this);
- }
+ Object.assign(this.captions, {
+ toggled: false,
+ active: active,
+ language: language,
+ languages: languages
+ });
- // Show captions
- if (show) {
- this.toggleCaptions(true);
- }
- },
- setLanguage: function setLanguage(language) {
- var show = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
+ // Watch changes to textTracks and update captions menu
+ if (this.isHTML5) {
+ var trackEvents = this.config.captions.update ? 'addtrack removetrack' : 'removetrack';
+ on.call(this, this.media.textTracks, trackEvents, captions.update.bind(this));
+ }
- if (!utils.is.string(language)) {
- this.debug.warn('Invalid language argument', language);
- return;
- }
- // Normalize
- this.captions.language = language.toLowerCase();
+ // Update available languages in list next tick (the event must not be triggered before the listeners)
+ setTimeout(captions.update.bind(this), 0);
+ },
- // Set currentTrack
- var tracks = captions.getTracks.call(this);
- var track = captions.getCurrentTrack.call(this, true);
- captions.set.call(this, tracks.indexOf(track), false, show);
- },
+ // Update available language options in settings based on tracks
+ update: function update() {
+ var _this = this;
- // Get current valid caption tracks
- // If update is false it will also ignore tracks without metadata
- // This is used to "freeze" the language options when captions.update is false
- getTracks: function getTracks() {
- var _this2 = this;
+ var tracks = captions.getTracks.call(this, true);
+ // Get the wanted language
+ var _captions = this.captions,
+ active = _captions.active,
+ language = _captions.language,
+ meta = _captions.meta,
+ currentTrackNode = _captions.currentTrackNode;
- var update = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
+ var languageExists = Boolean(tracks.find(function (track) {
+ return track.language === language;
+ }));
- // Handle media or textTracks missing or null
- var tracks = Array.from((this.media || {}).textTracks || []);
- // For HTML5, use cache instead of current tracks when it exists (if captions.update is false)
- // Filter out removed tracks and tracks that aren't captions/subtitles (for example metadata)
- return tracks.filter(function (track) {
- return !_this2.isHTML5 || update || _this2.captions.meta.has(track);
- }).filter(function (track) {
- return ['captions', 'subtitles'].includes(track.kind);
- });
- },
+ // Handle tracks (add event listener and "pseudo"-default)
+ if (this.isHTML5 && this.isVideo) {
+ tracks.filter(function (track) {
+ return !meta.get(track);
+ }).forEach(function (track) {
+ _this.debug.log('Track added', track);
+ // Attempt to store if the original dom element was "default"
+ meta.set(track, {
+ default: track.mode === 'showing'
+ });
+ // Turn off native caption rendering to avoid double captions
+ track.mode = 'hidden';
- // Get the current track for the current language
- getCurrentTrack: function getCurrentTrack() {
- var _this3 = this;
+ // Add event listener for cue changes
+ on.call(_this, track, 'cuechange', function () {
+ return captions.updateCues.call(_this);
+ });
+ });
+ }
- var fromLanguage = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
+ // Update language first time it matches, or if the previous matching track was removed
+ if (languageExists && this.language !== language || !tracks.includes(currentTrackNode)) {
+ captions.setLanguage.call(this, language);
+ captions.toggle.call(this, active && languageExists);
+ }
- var tracks = captions.getTracks.call(this);
- var sortIsDefault = function sortIsDefault(track) {
- return Number((_this3.captions.meta.get(track) || {}).default);
- };
- var sorted = Array.from(tracks).sort(function (a, b) {
- return sortIsDefault(b) - sortIsDefault(a);
- });
- return !fromLanguage && tracks[this.currentTrack] || sorted.find(function (track) {
- return track.language === _this3.captions.language;
- }) || sorted[0];
- },
+ // Enable or disable captions based on track length
+ toggleClass(this.elements.container, this.config.classNames.captions.enabled, !is.empty(tracks));
+ // Update available languages in list
+ if ((this.config.controls || []).includes('settings') && this.config.settings.includes('captions')) {
+ controls.setCaptionsMenu.call(this);
+ }
+ },
- // Get UI label for track
- getLabel: function getLabel(track) {
- var currentTrack = track;
- if (!utils.is.track(currentTrack) && support.textTracks && this.captions.active) {
- currentTrack = captions.getCurrentTrack.call(this);
- }
+ // Toggle captions display
+ // Used internally for the toggleCaptions method, with the passive option forced to false
+ toggle: function toggle(input) {
+ var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
- if (utils.is.track(currentTrack)) {
- if (!utils.is.empty(currentTrack.label)) {
- return currentTrack.label;
+ // If there's no full support
+ if (!this.supported.ui) {
+ return;
}
- if (!utils.is.empty(currentTrack.language)) {
- return track.language.toUpperCase();
- }
+ var toggled = this.captions.toggled; // Current state
- return i18n.get('enabled', this.config);
- }
+ var activeClass = this.config.classNames.captions.active;
- return i18n.get('disabled', this.config);
- },
+ // Get the next state
+ // If the method is called without parameter, toggle based on current value
+ var active = is.nullOrUndefined(input) ? !toggled : input;
+ // Update state and trigger event
+ if (active !== toggled) {
+ // When passive, don't override user preferences
+ if (!passive) {
+ this.captions.active = active;
+ this.storage.set({ captions: active });
+ }
- // Update captions using current track's active cues
- // Also optional array argument in case there isn't any track (ex: vimeo)
- updateCues: function updateCues(input) {
- // Requires UI
- if (!this.supported.ui) {
- return;
- }
+ // Force language if the call isn't passive and there is no matching language to toggle to
+ if (!this.language && active && !passive) {
+ var tracks = captions.getTracks.call(this);
+ var track = captions.findTrack.call(this, [this.captions.language].concat(toConsumableArray(this.captions.languages)), true);
- if (!utils.is.element(this.elements.captions)) {
- this.debug.warn('No captions element to render to');
- return;
- }
+ // Override user preferences to avoid switching languages if a matching track is added
+ this.captions.language = track.language;
- // Only accept array or empty input
- if (!utils.is.nullOrUndefined(input) && !Array.isArray(input)) {
- this.debug.warn('updateCues: Invalid input', input);
- return;
- }
+ // Set caption, but don't store in localStorage as user preference
+ captions.set.call(this, tracks.indexOf(track));
+ return;
+ }
- var cues = input;
+ // Toggle state
+ this.elements.buttons.captions.pressed = active;
- // Get cues from track
- if (!cues) {
- var track = captions.getCurrentTrack.call(this);
- cues = Array.from((track || {}).activeCues || []).map(function (cue) {
- return cue.getCueAsHTML();
- }).map(utils.getHTML);
- }
+ // Add class hook
+ toggleClass(this.elements.container, activeClass, active);
- // Set new caption text
- var content = cues.map(function (cueText) {
- return cueText.trim();
- }).join('\n');
- var changed = content !== this.elements.captions.innerHTML;
-
- if (changed) {
- // Empty the container and create a new child element
- utils.emptyElement(this.elements.captions);
- var caption = utils.createElement('span', utils.getAttributesFromSelector(this.config.selectors.caption));
- caption.innerHTML = content;
- this.elements.captions.appendChild(caption);
-
- // Trigger event
- utils.dispatchEvent.call(this, this.media, 'cuechange');
- }
- }
-};
+ this.captions.toggled = active;
-// ==========================================================================
-// Console wrapper
-// ==========================================================================
+ // Update settings menu
+ controls.updateSetting.call(this, 'captions');
-var noop = function noop() {};
+ // Trigger event (not used internally)
+ triggerEvent.call(this, this.media, active ? 'captionsenabled' : 'captionsdisabled');
+ }
+ },
-var Console = function () {
- function Console() {
- var enabled = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
- classCallCheck(this, Console);
- this.enabled = window.console && enabled;
+ // Set captions by track index
+ // Used internally for the currentTrack setter with the passive option forced to false
+ set: function set$$1(index) {
+ var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
- if (this.enabled) {
- this.log('Debugging enabled');
- }
- }
+ var tracks = captions.getTracks.call(this);
- createClass(Console, [{
- key: 'log',
- get: function get$$1() {
- // eslint-disable-next-line no-console
- return this.enabled ? Function.prototype.bind.call(console.log, console) : noop;
- }
- }, {
- key: 'warn',
- get: function get$$1() {
- // eslint-disable-next-line no-console
- return this.enabled ? Function.prototype.bind.call(console.warn, console) : noop;
- }
- }, {
- key: 'error',
- get: function get$$1() {
- // eslint-disable-next-line no-console
- return this.enabled ? Function.prototype.bind.call(console.error, console) : noop;
- }
- }]);
- return Console;
-}();
+ // Disable captions if setting to -1
+ if (index === -1) {
+ captions.toggle.call(this, false, passive);
+ return;
+ }
-// ==========================================================================
-// Plyr default config
-// ==========================================================================
-
-var defaults$1 = {
- // Disable
- enabled: true,
-
- // Custom media title
- title: '',
-
- // Logging to console
- debug: false,
-
- // Auto play (if supported)
- autoplay: false,
-
- // Only allow one media playing at once (vimeo only)
- autopause: true,
-
- // Allow inline playback on iOS (this effects YouTube/Vimeo - HTML5 requires the attribute present)
- // TODO: Remove iosNative fullscreen option in favour of this (logic needs work)
- playsinline: true,
-
- // Default time to skip when rewind/fast forward
- seekTime: 10,
-
- // Default volume
- volume: 1,
- muted: false,
-
- // Pass a custom duration
- duration: null,
-
- // Display the media duration on load in the current time position
- // If you have opted to display both duration and currentTime, this is ignored
- displayDuration: true,
-
- // Invert the current time to be a countdown
- invertTime: true,
-
- // Clicking the currentTime inverts it's value to show time left rather than elapsed
- toggleInvert: true,
-
- // Aspect ratio (for embeds)
- ratio: '16:9',
-
- // Click video container to play/pause
- clickToPlay: true,
-
- // Auto hide the controls
- hideControls: true,
-
- // Reset to start when playback ended
- resetOnEnd: false,
-
- // Disable the standard context menu
- disableContextMenu: true,
-
- // Sprite (for icons)
- loadSprite: true,
- iconPrefix: 'plyr',
- iconUrl: 'https://cdn.plyr.io/3.3.12/plyr.svg',
-
- // Blank video (used to prevent errors on source change)
- blankVideo: 'https://cdn.plyr.io/static/blank.mp4',
-
- // Quality default
- quality: {
- default: 576,
- options: [4320, 2880, 2160, 1440, 1080, 720, 576, 480, 360, 240, 'default']
- },
-
- // Set loops
- loop: {
- active: false
- // start: null,
- // end: null,
- },
-
- // Speed default and options to display
- speed: {
- selected: 1,
- options: [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2]
- },
-
- // Keyboard shortcut settings
- keyboard: {
- focused: true,
- global: false
- },
-
- // Display tooltips
- tooltips: {
- controls: false,
- seek: true
- },
-
- // Captions settings
- captions: {
- active: false,
- language: 'auto',
- // Listen to new tracks added after Plyr is initialized.
- // This is needed for streaming captions, but may result in unselectable options
- update: false
- },
-
- // Fullscreen settings
- fullscreen: {
- enabled: true, // Allow fullscreen?
- fallback: true, // Fallback for vintage browsers
- iosNative: false // Use the native fullscreen in iOS (disables custom controls)
- },
-
- // Local storage
- storage: {
- enabled: true,
- key: 'plyr'
- },
-
- // Default controls
- controls: ['play-large',
- // 'restart',
- // 'rewind',
- 'play',
- // 'fast-forward',
- 'progress', 'current-time', 'mute', 'volume', 'captions', 'settings', 'pip', 'airplay', 'fullscreen'],
- settings: ['captions', 'quality', 'speed'],
-
- // Localisation
- i18n: {
- restart: 'Restart',
- rewind: 'Rewind {seektime}s',
- play: 'Play',
- pause: 'Pause',
- fastForward: 'Forward {seektime}s',
- seek: 'Seek',
- seekLabel: '{currentTime} of {duration}',
- played: 'Played',
- buffered: 'Buffered',
- currentTime: 'Current time',
- duration: 'Duration',
- volume: 'Volume',
- mute: 'Mute',
- unmute: 'Unmute',
- enableCaptions: 'Enable captions',
- disableCaptions: 'Disable captions',
- enterFullscreen: 'Enter fullscreen',
- exitFullscreen: 'Exit fullscreen',
- frameTitle: 'Player for {title}',
- captions: 'Captions',
- settings: 'Settings',
- menuBack: 'Go back to previous menu',
- speed: 'Speed',
- normal: 'Normal',
- quality: 'Quality',
- loop: 'Loop',
- start: 'Start',
- end: 'End',
- all: 'All',
- reset: 'Reset',
- disabled: 'Disabled',
- enabled: 'Enabled',
- advertisement: 'Ad',
- qualityBadge: {
- 2160: '4K',
- 1440: 'HD',
- 1080: 'HD',
- 720: 'HD',
- 576: 'SD',
- 480: 'SD'
- }
- },
-
- // URLs
- urls: {
- vimeo: {
- sdk: 'https://player.vimeo.com/api/player.js',
- iframe: 'https://player.vimeo.com/video/{0}?{1}',
- api: 'https://vimeo.com/api/v2/video/{0}.json'
- },
- youtube: {
- sdk: 'https://www.youtube.com/iframe_api',
- api: 'https://www.googleapis.com/youtube/v3/videos?id={0}&key={1}&fields=items(snippet(title))&part=snippet'
- },
- googleIMA: {
- sdk: 'https://imasdk.googleapis.com/js/sdkloader/ima3.js'
- }
- },
-
- // Custom control listeners
- listeners: {
- seek: null,
- play: null,
- pause: null,
- restart: null,
- rewind: null,
- fastForward: null,
- mute: null,
- volume: null,
- captions: null,
- fullscreen: null,
- pip: null,
- airplay: null,
- speed: null,
- quality: null,
- loop: null,
- language: null
- },
-
- // Events to watch and bubble
- events: [
- // Events to watch on HTML5 media elements and bubble
- // https://developer.mozilla.org/en/docs/Web/Guide/Events/Media_events
- 'ended', 'progress', 'stalled', 'playing', 'waiting', 'canplay', 'canplaythrough', 'loadstart', 'loadeddata', 'loadedmetadata', 'timeupdate', 'volumechange', 'play', 'pause', 'error', 'seeking', 'seeked', 'emptied', 'ratechange', 'cuechange',
-
- // Custom events
- 'enterfullscreen', 'exitfullscreen', 'captionsenabled', 'captionsdisabled', 'languagechange', 'controlshidden', 'controlsshown', 'ready',
-
- // YouTube
- 'statechange', 'qualitychange', 'qualityrequested',
-
- // Ads
- 'adsloaded', 'adscontentpause', 'adscontentresume', 'adstarted', 'adsmidpoint', 'adscomplete', 'adsallcomplete', 'adsimpression', 'adsclick'],
-
- // Selectors
- // Change these to match your template if using custom HTML
- selectors: {
- editable: 'input, textarea, select, [contenteditable]',
- container: '.plyr',
- controls: {
- container: null,
- wrapper: '.plyr__controls'
- },
- labels: '[data-plyr]',
- buttons: {
- play: '[data-plyr="play"]',
- pause: '[data-plyr="pause"]',
- restart: '[data-plyr="restart"]',
- rewind: '[data-plyr="rewind"]',
- fastForward: '[data-plyr="fast-forward"]',
- mute: '[data-plyr="mute"]',
- captions: '[data-plyr="captions"]',
- fullscreen: '[data-plyr="fullscreen"]',
- pip: '[data-plyr="pip"]',
- airplay: '[data-plyr="airplay"]',
- settings: '[data-plyr="settings"]',
- loop: '[data-plyr="loop"]'
- },
- inputs: {
- seek: '[data-plyr="seek"]',
- volume: '[data-plyr="volume"]',
- speed: '[data-plyr="speed"]',
- language: '[data-plyr="language"]',
- quality: '[data-plyr="quality"]'
- },
- display: {
- currentTime: '.plyr__time--current',
- duration: '.plyr__time--duration',
- buffer: '.plyr__progress__buffer',
- loop: '.plyr__progress__loop', // Used later
- volume: '.plyr__volume--display'
- },
- progress: '.plyr__progress',
- captions: '.plyr__captions',
- caption: '.plyr__caption',
- menu: {
- quality: '.js-plyr__menu__list--quality'
- }
- },
-
- // Class hooks added to the player in different states
- classNames: {
- type: 'plyr--{0}',
- provider: 'plyr--{0}',
- video: 'plyr__video-wrapper',
- embed: 'plyr__video-embed',
- embedContainer: 'plyr__video-embed__container',
- poster: 'plyr__poster',
- posterEnabled: 'plyr__poster-enabled',
- ads: 'plyr__ads',
- control: 'plyr__control',
- controlPressed: 'plyr__control--pressed',
- playing: 'plyr--playing',
- paused: 'plyr--paused',
- stopped: 'plyr--stopped',
- loading: 'plyr--loading',
- hover: 'plyr--hover',
- tooltip: 'plyr__tooltip',
- cues: 'plyr__cues',
- hidden: 'plyr__sr-only',
- hideControls: 'plyr--hide-controls',
- isIos: 'plyr--is-ios',
- isTouch: 'plyr--is-touch',
- uiSupported: 'plyr--full-ui',
- noTransition: 'plyr--no-transition',
- menu: {
- value: 'plyr__menu__value',
- badge: 'plyr__badge',
- open: 'plyr--menu-open'
- },
- captions: {
- enabled: 'plyr--captions-enabled',
- active: 'plyr--captions-active'
- },
- fullscreen: {
- enabled: 'plyr--fullscreen-enabled',
- fallback: 'plyr--fullscreen-fallback'
- },
- pip: {
- supported: 'plyr--pip-supported',
- active: 'plyr--pip-active'
- },
- airplay: {
- supported: 'plyr--airplay-supported',
- active: 'plyr--airplay-active'
- },
- tabFocus: 'plyr__tab-focus'
- },
-
- // Embed attributes
- attributes: {
- embed: {
- provider: 'data-plyr-provider',
- id: 'data-plyr-embed-id'
- }
- },
-
- // API keys
- keys: {
- google: null
- },
-
- // Advertisements plugin
- // Register for an account here: http://vi.ai/publisher-video-monetization/?aid=plyrio
- ads: {
- enabled: false,
- publisherId: ''
- }
-};
+ if (!is.number(index)) {
+ this.debug.warn('Invalid caption argument', index);
+ return;
+ }
-// ==========================================================================
+ if (!(index in tracks)) {
+ this.debug.warn('Track not found', index);
+ return;
+ }
-var browser$1 = utils.getBrowser();
+ if (this.captions.currentTrack !== index) {
+ this.captions.currentTrack = index;
+ var track = tracks[index];
-function onChange() {
- if (!this.enabled) {
- return;
- }
+ var _ref = track || {},
+ language = _ref.language;
- // Update toggle button
- var button = this.player.elements.buttons.fullscreen;
- if (utils.is.element(button)) {
- button.pressed = this.active;
- }
+ // Store reference to node for invalidation on remove
- // Trigger an event
- utils.dispatchEvent.call(this.player, this.target, this.active ? 'enterfullscreen' : 'exitfullscreen', true);
- // Trap focus in container
- if (!browser$1.isIos) {
- utils.trapFocus.call(this.player, this.target, this.active);
- }
-}
+ this.captions.currentTrackNode = track;
-function toggleFallback() {
- var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
+ // Update settings menu
+ controls.updateSetting.call(this, 'captions');
- // Store or restore scroll position
- if (toggle) {
- this.scrollPosition = {
- x: window.scrollX || 0,
- y: window.scrollY || 0
- };
- } else {
- window.scrollTo(this.scrollPosition.x, this.scrollPosition.y);
- }
+ // When passive, don't override user preferences
+ if (!passive) {
+ this.captions.language = language;
+ this.storage.set({ language: language });
+ }
- // Toggle scroll
- document.body.style.overflow = toggle ? 'hidden' : '';
+ // Handle Vimeo captions
+ if (this.isVimeo) {
+ this.embed.enableTextTrack(language);
+ }
- // Toggle class hook
- utils.toggleClass(this.target, this.player.config.classNames.fullscreen.fallback, toggle);
+ // Trigger event
+ triggerEvent.call(this, this.media, 'languagechange');
+ }
- // Toggle button and fire events
- onChange.call(this);
-}
+ // Show captions
+ captions.toggle.call(this, true, passive);
-var Fullscreen = function () {
- function Fullscreen(player) {
- var _this = this;
+ if (this.isHTML5 && this.isVideo) {
+ // If we change the active track while a cue is already displayed we need to update it
+ captions.updateCues.call(this);
+ }
+ },
- classCallCheck(this, Fullscreen);
- // Keep reference to parent
- this.player = player;
+ // Set captions by language
+ // Used internally for the language setter with the passive option forced to false
+ setLanguage: function setLanguage(input) {
+ var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
- // Get prefix
- this.prefix = Fullscreen.prefix;
- this.property = Fullscreen.property;
+ if (!is.string(input)) {
+ this.debug.warn('Invalid language argument', input);
+ return;
+ }
+ // Normalize
+ var language = input.toLowerCase();
+ this.captions.language = language;
- // Scroll position
- this.scrollPosition = { x: 0, y: 0 };
+ // Set currentTrack
+ var tracks = captions.getTracks.call(this);
+ var track = captions.findTrack.call(this, [language]);
+ captions.set.call(this, tracks.indexOf(track), passive);
+ },
- // Register event listeners
- // Handle event (incase user presses escape etc)
- utils.on(document, this.prefix === 'ms' ? 'MSFullscreenChange' : this.prefix + 'fullscreenchange', function () {
- // TODO: Filter for target??
- onChange.call(_this);
- });
- // Fullscreen toggle on double click
- utils.on(this.player.elements.container, 'dblclick', function (event) {
- // Ignore double click in controls
- if (utils.is.element(_this.player.elements.controls) && _this.player.elements.controls.contains(event.target)) {
- return;
- }
+ // Get current valid caption tracks
+ // If update is false it will also ignore tracks without metadata
+ // This is used to "freeze" the language options when captions.update is false
+ getTracks: function getTracks() {
+ var _this2 = this;
- _this.toggle();
- });
+ var update = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
- // Update the UI
- this.update();
- }
+ // Handle media or textTracks missing or null
+ var tracks = Array.from((this.media || {}).textTracks || []);
+ // For HTML5, use cache instead of current tracks when it exists (if captions.update is false)
+ // Filter out removed tracks and tracks that aren't captions/subtitles (for example metadata)
+ return tracks.filter(function (track) {
+ return !_this2.isHTML5 || update || _this2.captions.meta.has(track);
+ }).filter(function (track) {
+ return ['captions', 'subtitles'].includes(track.kind);
+ });
+ },
- // Determine if native supported
+ // Match tracks based on languages and get the first
+ findTrack: function findTrack(languages) {
+ var _this3 = this;
- createClass(Fullscreen, [{
- key: 'update',
+ var force = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
+ var tracks = captions.getTracks.call(this);
+ var sortIsDefault = function sortIsDefault(track) {
+ return Number((_this3.captions.meta.get(track) || {}).default);
+ };
+ var sorted = Array.from(tracks).sort(function (a, b) {
+ return sortIsDefault(b) - sortIsDefault(a);
+ });
+ var track = void 0;
+ languages.every(function (language) {
+ track = sorted.find(function (track) {
+ return track.language === language;
+ });
+ return !track; // Break iteration if there is a match
+ });
+ // If no match is found but is required, get first
+ return track || (force ? sorted[0] : undefined);
+ },
- // Update UI
- value: function update() {
- if (this.enabled) {
- this.player.debug.log((Fullscreen.native ? 'Native' : 'Fallback') + ' fullscreen enabled');
- } else {
- this.player.debug.log('Fullscreen not supported and fallback disabled');
- }
- // Add styling hook to show button
- utils.toggleClass(this.player.elements.container, this.player.config.classNames.fullscreen.enabled, this.enabled);
- }
+ // Get the current track
+ getCurrentTrack: function getCurrentTrack() {
+ return captions.getTracks.call(this)[this.currentTrack];
+ },
- // Make an element fullscreen
- }, {
- key: 'enter',
- value: function enter() {
- if (!this.enabled) {
- return;
+ // Get UI label for track
+ getLabel: function getLabel(track) {
+ var currentTrack = track;
+
+ if (!is.track(currentTrack) && support.textTracks && this.captions.toggled) {
+ currentTrack = captions.getCurrentTrack.call(this);
}
- // iOS native fullscreen doesn't need the request step
- if (browser$1.isIos && this.player.config.fullscreen.iosNative) {
- if (this.player.playing) {
- this.target.webkitEnterFullscreen();
+ if (is.track(currentTrack)) {
+ if (!is.empty(currentTrack.label)) {
+ return currentTrack.label;
}
- } else if (!Fullscreen.native) {
- toggleFallback.call(this, true);
- } else if (!this.prefix) {
- this.target.requestFullscreen();
- } else if (!utils.is.empty(this.prefix)) {
- this.target[this.prefix + 'Request' + this.property]();
+
+ if (!is.empty(currentTrack.language)) {
+ return track.language.toUpperCase();
+ }
+
+ return i18n.get('enabled', this.config);
}
- }
- // Bail from fullscreen
+ return i18n.get('disabled', this.config);
+ },
+
- }, {
- key: 'exit',
- value: function exit() {
- if (!this.enabled) {
+ // Update captions using current track's active cues
+ // Also optional array argument in case there isn't any track (ex: vimeo)
+ updateCues: function updateCues(input) {
+ // Requires UI
+ if (!this.supported.ui) {
return;
}
- // iOS native fullscreen
- if (browser$1.isIos && this.player.config.fullscreen.iosNative) {
- this.target.webkitExitFullscreen();
- this.player.play();
- } else if (!Fullscreen.native) {
- toggleFallback.call(this, false);
- } else if (!this.prefix) {
- (document.cancelFullScreen || document.exitFullscreen).call(document);
- } else if (!utils.is.empty(this.prefix)) {
- var action = this.prefix === 'moz' ? 'Cancel' : 'Exit';
- document['' + this.prefix + action + this.property]();
+ if (!is.element(this.elements.captions)) {
+ this.debug.warn('No captions element to render to');
+ return;
}
- }
- // Toggle state
-
- }, {
- key: 'toggle',
- value: function toggle() {
- if (!this.active) {
- this.enter();
- } else {
- this.exit();
+ // Only accept array or empty input
+ if (!is.nullOrUndefined(input) && !Array.isArray(input)) {
+ this.debug.warn('updateCues: Invalid input', input);
+ return;
}
- }
- }, {
- key: 'enabled',
+ var cues = input;
- // Determine if fullscreen is enabled
- get: function get$$1() {
- return (Fullscreen.native || this.player.config.fullscreen.fallback) && this.player.config.fullscreen.enabled && this.player.supported.ui && this.player.isVideo;
- }
+ // Get cues from track
+ if (!cues) {
+ var track = captions.getCurrentTrack.call(this);
+ cues = Array.from((track || {}).activeCues || []).map(function (cue) {
+ return cue.getCueAsHTML();
+ }).map(getHTML);
+ }
- // Get active state
+ // Set new caption text
+ var content = cues.map(function (cueText) {
+ return cueText.trim();
+ }).join('\n');
+ var changed = content !== this.elements.captions.innerHTML;
- }, {
- key: 'active',
- get: function get$$1() {
- if (!this.enabled) {
- return false;
- }
+ if (changed) {
+ // Empty the container and create a new child element
+ emptyElement(this.elements.captions);
+ var caption = createElement('span', getAttributesFromSelector(this.config.selectors.caption));
+ caption.innerHTML = content;
+ this.elements.captions.appendChild(caption);
- // Fallback using classname
- if (!Fullscreen.native) {
- return utils.hasClass(this.target, this.player.config.classNames.fullscreen.fallback);
+ // Trigger event
+ triggerEvent.call(this, this.media, 'cuechange');
}
+ }
+ };
- var element = !this.prefix ? document.fullscreenElement : document['' + this.prefix + this.property + 'Element'];
+ // ==========================================================================
+ // Plyr default config
+ // ==========================================================================
- return element === this.target;
- }
+ var defaults$1 = {
+ // Disable
+ enabled: true,
- // Get target element
+ // Custom media title
+ title: '',
- }, {
- key: 'target',
- get: function get$$1() {
- return browser$1.isIos && this.player.config.fullscreen.iosNative ? this.player.media : this.player.elements.container;
- }
- }], [{
- key: 'native',
- get: function get$$1() {
- return !!(document.fullscreenEnabled || document.webkitFullscreenEnabled || document.mozFullScreenEnabled || document.msFullscreenEnabled);
- }
+ // Logging to console
+ debug: false,
- // Get the prefix for handlers
+ // Auto play (if supported)
+ autoplay: false,
- }, {
- key: 'prefix',
- get: function get$$1() {
- // No prefix
- if (utils.is.function(document.exitFullscreen)) {
- return '';
- }
+ // Only allow one media playing at once (vimeo only)
+ autopause: true,
- // Check for fullscreen support by vendor prefix
- var value = '';
- var prefixes = ['webkit', 'moz', 'ms'];
+ // Allow inline playback on iOS (this effects YouTube/Vimeo - HTML5 requires the attribute present)
+ // TODO: Remove iosNative fullscreen option in favour of this (logic needs work)
+ playsinline: true,
- prefixes.some(function (pre) {
- if (utils.is.function(document[pre + 'ExitFullscreen']) || utils.is.function(document[pre + 'CancelFullScreen'])) {
- value = pre;
- return true;
- }
+ // Default time to skip when rewind/fast forward
+ seekTime: 10,
- return false;
- });
+ // Default volume
+ volume: 1,
+ muted: false,
- return value;
- }
- }, {
- key: 'property',
- get: function get$$1() {
- return this.prefix === 'moz' ? 'FullScreen' : 'Fullscreen';
- }
- }]);
- return Fullscreen;
-}();
+ // Pass a custom duration
+ duration: null,
-// ==========================================================================
+ // Display the media duration on load in the current time position
+ // If you have opted to display both duration and currentTime, this is ignored
+ displayDuration: true,
-// Sniff out the browser
-var browser$2 = utils.getBrowser();
+ // Invert the current time to be a countdown
+ invertTime: true,
-var ui = {
- addStyleHook: function addStyleHook() {
- utils.toggleClass(this.elements.container, this.config.selectors.container.replace('.', ''), true);
- utils.toggleClass(this.elements.container, this.config.classNames.uiSupported, this.supported.ui);
- },
+ // Clicking the currentTime inverts it's value to show time left rather than elapsed
+ toggleInvert: true,
+ // Aspect ratio (for embeds)
+ ratio: '16:9',
- // Toggle native HTML5 media controls
- toggleNativeControls: function toggleNativeControls() {
- var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
+ // Click video container to play/pause
+ clickToPlay: true,
- if (toggle && this.isHTML5) {
- this.media.setAttribute('controls', '');
- } else {
- this.media.removeAttribute('controls');
- }
- },
+ // Auto hide the controls
+ hideControls: true,
+ // Reset to start when playback ended
+ resetOnEnd: false,
- // Setup the UI
- build: function build() {
- var _this = this;
+ // Disable the standard context menu
+ disableContextMenu: true,
- // Re-attach media element listeners
- // TODO: Use event bubbling?
- this.listeners.media();
+ // Sprite (for icons)
+ loadSprite: true,
+ iconPrefix: 'plyr',
+ iconUrl: 'https://cdn.plyr.io/3.3.12/plyr.svg',
- // Don't setup interface if no support
- if (!this.supported.ui) {
- this.debug.warn('Basic support only for ' + this.provider + ' ' + this.type);
+ // Blank video (used to prevent errors on source change)
+ blankVideo: 'https://cdn.plyr.io/static/blank.mp4',
- // Restore native controls
- ui.toggleNativeControls.call(this, true);
+ // Quality default
+ quality: {
+ default: 576,
+ options: [4320, 2880, 2160, 1440, 1080, 720, 576, 480, 360, 240, 'default']
+ },
- // Bail
- return;
- }
+ // Set loops
+ loop: {
+ active: false
+ // start: null,
+ // end: null,
+ },
- // Inject custom controls if not present
- if (!utils.is.element(this.elements.controls)) {
- // Inject custom controls
- controls.inject.call(this);
+ // Speed default and options to display
+ speed: {
+ selected: 1,
+ options: [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2]
+ },
- // Re-attach control listeners
- this.listeners.controls();
- }
+ // Keyboard shortcut settings
+ keyboard: {
+ focused: true,
+ global: false
+ },
- // Remove native controls
- ui.toggleNativeControls.call(this);
+ // Display tooltips
+ tooltips: {
+ controls: false,
+ seek: true
+ },
- // Setup captions for HTML5
- if (this.isHTML5) {
- captions.setup.call(this);
- }
+ // Captions settings
+ captions: {
+ active: false,
+ language: 'auto',
+ // Listen to new tracks added after Plyr is initialized.
+ // This is needed for streaming captions, but may result in unselectable options
+ update: false
+ },
- // Reset volume
- this.volume = null;
+ // Fullscreen settings
+ fullscreen: {
+ enabled: true, // Allow fullscreen?
+ fallback: true, // Fallback for vintage browsers
+ iosNative: false // Use the native fullscreen in iOS (disables custom controls)
+ },
- // Reset mute state
- this.muted = null;
+ // Local storage
+ storage: {
+ enabled: true,
+ key: 'plyr'
+ },
- // Reset speed
- this.speed = null;
+ // Default controls
+ controls: ['play-large',
+ // 'restart',
+ // 'rewind',
+ 'play',
+ // 'fast-forward',
+ 'progress', 'current-time', 'mute', 'volume', 'captions', 'settings', 'pip', 'airplay', 'fullscreen'],
+ settings: ['captions', 'quality', 'speed'],
+
+ // Localisation
+ i18n: {
+ restart: 'Restart',
+ rewind: 'Rewind {seektime}s',
+ play: 'Play',
+ pause: 'Pause',
+ fastForward: 'Forward {seektime}s',
+ seek: 'Seek',
+ seekLabel: '{currentTime} of {duration}',
+ played: 'Played',
+ buffered: 'Buffered',
+ currentTime: 'Current time',
+ duration: 'Duration',
+ volume: 'Volume',
+ mute: 'Mute',
+ unmute: 'Unmute',
+ enableCaptions: 'Enable captions',
+ disableCaptions: 'Disable captions',
+ enterFullscreen: 'Enter fullscreen',
+ exitFullscreen: 'Exit fullscreen',
+ frameTitle: 'Player for {title}',
+ captions: 'Captions',
+ settings: 'Settings',
+ menuBack: 'Go back to previous menu',
+ speed: 'Speed',
+ normal: 'Normal',
+ quality: 'Quality',
+ loop: 'Loop',
+ start: 'Start',
+ end: 'End',
+ all: 'All',
+ reset: 'Reset',
+ disabled: 'Disabled',
+ enabled: 'Enabled',
+ advertisement: 'Ad',
+ qualityBadge: {
+ 2160: '4K',
+ 1440: 'HD',
+ 1080: 'HD',
+ 720: 'HD',
+ 576: 'SD',
+ 480: 'SD'
+ }
+ },
- // Reset loop state
- this.loop = null;
+ // URLs
+ urls: {
+ vimeo: {
+ sdk: 'https://player.vimeo.com/api/player.js',
+ iframe: 'https://player.vimeo.com/video/{0}?{1}',
+ api: 'https://vimeo.com/api/v2/video/{0}.json'
+ },
+ youtube: {
+ sdk: 'https://www.youtube.com/iframe_api',
+ api: 'https://www.googleapis.com/youtube/v3/videos?id={0}&key={1}&fields=items(snippet(title))&part=snippet'
+ },
+ googleIMA: {
+ sdk: 'https://imasdk.googleapis.com/js/sdkloader/ima3.js'
+ }
+ },
- // Reset quality setting
- this.quality = null;
+ // Custom control listeners
+ listeners: {
+ seek: null,
+ play: null,
+ pause: null,
+ restart: null,
+ rewind: null,
+ fastForward: null,
+ mute: null,
+ volume: null,
+ captions: null,
+ fullscreen: null,
+ pip: null,
+ airplay: null,
+ speed: null,
+ quality: null,
+ loop: null,
+ language: null
+ },
- // Reset volume display
- controls.updateVolume.call(this);
+ // Events to watch and bubble
+ events: [
+ // Events to watch on HTML5 media elements and bubble
+ // https://developer.mozilla.org/en/docs/Web/Guide/Events/Media_events
+ 'ended', 'progress', 'stalled', 'playing', 'waiting', 'canplay', 'canplaythrough', 'loadstart', 'loadeddata', 'loadedmetadata', 'timeupdate', 'volumechange', 'play', 'pause', 'error', 'seeking', 'seeked', 'emptied', 'ratechange', 'cuechange',
- // Reset time display
- controls.timeUpdate.call(this);
+ // Custom events
+ 'enterfullscreen', 'exitfullscreen', 'captionsenabled', 'captionsdisabled', 'languagechange', 'controlshidden', 'controlsshown', 'ready',
- // Update the UI
- ui.checkPlaying.call(this);
+ // YouTube
+ 'statechange', 'qualitychange', 'qualityrequested',
+
+ // Ads
+ 'adsloaded', 'adscontentpause', 'adscontentresume', 'adstarted', 'adsmidpoint', 'adscomplete', 'adsallcomplete', 'adsimpression', 'adsclick'],
+
+ // Selectors
+ // Change these to match your template if using custom HTML
+ selectors: {
+ editable: 'input, textarea, select, [contenteditable]',
+ container: '.plyr',
+ controls: {
+ container: null,
+ wrapper: '.plyr__controls'
+ },
+ labels: '[data-plyr]',
+ buttons: {
+ play: '[data-plyr="play"]',
+ pause: '[data-plyr="pause"]',
+ restart: '[data-plyr="restart"]',
+ rewind: '[data-plyr="rewind"]',
+ fastForward: '[data-plyr="fast-forward"]',
+ mute: '[data-plyr="mute"]',
+ captions: '[data-plyr="captions"]',
+ fullscreen: '[data-plyr="fullscreen"]',
+ pip: '[data-plyr="pip"]',
+ airplay: '[data-plyr="airplay"]',
+ settings: '[data-plyr="settings"]',
+ loop: '[data-plyr="loop"]'
+ },
+ inputs: {
+ seek: '[data-plyr="seek"]',
+ volume: '[data-plyr="volume"]',
+ speed: '[data-plyr="speed"]',
+ language: '[data-plyr="language"]',
+ quality: '[data-plyr="quality"]'
+ },
+ display: {
+ currentTime: '.plyr__time--current',
+ duration: '.plyr__time--duration',
+ buffer: '.plyr__progress__buffer',
+ loop: '.plyr__progress__loop', // Used later
+ volume: '.plyr__volume--display'
+ },
+ progress: '.plyr__progress',
+ captions: '.plyr__captions',
+ caption: '.plyr__caption',
+ menu: {
+ quality: '.js-plyr__menu__list--quality'
+ }
+ },
- // Check for picture-in-picture support
- utils.toggleClass(this.elements.container, this.config.classNames.pip.supported, support.pip && this.isHTML5 && this.isVideo);
+ // Class hooks added to the player in different states
+ classNames: {
+ type: 'plyr--{0}',
+ provider: 'plyr--{0}',
+ video: 'plyr__video-wrapper',
+ embed: 'plyr__video-embed',
+ embedContainer: 'plyr__video-embed__container',
+ poster: 'plyr__poster',
+ posterEnabled: 'plyr__poster-enabled',
+ ads: 'plyr__ads',
+ control: 'plyr__control',
+ controlPressed: 'plyr__control--pressed',
+ playing: 'plyr--playing',
+ paused: 'plyr--paused',
+ stopped: 'plyr--stopped',
+ loading: 'plyr--loading',
+ hover: 'plyr--hover',
+ tooltip: 'plyr__tooltip',
+ cues: 'plyr__cues',
+ hidden: 'plyr__sr-only',
+ hideControls: 'plyr--hide-controls',
+ isIos: 'plyr--is-ios',
+ isTouch: 'plyr--is-touch',
+ uiSupported: 'plyr--full-ui',
+ noTransition: 'plyr--no-transition',
+ menu: {
+ value: 'plyr__menu__value',
+ badge: 'plyr__badge',
+ open: 'plyr--menu-open'
+ },
+ captions: {
+ enabled: 'plyr--captions-enabled',
+ active: 'plyr--captions-active'
+ },
+ fullscreen: {
+ enabled: 'plyr--fullscreen-enabled',
+ fallback: 'plyr--fullscreen-fallback'
+ },
+ pip: {
+ supported: 'plyr--pip-supported',
+ active: 'plyr--pip-active'
+ },
+ airplay: {
+ supported: 'plyr--airplay-supported',
+ active: 'plyr--airplay-active'
+ },
+ tabFocus: 'plyr__tab-focus'
+ },
- // Check for airplay support
- utils.toggleClass(this.elements.container, this.config.classNames.airplay.supported, support.airplay && this.isHTML5);
+ // Embed attributes
+ attributes: {
+ embed: {
+ provider: 'data-plyr-provider',
+ id: 'data-plyr-embed-id'
+ }
+ },
- // Add iOS class
- utils.toggleClass(this.elements.container, this.config.classNames.isIos, browser$2.isIos);
+ // API keys
+ keys: {
+ google: null
+ },
- // Add touch class
- utils.toggleClass(this.elements.container, this.config.classNames.isTouch, this.touch);
+ // Advertisements plugin
+ // Register for an account here: http://vi.ai/publisher-video-monetization/?aid=plyrio
+ ads: {
+ enabled: false,
+ publisherId: ''
+ }
+ };
- // Ready for API calls
- this.ready = true;
+ // ==========================================================================
+ // Plyr supported types and providers
+ // ==========================================================================
- // Ready event at end of execution stack
- setTimeout(function () {
- utils.dispatchEvent.call(_this, _this.media, 'ready');
- }, 0);
+ var providers = {
+ html5: 'html5',
+ youtube: 'youtube',
+ vimeo: 'vimeo'
+ };
- // Set the title
- ui.setTitle.call(this);
+ var types = {
+ audio: 'audio',
+ video: 'video'
+ };
- // Assure the poster image is set, if the property was added before the element was created
- if (this.poster && this.elements.poster && !this.elements.poster.style.backgroundImage) {
- ui.setPoster.call(this, this.poster);
+ /**
+ * Get provider by URL
+ * @param {string} url
+ */
+ function getProviderByUrl(url) {
+ // YouTube
+ if (/^(https?:\/\/)?(www\.)?(youtube\.com|youtu\.?be)\/.+$/.test(url)) {
+ return providers.youtube;
}
- // Manually set the duration if user has overridden it.
- // The event listeners for it doesn't get called if preload is disabled (#701)
- if (this.config.duration) {
- controls.durationUpdate.call(this);
+ // Vimeo
+ if (/^https?:\/\/player.vimeo.com\/video\/\d{0,9}(?=\b|\/)/.test(url)) {
+ return providers.vimeo;
}
- },
+ return null;
+ }
- // Setup aria attribute for play and iframe title
- setTitle: function setTitle() {
- // Find the current text
- var label = i18n.get('play', this.config);
+ // ==========================================================================
+ // Console wrapper
+ // ==========================================================================
- // If there's a media title set, use that for the label
- if (utils.is.string(this.config.title) && !utils.is.empty(this.config.title)) {
- label += ', ' + this.config.title;
- }
+ var noop = function noop() {};
- // If there's a play button, set label
- if (utils.is.nodeList(this.elements.buttons.play)) {
- Array.from(this.elements.buttons.play).forEach(function (button) {
- button.setAttribute('aria-label', label);
- });
- }
+ var Console = function () {
+ function Console() {
+ var enabled = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
+ classCallCheck(this, Console);
- // Set iframe title
- // https://github.com/sampotts/plyr/issues/124
- if (this.isEmbed) {
- var iframe = utils.getElement.call(this, 'iframe');
+ this.enabled = window.console && enabled;
- if (!utils.is.element(iframe)) {
- return;
+ if (this.enabled) {
+ this.log('Debugging enabled');
}
+ }
- // Default to media type
- var title = !utils.is.empty(this.config.title) ? this.config.title : 'video';
- var format = i18n.get('frameTitle', this.config);
+ createClass(Console, [{
+ key: 'log',
+ get: function get$$1() {
+ // eslint-disable-next-line no-console
+ return this.enabled ? Function.prototype.bind.call(console.log, console) : noop;
+ }
+ }, {
+ key: 'warn',
+ get: function get$$1() {
+ // eslint-disable-next-line no-console
+ return this.enabled ? Function.prototype.bind.call(console.warn, console) : noop;
+ }
+ }, {
+ key: 'error',
+ get: function get$$1() {
+ // eslint-disable-next-line no-console
+ return this.enabled ? Function.prototype.bind.call(console.error, console) : noop;
+ }
+ }]);
+ return Console;
+ }();
- iframe.setAttribute('title', format.replace('{title}', title));
- }
- },
+ // ==========================================================================
+ function onChange() {
+ if (!this.enabled) {
+ return;
+ }
- // Toggle poster
- togglePoster: function togglePoster(enable) {
- utils.toggleClass(this.elements.container, this.config.classNames.posterEnabled, enable);
- },
+ // Update toggle button
+ var button = this.player.elements.buttons.fullscreen;
+ if (is.element(button)) {
+ button.pressed = this.active;
+ }
+ // Trigger an event
+ triggerEvent.call(this.player, this.target, this.active ? 'enterfullscreen' : 'exitfullscreen', true);
- // Set the poster image (async)
- setPoster: function setPoster(poster) {
- var _this2 = this;
+ // Trap focus in container
+ if (!browser.isIos) {
+ trapFocus.call(this.player, this.target, this.active);
+ }
+ }
- // Set property regardless of validity
- this.media.setAttribute('poster', poster);
+ function toggleFallback() {
+ var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
- // Bail if element is missing
- if (!utils.is.element(this.elements.poster)) {
- return Promise.reject();
+ // Store or restore scroll position
+ if (toggle) {
+ this.scrollPosition = {
+ x: window.scrollX || 0,
+ y: window.scrollY || 0
+ };
+ } else {
+ window.scrollTo(this.scrollPosition.x, this.scrollPosition.y);
}
- // Load the image, and set poster if successful
- var loadPromise = utils.loadImage(poster).then(function () {
- _this2.elements.poster.style.backgroundImage = 'url(\'' + poster + '\')';
- Object.assign(_this2.elements.poster.style, {
- backgroundImage: 'url(\'' + poster + '\')',
- // Reset backgroundSize as well (since it can be set to "cover" for padded thumbnails for youtube)
- backgroundSize: ''
- });
- ui.togglePoster.call(_this2, true);
- return poster;
- });
+ // Toggle scroll
+ document.body.style.overflow = toggle ? 'hidden' : '';
- // Hide the element if the poster can't be loaded (otherwise it will just be a black element covering the video)
- loadPromise.catch(function () {
- return ui.togglePoster.call(_this2, false);
- });
+ // Toggle class hook
+ toggleClass(this.target, this.player.config.classNames.fullscreen.fallback, toggle);
- // Return the promise so the caller can use it as well
- return loadPromise;
- },
+ // Toggle button and fire events
+ onChange.call(this);
+ }
+ var Fullscreen = function () {
+ function Fullscreen(player) {
+ var _this = this;
- // Check playing state
- checkPlaying: function checkPlaying(event) {
- var _this3 = this;
+ classCallCheck(this, Fullscreen);
- // Class hooks
- utils.toggleClass(this.elements.container, this.config.classNames.playing, this.playing);
- utils.toggleClass(this.elements.container, this.config.classNames.paused, this.paused);
- utils.toggleClass(this.elements.container, this.config.classNames.stopped, this.stopped);
+ // Keep reference to parent
+ this.player = player;
- // Set state
- Array.from(this.elements.buttons.play).forEach(function (target) {
- target.pressed = _this3.playing;
- });
+ // Get prefix
+ this.prefix = Fullscreen.prefix;
+ this.property = Fullscreen.property;
- // Only update controls on non timeupdate events
- if (utils.is.event(event) && event.type === 'timeupdate') {
- return;
+ // Scroll position
+ this.scrollPosition = { x: 0, y: 0 };
+
+ // Register event listeners
+ // Handle event (incase user presses escape etc)
+ on.call(this.player, document, this.prefix === 'ms' ? 'MSFullscreenChange' : this.prefix + 'fullscreenchange', function () {
+ // TODO: Filter for target??
+ onChange.call(_this);
+ });
+
+ // Fullscreen toggle on double click
+ on.call(this.player, this.player.elements.container, 'dblclick', function (event) {
+ // Ignore double click in controls
+ if (is.element(_this.player.elements.controls) && _this.player.elements.controls.contains(event.target)) {
+ return;
+ }
+
+ _this.toggle();
+ });
+
+ // Update the UI
+ this.update();
}
- // Toggle controls
- ui.toggleControls.call(this);
- },
+ // Determine if native supported
- // Check if media is loading
- checkLoading: function checkLoading(event) {
- var _this4 = this;
+ createClass(Fullscreen, [{
+ key: 'update',
- this.loading = ['stalled', 'waiting'].includes(event.type);
- // Clear timer
- clearTimeout(this.timers.loading);
+ // Update UI
+ value: function update() {
+ if (this.enabled) {
+ this.player.debug.log((Fullscreen.native ? 'Native' : 'Fallback') + ' fullscreen enabled');
+ } else {
+ this.player.debug.log('Fullscreen not supported and fallback disabled');
+ }
- // Timer to prevent flicker when seeking
- this.timers.loading = setTimeout(function () {
- // Update progress bar loading class state
- utils.toggleClass(_this4.elements.container, _this4.config.classNames.loading, _this4.loading);
+ // Add styling hook to show button
+ toggleClass(this.player.elements.container, this.player.config.classNames.fullscreen.enabled, this.enabled);
+ }
- // Update controls visibility
- ui.toggleControls.call(_this4);
- }, this.loading ? 250 : 0);
- },
+ // Make an element fullscreen
+ }, {
+ key: 'enter',
+ value: function enter() {
+ if (!this.enabled) {
+ return;
+ }
- // Toggle controls based on state and `force` argument
- toggleControls: function toggleControls(force) {
- var controls$$1 = this.elements.controls;
+ // iOS native fullscreen doesn't need the request step
+ if (browser.isIos && this.player.config.fullscreen.iosNative) {
+ if (this.player.playing) {
+ this.target.webkitEnterFullscreen();
+ }
+ } else if (!Fullscreen.native) {
+ toggleFallback.call(this, true);
+ } else if (!this.prefix) {
+ this.target.requestFullscreen();
+ } else if (!is.empty(this.prefix)) {
+ this.target[this.prefix + 'Request' + this.property]();
+ }
+ }
+ // Bail from fullscreen
- if (controls$$1 && this.config.hideControls) {
- // Show controls if force, loading, paused, or button interaction, otherwise hide
- this.toggleControls(Boolean(force || this.loading || this.paused || controls$$1.pressed || controls$$1.hover));
- }
- }
-};
+ }, {
+ key: 'exit',
+ value: function exit() {
+ if (!this.enabled) {
+ return;
+ }
-// ==========================================================================
+ // iOS native fullscreen
+ if (browser.isIos && this.player.config.fullscreen.iosNative) {
+ this.target.webkitExitFullscreen();
+ this.player.play();
+ } else if (!Fullscreen.native) {
+ toggleFallback.call(this, false);
+ } else if (!this.prefix) {
+ (document.cancelFullScreen || document.exitFullscreen).call(document);
+ } else if (!is.empty(this.prefix)) {
+ var action = this.prefix === 'moz' ? 'Cancel' : 'Exit';
+ document['' + this.prefix + action + this.property]();
+ }
+ }
-// Sniff out the browser
-var browser$3 = utils.getBrowser();
+ // Toggle state
-var Listeners = function () {
- function Listeners(player) {
- classCallCheck(this, Listeners);
+ }, {
+ key: 'toggle',
+ value: function toggle() {
+ if (!this.active) {
+ this.enter();
+ } else {
+ this.exit();
+ }
+ }
+ }, {
+ key: 'enabled',
- this.player = player;
- this.lastKey = null;
- this.handleKey = this.handleKey.bind(this);
- this.toggleMenu = this.toggleMenu.bind(this);
- this.firstTouch = this.firstTouch.bind(this);
- }
+ // Determine if fullscreen is enabled
+ get: function get$$1() {
+ return (Fullscreen.native || this.player.config.fullscreen.fallback) && this.player.config.fullscreen.enabled && this.player.supported.ui && this.player.isVideo;
+ }
- // Handle key presses
+ // Get active state
+ }, {
+ key: 'active',
+ get: function get$$1() {
+ if (!this.enabled) {
+ return false;
+ }
- createClass(Listeners, [{
- key: 'handleKey',
- value: function handleKey(event) {
- var _this = this;
+ // Fallback using classname
+ if (!Fullscreen.native) {
+ return hasClass(this.target, this.player.config.classNames.fullscreen.fallback);
+ }
- var code = event.keyCode ? event.keyCode : event.which;
- var pressed = event.type === 'keydown';
- var repeat = pressed && code === this.lastKey;
+ var element = !this.prefix ? document.fullscreenElement : document['' + this.prefix + this.property + 'Element'];
- // Bail if a modifier key is set
- if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) {
- return;
+ return element === this.target;
}
- // If the event is bubbled from the media element
- // Firefox doesn't get the keycode for whatever reason
- if (!utils.is.number(code)) {
- return;
+ // Get target element
+
+ }, {
+ key: 'target',
+ get: function get$$1() {
+ return browser.isIos && this.player.config.fullscreen.iosNative ? this.player.media : this.player.elements.container;
+ }
+ }], [{
+ key: 'native',
+ get: function get$$1() {
+ return !!(document.fullscreenEnabled || document.webkitFullscreenEnabled || document.mozFullScreenEnabled || document.msFullscreenEnabled);
}
- // Seek by the number keys
- var seekByKey = function seekByKey() {
- // Divide the max duration into 10th's and times by the number value
- _this.player.currentTime = _this.player.duration / 10 * (code - 48);
- };
+ // Get the prefix for handlers
- // Handle the key on keydown
- // Reset on keyup
- if (pressed) {
- // Which keycodes should we prevent default
- var preventDefault = [48, 49, 50, 51, 52, 53, 54, 56, 57, 32, 75, 38, 40, 77, 39, 37, 70, 67, 73, 76, 79];
-
- // Check focused element
- // and if the focused element is not editable (e.g. text input)
- // and any that accept key input http://webaim.org/techniques/keyboard/
- var focused = utils.getFocusElement();
- if (utils.is.element(focused) && focused !== this.player.elements.inputs.seek && utils.matches(focused, this.player.config.selectors.editable)) {
- return;
- }
-
- // If the code is found prevent default (e.g. prevent scrolling for arrows)
- if (preventDefault.includes(code)) {
- event.preventDefault();
- event.stopPropagation();
+ }, {
+ key: 'prefix',
+ get: function get$$1() {
+ // No prefix
+ if (is.function(document.exitFullscreen)) {
+ return '';
}
- switch (code) {
- case 48:
- case 49:
- case 50:
- case 51:
- case 52:
- case 53:
- case 54:
- case 55:
- case 56:
- case 57:
- // 0-9
- if (!repeat) {
- seekByKey();
- }
- break;
+ // Check for fullscreen support by vendor prefix
+ var value = '';
+ var prefixes = ['webkit', 'moz', 'ms'];
- case 32:
- case 75:
- // Space and K key
- if (!repeat) {
- this.player.togglePlay();
- }
- break;
+ prefixes.some(function (pre) {
+ if (is.function(document[pre + 'ExitFullscreen']) || is.function(document[pre + 'CancelFullScreen'])) {
+ value = pre;
+ return true;
+ }
- case 38:
- // Arrow up
- this.player.increaseVolume(0.1);
- break;
+ return false;
+ });
- case 40:
- // Arrow down
- this.player.decreaseVolume(0.1);
- break;
+ return value;
+ }
+ }, {
+ key: 'property',
+ get: function get$$1() {
+ return this.prefix === 'moz' ? 'FullScreen' : 'Fullscreen';
+ }
+ }]);
+ return Fullscreen;
+ }();
- case 77:
- // M key
- if (!repeat) {
- this.player.muted = !this.player.muted;
- }
- break;
+ // ==========================================================================
+ // Load image avoiding xhr/fetch CORS issues
+ // Server status can't be obtained this way unfortunately, so this uses "naturalWidth" to determine if the image has loaded
+ // By default it checks if it is at least 1px, but you can add a second argument to change this
+ // ==========================================================================
- case 39:
- // Arrow forward
- this.player.forward();
- break;
+ function loadImage(src) {
+ var minWidth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
- case 37:
- // Arrow back
- this.player.rewind();
- break;
+ return new Promise(function (resolve, reject) {
+ var image = new Image();
- case 70:
- // F key
- this.player.fullscreen.toggle();
- break;
+ var handler = function handler() {
+ delete image.onload;
+ delete image.onerror;
+ (image.naturalWidth >= minWidth ? resolve : reject)(image);
+ };
- case 67:
- // C key
- if (!repeat) {
- this.player.toggleCaptions();
- }
- break;
+ Object.assign(image, { onload: handler, onerror: handler, src: src });
+ });
+ }
- case 76:
- // L key
- this.player.loop = !this.player.loop;
- break;
+ // ==========================================================================
- /* case 73:
- this.setLoop('start');
- break;
- case 76:
- this.setLoop();
- break;
- case 79:
- this.setLoop('end');
- break; */
+ var ui = {
+ addStyleHook: function addStyleHook() {
+ toggleClass(this.elements.container, this.config.selectors.container.replace('.', ''), true);
+ toggleClass(this.elements.container, this.config.classNames.uiSupported, this.supported.ui);
+ },
- default:
- break;
- }
- // Escape is handle natively when in full screen
- // So we only need to worry about non native
- if (!this.player.fullscreen.enabled && this.player.fullscreen.active && code === 27) {
- this.player.fullscreen.toggle();
- }
+ // Toggle native HTML5 media controls
+ toggleNativeControls: function toggleNativeControls() {
+ var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
- // Store last code for next cycle
- this.lastKey = code;
+ if (toggle && this.isHTML5) {
+ this.media.setAttribute('controls', '');
} else {
- this.lastKey = null;
+ this.media.removeAttribute('controls');
}
- }
+ },
- // Toggle menu
- }, {
- key: 'toggleMenu',
- value: function toggleMenu(event) {
- controls.toggleMenu.call(this.player, event);
- }
+ // Setup the UI
+ build: function build() {
+ var _this = this;
- // Device is touch enabled
+ // Re-attach media element listeners
+ // TODO: Use event bubbling?
+ this.listeners.media();
- }, {
- key: 'firstTouch',
- value: function firstTouch() {
- this.player.touch = true;
+ // Don't setup interface if no support
+ if (!this.supported.ui) {
+ this.debug.warn('Basic support only for ' + this.provider + ' ' + this.type);
- // Add touch class
- utils.toggleClass(this.player.elements.container, this.player.config.classNames.isTouch, true);
+ // Restore native controls
+ ui.toggleNativeControls.call(this, true);
- // Clean up
- utils.off(document.body, 'touchstart', this.firstTouch);
- }
+ // Bail
+ return;
+ }
+
+ // Inject custom controls if not present
+ if (!is.element(this.elements.controls)) {
+ // Inject custom controls
+ controls.inject.call(this);
- // Global window & document listeners
+ // Re-attach control listeners
+ this.listeners.controls();
+ }
- }, {
- key: 'global',
- value: function global() {
- var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
+ // Remove native controls
+ ui.toggleNativeControls.call(this);
- // Keyboard shortcuts
- if (this.player.config.keyboard.global) {
- utils.toggleListener(window, 'keydown keyup', this.handleKey, toggle, false);
+ // Setup captions for HTML5
+ if (this.isHTML5) {
+ captions.setup.call(this);
}
- // Click anywhere closes menu
- utils.toggleListener(document.body, 'click', this.toggleMenu, toggle);
+ // Reset volume
+ this.volume = null;
- // Detect touch by events
- utils.on(document.body, 'touchstart', this.firstTouch);
- }
+ // Reset mute state
+ this.muted = null;
- // Container listeners
+ // Reset speed
+ this.speed = null;
- }, {
- key: 'container',
- value: function container() {
- var _this2 = this;
+ // Reset loop state
+ this.loop = null;
- // Keyboard shortcuts
- if (!this.player.config.keyboard.global && this.player.config.keyboard.focused) {
- utils.on(this.player.elements.container, 'keydown keyup', this.handleKey, false);
- }
+ // Reset quality setting
+ this.quality = null;
- // Detect tab focus
- // Remove class on blur/focusout
- utils.on(this.player.elements.container, 'focusout', function (event) {
- utils.toggleClass(event.target, _this2.player.config.classNames.tabFocus, false);
- });
+ // Reset volume display
+ controls.updateVolume.call(this);
- // Add classname to tabbed elements
- utils.on(this.player.elements.container, 'keydown', function (event) {
- if (event.keyCode !== 9) {
- return;
- }
+ // Reset time display
+ controls.timeUpdate.call(this);
- // Delay the adding of classname until the focus has changed
- // This event fires before the focusin event
- setTimeout(function () {
- utils.toggleClass(utils.getFocusElement(), _this2.player.config.classNames.tabFocus, true);
- }, 0);
- });
+ // Update the UI
+ ui.checkPlaying.call(this);
- // Toggle controls on mouse events and entering fullscreen
- utils.on(this.player.elements.container, 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen', function (event) {
- var controls$$1 = _this2.player.elements.controls;
+ // Check for picture-in-picture support
+ toggleClass(this.elements.container, this.config.classNames.pip.supported, support.pip && this.isHTML5 && this.isVideo);
- // Remove button states for fullscreen
+ // Check for airplay support
+ toggleClass(this.elements.container, this.config.classNames.airplay.supported, support.airplay && this.isHTML5);
- if (event.type === 'enterfullscreen') {
- controls$$1.pressed = false;
- controls$$1.hover = false;
- }
+ // Add iOS class
+ toggleClass(this.elements.container, this.config.classNames.isIos, browser.isIos);
- // Show, then hide after a timeout unless another control event occurs
- var show = ['touchstart', 'touchmove', 'mousemove'].includes(event.type);
+ // Add touch class
+ toggleClass(this.elements.container, this.config.classNames.isTouch, this.touch);
- var delay = 0;
+ // Ready for API calls
+ this.ready = true;
- if (show) {
- ui.toggleControls.call(_this2.player, true);
- // Use longer timeout for touch devices
- delay = _this2.player.touch ? 3000 : 2000;
- }
+ // Ready event at end of execution stack
+ setTimeout(function () {
+ triggerEvent.call(_this, _this.media, 'ready');
+ }, 0);
- // Clear timer
- clearTimeout(_this2.player.timers.controls);
- // Timer to prevent flicker when seeking
- _this2.player.timers.controls = setTimeout(function () {
- return ui.toggleControls.call(_this2.player, false);
- }, delay);
- });
- }
+ // Set the title
+ ui.setTitle.call(this);
- // Listen for media events
+ // Assure the poster image is set, if the property was added before the element was created
+ if (this.poster) {
+ ui.setPoster.call(this, this.poster, false).catch(function () {});
+ }
- }, {
- key: 'media',
- value: function media() {
- var _this3 = this;
+ // Manually set the duration if user has overridden it.
+ // The event listeners for it doesn't get called if preload is disabled (#701)
+ if (this.config.duration) {
+ controls.durationUpdate.call(this);
+ }
+ },
- // Time change on media
- utils.on(this.player.media, 'timeupdate seeking seeked', function (event) {
- return controls.timeUpdate.call(_this3.player, event);
- });
- // Display duration
- utils.on(this.player.media, 'durationchange loadeddata loadedmetadata', function (event) {
- return controls.durationUpdate.call(_this3.player, event);
- });
+ // Setup aria attribute for play and iframe title
+ setTitle: function setTitle() {
+ // Find the current text
+ var label = i18n.get('play', this.config);
- // Check for audio tracks on load
- // We can't use `loadedmetadata` as it doesn't seem to have audio tracks at that point
- utils.on(this.player.media, 'loadeddata', function () {
- utils.toggleHidden(_this3.player.elements.volume, !_this3.player.hasAudio);
- utils.toggleHidden(_this3.player.elements.buttons.mute, !_this3.player.hasAudio);
- });
+ // If there's a media title set, use that for the label
+ if (is.string(this.config.title) && !is.empty(this.config.title)) {
+ label += ', ' + this.config.title;
+ }
+
+ // If there's a play button, set label
+ if (is.nodeList(this.elements.buttons.play)) {
+ Array.from(this.elements.buttons.play).forEach(function (button) {
+ button.setAttribute('aria-label', label);
+ });
+ }
+
+ // Set iframe title
+ // https://github.com/sampotts/plyr/issues/124
+ if (this.isEmbed) {
+ var iframe = getElement.call(this, 'iframe');
- // Handle the media finishing
- utils.on(this.player.media, 'ended', function () {
- // Show poster on end
- if (_this3.player.isHTML5 && _this3.player.isVideo && _this3.player.config.resetOnEnd) {
- // Restart
- _this3.player.restart();
+ if (!is.element(iframe)) {
+ return;
}
- });
- // Check for buffer progress
- utils.on(this.player.media, 'progress playing seeking seeked', function (event) {
- return controls.updateProgress.call(_this3.player, event);
- });
+ // Default to media type
+ var title = !is.empty(this.config.title) ? this.config.title : 'video';
+ var format = i18n.get('frameTitle', this.config);
- // Handle volume changes
- utils.on(this.player.media, 'volumechange', function (event) {
- return controls.updateVolume.call(_this3.player, event);
- });
+ iframe.setAttribute('title', format.replace('{title}', title));
+ }
+ },
- // Handle play/pause
- utils.on(this.player.media, 'playing play pause ended emptied timeupdate', function (event) {
- return ui.checkPlaying.call(_this3.player, event);
- });
- // Loading state
- utils.on(this.player.media, 'waiting canplay seeked playing', function (event) {
- return ui.checkLoading.call(_this3.player, event);
- });
+ // Toggle poster
+ togglePoster: function togglePoster(enable) {
+ toggleClass(this.elements.container, this.config.classNames.posterEnabled, enable);
+ },
- // If autoplay, then load advertisement if required
- // TODO: Show some sort of loading state while the ad manager loads else there's a delay before ad shows
- utils.on(this.player.media, 'playing', function () {
- if (!_this3.player.ads) {
- return;
- }
- // If ads are enabled, wait for them first
- if (_this3.player.ads.enabled && !_this3.player.ads.initialized) {
- // Wait for manager response
- _this3.player.ads.managerPromise.then(function () {
- return _this3.player.ads.play();
- }).catch(function () {
- return _this3.player.play();
- });
+ // Set the poster image (async)
+ // Used internally for the poster setter, with the passive option forced to false
+ setPoster: function setPoster(poster) {
+ var _this2 = this;
+
+ var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
+
+ // Don't override if call is passive
+ if (passive && this.poster) {
+ return Promise.reject(new Error('Poster already set'));
+ }
+
+ // Set property synchronously to respect the call order
+ this.media.setAttribute('poster', poster);
+
+ // Wait until ui is ready
+ return ready.call(this)
+ // Load image
+ .then(function () {
+ return loadImage(poster);
+ }).catch(function (err) {
+ // Hide poster on error unless it's been set by another call
+ if (poster === _this2.poster) {
+ ui.togglePoster.call(_this2, false);
+ }
+ // Rethrow
+ throw err;
+ }).then(function () {
+ // Prevent race conditions
+ if (poster !== _this2.poster) {
+ throw new Error('setPoster cancelled by later call to setPoster');
}
+ }).then(function () {
+ Object.assign(_this2.elements.poster.style, {
+ backgroundImage: 'url(\'' + poster + '\')',
+ // Reset backgroundSize as well (since it can be set to "cover" for padded thumbnails for youtube)
+ backgroundSize: ''
+ });
+ ui.togglePoster.call(_this2, true);
+ return poster;
});
+ },
- // Click video
- if (this.player.supported.ui && this.player.config.clickToPlay && !this.player.isAudio) {
- // Re-fetch the wrapper
- var wrapper = utils.getElement.call(this.player, '.' + this.player.config.classNames.video);
- // Bail if there's no wrapper (this should never happen)
- if (!utils.is.element(wrapper)) {
- return;
- }
+ // Check playing state
+ checkPlaying: function checkPlaying(event) {
+ var _this3 = this;
- // On click play, pause ore restart
- utils.on(wrapper, 'click', function () {
- // Touch devices will just show controls (if we're hiding controls)
- if (_this3.player.config.hideControls && _this3.player.touch && !_this3.player.paused) {
- return;
- }
+ // Class hooks
+ toggleClass(this.elements.container, this.config.classNames.playing, this.playing);
+ toggleClass(this.elements.container, this.config.classNames.paused, this.paused);
+ toggleClass(this.elements.container, this.config.classNames.stopped, this.stopped);
- if (_this3.player.paused) {
- _this3.player.play();
- } else if (_this3.player.ended) {
- _this3.player.restart();
- _this3.player.play();
- } else {
- _this3.player.pause();
- }
- });
- }
+ // Set state
+ Array.from(this.elements.buttons.play).forEach(function (target) {
+ target.pressed = _this3.playing;
+ });
- // Disable right click
- if (this.player.supported.ui && this.player.config.disableContextMenu) {
- utils.on(this.player.elements.wrapper, 'contextmenu', function (event) {
- event.preventDefault();
- }, false);
+ // Only update controls on non timeupdate events
+ if (is.event(event) && event.type === 'timeupdate') {
+ return;
}
- // Volume change
- utils.on(this.player.media, 'volumechange', function () {
- // Save to storage
- _this3.player.storage.set({ volume: _this3.player.volume, muted: _this3.player.muted });
- });
+ // Toggle controls
+ ui.toggleControls.call(this);
+ },
- // Speed change
- utils.on(this.player.media, 'ratechange', function () {
- // Update UI
- controls.updateSetting.call(_this3.player, 'speed');
- // Save to storage
- _this3.player.storage.set({ speed: _this3.player.speed });
- });
+ // Check if media is loading
+ checkLoading: function checkLoading(event) {
+ var _this4 = this;
- // Quality request
- utils.on(this.player.media, 'qualityrequested', function (event) {
- // Save to storage
- _this3.player.storage.set({ quality: event.detail.quality });
- });
+ this.loading = ['stalled', 'waiting'].includes(event.type);
- // Quality change
- utils.on(this.player.media, 'qualitychange', function (event) {
- // Update UI
- controls.updateSetting.call(_this3.player, 'quality', null, event.detail.quality);
- });
+ // Clear timer
+ clearTimeout(this.timers.loading);
- // Caption language change
- utils.on(this.player.media, 'languagechange', function () {
- // Update UI
- controls.updateSetting.call(_this3.player, 'captions');
+ // Timer to prevent flicker when seeking
+ this.timers.loading = setTimeout(function () {
+ // Update progress bar loading class state
+ toggleClass(_this4.elements.container, _this4.config.classNames.loading, _this4.loading);
- // Save to storage
- _this3.player.storage.set({ language: _this3.player.language });
- });
+ // Update controls visibility
+ ui.toggleControls.call(_this4);
+ }, this.loading ? 250 : 0);
+ },
- // Captions toggle
- utils.on(this.player.media, 'captionsenabled captionsdisabled', function () {
- // Update UI
- controls.updateSetting.call(_this3.player, 'captions');
- // Save to storage
- _this3.player.storage.set({ captions: _this3.player.captions.active });
- });
+ // Toggle controls based on state and `force` argument
+ toggleControls: function toggleControls(force) {
+ var controls$$1 = this.elements.controls;
- // Proxy events to container
- // Bubble up key events for Edge
- utils.on(this.player.media, this.player.config.events.concat(['keyup', 'keydown']).join(' '), function (event) {
- var _event$detail = event.detail,
- detail = _event$detail === undefined ? {} : _event$detail;
- // Get error details from media
+ if (controls$$1 && this.config.hideControls) {
+ // Show controls if force, loading, paused, or button interaction, otherwise hide
+ this.toggleControls(Boolean(force || this.loading || this.paused || controls$$1.pressed || controls$$1.hover));
+ }
+ }
+ };
- if (event.type === 'error') {
- detail = _this3.player.media.error;
- }
+ // ==========================================================================
- utils.dispatchEvent.call(_this3.player, _this3.player.elements.container, event.type, true, detail);
- });
+ var Listeners = function () {
+ function Listeners(player) {
+ classCallCheck(this, Listeners);
+
+ this.player = player;
+ this.lastKey = null;
+
+ this.handleKey = this.handleKey.bind(this);
+ this.toggleMenu = this.toggleMenu.bind(this);
+ this.firstTouch = this.firstTouch.bind(this);
}
- // Listen for control events
+ // Handle key presses
- }, {
- key: 'controls',
- value: function controls$$1() {
- var _this4 = this;
- // IE doesn't support input event, so we fallback to change
- var inputEvent = browser$3.isIE ? 'change' : 'input';
+ createClass(Listeners, [{
+ key: 'handleKey',
+ value: function handleKey(event) {
+ var _this = this;
- // Run default and custom handlers
- var proxy = function proxy(event, defaultHandler, customHandlerKey) {
- var customHandler = _this4.player.config.listeners[customHandlerKey];
- var hasCustomHandler = utils.is.function(customHandler);
- var returned = true;
+ var code = event.keyCode ? event.keyCode : event.which;
+ var pressed = event.type === 'keydown';
+ var repeat = pressed && code === this.lastKey;
- // Execute custom handler
- if (hasCustomHandler) {
- returned = customHandler.call(_this4.player, event);
+ // Bail if a modifier key is set
+ if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) {
+ return;
}
- // Only call default handler if not prevented in custom handler
- if (returned && utils.is.function(defaultHandler)) {
- defaultHandler.call(_this4.player, event);
+ // If the event is bubbled from the media element
+ // Firefox doesn't get the keycode for whatever reason
+ if (!is.number(code)) {
+ return;
}
- };
- // Trigger custom and default handlers
- var on = function on(element, type, defaultHandler, customHandlerKey) {
- var passive = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;
+ // Seek by the number keys
+ var seekByKey = function seekByKey() {
+ // Divide the max duration into 10th's and times by the number value
+ _this.player.currentTime = _this.player.duration / 10 * (code - 48);
+ };
- var customHandler = _this4.player.config.listeners[customHandlerKey];
- var hasCustomHandler = utils.is.function(customHandler);
+ // Handle the key on keydown
+ // Reset on keyup
+ if (pressed) {
+ // Which keycodes should we prevent default
+ var preventDefault = [32, 37, 38, 39, 40, 48, 49, 50, 51, 52, 53, 54, 56, 57, 67, 70, 73, 75, 76, 77, 79];
+
+ // Check focused element
+ // and if the focused element is not editable (e.g. text input)
+ // and any that accept key input http://webaim.org/techniques/keyboard/
+ var focused = getFocusElement();
+ if (is.element(focused) && focused !== this.player.elements.inputs.seek && matches(focused, this.player.config.selectors.editable)) {
+ return;
+ }
- utils.on(element, type, function (event) {
- return proxy(event, defaultHandler, customHandlerKey);
- }, passive && !hasCustomHandler);
- };
+ // If the code is found prevent default (e.g. prevent scrolling for arrows)
+ if (preventDefault.includes(code)) {
+ event.preventDefault();
+ event.stopPropagation();
+ }
- // Play/pause toggle
- on(this.player.elements.buttons.play, 'click', this.player.togglePlay, 'play');
+ switch (code) {
+ case 48:
+ case 49:
+ case 50:
+ case 51:
+ case 52:
+ case 53:
+ case 54:
+ case 55:
+ case 56:
+ case 57:
+ // 0-9
+ if (!repeat) {
+ seekByKey();
+ }
+ break;
- // Pause
- on(this.player.elements.buttons.restart, 'click', this.player.restart, 'restart');
+ case 32:
+ case 75:
+ // Space and K key
+ if (!repeat) {
+ this.player.togglePlay();
+ }
+ break;
- // Rewind
- on(this.player.elements.buttons.rewind, 'click', this.player.rewind, 'rewind');
+ case 38:
+ // Arrow up
+ this.player.increaseVolume(0.1);
+ break;
- // Rewind
- on(this.player.elements.buttons.fastForward, 'click', this.player.forward, 'fastForward');
+ case 40:
+ // Arrow down
+ this.player.decreaseVolume(0.1);
+ break;
- // Mute toggle
- on(this.player.elements.buttons.mute, 'click', function () {
- _this4.player.muted = !_this4.player.muted;
- }, 'mute');
+ case 77:
+ // M key
+ if (!repeat) {
+ this.player.muted = !this.player.muted;
+ }
+ break;
- // Captions toggle
- on(this.player.elements.buttons.captions, 'click', this.player.toggleCaptions);
+ case 39:
+ // Arrow forward
+ this.player.forward();
+ break;
- // Fullscreen toggle
- on(this.player.elements.buttons.fullscreen, 'click', function () {
- _this4.player.fullscreen.toggle();
- }, 'fullscreen');
+ case 37:
+ // Arrow back
+ this.player.rewind();
+ break;
- // Picture-in-Picture
- on(this.player.elements.buttons.pip, 'click', function () {
- _this4.player.pip = 'toggle';
- }, 'pip');
+ case 70:
+ // F key
+ this.player.fullscreen.toggle();
+ break;
- // Airplay
- on(this.player.elements.buttons.airplay, 'click', this.player.airplay, 'airplay');
+ case 67:
+ // C key
+ if (!repeat) {
+ this.player.toggleCaptions();
+ }
+ break;
- // Settings menu
- on(this.player.elements.buttons.settings, 'click', function (event) {
- controls.toggleMenu.call(_this4.player, event);
- });
+ case 76:
+ // L key
+ this.player.loop = !this.player.loop;
+ break;
- // Settings menu
- on(this.player.elements.settings.form, 'click', function (event) {
- event.stopPropagation();
+ /* case 73:
+ this.setLoop('start');
+ break;
+ case 76:
+ this.setLoop();
+ break;
+ case 79:
+ this.setLoop('end');
+ break; */
- // Go back to home tab on click
- var showHomeTab = function showHomeTab() {
- var id = 'plyr-settings-' + _this4.player.id + '-home';
- controls.showTab.call(_this4.player, id);
- };
+ default:
+ break;
+ }
- // Settings menu items - use event delegation as items are added/removed
- if (utils.matches(event.target, _this4.player.config.selectors.inputs.language)) {
- proxy(event, function () {
- _this4.player.currentTrack = Number(event.target.value);
- showHomeTab();
- }, 'language');
- } else if (utils.matches(event.target, _this4.player.config.selectors.inputs.quality)) {
- proxy(event, function () {
- _this4.player.quality = event.target.value;
- showHomeTab();
- }, 'quality');
- } else if (utils.matches(event.target, _this4.player.config.selectors.inputs.speed)) {
- proxy(event, function () {
- _this4.player.speed = parseFloat(event.target.value);
- showHomeTab();
- }, 'speed');
+ // Escape is handle natively when in full screen
+ // So we only need to worry about non native
+ if (!this.player.fullscreen.enabled && this.player.fullscreen.active && code === 27) {
+ this.player.fullscreen.toggle();
+ }
+
+ // Store last code for next cycle
+ this.lastKey = code;
} else {
- var tab = event.target;
- controls.showTab.call(_this4.player, tab.getAttribute('aria-controls'));
+ this.lastKey = null;
}
- });
+ }
- // Set range input alternative "value", which matches the tooltip time (#954)
- on(this.player.elements.inputs.seek, 'mousedown mousemove', function (event) {
- var clientRect = _this4.player.elements.progress.getBoundingClientRect();
- var percent = 100 / clientRect.width * (event.pageX - clientRect.left);
- event.currentTarget.setAttribute('seek-value', percent);
- });
+ // Toggle menu
+
+ }, {
+ key: 'toggleMenu',
+ value: function toggleMenu(event) {
+ controls.toggleMenu.call(this.player, event);
+ }
- // Pause while seeking
- on(this.player.elements.inputs.seek, 'mousedown mouseup keydown keyup touchstart touchend', function (event) {
- var seek = event.currentTarget;
+ // Device is touch enabled
- var code = event.keyCode ? event.keyCode : event.which;
- var eventType = event.type;
+ }, {
+ key: 'firstTouch',
+ value: function firstTouch() {
+ this.player.touch = true;
- if ((eventType === 'keydown' || eventType === 'keyup') && code !== 39 && code !== 37) {
- return;
- }
- // Was playing before?
- var play = seek.hasAttribute('play-on-seeked');
-
- // Done seeking
- var done = ['mouseup', 'touchend', 'keyup'].includes(event.type);
-
- // If we're done seeking and it was playing, resume playback
- if (play && done) {
- seek.removeAttribute('play-on-seeked');
- _this4.player.play();
- } else if (!done && _this4.player.playing) {
- seek.setAttribute('play-on-seeked', '');
- _this4.player.pause();
- }
- });
+ // Add touch class
+ toggleClass(this.player.elements.container, this.player.config.classNames.isTouch, true);
+ }
- // Seek
- on(this.player.elements.inputs.seek, inputEvent, function (event) {
- var seek = event.currentTarget;
+ // Global window & document listeners
- // If it exists, use seek-value instead of "value" for consistency with tooltip time (#954)
- var seekTo = seek.getAttribute('seek-value');
+ }, {
+ key: 'global',
+ value: function global() {
+ var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
- if (utils.is.empty(seekTo)) {
- seekTo = seek.value;
+ // Keyboard shortcuts
+ if (this.player.config.keyboard.global) {
+ toggleListener.call(this.player, window, 'keydown keyup', this.handleKey, toggle, false);
}
- seek.removeAttribute('seek-value');
+ // Click anywhere closes menu
+ toggleListener.call(this.player, document.body, 'click', this.toggleMenu, toggle);
- _this4.player.currentTime = seekTo / seek.max * _this4.player.duration;
- }, 'seek');
+ // Detect touch by events
+ once.call(this.player, document.body, 'touchstart', this.firstTouch);
+ }
- // Current time invert
- // Only if one time element is used for both currentTime and duration
- if (this.player.config.toggleInvert && !utils.is.element(this.player.elements.display.duration)) {
- on(this.player.elements.display.currentTime, 'click', function () {
- // Do nothing if we're at the start
- if (_this4.player.currentTime === 0) {
- return;
- }
+ // Container listeners
+
+ }, {
+ key: 'container',
+ value: function container() {
+ var _this2 = this;
- _this4.player.config.invertTime = !_this4.player.config.invertTime;
+ // Keyboard shortcuts
+ if (!this.player.config.keyboard.global && this.player.config.keyboard.focused) {
+ on.call(this.player, this.player.elements.container, 'keydown keyup', this.handleKey, false);
+ }
- controls.timeUpdate.call(_this4.player);
+ // Detect tab focus
+ // Remove class on blur/focusout
+ on.call(this.player, this.player.elements.container, 'focusout', function (event) {
+ toggleClass(event.target, _this2.player.config.classNames.tabFocus, false);
});
- }
+ // Add classname to tabbed elements
+ on.call(this.player, this.player.elements.container, 'keydown', function (event) {
+ if (event.keyCode !== 9) {
+ return;
+ }
- // Volume
- on(this.player.elements.inputs.volume, inputEvent, function (event) {
- _this4.player.volume = event.target.value;
- }, 'volume');
-
- // Polyfill for lower fill in <input type="range"> for webkit
- if (browser$3.isWebkit) {
- on(utils.getElements.call(this.player, 'input[type="range"]'), 'input', function (event) {
- controls.updateRangeFill.call(_this4.player, event.target);
+ // Delay the adding of classname until the focus has changed
+ // This event fires before the focusin event
+ setTimeout(function () {
+ toggleClass(getFocusElement(), _this2.player.config.classNames.tabFocus, true);
+ }, 0);
});
- }
- // Seek tooltip
- on(this.player.elements.progress, 'mouseenter mouseleave mousemove', function (event) {
- return controls.updateSeekTooltip.call(_this4.player, event);
- });
+ // Toggle controls on mouse events and entering fullscreen
+ on.call(this.player, this.player.elements.container, 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen', function (event) {
+ var controls$$1 = _this2.player.elements.controls;
- // Update controls.hover state (used for ui.toggleControls to avoid hiding when interacting)
- on(this.player.elements.controls, 'mouseenter mouseleave', function (event) {
- _this4.player.elements.controls.hover = !_this4.player.touch && event.type === 'mouseenter';
- });
+ // Remove button states for fullscreen
- // Update controls.pressed state (used for ui.toggleControls to avoid hiding when interacting)
- on(this.player.elements.controls, 'mousedown mouseup touchstart touchend touchcancel', function (event) {
- _this4.player.elements.controls.pressed = ['mousedown', 'touchstart'].includes(event.type);
- });
+ if (event.type === 'enterfullscreen') {
+ controls$$1.pressed = false;
+ controls$$1.hover = false;
+ }
- // Focus in/out on controls
- on(this.player.elements.controls, 'focusin focusout', function (event) {
- var _player = _this4.player,
- config = _player.config,
- elements = _player.elements,
- timers = _player.timers;
+ // Show, then hide after a timeout unless another control event occurs
+ var show = ['touchstart', 'touchmove', 'mousemove'].includes(event.type);
- // Skip transition to prevent focus from scrolling the parent element
+ var delay = 0;
- utils.toggleClass(elements.controls, config.classNames.noTransition, event.type === 'focusin');
+ if (show) {
+ ui.toggleControls.call(_this2.player, true);
+ // Use longer timeout for touch devices
+ delay = _this2.player.touch ? 3000 : 2000;
+ }
- // Toggle
- ui.toggleControls.call(_this4.player, event.type === 'focusin');
+ // Clear timer
+ clearTimeout(_this2.player.timers.controls);
+ // Timer to prevent flicker when seeking
+ _this2.player.timers.controls = setTimeout(function () {
+ return ui.toggleControls.call(_this2.player, false);
+ }, delay);
+ });
+ }
- // If focusin, hide again after delay
- if (event.type === 'focusin') {
- // Restore transition
- setTimeout(function () {
- utils.toggleClass(elements.controls, config.classNames.noTransition, false);
- }, 0);
+ // Listen for media events
- // Delay a little more for keyboard users
- var delay = _this4.touch ? 3000 : 4000;
+ }, {
+ key: 'media',
+ value: function media() {
+ var _this3 = this;
- // Clear timer
- clearTimeout(timers.controls);
- // Hide
- timers.controls = setTimeout(function () {
- return ui.toggleControls.call(_this4.player, false);
- }, delay);
- }
- });
+ // Time change on media
+ on.call(this.player, this.player.media, 'timeupdate seeking seeked', function (event) {
+ return controls.timeUpdate.call(_this3.player, event);
+ });
- // Mouse wheel for volume
- on(this.player.elements.inputs.volume, 'wheel', function (event) {
- // Detect "natural" scroll - suppored on OS X Safari only
- // Other browsers on OS X will be inverted until support improves
- var inverted = event.webkitDirectionInvertedFromDevice;
- var step = 1 / 50;
- var direction = 0;
-
- // Scroll down (or up on natural) to decrease
- if (event.deltaY < 0 || event.deltaX > 0) {
- if (inverted) {
- _this4.player.decreaseVolume(step);
- direction = -1;
- } else {
- _this4.player.increaseVolume(step);
- direction = 1;
- }
- }
+ // Display duration
+ on.call(this.player, this.player.media, 'durationchange loadeddata loadedmetadata', function (event) {
+ return controls.durationUpdate.call(_this3.player, event);
+ });
- // Scroll up (or down on natural) to increase
- if (event.deltaY > 0 || event.deltaX < 0) {
- if (inverted) {
- _this4.player.increaseVolume(step);
- direction = 1;
- } else {
- _this4.player.decreaseVolume(step);
- direction = -1;
+ // Check for audio tracks on load
+ // We can't use `loadedmetadata` as it doesn't seem to have audio tracks at that point
+ on.call(this.player, this.player.media, 'canplay', function () {
+ toggleHidden(_this3.player.elements.volume, !_this3.player.hasAudio);
+ toggleHidden(_this3.player.elements.buttons.mute, !_this3.player.hasAudio);
+ });
+
+ // Handle the media finishing
+ on.call(this.player, this.player.media, 'ended', function () {
+ // Show poster on end
+ if (_this3.player.isHTML5 && _this3.player.isVideo && _this3.player.config.resetOnEnd) {
+ // Restart
+ _this3.player.restart();
}
- }
+ });
- // Don't break page scrolling at max and min
- if (direction === 1 && _this4.player.media.volume < 1 || direction === -1 && _this4.player.media.volume > 0) {
- event.preventDefault();
- }
- }, 'volume', false);
- }
+ // Check for buffer progress
+ on.call(this.player, this.player.media, 'progress playing seeking seeked', function (event) {
+ return controls.updateProgress.call(_this3.player, event);
+ });
- // Reset on destroy
+ // Handle volume changes
+ on.call(this.player, this.player.media, 'volumechange', function (event) {
+ return controls.updateVolume.call(_this3.player, event);
+ });
- }, {
- key: 'clear',
- value: function clear() {
- this.global(false);
- }
- }]);
- return Listeners;
-}();
+ // Handle play/pause
+ on.call(this.player, this.player.media, 'playing play pause ended emptied timeupdate', function (event) {
+ return ui.checkPlaying.call(_this3.player, event);
+ });
-// ==========================================================================
+ // Loading state
+ on.call(this.player, this.player.media, 'waiting canplay seeked playing', function (event) {
+ return ui.checkLoading.call(_this3.player, event);
+ });
-// Set playback state and trigger change (only on actual change)
-function assurePlaybackState(play) {
- if (play && !this.embed.hasPlayed) {
- this.embed.hasPlayed = true;
- }
- if (this.media.paused === play) {
- this.media.paused = !play;
- utils.dispatchEvent.call(this, this.media, play ? 'play' : 'pause');
- }
-}
+ // If autoplay, then load advertisement if required
+ // TODO: Show some sort of loading state while the ad manager loads else there's a delay before ad shows
+ on.call(this.player, this.player.media, 'playing', function () {
+ if (!_this3.player.ads) {
+ return;
+ }
-var vimeo = {
- setup: function setup() {
- var _this = this;
+ // If ads are enabled, wait for them first
+ if (_this3.player.ads.enabled && !_this3.player.ads.initialized) {
+ // Wait for manager response
+ _this3.player.ads.managerPromise.then(function () {
+ return _this3.player.ads.play();
+ }).catch(function () {
+ return _this3.player.play();
+ });
+ }
+ });
- // Add embed class for responsive
- utils.toggleClass(this.elements.wrapper, this.config.classNames.embed, true);
+ // Click video
+ if (this.player.supported.ui && this.player.config.clickToPlay && !this.player.isAudio) {
+ // Re-fetch the wrapper
+ var wrapper = getElement.call(this.player, '.' + this.player.config.classNames.video);
- // Set intial ratio
- vimeo.setAspectRatio.call(this);
+ // Bail if there's no wrapper (this should never happen)
+ if (!is.element(wrapper)) {
+ return;
+ }
- // Load the API if not already
- if (!utils.is.object(window.Vimeo)) {
- utils.loadScript(this.config.urls.vimeo.sdk).then(function () {
- vimeo.ready.call(_this);
- }).catch(function (error) {
- _this.debug.warn('Vimeo API failed to load', error);
- });
- } else {
- vimeo.ready.call(this);
- }
- },
+ // On click play, pause ore restart
+ on.call(this.player, wrapper, 'click', function () {
+ // Touch devices will just show controls (if we're hiding controls)
+ if (_this3.player.config.hideControls && _this3.player.touch && !_this3.player.paused) {
+ return;
+ }
+
+ if (_this3.player.paused) {
+ _this3.player.play();
+ } else if (_this3.player.ended) {
+ _this3.player.restart();
+ _this3.player.play();
+ } else {
+ _this3.player.pause();
+ }
+ });
+ }
+ // Disable right click
+ if (this.player.supported.ui && this.player.config.disableContextMenu) {
+ on.call(this.player, this.player.elements.wrapper, 'contextmenu', function (event) {
+ event.preventDefault();
+ }, false);
+ }
- // Set aspect ratio
- // For Vimeo we have an extra 300% height <div> to hide the standard controls and UI
- setAspectRatio: function setAspectRatio(input) {
- var ratio = utils.is.string(input) ? input.split(':') : this.config.ratio.split(':');
- var padding = 100 / ratio[0] * ratio[1];
- this.elements.wrapper.style.paddingBottom = padding + '%';
+ // Volume change
+ on.call(this.player, this.player.media, 'volumechange', function () {
+ // Save to storage
+ _this3.player.storage.set({ volume: _this3.player.volume, muted: _this3.player.muted });
+ });
- if (this.supported.ui) {
- var height = 240;
- var offset = (height - padding) / (height / 50);
+ // Speed change
+ on.call(this.player, this.player.media, 'ratechange', function () {
+ // Update UI
+ controls.updateSetting.call(_this3.player, 'speed');
- this.media.style.transform = 'translateY(-' + offset + '%)';
- }
- },
+ // Save to storage
+ _this3.player.storage.set({ speed: _this3.player.speed });
+ });
+ // Quality request
+ on.call(this.player, this.player.media, 'qualityrequested', function (event) {
+ // Save to storage
+ _this3.player.storage.set({ quality: event.detail.quality });
+ });
- // API Ready
- ready: function ready() {
- var _this2 = this;
+ // Quality change
+ on.call(this.player, this.player.media, 'qualitychange', function (event) {
+ // Update UI
+ controls.updateSetting.call(_this3.player, 'quality', null, event.detail.quality);
+ });
- var player = this;
-
- // Get Vimeo params for the iframe
- var options = {
- loop: player.config.loop.active,
- autoplay: player.autoplay,
- // muted: player.muted,
- byline: false,
- portrait: false,
- title: false,
- speed: true,
- transparent: 0,
- gesture: 'media',
- playsinline: !this.config.fullscreen.iosNative
- };
- var params = utils.buildUrlParams(options);
+ // Proxy events to container
+ // Bubble up key events for Edge
+ var proxyEvents = this.player.config.events.concat(['keyup', 'keydown']).join(' ');
+ on.call(this.player, this.player.media, proxyEvents, function (event) {
+ var _event$detail = event.detail,
+ detail = _event$detail === undefined ? {} : _event$detail;
- // Get the source URL or ID
- var source = player.media.getAttribute('src');
+ // Get error details from media
- // Get from <div> if needed
- if (utils.is.empty(source)) {
- source = player.media.getAttribute(player.config.attributes.embed.id);
- }
+ if (event.type === 'error') {
+ detail = _this3.player.media.error;
+ }
- var id = utils.parseVimeoId(source);
+ triggerEvent.call(_this3.player, _this3.player.elements.container, event.type, true, detail);
+ });
+ }
- // Build an iframe
- var iframe = utils.createElement('iframe');
- var src = utils.format(player.config.urls.vimeo.iframe, id, params);
- iframe.setAttribute('src', src);
- iframe.setAttribute('allowfullscreen', '');
- iframe.setAttribute('allowtransparency', '');
- iframe.setAttribute('allow', 'autoplay');
+ // Listen for control events
- // Inject the package
- var wrapper = utils.createElement('div', { class: player.config.classNames.embedContainer });
- wrapper.appendChild(iframe);
- player.media = utils.replaceElement(wrapper, player.media);
+ }, {
+ key: 'controls',
+ value: function controls$$1() {
+ var _this4 = this;
- // Get poster image
- utils.fetch(utils.format(player.config.urls.vimeo.api, id), 'json').then(function (response) {
- if (utils.is.empty(response)) {
- return;
- }
+ // IE doesn't support input event, so we fallback to change
+ var inputEvent = browser.isIE ? 'change' : 'input';
- // Get the URL for thumbnail
- var url = new URL(response[0].thumbnail_large);
+ // Run default and custom handlers
+ var proxy = function proxy(event, defaultHandler, customHandlerKey) {
+ var customHandler = _this4.player.config.listeners[customHandlerKey];
+ var hasCustomHandler = is.function(customHandler);
+ var returned = true;
- // Get original image
- url.pathname = url.pathname.split('_')[0] + '.jpg';
+ // Execute custom handler
+ if (hasCustomHandler) {
+ returned = customHandler.call(_this4.player, event);
+ }
- // Set and show poster
- ui.setPoster.call(player, url.href);
- });
+ // Only call default handler if not prevented in custom handler
+ if (returned && is.function(defaultHandler)) {
+ defaultHandler.call(_this4.player, event);
+ }
+ };
- // Setup instance
- // https://github.com/vimeo/player.js
- player.embed = new window.Vimeo.Player(iframe, {
- autopause: player.config.autopause,
- muted: player.muted
- });
+ // Trigger custom and default handlers
+ var bind = function bind(element, type, defaultHandler, customHandlerKey) {
+ var passive = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;
- player.media.paused = true;
- player.media.currentTime = 0;
+ var customHandler = _this4.player.config.listeners[customHandlerKey];
+ var hasCustomHandler = is.function(customHandler);
- // Disable native text track rendering
- if (player.supported.ui) {
- player.embed.disableTextTrack();
- }
+ on.call(_this4.player, element, type, function (event) {
+ return proxy(event, defaultHandler, customHandlerKey);
+ }, passive && !hasCustomHandler);
+ };
- // Create a faux HTML5 API using the Vimeo API
- player.media.play = function () {
- assurePlaybackState.call(player, true);
- return player.embed.play();
- };
+ // Play/pause toggle
+ Array.from(this.player.elements.buttons.play).forEach(function (button) {
+ bind(button, 'click', _this4.player.togglePlay, 'play');
+ });
- player.media.pause = function () {
- assurePlaybackState.call(player, false);
- return player.embed.pause();
- };
+ // Pause
+ bind(this.player.elements.buttons.restart, 'click', this.player.restart, 'restart');
- player.media.stop = function () {
- player.pause();
- player.currentTime = 0;
- };
+ // Rewind
+ bind(this.player.elements.buttons.rewind, 'click', this.player.rewind, 'rewind');
- // Seeking
- var currentTime = player.media.currentTime;
+ // Rewind
+ bind(this.player.elements.buttons.fastForward, 'click', this.player.forward, 'fastForward');
- Object.defineProperty(player.media, 'currentTime', {
- get: function get() {
- return currentTime;
- },
- set: function set(time) {
- // Vimeo will automatically play on seek if the video hasn't been played before
+ // Mute toggle
+ bind(this.player.elements.buttons.mute, 'click', function () {
+ _this4.player.muted = !_this4.player.muted;
+ }, 'mute');
+
+ // Captions toggle
+ bind(this.player.elements.buttons.captions, 'click', function () {
+ return _this4.player.toggleCaptions();
+ });
- // Get current paused state and volume etc
- var embed = player.embed,
- media = player.media,
- paused = player.paused,
- volume = player.volume;
+ // Fullscreen toggle
+ bind(this.player.elements.buttons.fullscreen, 'click', function () {
+ _this4.player.fullscreen.toggle();
+ }, 'fullscreen');
- var restorePause = paused && !embed.hasPlayed;
+ // Picture-in-Picture
+ bind(this.player.elements.buttons.pip, 'click', function () {
+ _this4.player.pip = 'toggle';
+ }, 'pip');
- // Set seeking state and trigger event
- media.seeking = true;
- utils.dispatchEvent.call(player, media, 'seeking');
+ // Airplay
+ bind(this.player.elements.buttons.airplay, 'click', this.player.airplay, 'airplay');
- // If paused, mute until seek is complete
- Promise.resolve(restorePause && embed.setVolume(0))
- // Seek
- .then(function () {
- return embed.setCurrentTime(time);
- })
- // Restore paused
- .then(function () {
- return restorePause && embed.pause();
- })
- // Restore volume
- .then(function () {
- return restorePause && embed.setVolume(volume);
- }).catch(function () {
- // Do nothing
+ // Settings menu
+ bind(this.player.elements.buttons.settings, 'click', function (event) {
+ controls.toggleMenu.call(_this4.player, event);
});
- }
- });
- // Playback speed
- var speed = player.config.speed.selected;
- Object.defineProperty(player.media, 'playbackRate', {
- get: function get() {
- return speed;
- },
- set: function set(input) {
- player.embed.setPlaybackRate(input).then(function () {
- speed = input;
- utils.dispatchEvent.call(player, player.media, 'ratechange');
- }).catch(function (error) {
- // Hide menu item (and menu if empty)
- if (error.name === 'Error') {
- controls.setSpeedMenu.call(player, []);
+ // Settings menu
+ bind(this.player.elements.settings.form, 'click', function (event) {
+ event.stopPropagation();
+
+ // Go back to home tab on click
+ var showHomeTab = function showHomeTab() {
+ var id = 'plyr-settings-' + _this4.player.id + '-home';
+ controls.showTab.call(_this4.player, id);
+ };
+
+ // Settings menu items - use event delegation as items are added/removed
+ if (matches(event.target, _this4.player.config.selectors.inputs.language)) {
+ proxy(event, function () {
+ _this4.player.currentTrack = Number(event.target.value);
+ showHomeTab();
+ }, 'language');
+ } else if (matches(event.target, _this4.player.config.selectors.inputs.quality)) {
+ proxy(event, function () {
+ _this4.player.quality = event.target.value;
+ showHomeTab();
+ }, 'quality');
+ } else if (matches(event.target, _this4.player.config.selectors.inputs.speed)) {
+ proxy(event, function () {
+ _this4.player.speed = parseFloat(event.target.value);
+ showHomeTab();
+ }, 'speed');
+ } else {
+ var tab = event.target;
+ controls.showTab.call(_this4.player, tab.getAttribute('aria-controls'));
}
});
- }
- });
-
- // Volume
- var volume = player.config.volume;
- Object.defineProperty(player.media, 'volume', {
- get: function get() {
- return volume;
- },
- set: function set(input) {
- player.embed.setVolume(input).then(function () {
- volume = input;
- utils.dispatchEvent.call(player, player.media, 'volumechange');
+ // Set range input alternative "value", which matches the tooltip time (#954)
+ bind(this.player.elements.inputs.seek, 'mousedown mousemove', function (event) {
+ var clientRect = _this4.player.elements.progress.getBoundingClientRect();
+ var percent = 100 / clientRect.width * (event.pageX - clientRect.left);
+ event.currentTarget.setAttribute('seek-value', percent);
});
- }
- });
- // Muted
- var muted = player.config.muted;
+ // Pause while seeking
+ bind(this.player.elements.inputs.seek, 'mousedown mouseup keydown keyup touchstart touchend', function (event) {
+ var seek = event.currentTarget;
- Object.defineProperty(player.media, 'muted', {
- get: function get() {
- return muted;
- },
- set: function set(input) {
- var toggle = utils.is.boolean(input) ? input : false;
+ var code = event.keyCode ? event.keyCode : event.which;
+ var eventType = event.type;
- player.embed.setVolume(toggle ? 0 : player.config.volume).then(function () {
- muted = toggle;
- utils.dispatchEvent.call(player, player.media, 'volumechange');
+ if ((eventType === 'keydown' || eventType === 'keyup') && code !== 39 && code !== 37) {
+ return;
+ }
+ // Was playing before?
+ var play = seek.hasAttribute('play-on-seeked');
+
+ // Done seeking
+ var done = ['mouseup', 'touchend', 'keyup'].includes(event.type);
+
+ // If we're done seeking and it was playing, resume playback
+ if (play && done) {
+ seek.removeAttribute('play-on-seeked');
+ _this4.player.play();
+ } else if (!done && _this4.player.playing) {
+ seek.setAttribute('play-on-seeked', '');
+ _this4.player.pause();
+ }
});
- }
- });
- // Loop
- var loop = player.config.loop;
+ // Seek
+ bind(this.player.elements.inputs.seek, inputEvent, function (event) {
+ var seek = event.currentTarget;
- Object.defineProperty(player.media, 'loop', {
- get: function get() {
- return loop;
- },
- set: function set(input) {
- var toggle = utils.is.boolean(input) ? input : player.config.loop.active;
+ // If it exists, use seek-value instead of "value" for consistency with tooltip time (#954)
+ var seekTo = seek.getAttribute('seek-value');
- player.embed.setLoop(toggle).then(function () {
- loop = toggle;
- });
- }
- });
+ if (is.empty(seekTo)) {
+ seekTo = seek.value;
+ }
- // Source
- var currentSrc = void 0;
- player.embed.getVideoUrl().then(function (value) {
- currentSrc = value;
- }).catch(function (error) {
- _this2.debug.warn(error);
- });
+ seek.removeAttribute('seek-value');
- Object.defineProperty(player.media, 'currentSrc', {
- get: function get() {
- return currentSrc;
- }
- });
+ _this4.player.currentTime = seekTo / seek.max * _this4.player.duration;
+ }, 'seek');
- // Ended
- Object.defineProperty(player.media, 'ended', {
- get: function get() {
- return player.currentTime === player.duration;
- }
- });
+ // Current time invert
+ // Only if one time element is used for both currentTime and duration
+ if (this.player.config.toggleInvert && !is.element(this.player.elements.display.duration)) {
+ bind(this.player.elements.display.currentTime, 'click', function () {
+ // Do nothing if we're at the start
+ if (_this4.player.currentTime === 0) {
+ return;
+ }
- // Set aspect ratio based on video size
- Promise.all([player.embed.getVideoWidth(), player.embed.getVideoHeight()]).then(function (dimensions) {
- var ratio = utils.getAspectRatio(dimensions[0], dimensions[1]);
- vimeo.setAspectRatio.call(_this2, ratio);
- });
+ _this4.player.config.invertTime = !_this4.player.config.invertTime;
- // Set autopause
- player.embed.setAutopause(player.config.autopause).then(function (state) {
- player.config.autopause = state;
- });
+ controls.timeUpdate.call(_this4.player);
+ });
+ }
- // Get title
- player.embed.getVideoTitle().then(function (title) {
- player.config.title = title;
- ui.setTitle.call(_this2);
- });
+ // Volume
+ bind(this.player.elements.inputs.volume, inputEvent, function (event) {
+ _this4.player.volume = event.target.value;
+ }, 'volume');
+
+ // Polyfill for lower fill in <input type="range"> for webkit
+ if (browser.isWebkit) {
+ Array.from(getElements.call(this.player, 'input[type="range"]')).forEach(function (element) {
+ bind(element, 'input', function (event) {
+ return controls.updateRangeFill.call(_this4.player, event.target);
+ });
+ });
+ }
- // Get current time
- player.embed.getCurrentTime().then(function (value) {
- currentTime = value;
- utils.dispatchEvent.call(player, player.media, 'timeupdate');
- });
+ // Seek tooltip
+ bind(this.player.elements.progress, 'mouseenter mouseleave mousemove', function (event) {
+ return controls.updateSeekTooltip.call(_this4.player, event);
+ });
- // Get duration
- player.embed.getDuration().then(function (value) {
- player.media.duration = value;
- utils.dispatchEvent.call(player, player.media, 'durationchange');
- });
+ // Update controls.hover state (used for ui.toggleControls to avoid hiding when interacting)
+ bind(this.player.elements.controls, 'mouseenter mouseleave', function (event) {
+ _this4.player.elements.controls.hover = !_this4.player.touch && event.type === 'mouseenter';
+ });
- // Get captions
- player.embed.getTextTracks().then(function (tracks) {
- player.media.textTracks = tracks;
- captions.setup.call(player);
- });
+ // Update controls.pressed state (used for ui.toggleControls to avoid hiding when interacting)
+ bind(this.player.elements.controls, 'mousedown mouseup touchstart touchend touchcancel', function (event) {
+ _this4.player.elements.controls.pressed = ['mousedown', 'touchstart'].includes(event.type);
+ });
- player.embed.on('cuechange', function (_ref) {
- var _ref$cues = _ref.cues,
- cues = _ref$cues === undefined ? [] : _ref$cues;
+ // Focus in/out on controls
+ bind(this.player.elements.controls, 'focusin focusout', function (event) {
+ var _player = _this4.player,
+ config = _player.config,
+ elements = _player.elements,
+ timers = _player.timers;
- var strippedCues = cues.map(function (cue) {
- return utils.stripHTML(cue.text);
- });
- captions.updateCues.call(player, strippedCues);
- });
+ // Skip transition to prevent focus from scrolling the parent element
- player.embed.on('loaded', function () {
- // Assure state and events are updated on autoplay
- player.embed.getPaused().then(function (paused) {
- assurePlaybackState.call(player, !paused);
- if (!paused) {
- utils.dispatchEvent.call(player, player.media, 'playing');
- }
- });
+ toggleClass(elements.controls, config.classNames.noTransition, event.type === 'focusin');
- if (utils.is.element(player.embed.element) && player.supported.ui) {
- var frame = player.embed.element;
+ // Toggle
+ ui.toggleControls.call(_this4.player, event.type === 'focusin');
- // Fix keyboard focus issues
- // https://github.com/sampotts/plyr/issues/317
- frame.setAttribute('tabindex', -1);
- }
- });
+ // If focusin, hide again after delay
+ if (event.type === 'focusin') {
+ // Restore transition
+ setTimeout(function () {
+ toggleClass(elements.controls, config.classNames.noTransition, false);
+ }, 0);
- player.embed.on('play', function () {
- assurePlaybackState.call(player, true);
- utils.dispatchEvent.call(player, player.media, 'playing');
- });
+ // Delay a little more for keyboard users
+ var delay = _this4.touch ? 3000 : 4000;
- player.embed.on('pause', function () {
- assurePlaybackState.call(player, false);
- });
+ // Clear timer
+ clearTimeout(timers.controls);
+ // Hide
+ timers.controls = setTimeout(function () {
+ return ui.toggleControls.call(_this4.player, false);
+ }, delay);
+ }
+ });
- player.embed.on('timeupdate', function (data) {
- player.media.seeking = false;
- currentTime = data.seconds;
- utils.dispatchEvent.call(player, player.media, 'timeupdate');
- });
+ // Mouse wheel for volume
+ bind(this.player.elements.inputs.volume, 'wheel', function (event) {
+ // Detect "natural" scroll - suppored on OS X Safari only
+ // Other browsers on OS X will be inverted until support improves
+ var inverted = event.webkitDirectionInvertedFromDevice;
+ var step = 1 / 50;
+ var direction = 0;
+
+ // Scroll down (or up on natural) to decrease
+ if (event.deltaY < 0 || event.deltaX > 0) {
+ if (inverted) {
+ _this4.player.decreaseVolume(step);
+ direction = -1;
+ } else {
+ _this4.player.increaseVolume(step);
+ direction = 1;
+ }
+ }
- player.embed.on('progress', function (data) {
- player.media.buffered = data.percent;
- utils.dispatchEvent.call(player, player.media, 'progress');
+ // Scroll up (or down on natural) to increase
+ if (event.deltaY > 0 || event.deltaX < 0) {
+ if (inverted) {
+ _this4.player.increaseVolume(step);
+ direction = 1;
+ } else {
+ _this4.player.decreaseVolume(step);
+ direction = -1;
+ }
+ }
- // Check all loaded
- if (parseInt(data.percent, 10) === 1) {
- utils.dispatchEvent.call(player, player.media, 'canplaythrough');
+ // Don't break page scrolling at max and min
+ if (direction === 1 && _this4.player.media.volume < 1 || direction === -1 && _this4.player.media.volume > 0) {
+ event.preventDefault();
+ }
+ }, 'volume', false);
}
+ }]);
+ return Listeners;
+ }();
- // Get duration as if we do it before load, it gives an incorrect value
- // https://github.com/sampotts/plyr/issues/891
- player.embed.getDuration().then(function (value) {
- if (value !== player.media.duration) {
- player.media.duration = value;
- utils.dispatchEvent.call(player, player.media, 'durationchange');
- }
- });
- });
+ var commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
- player.embed.on('seeked', function () {
- player.media.seeking = false;
- utils.dispatchEvent.call(player, player.media, 'seeked');
- });
+ function createCommonjsModule(fn, module) {
+ return module = { exports: {} }, fn(module, module.exports), module.exports;
+ }
- player.embed.on('ended', function () {
- player.media.paused = true;
- utils.dispatchEvent.call(player, player.media, 'ended');
- });
+ var loadjs_umd = createCommonjsModule(function (module, exports) {
+ (function(root, factory) {
+ if (typeof undefined === 'function' && undefined.amd) {
+ undefined([], factory);
+ } else {
+ module.exports = factory();
+ }
+ }(commonjsGlobal, function() {
+ /**
+ * Global dependencies.
+ * @global {Object} document - DOM
+ */
- player.embed.on('error', function (detail) {
- player.media.error = detail;
- utils.dispatchEvent.call(player, player.media, 'error');
- });
+ var devnull = function() {},
+ bundleIdCache = {},
+ bundleResultCache = {},
+ bundleCallbackQueue = {};
- // Rebuild UI
- setTimeout(function () {
- return ui.build.call(player);
- }, 0);
+
+ /**
+ * Subscribe to bundle load event.
+ * @param {string[]} bundleIds - Bundle ids
+ * @param {Function} callbackFn - The callback function
+ */
+ function subscribe(bundleIds, callbackFn) {
+ // listify
+ bundleIds = bundleIds.push ? bundleIds : [bundleIds];
+
+ var depsNotFound = [],
+ i = bundleIds.length,
+ numWaiting = i,
+ fn,
+ bundleId,
+ r,
+ q;
+
+ // define callback function
+ fn = function (bundleId, pathsNotFound) {
+ if (pathsNotFound.length) depsNotFound.push(bundleId);
+
+ numWaiting--;
+ if (!numWaiting) callbackFn(depsNotFound);
+ };
+
+ // register callback
+ while (i--) {
+ bundleId = bundleIds[i];
+
+ // execute callback if in result cache
+ r = bundleResultCache[bundleId];
+ if (r) {
+ fn(bundleId, r);
+ continue;
+ }
+
+ // add to callback queue
+ q = bundleCallbackQueue[bundleId] = bundleCallbackQueue[bundleId] || [];
+ q.push(fn);
+ }
}
-};
-// ==========================================================================
-// Standardise YouTube quality unit
-function mapQualityUnit(input) {
- switch (input) {
- case 'hd2160':
- return 2160;
+ /**
+ * Publish bundle load event.
+ * @param {string} bundleId - Bundle id
+ * @param {string[]} pathsNotFound - List of files not found
+ */
+ function publish(bundleId, pathsNotFound) {
+ // exit if id isn't defined
+ if (!bundleId) return;
- case 2160:
- return 'hd2160';
+ var q = bundleCallbackQueue[bundleId];
- case 'hd1440':
- return 1440;
+ // cache result
+ bundleResultCache[bundleId] = pathsNotFound;
- case 1440:
- return 'hd1440';
+ // exit if queue is empty
+ if (!q) return;
- case 'hd1080':
- return 1080;
+ // empty callback queue
+ while (q.length) {
+ q[0](bundleId, pathsNotFound);
+ q.splice(0, 1);
+ }
+ }
- case 1080:
- return 'hd1080';
- case 'hd720':
- return 720;
+ /**
+ * Execute callbacks.
+ * @param {Object or Function} args - The callback args
+ * @param {string[]} depsNotFound - List of dependencies not found
+ */
+ function executeCallbacks(args, depsNotFound) {
+ // accept function as argument
+ if (args.call) args = {success: args};
- case 720:
- return 'hd720';
+ // success and error callbacks
+ if (depsNotFound.length) (args.error || devnull)(depsNotFound);
+ else (args.success || devnull)(args);
+ }
- case 'large':
- return 480;
- case 480:
- return 'large';
+ /**
+ * Load individual file.
+ * @param {string} path - The file path
+ * @param {Function} callbackFn - The callback function
+ */
+ function loadFile(path, callbackFn, args, numTries) {
+ var doc = document,
+ async = args.async,
+ maxTries = (args.numRetries || 0) + 1,
+ beforeCallbackFn = args.before || devnull,
+ pathStripped = path.replace(/^(css|img)!/, ''),
+ isCss,
+ e;
+
+ numTries = numTries || 0;
+
+ if (/(^css!|\.css$)/.test(path)) {
+ isCss = true;
+
+ // css
+ e = doc.createElement('link');
+ e.rel = 'stylesheet';
+ e.href = pathStripped; //.replace(/^css!/, ''); // remove "css!" prefix
+ } else if (/(^img!|\.(png|gif|jpg|svg)$)/.test(path)) {
+ // image
+ e = doc.createElement('img');
+ e.src = pathStripped;
+ } else {
+ // javascript
+ e = doc.createElement('script');
+ e.src = path;
+ e.async = async === undefined ? true : async;
+ }
- case 'medium':
- return 360;
+ e.onload = e.onerror = e.onbeforeload = function (ev) {
+ var result = ev.type[0];
- case 360:
- return 'medium';
+ // Note: The following code isolates IE using `hideFocus` and treats empty
+ // stylesheets as failures to get around lack of onerror support
+ if (isCss && 'hideFocus' in e) {
+ try {
+ if (!e.sheet.cssText.length) result = 'e';
+ } catch (x) {
+ // sheets objects created from load errors don't allow access to
+ // `cssText`
+ result = 'e';
+ }
+ }
- case 'small':
- return 240;
+ // handle retries in case of load failure
+ if (result == 'e') {
+ // increment counter
+ numTries += 1;
- case 240:
- return 'small';
+ // exit function and try again
+ if (numTries < maxTries) {
+ return loadFile(path, callbackFn, args, numTries);
+ }
+ }
- default:
- return 'default';
- }
-}
+ // execute callback
+ callbackFn(path, result, ev.defaultPrevented);
+ };
-function mapQualityUnits(levels) {
- if (utils.is.empty(levels)) {
- return levels;
+ // add to document (unless callback returns `false`)
+ if (beforeCallbackFn(path, e) !== false) doc.head.appendChild(e);
}
- return utils.dedupe(levels.map(function (level) {
- return mapQualityUnit(level);
- }));
-}
-// Set playback state and trigger change (only on actual change)
-function assurePlaybackState$1(play) {
- if (play && !this.embed.hasPlayed) {
- this.embed.hasPlayed = true;
- }
- if (this.media.paused === play) {
- this.media.paused = !play;
- utils.dispatchEvent.call(this, this.media, play ? 'play' : 'pause');
+ /**
+ * Load multiple files.
+ * @param {string[]} paths - The file paths
+ * @param {Function} callbackFn - The callback function
+ */
+ function loadFiles(paths, callbackFn, args) {
+ // listify paths
+ paths = paths.push ? paths : [paths];
+
+ var numWaiting = paths.length,
+ x = numWaiting,
+ pathsNotFound = [],
+ fn,
+ i;
+
+ // define callback function
+ fn = function(path, result, defaultPrevented) {
+ // handle error
+ if (result == 'e') pathsNotFound.push(path);
+
+ // handle beforeload event. If defaultPrevented then that means the load
+ // will be blocked (ex. Ghostery/ABP on Safari)
+ if (result == 'b') {
+ if (defaultPrevented) pathsNotFound.push(path);
+ else return;
+ }
+
+ numWaiting--;
+ if (!numWaiting) callbackFn(pathsNotFound);
+ };
+
+ // load scripts
+ for (i=0; i < x; i++) loadFile(paths[i], fn, args);
}
-}
-var youtube = {
- setup: function setup() {
- var _this = this;
- // Add embed class for responsive
- utils.toggleClass(this.elements.wrapper, this.config.classNames.embed, true);
+ /**
+ * Initiate script load and register bundle.
+ * @param {(string|string[])} paths - The file paths
+ * @param {(string|Function)} [arg1] - The bundleId or success callback
+ * @param {Function} [arg2] - The success or error callback
+ * @param {Function} [arg3] - The error callback
+ */
+ function loadjs(paths, arg1, arg2) {
+ var bundleId,
+ args;
- // Set aspect ratio
- youtube.setAspectRatio.call(this);
+ // bundleId (if string)
+ if (arg1 && arg1.trim) bundleId = arg1;
+
+ // args (default is {})
+ args = (bundleId ? arg2 : arg1) || {};
- // Setup API
- if (utils.is.object(window.YT) && utils.is.function(window.YT.Player)) {
- youtube.ready.call(this);
+ // throw error if bundle is already defined
+ if (bundleId) {
+ if (bundleId in bundleIdCache) {
+ throw "LoadJS";
} else {
- // Load the API
- utils.loadScript(this.config.urls.youtube.sdk).catch(function (error) {
- _this.debug.warn('YouTube API failed to load', error);
- });
+ bundleIdCache[bundleId] = true;
+ }
+ }
- // Setup callback for the API
- // YouTube has it's own system of course...
- window.onYouTubeReadyCallbacks = window.onYouTubeReadyCallbacks || [];
+ // load scripts
+ loadFiles(paths, function (pathsNotFound) {
+ // execute callbacks
+ executeCallbacks(args, pathsNotFound);
- // Add to queue
- window.onYouTubeReadyCallbacks.push(function () {
- youtube.ready.call(_this);
- });
+ // publish bundle load event
+ publish(bundleId, pathsNotFound);
+ }, args);
+ }
- // Set callback to process queue
- window.onYouTubeIframeAPIReady = function () {
- window.onYouTubeReadyCallbacks.forEach(function (callback) {
- callback();
- });
- };
- }
- },
+ /**
+ * Execute callbacks when dependencies have been satisfied.
+ * @param {(string|string[])} deps - List of bundle ids
+ * @param {Object} args - success/error arguments
+ */
+ loadjs.ready = function ready(deps, args) {
+ // subscribe to bundle load event
+ subscribe(deps, function (depsNotFound) {
+ // execute callbacks
+ executeCallbacks(args, depsNotFound);
+ });
- // Get the media title
- getTitle: function getTitle(videoId) {
- var _this2 = this;
+ return loadjs;
+ };
- // Try via undocumented API method first
- // This method disappears now and then though...
- // https://github.com/sampotts/plyr/issues/709
- if (utils.is.function(this.embed.getVideoData)) {
- var _embed$getVideoData = this.embed.getVideoData(),
- title = _embed$getVideoData.title;
- if (utils.is.empty(title)) {
- this.config.title = title;
- ui.setTitle.call(this);
- return;
- }
- }
+ /**
+ * Manually satisfy bundle dependencies.
+ * @param {string} bundleId - The bundle id
+ */
+ loadjs.done = function done(bundleId) {
+ publish(bundleId, []);
+ };
- // Or via Google API
- var key = this.config.keys.google;
- if (utils.is.string(key) && !utils.is.empty(key)) {
- var url = utils.format(this.config.urls.youtube.api, videoId, key);
- utils.fetch(url).then(function (result) {
- if (utils.is.object(result)) {
- _this2.config.title = result.items[0].snippet.title;
- ui.setTitle.call(_this2);
- }
- }).catch(function () {});
- }
- },
+ /**
+ * Reset loadjs dependencies statuses
+ */
+ loadjs.reset = function reset() {
+ bundleIdCache = {};
+ bundleResultCache = {};
+ bundleCallbackQueue = {};
+ };
- // Set aspect ratio
- setAspectRatio: function setAspectRatio() {
- var ratio = this.config.ratio.split(':');
- this.elements.wrapper.style.paddingBottom = 100 / ratio[0] * ratio[1] + '%';
- },
+ /**
+ * Determine if bundle has already been defined
+ * @param String} bundleId - The bundle id
+ */
+ loadjs.isDefined = function isDefined(bundleId) {
+ return bundleId in bundleIdCache;
+ };
- // API ready
- ready: function ready() {
- var player = this;
+ // export
+ return loadjs;
- // Ignore already setup (race condition)
- var currentId = player.media.getAttribute('id');
- if (!utils.is.empty(currentId) && currentId.startsWith('youtube-')) {
- return;
- }
+ }));
+ });
+
+ // ==========================================================================
+
+ function loadScript(url) {
+ return new Promise(function (resolve, reject) {
+ loadjs_umd(url, {
+ success: resolve,
+ error: reject
+ });
+ });
+ }
- // Get the source URL or ID
- var source = player.media.getAttribute('src');
+ // ==========================================================================
- // Get from <div> if needed
- if (utils.is.empty(source)) {
- source = player.media.getAttribute(this.config.attributes.embed.id);
+ // Parse Vimeo ID from URL
+ function parseId(url) {
+ if (is.empty(url)) {
+ return null;
}
- // Replace the <iframe> with a <div> due to YouTube API issues
- var videoId = utils.parseYouTubeId(source);
- var id = utils.generateId(player.provider);
- var container = utils.createElement('div', { id: id });
- player.media = utils.replaceElement(container, player.media);
+ if (is.number(Number(url))) {
+ return url;
+ }
+
+ var regex = /^.*(vimeo.com\/|video\/)(\d+).*/;
+ return url.match(regex) ? RegExp.$2 : url;
+ }
- // Set poster image
- var posterSrc = function posterSrc(format) {
- return 'https://img.youtube.com/vi/' + videoId + '/' + format + 'default.jpg';
+ // Get aspect ratio for dimensions
+ function getAspectRatio(width, height) {
+ var getRatio = function getRatio(w, h) {
+ return h === 0 ? w : getRatio(h, w % h);
};
+ var ratio = getRatio(width, height);
+ return width / ratio + ':' + height / ratio;
+ }
+
+ // Set playback state and trigger change (only on actual change)
+ function assurePlaybackState(play) {
+ if (play && !this.embed.hasPlayed) {
+ this.embed.hasPlayed = true;
+ }
+ if (this.media.paused === play) {
+ this.media.paused = !play;
+ triggerEvent.call(this, this.media, play ? 'play' : 'pause');
+ }
+ }
+
+ var vimeo = {
+ setup: function setup() {
+ var _this = this;
+
+ // Add embed class for responsive
+ toggleClass(this.elements.wrapper, this.config.classNames.embed, true);
+
+ // Set intial ratio
+ vimeo.setAspectRatio.call(this);
- // Check thumbnail images in order of quality, but reject fallback thumbnails (120px wide)
- utils.loadImage(posterSrc('maxres'), 121) // Higest quality and unpadded
- .catch(function () {
- return utils.loadImage(posterSrc('sd'), 121);
- }) // 480p padded 4:3
- .catch(function () {
- return utils.loadImage(posterSrc('hq'));
- }) // 360p padded 4:3. Always exists
- .then(function (image) {
- return ui.setPoster.call(player, image.src);
- }).then(function (posterSrc) {
- // If the image is padded, use background-size "cover" instead (like youtube does too with their posters)
- if (!posterSrc.includes('maxres')) {
- player.elements.poster.style.backgroundSize = 'cover';
+ // Load the API if not already
+ if (!is.object(window.Vimeo)) {
+ loadScript(this.config.urls.vimeo.sdk).then(function () {
+ vimeo.ready.call(_this);
+ }).catch(function (error) {
+ _this.debug.warn('Vimeo API failed to load', error);
+ });
+ } else {
+ vimeo.ready.call(this);
}
- });
+ },
- // Setup instance
- // https://developers.google.com/youtube/iframe_api_reference
- player.embed = new window.YT.Player(id, {
- videoId: videoId,
- playerVars: {
- autoplay: player.config.autoplay ? 1 : 0, // Autoplay
- controls: player.supported.ui ? 0 : 1, // Only show controls if not fully supported
- rel: 0, // No related vids
- showinfo: 0, // Hide info
- iv_load_policy: 3, // Hide annotations
- modestbranding: 1, // Hide logos as much as possible (they still show one in the corner when paused)
- disablekb: 1, // Disable keyboard as we handle it
- playsinline: 1, // Allow iOS inline playback
-
- // Tracking for stats
- // origin: window ? `${window.location.protocol}//${window.location.host}` : null,
- widget_referrer: window ? window.location.href : null,
-
- // Captions are flaky on YouTube
- cc_load_policy: player.captions.active ? 1 : 0,
- cc_lang_pref: player.config.captions.language
- },
- events: {
- onError: function onError(event) {
- // If we've already fired an error, don't do it again
- // YouTube fires onError twice
- if (utils.is.object(player.media.error)) {
- return;
- }
- var detail = {
- code: event.data
- };
+ // Set aspect ratio
+ // For Vimeo we have an extra 300% height <div> to hide the standard controls and UI
+ setAspectRatio: function setAspectRatio(input) {
+ var _split = (is.string(input) ? input : this.config.ratio).split(':'),
+ _split2 = slicedToArray(_split, 2),
+ x = _split2[0],
+ y = _split2[1];
- // Messages copied from https://developers.google.com/youtube/iframe_api_reference#onError
- switch (event.data) {
- case 2:
- detail.message = 'The request contains an invalid parameter value. For example, this error occurs if you specify a video ID that does not have 11 characters, or if the video ID contains invalid characters, such as exclamation points or asterisks.';
- break;
+ var padding = 100 / x * y;
+ this.elements.wrapper.style.paddingBottom = padding + '%';
- case 5:
- detail.message = 'The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.';
- break;
+ if (this.supported.ui) {
+ var height = 240;
+ var offset = (height - padding) / (height / 50);
- case 100:
- detail.message = 'The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.';
- break;
+ this.media.style.transform = 'translateY(-' + offset + '%)';
+ }
+ },
- case 101:
- case 150:
- detail.message = 'The owner of the requested video does not allow it to be played in embedded players.';
- break;
- default:
- detail.message = 'An unknown error occured';
- break;
- }
+ // API Ready
+ ready: function ready$$1() {
+ var _this2 = this;
- player.media.error = detail;
+ var player = this;
+
+ // Get Vimeo params for the iframe
+ var options = {
+ loop: player.config.loop.active,
+ autoplay: player.autoplay,
+ // muted: player.muted,
+ byline: false,
+ portrait: false,
+ title: false,
+ speed: true,
+ transparent: 0,
+ gesture: 'media',
+ playsinline: !this.config.fullscreen.iosNative
+ };
+ var params = buildUrlParams(options);
- utils.dispatchEvent.call(player, player.media, 'error');
- },
- onPlaybackQualityChange: function onPlaybackQualityChange() {
- utils.dispatchEvent.call(player, player.media, 'qualitychange', false, {
- quality: player.media.quality
- });
- },
- onPlaybackRateChange: function onPlaybackRateChange(event) {
- // Get the instance
- var instance = event.target;
+ // Get the source URL or ID
+ var source = player.media.getAttribute('src');
- // Get current speed
- player.media.playbackRate = instance.getPlaybackRate();
+ // Get from <div> if needed
+ if (is.empty(source)) {
+ source = player.media.getAttribute(player.config.attributes.embed.id);
+ }
- utils.dispatchEvent.call(player, player.media, 'ratechange');
- },
- onReady: function onReady(event) {
- // Get the instance
- var instance = event.target;
+ var id = parseId(source);
- // Get the title
- youtube.getTitle.call(player, videoId);
+ // Build an iframe
+ var iframe = createElement('iframe');
+ var src = format(player.config.urls.vimeo.iframe, id, params);
+ iframe.setAttribute('src', src);
+ iframe.setAttribute('allowfullscreen', '');
+ iframe.setAttribute('allowtransparency', '');
+ iframe.setAttribute('allow', 'autoplay');
- // Create a faux HTML5 API using the YouTube API
- player.media.play = function () {
- assurePlaybackState$1.call(player, true);
- instance.playVideo();
- };
+ // Get poster, if already set
+ var poster = player.poster;
- player.media.pause = function () {
- assurePlaybackState$1.call(player, false);
- instance.pauseVideo();
- };
+ // Inject the package
- player.media.stop = function () {
- instance.stopVideo();
- };
+ var wrapper = createElement('div', { poster: poster, class: player.config.classNames.embedContainer });
+ wrapper.appendChild(iframe);
+ player.media = replaceElement(wrapper, player.media);
- player.media.duration = instance.getDuration();
- player.media.paused = true;
-
- // Seeking
- player.media.currentTime = 0;
- Object.defineProperty(player.media, 'currentTime', {
- get: function get() {
- return Number(instance.getCurrentTime());
- },
- set: function set(time) {
- // If paused, mute audio preventively (YouTube starts playing on seek if the video hasn't been played yet).
- if (player.paused) {
- player.embed.mute();
- }
+ // Get poster image
+ fetch$1(format(player.config.urls.vimeo.api, id), 'json').then(function (response) {
+ if (is.empty(response)) {
+ return;
+ }
- // Set seeking state and trigger event
- player.media.seeking = true;
- utils.dispatchEvent.call(player, player.media, 'seeking');
+ // Get the URL for thumbnail
+ var url = new URL(response[0].thumbnail_large);
- // Seek after events sent
- instance.seekTo(time);
- }
- });
+ // Get original image
+ url.pathname = url.pathname.split('_')[0] + '.jpg';
- // Playback speed
- Object.defineProperty(player.media, 'playbackRate', {
- get: function get() {
- return instance.getPlaybackRate();
- },
- set: function set(input) {
- instance.setPlaybackRate(input);
- }
- });
+ // Set and show poster
+ ui.setPoster.call(player, url.href).catch(function () {});
+ });
- // Quality
- Object.defineProperty(player.media, 'quality', {
- get: function get() {
- return mapQualityUnit(instance.getPlaybackQuality());
- },
- set: function set(input) {
- var quality = input;
-
- // Set via API
- instance.setPlaybackQuality(mapQualityUnit(quality));
-
- // Trigger request event
- utils.dispatchEvent.call(player, player.media, 'qualityrequested', false, {
- quality: quality
- });
- }
- });
+ // Setup instance
+ // https://github.com/vimeo/player.js
+ player.embed = new window.Vimeo.Player(iframe, {
+ autopause: player.config.autopause,
+ muted: player.muted
+ });
- // Volume
- var volume = player.config.volume;
-
- Object.defineProperty(player.media, 'volume', {
- get: function get() {
- return volume;
- },
- set: function set(input) {
- volume = input;
- instance.setVolume(volume * 100);
- utils.dispatchEvent.call(player, player.media, 'volumechange');
- }
- });
+ player.media.paused = true;
+ player.media.currentTime = 0;
- // Muted
- var muted = player.config.muted;
-
- Object.defineProperty(player.media, 'muted', {
- get: function get() {
- return muted;
- },
- set: function set(input) {
- var toggle = utils.is.boolean(input) ? input : muted;
- muted = toggle;
- instance[toggle ? 'mute' : 'unMute']();
- utils.dispatchEvent.call(player, player.media, 'volumechange');
- }
- });
+ // Disable native text track rendering
+ if (player.supported.ui) {
+ player.embed.disableTextTrack();
+ }
- // Source
- Object.defineProperty(player.media, 'currentSrc', {
- get: function get() {
- return instance.getVideoUrl();
- }
+ // Create a faux HTML5 API using the Vimeo API
+ player.media.play = function () {
+ assurePlaybackState.call(player, true);
+ return player.embed.play();
+ };
+
+ player.media.pause = function () {
+ assurePlaybackState.call(player, false);
+ return player.embed.pause();
+ };
+
+ player.media.stop = function () {
+ player.pause();
+ player.currentTime = 0;
+ };
+
+ // Seeking
+ var currentTime = player.media.currentTime;
+
+ Object.defineProperty(player.media, 'currentTime', {
+ get: function get$$1() {
+ return currentTime;
+ },
+ set: function set$$1(time) {
+ // Vimeo will automatically play on seek if the video hasn't been played before
+
+ // Get current paused state and volume etc
+ var embed = player.embed,
+ media = player.media,
+ paused = player.paused,
+ volume = player.volume;
+
+ var restorePause = paused && !embed.hasPlayed;
+
+ // Set seeking state and trigger event
+ media.seeking = true;
+ triggerEvent.call(player, media, 'seeking');
+
+ // If paused, mute until seek is complete
+ Promise.resolve(restorePause && embed.setVolume(0))
+ // Seek
+ .then(function () {
+ return embed.setCurrentTime(time);
+ })
+ // Restore paused
+ .then(function () {
+ return restorePause && embed.pause();
+ })
+ // Restore volume
+ .then(function () {
+ return restorePause && embed.setVolume(volume);
+ }).catch(function () {
+ // Do nothing
});
+ }
+ });
- // Ended
- Object.defineProperty(player.media, 'ended', {
- get: function get() {
- return player.currentTime === player.duration;
+ // Playback speed
+ var speed = player.config.speed.selected;
+ Object.defineProperty(player.media, 'playbackRate', {
+ get: function get$$1() {
+ return speed;
+ },
+ set: function set$$1(input) {
+ player.embed.setPlaybackRate(input).then(function () {
+ speed = input;
+ triggerEvent.call(player, player.media, 'ratechange');
+ }).catch(function (error) {
+ // Hide menu item (and menu if empty)
+ if (error.name === 'Error') {
+ controls.setSpeedMenu.call(player, []);
}
});
+ }
+ });
- // Get available speeds
- player.options.speed = instance.getAvailablePlaybackRates();
+ // Volume
+ var volume = player.config.volume;
- // Set the tabindex to avoid focus entering iframe
- if (player.supported.ui) {
- player.media.setAttribute('tabindex', -1);
- }
+ Object.defineProperty(player.media, 'volume', {
+ get: function get$$1() {
+ return volume;
+ },
+ set: function set$$1(input) {
+ player.embed.setVolume(input).then(function () {
+ volume = input;
+ triggerEvent.call(player, player.media, 'volumechange');
+ });
+ }
+ });
- utils.dispatchEvent.call(player, player.media, 'timeupdate');
- utils.dispatchEvent.call(player, player.media, 'durationchange');
+ // Muted
+ var muted = player.config.muted;
- // Reset timer
- clearInterval(player.timers.buffering);
+ Object.defineProperty(player.media, 'muted', {
+ get: function get$$1() {
+ return muted;
+ },
+ set: function set$$1(input) {
+ var toggle = is.boolean(input) ? input : false;
- // Setup buffering
- player.timers.buffering = setInterval(function () {
- // Get loaded % from YouTube
- player.media.buffered = instance.getVideoLoadedFraction();
+ player.embed.setVolume(toggle ? 0 : player.config.volume).then(function () {
+ muted = toggle;
+ triggerEvent.call(player, player.media, 'volumechange');
+ });
+ }
+ });
- // Trigger progress only when we actually buffer something
- if (player.media.lastBuffered === null || player.media.lastBuffered < player.media.buffered) {
- utils.dispatchEvent.call(player, player.media, 'progress');
- }
+ // Loop
+ var loop = player.config.loop;
- // Set last buffer point
- player.media.lastBuffered = player.media.buffered;
+ Object.defineProperty(player.media, 'loop', {
+ get: function get$$1() {
+ return loop;
+ },
+ set: function set$$1(input) {
+ var toggle = is.boolean(input) ? input : player.config.loop.active;
- // Bail if we're at 100%
- if (player.media.buffered === 1) {
- clearInterval(player.timers.buffering);
+ player.embed.setLoop(toggle).then(function () {
+ loop = toggle;
+ });
+ }
+ });
- // Trigger event
- utils.dispatchEvent.call(player, player.media, 'canplaythrough');
- }
- }, 200);
+ // Source
+ var currentSrc = void 0;
+ player.embed.getVideoUrl().then(function (value) {
+ currentSrc = value;
+ }).catch(function (error) {
+ _this2.debug.warn(error);
+ });
- // Rebuild UI
- setTimeout(function () {
- return ui.build.call(player);
- }, 50);
- },
- onStateChange: function onStateChange(event) {
- // Get the instance
- var instance = event.target;
+ Object.defineProperty(player.media, 'currentSrc', {
+ get: function get$$1() {
+ return currentSrc;
+ }
+ });
- // Reset timer
- clearInterval(player.timers.playing);
+ // Ended
+ Object.defineProperty(player.media, 'ended', {
+ get: function get$$1() {
+ return player.currentTime === player.duration;
+ }
+ });
- var seeked = player.media.seeking && [1, 2].includes(event.data);
+ // Set aspect ratio based on video size
+ Promise.all([player.embed.getVideoWidth(), player.embed.getVideoHeight()]).then(function (dimensions) {
+ var ratio = getAspectRatio(dimensions[0], dimensions[1]);
+ vimeo.setAspectRatio.call(_this2, ratio);
+ });
- if (seeked) {
- // Unset seeking and fire seeked event
- player.media.seeking = false;
- utils.dispatchEvent.call(player, player.media, 'seeked');
- }
+ // Set autopause
+ player.embed.setAutopause(player.config.autopause).then(function (state) {
+ player.config.autopause = state;
+ });
- // Handle events
- // -1 Unstarted
- // 0 Ended
- // 1 Playing
- // 2 Paused
- // 3 Buffering
- // 5 Video cued
- switch (event.data) {
- case -1:
- // Update scrubber
- utils.dispatchEvent.call(player, player.media, 'timeupdate');
+ // Get title
+ player.embed.getVideoTitle().then(function (title) {
+ player.config.title = title;
+ ui.setTitle.call(_this2);
+ });
- // Get loaded % from YouTube
- player.media.buffered = instance.getVideoLoadedFraction();
- utils.dispatchEvent.call(player, player.media, 'progress');
+ // Get current time
+ player.embed.getCurrentTime().then(function (value) {
+ currentTime = value;
+ triggerEvent.call(player, player.media, 'timeupdate');
+ });
- break;
+ // Get duration
+ player.embed.getDuration().then(function (value) {
+ player.media.duration = value;
+ triggerEvent.call(player, player.media, 'durationchange');
+ });
- case 0:
- assurePlaybackState$1.call(player, false);
+ // Get captions
+ player.embed.getTextTracks().then(function (tracks) {
+ player.media.textTracks = tracks;
+ captions.setup.call(player);
+ });
- // YouTube doesn't support loop for a single video, so mimick it.
- if (player.media.loop) {
- // YouTube needs a call to `stopVideo` before playing again
- instance.stopVideo();
- instance.playVideo();
- } else {
- utils.dispatchEvent.call(player, player.media, 'ended');
- }
+ player.embed.on('cuechange', function (_ref) {
+ var _ref$cues = _ref.cues,
+ cues = _ref$cues === undefined ? [] : _ref$cues;
- break;
+ var strippedCues = cues.map(function (cue) {
+ return stripHTML(cue.text);
+ });
+ captions.updateCues.call(player, strippedCues);
+ });
- case 1:
- // Restore paused state (YouTube starts playing on seek if the video hasn't been played yet)
- if (player.media.paused && !player.embed.hasPlayed) {
- player.media.pause();
- } else {
- assurePlaybackState$1.call(player, true);
+ player.embed.on('loaded', function () {
+ // Assure state and events are updated on autoplay
+ player.embed.getPaused().then(function (paused) {
+ assurePlaybackState.call(player, !paused);
+ if (!paused) {
+ triggerEvent.call(player, player.media, 'playing');
+ }
+ });
- utils.dispatchEvent.call(player, player.media, 'playing');
+ if (is.element(player.embed.element) && player.supported.ui) {
+ var frame = player.embed.element;
- // Poll to get playback progress
- player.timers.playing = setInterval(function () {
- utils.dispatchEvent.call(player, player.media, 'timeupdate');
- }, 50);
+ // Fix keyboard focus issues
+ // https://github.com/sampotts/plyr/issues/317
+ frame.setAttribute('tabindex', -1);
+ }
+ });
- // Check duration again due to YouTube bug
- // https://github.com/sampotts/plyr/issues/374
- // https://code.google.com/p/gdata-issues/issues/detail?id=8690
- if (player.media.duration !== instance.getDuration()) {
- player.media.duration = instance.getDuration();
- utils.dispatchEvent.call(player, player.media, 'durationchange');
- }
+ player.embed.on('play', function () {
+ assurePlaybackState.call(player, true);
+ triggerEvent.call(player, player.media, 'playing');
+ });
- // Get quality
- controls.setQualityMenu.call(player, mapQualityUnits(instance.getAvailableQualityLevels()));
- }
+ player.embed.on('pause', function () {
+ assurePlaybackState.call(player, false);
+ });
- break;
+ player.embed.on('timeupdate', function (data) {
+ player.media.seeking = false;
+ currentTime = data.seconds;
+ triggerEvent.call(player, player.media, 'timeupdate');
+ });
- case 2:
- // Restore audio (YouTube starts playing on seek if the video hasn't been played yet)
- if (!player.muted) {
- player.embed.unMute();
- }
- assurePlaybackState$1.call(player, false);
+ player.embed.on('progress', function (data) {
+ player.media.buffered = data.percent;
+ triggerEvent.call(player, player.media, 'progress');
- break;
+ // Check all loaded
+ if (parseInt(data.percent, 10) === 1) {
+ triggerEvent.call(player, player.media, 'canplaythrough');
+ }
- default:
- break;
+ // Get duration as if we do it before load, it gives an incorrect value
+ // https://github.com/sampotts/plyr/issues/891
+ player.embed.getDuration().then(function (value) {
+ if (value !== player.media.duration) {
+ player.media.duration = value;
+ triggerEvent.call(player, player.media, 'durationchange');
}
+ });
+ });
- utils.dispatchEvent.call(player, player.elements.container, 'statechange', false, {
- code: event.data
- });
- }
- }
- });
- }
-};
+ player.embed.on('seeked', function () {
+ player.media.seeking = false;
+ triggerEvent.call(player, player.media, 'seeked');
+ });
-// ==========================================================================
+ player.embed.on('ended', function () {
+ player.media.paused = true;
+ triggerEvent.call(player, player.media, 'ended');
+ });
-var media = {
- // Setup media
- setup: function setup() {
- // If there's no media, bail
- if (!this.media) {
- this.debug.warn('No media element found!');
- return;
- }
+ player.embed.on('error', function (detail) {
+ player.media.error = detail;
+ triggerEvent.call(player, player.media, 'error');
+ });
- // Add type class
- utils.toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', this.type), true);
+ // Rebuild UI
+ setTimeout(function () {
+ return ui.build.call(player);
+ }, 0);
+ }
+ };
- // Add provider class
- utils.toggleClass(this.elements.container, this.config.classNames.provider.replace('{0}', this.provider), true);
+ // ==========================================================================
- // Add video class for embeds
- // This will require changes if audio embeds are added
- if (this.isEmbed) {
- utils.toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', 'video'), true);
+ // Parse YouTube ID from URL
+ function parseId$1(url) {
+ if (is.empty(url)) {
+ return null;
}
- // Inject the player wrapper
- if (this.isVideo) {
- // Create the wrapper div
- this.elements.wrapper = utils.createElement('div', {
- class: this.config.classNames.video
- });
+ var regex = /^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|&v=)([^#&?]*).*/;
+ return url.match(regex) ? RegExp.$2 : url;
+ }
+
+ // Standardise YouTube quality unit
+ function mapQualityUnit(input) {
+ var qualities = {
+ hd2160: 2160,
+ hd1440: 1440,
+ hd1080: 1080,
+ hd720: 720,
+ large: 480,
+ medium: 360,
+ small: 240,
+ tiny: 144
+ };
- // Wrap the video in a container
- utils.wrap(this.media, this.elements.wrapper);
+ var entry = Object.entries(qualities).find(function (entry) {
+ return entry.includes(input);
+ });
- // Faux poster container
- this.elements.poster = utils.createElement('div', {
- class: this.config.classNames.poster
+ if (entry) {
+ // Get the match corresponding to the input
+ return entry.find(function (value) {
+ return value !== input;
});
-
- this.elements.wrapper.appendChild(this.elements.poster);
}
- if (this.isEmbed) {
- switch (this.provider) {
- case 'youtube':
- youtube.setup.call(this);
- break;
+ return 'default';
+ }
- case 'vimeo':
- vimeo.setup.call(this);
- break;
+ function mapQualityUnits(levels) {
+ if (is.empty(levels)) {
+ return levels;
+ }
- default:
- break;
- }
- } else if (this.isHTML5) {
- html5.extend.call(this);
+ return dedupe(levels.map(function (level) {
+ return mapQualityUnit(level);
+ }));
+ }
+
+ // Set playback state and trigger change (only on actual change)
+ function assurePlaybackState$1(play) {
+ if (play && !this.embed.hasPlayed) {
+ this.embed.hasPlayed = true;
+ }
+ if (this.media.paused === play) {
+ this.media.paused = !play;
+ triggerEvent.call(this, this.media, play ? 'play' : 'pause');
}
}
-};
-// ==========================================================================
+ var youtube = {
+ setup: function setup() {
+ var _this = this;
-var Ads = function () {
- /**
- * Ads constructor.
- * @param {object} player
- * @return {Ads}
- */
- function Ads(player) {
- var _this = this;
+ // Add embed class for responsive
+ toggleClass(this.elements.wrapper, this.config.classNames.embed, true);
- classCallCheck(this, Ads);
+ // Set aspect ratio
+ youtube.setAspectRatio.call(this);
- this.player = player;
- this.publisherId = player.config.ads.publisherId;
- this.playing = false;
- this.initialized = false;
- this.elements = {
- container: null,
- displayContainer: null
- };
- this.manager = null;
- this.loader = null;
- this.cuePoints = null;
- this.events = {};
- this.safetyTimer = null;
- this.countdownTimer = null;
-
- // Setup a promise to resolve when the IMA manager is ready
- this.managerPromise = new Promise(function (resolve, reject) {
- // The ad is loaded and ready
- _this.on('loaded', resolve);
-
- // Ads failed
- _this.on('error', reject);
- });
+ // Setup API
+ if (is.object(window.YT) && is.function(window.YT.Player)) {
+ youtube.ready.call(this);
+ } else {
+ // Load the API
+ loadScript(this.config.urls.youtube.sdk).catch(function (error) {
+ _this.debug.warn('YouTube API failed to load', error);
+ });
- this.load();
- }
+ // Setup callback for the API
+ // YouTube has it's own system of course...
+ window.onYouTubeReadyCallbacks = window.onYouTubeReadyCallbacks || [];
- createClass(Ads, [{
- key: 'load',
+ // Add to queue
+ window.onYouTubeReadyCallbacks.push(function () {
+ youtube.ready.call(_this);
+ });
+ // Set callback to process queue
+ window.onYouTubeIframeAPIReady = function () {
+ window.onYouTubeReadyCallbacks.forEach(function (callback) {
+ callback();
+ });
+ };
+ }
+ },
- /**
- * Load the IMA SDK
- */
- value: function load() {
+
+ // Get the media title
+ getTitle: function getTitle(videoId) {
var _this2 = this;
- if (this.enabled) {
- // Check if the Google IMA3 SDK is loaded or load it ourselves
- if (!utils.is.object(window.google) || !utils.is.object(window.google.ima)) {
- utils.loadScript(this.player.config.urls.googleIMA.sdk).then(function () {
- _this2.ready();
- }).catch(function () {
- // Script failed to load or is blocked
- _this2.trigger('error', new Error('Google IMA SDK failed to load'));
- });
- } else {
- this.ready();
+ // Try via undocumented API method first
+ // This method disappears now and then though...
+ // https://github.com/sampotts/plyr/issues/709
+ if (is.function(this.embed.getVideoData)) {
+ var _embed$getVideoData = this.embed.getVideoData(),
+ title = _embed$getVideoData.title;
+
+ if (is.empty(title)) {
+ this.config.title = title;
+ ui.setTitle.call(this);
+ return;
}
}
- }
- /**
- * Get the ads instance ready
- */
+ // Or via Google API
+ var key = this.config.keys.google;
+ if (is.string(key) && !is.empty(key)) {
+ var url = format(this.config.urls.youtube.api, videoId, key);
- }, {
- key: 'ready',
- value: function ready() {
- var _this3 = this;
+ fetch$1(url).then(function (result) {
+ if (is.object(result)) {
+ _this2.config.title = result.items[0].snippet.title;
+ ui.setTitle.call(_this2);
+ }
+ }).catch(function () {});
+ }
+ },
- // Start ticking our safety timer. If the whole advertisement
- // thing doesn't resolve within our set time; we bail
- this.startSafetyTimer(12000, 'ready()');
- // Clear the safety timer
- this.managerPromise.then(function () {
- _this3.clearSafetyTimer('onAdsManagerLoaded()');
- });
+ // Set aspect ratio
+ setAspectRatio: function setAspectRatio() {
+ var ratio = this.config.ratio.split(':');
+ this.elements.wrapper.style.paddingBottom = 100 / ratio[0] * ratio[1] + '%';
+ },
- // Set listeners on the Plyr instance
- this.listeners();
- // Setup the IMA SDK
- this.setupIMA();
- }
+ // API ready
+ ready: function ready$$1() {
+ var player = this;
- // Build the default tag URL
+ // Ignore already setup (race condition)
+ var currentId = player.media.getAttribute('id');
+ if (!is.empty(currentId) && currentId.startsWith('youtube-')) {
+ return;
+ }
- }, {
- key: 'setupIMA',
+ // Get the source URL or ID
+ var source = player.media.getAttribute('src');
+ // Get from <div> if needed
+ if (is.empty(source)) {
+ source = player.media.getAttribute(this.config.attributes.embed.id);
+ }
- /**
- * In order for the SDK to display ads for our video, we need to tell it where to put them,
- * so here we define our ad container. This div is set up to render on top of the video player.
- * Using the code below, we tell the SDK to render ads within that div. We also provide a
- * handle to the content video player - the SDK will poll the current time of our player to
- * properly place mid-rolls. After we create the ad display container, we initialize it. On
- * mobile devices, this initialization is done as the result of a user action.
- */
- value: function setupIMA() {
- // Create the container for our advertisements
- this.elements.container = utils.createElement('div', {
- class: this.player.config.classNames.ads
- });
- this.player.elements.container.appendChild(this.elements.container);
+ // Replace the <iframe> with a <div> due to YouTube API issues
+ var videoId = parseId$1(source);
+ var id = generateId(player.provider);
- // So we can run VPAID2
- google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED);
+ // Get poster, if already set
+ var poster = player.poster;
- // Set language
- google.ima.settings.setLocale(this.player.config.ads.language);
+ // Replace media element
- // We assume the adContainer is the video container of the plyr element
- // that will house the ads
- this.elements.displayContainer = new google.ima.AdDisplayContainer(this.elements.container);
+ var container = createElement('div', { id: id, poster: poster });
+ player.media = replaceElement(container, player.media);
- // Request video ads to be pre-loaded
- this.requestAds();
- }
+ // Id to poster wrapper
+ var posterSrc = function posterSrc(format$$1) {
+ return 'https://img.youtube.com/vi/' + videoId + '/' + format$$1 + 'default.jpg';
+ };
- /**
- * Request advertisements
- */
+ // Check thumbnail images in order of quality, but reject fallback thumbnails (120px wide)
+ loadImage(posterSrc('maxres'), 121) // Higest quality and unpadded
+ .catch(function () {
+ return loadImage(posterSrc('sd'), 121);
+ }) // 480p padded 4:3
+ .catch(function () {
+ return loadImage(posterSrc('hq'));
+ }) // 360p padded 4:3. Always exists
+ .then(function (image) {
+ return ui.setPoster.call(player, image.src);
+ }).then(function (posterSrc) {
+ // If the image is padded, use background-size "cover" instead (like youtube does too with their posters)
+ if (!posterSrc.includes('maxres')) {
+ player.elements.poster.style.backgroundSize = 'cover';
+ }
+ }).catch(function () {});
- }, {
- key: 'requestAds',
- value: function requestAds() {
- var _this4 = this;
+ // Setup instance
+ // https://developers.google.com/youtube/iframe_api_reference
+ player.embed = new window.YT.Player(id, {
+ videoId: videoId,
+ playerVars: {
+ autoplay: player.config.autoplay ? 1 : 0, // Autoplay
+ controls: player.supported.ui ? 0 : 1, // Only show controls if not fully supported
+ rel: 0, // No related vids
+ showinfo: 0, // Hide info
+ iv_load_policy: 3, // Hide annotations
+ modestbranding: 1, // Hide logos as much as possible (they still show one in the corner when paused)
+ disablekb: 1, // Disable keyboard as we handle it
+ playsinline: 1, // Allow iOS inline playback
+
+ // Tracking for stats
+ // origin: window ? `${window.location.protocol}//${window.location.host}` : null,
+ widget_referrer: window ? window.location.href : null,
+
+ // Captions are flaky on YouTube
+ cc_load_policy: player.captions.active ? 1 : 0,
+ cc_lang_pref: player.config.captions.language
+ },
+ events: {
+ onError: function onError(event) {
+ // YouTube may fire onError twice, so only handle it once
+ if (!player.media.error) {
+ var code = event.data;
+ // Messages copied from https://developers.google.com/youtube/iframe_api_reference#onError
+ var message = {
+ 2: 'The request contains an invalid parameter value. For example, this error occurs if you specify a video ID that does not have 11 characters, or if the video ID contains invalid characters, such as exclamation points or asterisks.',
+ 5: 'The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.',
+ 100: 'The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.',
+ 101: 'The owner of the requested video does not allow it to be played in embedded players.',
+ 150: 'The owner of the requested video does not allow it to be played in embedded players.'
+ }[code] || 'An unknown error occured';
+
+ player.media.error = { code: code, message: message };
+
+ triggerEvent.call(player, player.media, 'error');
+ }
+ },
+ onPlaybackQualityChange: function onPlaybackQualityChange() {
+ triggerEvent.call(player, player.media, 'qualitychange', false, {
+ quality: player.media.quality
+ });
+ },
+ onPlaybackRateChange: function onPlaybackRateChange(event) {
+ // Get the instance
+ var instance = event.target;
+
+ // Get current speed
+ player.media.playbackRate = instance.getPlaybackRate();
+
+ triggerEvent.call(player, player.media, 'ratechange');
+ },
+ onReady: function onReady(event) {
+ // Get the instance
+ var instance = event.target;
+
+ // Get the title
+ youtube.getTitle.call(player, videoId);
+
+ // Create a faux HTML5 API using the YouTube API
+ player.media.play = function () {
+ assurePlaybackState$1.call(player, true);
+ instance.playVideo();
+ };
+
+ player.media.pause = function () {
+ assurePlaybackState$1.call(player, false);
+ instance.pauseVideo();
+ };
+
+ player.media.stop = function () {
+ instance.stopVideo();
+ };
+
+ player.media.duration = instance.getDuration();
+ player.media.paused = true;
+
+ // Seeking
+ player.media.currentTime = 0;
+ Object.defineProperty(player.media, 'currentTime', {
+ get: function get() {
+ return Number(instance.getCurrentTime());
+ },
+ set: function set(time) {
+ // If paused, mute audio preventively (YouTube starts playing on seek if the video hasn't been played yet).
+ if (player.paused) {
+ player.embed.mute();
+ }
- var container = this.player.elements.container;
+ // Set seeking state and trigger event
+ player.media.seeking = true;
+ triggerEvent.call(player, player.media, 'seeking');
+ // Seek after events sent
+ instance.seekTo(time);
+ }
+ });
+
+ // Playback speed
+ Object.defineProperty(player.media, 'playbackRate', {
+ get: function get() {
+ return instance.getPlaybackRate();
+ },
+ set: function set(input) {
+ instance.setPlaybackRate(input);
+ }
+ });
+
+ // Quality
+ Object.defineProperty(player.media, 'quality', {
+ get: function get() {
+ return mapQualityUnit(instance.getPlaybackQuality());
+ },
+ set: function set(input) {
+ instance.setPlaybackQuality(mapQualityUnit(input));
+ }
+ });
+
+ // Volume
+ var volume = player.config.volume;
+
+ Object.defineProperty(player.media, 'volume', {
+ get: function get() {
+ return volume;
+ },
+ set: function set(input) {
+ volume = input;
+ instance.setVolume(volume * 100);
+ triggerEvent.call(player, player.media, 'volumechange');
+ }
+ });
+
+ // Muted
+ var muted = player.config.muted;
+
+ Object.defineProperty(player.media, 'muted', {
+ get: function get() {
+ return muted;
+ },
+ set: function set(input) {
+ var toggle = is.boolean(input) ? input : muted;
+ muted = toggle;
+ instance[toggle ? 'mute' : 'unMute']();
+ triggerEvent.call(player, player.media, 'volumechange');
+ }
+ });
- try {
- // Create ads loader
- this.loader = new google.ima.AdsLoader(this.elements.displayContainer);
-
- // Listen and respond to ads loaded and error events
- this.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, function (event) {
- return _this4.onAdsManagerLoaded(event);
- }, false);
- this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) {
- return _this4.onAdError(error);
- }, false);
-
- // Request video ads
- var request = new google.ima.AdsRequest();
- request.adTagUrl = this.tagUrl;
-
- // Specify the linear and nonlinear slot sizes. This helps the SDK
- // to select the correct creative if multiple are returned
- request.linearAdSlotWidth = container.offsetWidth;
- request.linearAdSlotHeight = container.offsetHeight;
- request.nonLinearAdSlotWidth = container.offsetWidth;
- request.nonLinearAdSlotHeight = container.offsetHeight;
-
- // We only overlay ads as we only support video.
- request.forceNonLinearFullSlot = false;
-
- // Mute based on current state
- request.setAdWillPlayMuted(!this.player.muted);
-
- this.loader.requestAds(request);
- } catch (e) {
- this.onAdError(e);
- }
- }
+ // Source
+ Object.defineProperty(player.media, 'currentSrc', {
+ get: function get() {
+ return instance.getVideoUrl();
+ }
+ });
- /**
- * Update the ad countdown
- * @param {boolean} start
- */
+ // Ended
+ Object.defineProperty(player.media, 'ended', {
+ get: function get() {
+ return player.currentTime === player.duration;
+ }
+ });
- }, {
- key: 'pollCountdown',
- value: function pollCountdown() {
- var _this5 = this;
+ // Get available speeds
+ player.options.speed = instance.getAvailablePlaybackRates();
- var start = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
+ // Set the tabindex to avoid focus entering iframe
+ if (player.supported.ui) {
+ player.media.setAttribute('tabindex', -1);
+ }
- if (!start) {
- clearInterval(this.countdownTimer);
- this.elements.container.removeAttribute('data-badge-text');
- return;
- }
+ triggerEvent.call(player, player.media, 'timeupdate');
+ triggerEvent.call(player, player.media, 'durationchange');
- var update = function update() {
- var time = utils.formatTime(Math.max(_this5.manager.getRemainingTime(), 0));
- var label = i18n.get('advertisement', _this5.player.config) + ' - ' + time;
- _this5.elements.container.setAttribute('data-badge-text', label);
- };
+ // Reset timer
+ clearInterval(player.timers.buffering);
- this.countdownTimer = setInterval(update, 100);
- }
+ // Setup buffering
+ player.timers.buffering = setInterval(function () {
+ // Get loaded % from YouTube
+ player.media.buffered = instance.getVideoLoadedFraction();
- /**
- * This method is called whenever the ads are ready inside the AdDisplayContainer
- * @param {Event} adsManagerLoadedEvent
- */
+ // Trigger progress only when we actually buffer something
+ if (player.media.lastBuffered === null || player.media.lastBuffered < player.media.buffered) {
+ triggerEvent.call(player, player.media, 'progress');
+ }
- }, {
- key: 'onAdsManagerLoaded',
- value: function onAdsManagerLoaded(event) {
- var _this6 = this;
+ // Set last buffer point
+ player.media.lastBuffered = player.media.buffered;
+
+ // Bail if we're at 100%
+ if (player.media.buffered === 1) {
+ clearInterval(player.timers.buffering);
+
+ // Trigger event
+ triggerEvent.call(player, player.media, 'canplaythrough');
+ }
+ }, 200);
+
+ // Rebuild UI
+ setTimeout(function () {
+ return ui.build.call(player);
+ }, 50);
+ },
+ onStateChange: function onStateChange(event) {
+ // Get the instance
+ var instance = event.target;
+
+ // Reset timer
+ clearInterval(player.timers.playing);
+
+ var seeked = player.media.seeking && [1, 2].includes(event.data);
+
+ if (seeked) {
+ // Unset seeking and fire seeked event
+ player.media.seeking = false;
+ triggerEvent.call(player, player.media, 'seeked');
+ }
- // Get the ads manager
- var settings = new google.ima.AdsRenderingSettings();
+ // Handle events
+ // -1 Unstarted
+ // 0 Ended
+ // 1 Playing
+ // 2 Paused
+ // 3 Buffering
+ // 5 Video cued
+ switch (event.data) {
+ case -1:
+ // Update scrubber
+ triggerEvent.call(player, player.media, 'timeupdate');
+
+ // Get loaded % from YouTube
+ player.media.buffered = instance.getVideoLoadedFraction();
+ triggerEvent.call(player, player.media, 'progress');
+
+ break;
+
+ case 0:
+ assurePlaybackState$1.call(player, false);
+
+ // YouTube doesn't support loop for a single video, so mimick it.
+ if (player.media.loop) {
+ // YouTube needs a call to `stopVideo` before playing again
+ instance.stopVideo();
+ instance.playVideo();
+ } else {
+ triggerEvent.call(player, player.media, 'ended');
+ }
+
+ break;
+
+ case 1:
+ // Restore paused state (YouTube starts playing on seek if the video hasn't been played yet)
+ if (player.media.paused && !player.embed.hasPlayed) {
+ player.media.pause();
+ } else {
+ assurePlaybackState$1.call(player, true);
- // Tell the SDK to save and restore content video state on our behalf
- settings.restoreCustomPlaybackStateOnAdBreakComplete = true;
- settings.enablePreloading = true;
+ triggerEvent.call(player, player.media, 'playing');
- // The SDK is polling currentTime on the contentPlayback. And needs a duration
- // so it can determine when to start the mid- and post-roll
- this.manager = event.getAdsManager(this.player, settings);
+ // Poll to get playback progress
+ player.timers.playing = setInterval(function () {
+ triggerEvent.call(player, player.media, 'timeupdate');
+ }, 50);
+
+ // Check duration again due to YouTube bug
+ // https://github.com/sampotts/plyr/issues/374
+ // https://code.google.com/p/gdata-issues/issues/detail?id=8690
+ if (player.media.duration !== instance.getDuration()) {
+ player.media.duration = instance.getDuration();
+ triggerEvent.call(player, player.media, 'durationchange');
+ }
+
+ // Get quality
+ controls.setQualityMenu.call(player, mapQualityUnits(instance.getAvailableQualityLevels()));
+ }
- // Get the cue points for any mid-rolls by filtering out the pre- and post-roll
- this.cuePoints = this.manager.getCuePoints();
+ break;
- // Add advertisement cue's within the time line if available
- if (!utils.is.empty(this.cuePoints)) {
- this.cuePoints.forEach(function (cuePoint) {
- if (cuePoint !== 0 && cuePoint !== -1 && cuePoint < _this6.player.duration) {
- var seekElement = _this6.player.elements.progress;
+ case 2:
+ // Restore audio (YouTube starts playing on seek if the video hasn't been played yet)
+ if (!player.muted) {
+ player.embed.unMute();
+ }
+ assurePlaybackState$1.call(player, false);
- if (utils.is.element(seekElement)) {
- var cuePercentage = 100 / _this6.player.duration * cuePoint;
- var cue = utils.createElement('span', {
- class: _this6.player.config.classNames.cues
- });
+ break;
- cue.style.left = cuePercentage.toString() + '%';
- seekElement.appendChild(cue);
+ default:
+ break;
}
+
+ triggerEvent.call(player, player.elements.container, 'statechange', false, {
+ code: event.data
+ });
}
- });
+ }
+ });
+ }
+ };
+
+ // ==========================================================================
+
+ var media = {
+ // Setup media
+ setup: function setup() {
+ // If there's no media, bail
+ if (!this.media) {
+ this.debug.warn('No media element found!');
+ return;
}
- // Get skippable state
- // TODO: Skip button
- // this.player.debug.warn(this.manager.getAdSkippableState());
+ // Add type class
+ toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', this.type), true);
- // Set volume to match player
- this.manager.setVolume(this.player.volume);
+ // Add provider class
+ toggleClass(this.elements.container, this.config.classNames.provider.replace('{0}', this.provider), true);
- // Add listeners to the required events
- // Advertisement error events
- this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) {
- return _this6.onAdError(error);
- });
+ // Add video class for embeds
+ // This will require changes if audio embeds are added
+ if (this.isEmbed) {
+ toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', 'video'), true);
+ }
- // Advertisement regular events
- Object.keys(google.ima.AdEvent.Type).forEach(function (type) {
- _this6.manager.addEventListener(google.ima.AdEvent.Type[type], function (event) {
- return _this6.onAdEvent(event);
+ // Inject the player wrapper
+ if (this.isVideo) {
+ // Create the wrapper div
+ this.elements.wrapper = createElement('div', {
+ class: this.config.classNames.video
});
- });
- // Resolve our adsManager
- this.trigger('loaded');
- }
+ // Wrap the video in a container
+ wrap(this.media, this.elements.wrapper);
- /**
- * This is where all the event handling takes place. Retrieve the ad from the event. Some
- * events (e.g. ALL_ADS_COMPLETED) don't have the ad object associated
- * https://developers.google.com/interactive-media-ads/docs/sdks/html5/v3/apis#ima.AdEvent.Type
- * @param {Event} event
- */
+ // Faux poster container
+ this.elements.poster = createElement('div', {
+ class: this.config.classNames.poster
+ });
- }, {
- key: 'onAdEvent',
- value: function onAdEvent(event) {
- var _this7 = this;
+ this.elements.wrapper.appendChild(this.elements.poster);
+ }
- var container = this.player.elements.container;
+ if (this.isHTML5) {
+ html5.extend.call(this);
+ } else if (this.isYouTube) {
+ youtube.setup.call(this);
+ } else if (this.isVimeo) {
+ vimeo.setup.call(this);
+ }
+ }
+ };
- // Retrieve the ad from the event. Some events (e.g. ALL_ADS_COMPLETED)
- // don't have ad object associated
+ // ==========================================================================
- var ad = event.getAd();
+ var Ads = function () {
+ /**
+ * Ads constructor.
+ * @param {object} player
+ * @return {Ads}
+ */
+ function Ads(player) {
+ var _this = this;
- // Proxy event
- var dispatchEvent = function dispatchEvent(type) {
- var event = 'ads' + type.replace(/_/g, '').toLowerCase();
- utils.dispatchEvent.call(_this7.player, _this7.player.media, event);
+ classCallCheck(this, Ads);
+
+ this.player = player;
+ this.publisherId = player.config.ads.publisherId;
+ this.playing = false;
+ this.initialized = false;
+ this.elements = {
+ container: null,
+ displayContainer: null
};
+ this.manager = null;
+ this.loader = null;
+ this.cuePoints = null;
+ this.events = {};
+ this.safetyTimer = null;
+ this.countdownTimer = null;
+
+ // Setup a promise to resolve when the IMA manager is ready
+ this.managerPromise = new Promise(function (resolve, reject) {
+ // The ad is loaded and ready
+ _this.on('loaded', resolve);
+
+ // Ads failed
+ _this.on('error', reject);
+ });
+
+ this.load();
+ }
- switch (event.type) {
- case google.ima.AdEvent.Type.LOADED:
- // This is the first event sent for an ad - it is possible to determine whether the
- // ad is a video ad or an overlay
- this.trigger('loaded');
+ createClass(Ads, [{
+ key: 'load',
- // Bubble event
- dispatchEvent(event.type);
- // Start countdown
- this.pollCountdown(true);
+ /**
+ * Load the IMA SDK
+ */
+ value: function load() {
+ var _this2 = this;
- if (!ad.isLinear()) {
- // Position AdDisplayContainer correctly for overlay
- ad.width = container.offsetWidth;
- ad.height = container.offsetHeight;
+ if (this.enabled) {
+ // Check if the Google IMA3 SDK is loaded or load it ourselves
+ if (!is.object(window.google) || !is.object(window.google.ima)) {
+ loadScript(this.player.config.urls.googleIMA.sdk).then(function () {
+ _this2.ready();
+ }).catch(function () {
+ // Script failed to load or is blocked
+ _this2.trigger('error', new Error('Google IMA SDK failed to load'));
+ });
+ } else {
+ this.ready();
}
+ }
+ }
- // console.info('Ad type: ' + event.getAd().getAdPodInfo().getPodIndex());
- // console.info('Ad time: ' + event.getAd().getAdPodInfo().getTimeOffset());
- break;
+ /**
+ * Get the ads instance ready
+ */
- case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:
- // All ads for the current videos are done. We can now request new advertisements
- // in case the video is re-played
-
- // Fire event
- dispatchEvent(event.type);
-
- // TODO: Example for what happens when a next video in a playlist would be loaded.
- // So here we load a new video when all ads are done.
- // Then we load new ads within a new adsManager. When the video
- // Is started - after - the ads are loaded, then we get ads.
- // You can also easily test cancelling and reloading by running
- // player.ads.cancel() and player.ads.play from the console I guess.
- // this.player.source = {
- // type: 'video',
- // title: 'View From A Blue Moon',
- // sources: [{
- // src:
- // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.mp4', type:
- // 'video/mp4', }], poster:
- // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg', tracks:
- // [ { kind: 'captions', label: 'English', srclang: 'en', src:
- // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt',
- // default: true, }, { kind: 'captions', label: 'French', srclang: 'fr', src:
- // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt', }, ],
- // };
-
- // TODO: So there is still this thing where a video should only be allowed to start
- // playing when the IMA SDK is ready or has failed
-
- this.loadAds();
- break;
+ }, {
+ key: 'ready',
+ value: function ready$$1() {
+ var _this3 = this;
- case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:
- // This event indicates the ad has started - the video player can adjust the UI,
- // for example display a pause button and remaining time. Fired when content should
- // be paused. This usually happens right before an ad is about to cover the content
+ // Start ticking our safety timer. If the whole advertisement
+ // thing doesn't resolve within our set time; we bail
+ this.startSafetyTimer(12000, 'ready()');
- dispatchEvent(event.type);
+ // Clear the safety timer
+ this.managerPromise.then(function () {
+ _this3.clearSafetyTimer('onAdsManagerLoaded()');
+ });
- this.pauseContent();
+ // Set listeners on the Plyr instance
+ this.listeners();
- break;
+ // Setup the IMA SDK
+ this.setupIMA();
+ }
- case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:
- // This event indicates the ad has finished - the video player can perform
- // appropriate UI actions, such as removing the timer for remaining time detection.
- // Fired when content should be resumed. This usually happens when an ad finishes
- // or collapses
+ // Build the default tag URL
- dispatchEvent(event.type);
+ }, {
+ key: 'setupIMA',
- this.pollCountdown();
- this.resumeContent();
+ /**
+ * In order for the SDK to display ads for our video, we need to tell it where to put them,
+ * so here we define our ad container. This div is set up to render on top of the video player.
+ * Using the code below, we tell the SDK to render ads within that div. We also provide a
+ * handle to the content video player - the SDK will poll the current time of our player to
+ * properly place mid-rolls. After we create the ad display container, we initialize it. On
+ * mobile devices, this initialization is done as the result of a user action.
+ */
+ value: function setupIMA() {
+ // Create the container for our advertisements
+ this.elements.container = createElement('div', {
+ class: this.player.config.classNames.ads
+ });
+ this.player.elements.container.appendChild(this.elements.container);
- break;
+ // So we can run VPAID2
+ google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED);
- case google.ima.AdEvent.Type.STARTED:
- case google.ima.AdEvent.Type.MIDPOINT:
- case google.ima.AdEvent.Type.COMPLETE:
- case google.ima.AdEvent.Type.IMPRESSION:
- case google.ima.AdEvent.Type.CLICK:
- dispatchEvent(event.type);
- break;
+ // Set language
+ google.ima.settings.setLocale(this.player.config.ads.language);
- default:
- break;
- }
- }
+ // We assume the adContainer is the video container of the plyr element
+ // that will house the ads
+ this.elements.displayContainer = new google.ima.AdDisplayContainer(this.elements.container);
- /**
- * Any ad error handling comes through here
- * @param {Event} event
- */
+ // Request video ads to be pre-loaded
+ this.requestAds();
+ }
- }, {
- key: 'onAdError',
- value: function onAdError(event) {
- this.cancel();
- this.player.debug.warn('Ads error', event);
- }
+ /**
+ * Request advertisements
+ */
- /**
- * Setup hooks for Plyr and window events. This ensures
- * the mid- and post-roll launch at the correct time. And
- * resize the advertisement when the player resizes
- */
+ }, {
+ key: 'requestAds',
+ value: function requestAds() {
+ var _this4 = this;
- }, {
- key: 'listeners',
- value: function listeners() {
- var _this8 = this;
+ var container = this.player.elements.container;
- var container = this.player.elements.container;
- var time = void 0;
+ try {
+ // Create ads loader
+ this.loader = new google.ima.AdsLoader(this.elements.displayContainer);
+
+ // Listen and respond to ads loaded and error events
+ this.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, function (event) {
+ return _this4.onAdsManagerLoaded(event);
+ }, false);
+ this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) {
+ return _this4.onAdError(error);
+ }, false);
+
+ // Request video ads
+ var request = new google.ima.AdsRequest();
+ request.adTagUrl = this.tagUrl;
+
+ // Specify the linear and nonlinear slot sizes. This helps the SDK
+ // to select the correct creative if multiple are returned
+ request.linearAdSlotWidth = container.offsetWidth;
+ request.linearAdSlotHeight = container.offsetHeight;
+ request.nonLinearAdSlotWidth = container.offsetWidth;
+ request.nonLinearAdSlotHeight = container.offsetHeight;
+
+ // We only overlay ads as we only support video.
+ request.forceNonLinearFullSlot = false;
+
+ // Mute based on current state
+ request.setAdWillPlayMuted(!this.player.muted);
+
+ this.loader.requestAds(request);
+ } catch (e) {
+ this.onAdError(e);
+ }
+ }
- // Add listeners to the required events
- this.player.on('ended', function () {
- _this8.loader.contentComplete();
- });
+ /**
+ * Update the ad countdown
+ * @param {boolean} start
+ */
- this.player.on('seeking', function () {
- time = _this8.player.currentTime;
- return time;
- });
+ }, {
+ key: 'pollCountdown',
+ value: function pollCountdown() {
+ var _this5 = this;
- this.player.on('seeked', function () {
- var seekedTime = _this8.player.currentTime;
+ var start = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
- if (utils.is.empty(_this8.cuePoints)) {
+ if (!start) {
+ clearInterval(this.countdownTimer);
+ this.elements.container.removeAttribute('data-badge-text');
return;
}
- _this8.cuePoints.forEach(function (cuePoint, index) {
- if (time < cuePoint && cuePoint < seekedTime) {
- _this8.manager.discardAdBreak();
- _this8.cuePoints.splice(index, 1);
- }
- });
- });
+ var update = function update() {
+ var time = formatTime(Math.max(_this5.manager.getRemainingTime(), 0));
+ var label = i18n.get('advertisement', _this5.player.config) + ' - ' + time;
+ _this5.elements.container.setAttribute('data-badge-text', label);
+ };
- // Listen to the resizing of the window. And resize ad accordingly
- // TODO: eventually implement ResizeObserver
- window.addEventListener('resize', function () {
- if (_this8.manager) {
- _this8.manager.resize(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);
- }
- });
- }
+ this.countdownTimer = setInterval(update, 100);
+ }
- /**
- * Initialize the adsManager and start playing advertisements
- */
+ /**
+ * This method is called whenever the ads are ready inside the AdDisplayContainer
+ * @param {Event} adsManagerLoadedEvent
+ */
- }, {
- key: 'play',
- value: function play() {
- var _this9 = this;
+ }, {
+ key: 'onAdsManagerLoaded',
+ value: function onAdsManagerLoaded(event) {
+ var _this6 = this;
- var container = this.player.elements.container;
+ // Get the ads manager
+ var settings = new google.ima.AdsRenderingSettings();
+ // Tell the SDK to save and restore content video state on our behalf
+ settings.restoreCustomPlaybackStateOnAdBreakComplete = true;
+ settings.enablePreloading = true;
- if (!this.managerPromise) {
- this.resumeContent();
- }
+ // The SDK is polling currentTime on the contentPlayback. And needs a duration
+ // so it can determine when to start the mid- and post-roll
+ this.manager = event.getAdsManager(this.player, settings);
- // Play the requested advertisement whenever the adsManager is ready
- this.managerPromise.then(function () {
- // Initialize the container. Must be done via a user action on mobile devices
- _this9.elements.displayContainer.initialize();
+ // Get the cue points for any mid-rolls by filtering out the pre- and post-roll
+ this.cuePoints = this.manager.getCuePoints();
- try {
- if (!_this9.initialized) {
- // Initialize the ads manager. Ad rules playlist will start at this time
- _this9.manager.init(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);
+ // Add advertisement cue's within the time line if available
+ if (!is.empty(this.cuePoints)) {
+ this.cuePoints.forEach(function (cuePoint) {
+ if (cuePoint !== 0 && cuePoint !== -1 && cuePoint < _this6.player.duration) {
+ var seekElement = _this6.player.elements.progress;
- // Call play to start showing the ad. Single video and overlay ads will
- // start at this time; the call will be ignored for ad rules
- _this9.manager.start();
- }
+ if (is.element(seekElement)) {
+ var cuePercentage = 100 / _this6.player.duration * cuePoint;
+ var cue = createElement('span', {
+ class: _this6.player.config.classNames.cues
+ });
- _this9.initialized = true;
- } catch (adError) {
- // An error may be thrown if there was a problem with the
- // VAST response
- _this9.onAdError(adError);
+ cue.style.left = cuePercentage.toString() + '%';
+ seekElement.appendChild(cue);
+ }
+ }
+ });
}
- }).catch(function () {});
- }
- /**
- * Resume our video
- */
+ // Get skippable state
+ // TODO: Skip button
+ // this.player.debug.warn(this.manager.getAdSkippableState());
- }, {
- key: 'resumeContent',
- value: function resumeContent() {
- // Hide the advertisement container
- this.elements.container.style.zIndex = '';
+ // Set volume to match player
+ this.manager.setVolume(this.player.volume);
- // Ad is stopped
- this.playing = false;
+ // Add listeners to the required events
+ // Advertisement error events
+ this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) {
+ return _this6.onAdError(error);
+ });
+
+ // Advertisement regular events
+ Object.keys(google.ima.AdEvent.Type).forEach(function (type) {
+ _this6.manager.addEventListener(google.ima.AdEvent.Type[type], function (event) {
+ return _this6.onAdEvent(event);
+ });
+ });
- // Play our video
- if (this.player.currentTime < this.player.duration) {
- this.player.play();
+ // Resolve our adsManager
+ this.trigger('loaded');
}
- }
- /**
- * Pause our video
- */
+ /**
+ * This is where all the event handling takes place. Retrieve the ad from the event. Some
+ * events (e.g. ALL_ADS_COMPLETED) don't have the ad object associated
+ * https://developers.google.com/interactive-media-ads/docs/sdks/html5/v3/apis#ima.AdEvent.Type
+ * @param {Event} event
+ */
- }, {
- key: 'pauseContent',
- value: function pauseContent() {
- // Show the advertisement container
- this.elements.container.style.zIndex = 3;
+ }, {
+ key: 'onAdEvent',
+ value: function onAdEvent(event) {
+ var _this7 = this;
- // Ad is playing.
- this.playing = true;
+ var container = this.player.elements.container;
- // Pause our video.
- this.player.pause();
- }
+ // Retrieve the ad from the event. Some events (e.g. ALL_ADS_COMPLETED)
+ // don't have ad object associated
- /**
- * Destroy the adsManager so we can grab new ads after this. If we don't then we're not
- * allowed to call new ads based on google policies, as they interpret this as an accidental
- * video requests. https://developers.google.com/interactive-
- * media-ads/docs/sdks/android/faq#8
- */
+ var ad = event.getAd();
- }, {
- key: 'cancel',
- value: function cancel() {
- // Pause our video
- if (this.initialized) {
- this.resumeContent();
- }
+ // Proxy event
+ var dispatchEvent = function dispatchEvent(type) {
+ var event = 'ads' + type.replace(/_/g, '').toLowerCase();
+ triggerEvent.call(_this7.player, _this7.player.media, event);
+ };
- // Tell our instance that we're done for now
- this.trigger('error');
+ switch (event.type) {
+ case google.ima.AdEvent.Type.LOADED:
+ // This is the first event sent for an ad - it is possible to determine whether the
+ // ad is a video ad or an overlay
+ this.trigger('loaded');
- // Re-create our adsManager
- this.loadAds();
- }
+ // Bubble event
+ dispatchEvent(event.type);
- /**
- * Re-create our adsManager
- */
+ // Start countdown
+ this.pollCountdown(true);
+
+ if (!ad.isLinear()) {
+ // Position AdDisplayContainer correctly for overlay
+ ad.width = container.offsetWidth;
+ ad.height = container.offsetHeight;
+ }
- }, {
- key: 'loadAds',
- value: function loadAds() {
- var _this10 = this;
+ // console.info('Ad type: ' + event.getAd().getAdPodInfo().getPodIndex());
+ // console.info('Ad time: ' + event.getAd().getAdPodInfo().getTimeOffset());
+ break;
- // Tell our adsManager to go bye bye
- this.managerPromise.then(function () {
- // Destroy our adsManager
- if (_this10.manager) {
- _this10.manager.destroy();
- }
+ case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:
+ // All ads for the current videos are done. We can now request new advertisements
+ // in case the video is re-played
+
+ // Fire event
+ dispatchEvent(event.type);
+
+ // TODO: Example for what happens when a next video in a playlist would be loaded.
+ // So here we load a new video when all ads are done.
+ // Then we load new ads within a new adsManager. When the video
+ // Is started - after - the ads are loaded, then we get ads.
+ // You can also easily test cancelling and reloading by running
+ // player.ads.cancel() and player.ads.play from the console I guess.
+ // this.player.source = {
+ // type: 'video',
+ // title: 'View From A Blue Moon',
+ // sources: [{
+ // src:
+ // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.mp4', type:
+ // 'video/mp4', }], poster:
+ // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg', tracks:
+ // [ { kind: 'captions', label: 'English', srclang: 'en', src:
+ // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt',
+ // default: true, }, { kind: 'captions', label: 'French', srclang: 'fr', src:
+ // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt', }, ],
+ // };
+
+ // TODO: So there is still this thing where a video should only be allowed to start
+ // playing when the IMA SDK is ready or has failed
+
+ this.loadAds();
+ break;
- // Re-set our adsManager promises
- _this10.managerPromise = new Promise(function (resolve) {
- _this10.on('loaded', resolve);
- _this10.player.debug.log(_this10.manager);
- });
+ case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:
+ // This event indicates the ad has started - the video player can adjust the UI,
+ // for example display a pause button and remaining time. Fired when content should
+ // be paused. This usually happens right before an ad is about to cover the content
- // Now request some new advertisements
- _this10.requestAds();
- }).catch(function () {});
- }
+ dispatchEvent(event.type);
- /**
- * Handles callbacks after an ad event was invoked
- * @param {string} event - Event type
- */
+ this.pauseContent();
- }, {
- key: 'trigger',
- value: function trigger(event) {
- var _this11 = this;
+ break;
- for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
- args[_key - 1] = arguments[_key];
- }
+ case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:
+ // This event indicates the ad has finished - the video player can perform
+ // appropriate UI actions, such as removing the timer for remaining time detection.
+ // Fired when content should be resumed. This usually happens when an ad finishes
+ // or collapses
- var handlers = this.events[event];
+ dispatchEvent(event.type);
- if (utils.is.array(handlers)) {
- handlers.forEach(function (handler) {
- if (utils.is.function(handler)) {
- handler.apply(_this11, args);
- }
- });
+ this.pollCountdown();
+
+ this.resumeContent();
+
+ break;
+
+ case google.ima.AdEvent.Type.STARTED:
+ case google.ima.AdEvent.Type.MIDPOINT:
+ case google.ima.AdEvent.Type.COMPLETE:
+ case google.ima.AdEvent.Type.IMPRESSION:
+ case google.ima.AdEvent.Type.CLICK:
+ dispatchEvent(event.type);
+ break;
+
+ default:
+ break;
+ }
}
- }
- /**
- * Add event listeners
- * @param {string} event - Event type
- * @param {function} callback - Callback for when event occurs
- * @return {Ads}
- */
+ /**
+ * Any ad error handling comes through here
+ * @param {Event} event
+ */
- }, {
- key: 'on',
- value: function on(event, callback) {
- if (!utils.is.array(this.events[event])) {
- this.events[event] = [];
+ }, {
+ key: 'onAdError',
+ value: function onAdError(event) {
+ this.cancel();
+ this.player.debug.warn('Ads error', event);
}
- this.events[event].push(callback);
+ /**
+ * Setup hooks for Plyr and window events. This ensures
+ * the mid- and post-roll launch at the correct time. And
+ * resize the advertisement when the player resizes
+ */
- return this;
- }
+ }, {
+ key: 'listeners',
+ value: function listeners() {
+ var _this8 = this;
- /**
- * Setup a safety timer for when the ad network doesn't respond for whatever reason.
- * The advertisement has 12 seconds to get its things together. We stop this timer when the
- * advertisement is playing, or when a user action is required to start, then we clear the
- * timer on ad ready
- * @param {number} time
- * @param {string} from
- */
+ var container = this.player.elements.container;
- }, {
- key: 'startSafetyTimer',
- value: function startSafetyTimer(time, from) {
- var _this12 = this;
+ var time = void 0;
- this.player.debug.log('Safety timer invoked from: ' + from);
+ // Add listeners to the required events
+ this.player.on('ended', function () {
+ _this8.loader.contentComplete();
+ });
- this.safetyTimer = setTimeout(function () {
- _this12.cancel();
- _this12.clearSafetyTimer('startSafetyTimer()');
- }, time);
- }
+ this.player.on('seeking', function () {
+ time = _this8.player.currentTime;
+ return time;
+ });
- /**
- * Clear our safety timer(s)
- * @param {string} from
- */
+ this.player.on('seeked', function () {
+ var seekedTime = _this8.player.currentTime;
- }, {
- key: 'clearSafetyTimer',
- value: function clearSafetyTimer(from) {
- if (!utils.is.nullOrUndefined(this.safetyTimer)) {
- this.player.debug.log('Safety timer cleared from: ' + from);
+ if (is.empty(_this8.cuePoints)) {
+ return;
+ }
+
+ _this8.cuePoints.forEach(function (cuePoint, index) {
+ if (time < cuePoint && cuePoint < seekedTime) {
+ _this8.manager.discardAdBreak();
+ _this8.cuePoints.splice(index, 1);
+ }
+ });
+ });
- clearTimeout(this.safetyTimer);
- this.safetyTimer = null;
+ // Listen to the resizing of the window. And resize ad accordingly
+ // TODO: eventually implement ResizeObserver
+ window.addEventListener('resize', function () {
+ if (_this8.manager) {
+ _this8.manager.resize(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);
+ }
+ });
}
- }
- }, {
- key: 'enabled',
- get: function get$$1() {
- return this.player.isVideo && this.player.config.ads.enabled && !utils.is.empty(this.publisherId);
- }
- }, {
- key: 'tagUrl',
- get: function get$$1() {
- var params = {
- AV_PUBLISHERID: '58c25bb0073ef448b1087ad6',
- AV_CHANNELID: '5a0458dc28a06145e4519d21',
- AV_URL: location.hostname,
- cb: Date.now(),
- AV_WIDTH: 640,
- AV_HEIGHT: 480,
- AV_CDIM2: this.publisherId
- };
- var base = 'https://go.aniview.com/api/adserver6/vast/';
+ /**
+ * Initialize the adsManager and start playing advertisements
+ */
- return base + '?' + utils.buildUrlParams(params);
- }
- }]);
- return Ads;
-}();
+ }, {
+ key: 'play',
+ value: function play() {
+ var _this9 = this;
-// ==========================================================================
+ var container = this.player.elements.container;
-var source = {
- // Add elements to HTML5 media (source, tracks, etc)
- insertElements: function insertElements(type, attributes) {
- var _this = this;
- if (utils.is.string(attributes)) {
- utils.insertElement(type, this.media, {
- src: attributes
- });
- } else if (utils.is.array(attributes)) {
- attributes.forEach(function (attribute) {
- utils.insertElement(type, _this.media, attribute);
- });
- }
- },
+ if (!this.managerPromise) {
+ this.resumeContent();
+ }
+ // Play the requested advertisement whenever the adsManager is ready
+ this.managerPromise.then(function () {
+ // Initialize the container. Must be done via a user action on mobile devices
+ _this9.elements.displayContainer.initialize();
- // Update source
- // Sources are not checked for support so be careful
- change: function change(input) {
- var _this2 = this;
+ try {
+ if (!_this9.initialized) {
+ // Initialize the ads manager. Ad rules playlist will start at this time
+ _this9.manager.init(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);
- if (!utils.is.object(input) || !('sources' in input) || !input.sources.length) {
- this.debug.warn('Invalid source format');
- return;
- }
+ // Call play to start showing the ad. Single video and overlay ads will
+ // start at this time; the call will be ignored for ad rules
+ _this9.manager.start();
+ }
- // Cancel current network requests
- html5.cancelRequests.call(this);
+ _this9.initialized = true;
+ } catch (adError) {
+ // An error may be thrown if there was a problem with the
+ // VAST response
+ _this9.onAdError(adError);
+ }
+ }).catch(function () {});
+ }
- // Destroy instance and re-setup
- this.destroy.call(this, function () {
- // Reset quality options
- _this2.options.quality = [];
+ /**
+ * Resume our video
+ */
- // Remove elements
- utils.removeElement(_this2.media);
- _this2.media = null;
+ }, {
+ key: 'resumeContent',
+ value: function resumeContent() {
+ // Hide the advertisement container
+ this.elements.container.style.zIndex = '';
- // Reset class name
- if (utils.is.element(_this2.elements.container)) {
- _this2.elements.container.removeAttribute('class');
+ // Ad is stopped
+ this.playing = false;
+
+ // Play our video
+ if (this.player.currentTime < this.player.duration) {
+ this.player.play();
+ }
}
- // Set the type and provider
- _this2.type = input.type;
- _this2.provider = !utils.is.empty(input.sources[0].provider) ? input.sources[0].provider : providers.html5;
+ /**
+ * Pause our video
+ */
- // Check for support
- _this2.supported = support.check(_this2.type, _this2.provider, _this2.config.playsinline);
+ }, {
+ key: 'pauseContent',
+ value: function pauseContent() {
+ // Show the advertisement container
+ this.elements.container.style.zIndex = 3;
- // Create new markup
- switch (_this2.provider + ':' + _this2.type) {
- case 'html5:video':
- _this2.media = utils.createElement('video');
- break;
+ // Ad is playing.
+ this.playing = true;
- case 'html5:audio':
- _this2.media = utils.createElement('audio');
- break;
+ // Pause our video.
+ this.player.pause();
+ }
- case 'youtube:video':
- case 'vimeo:video':
- _this2.media = utils.createElement('div', {
- src: input.sources[0].src
- });
- break;
+ /**
+ * Destroy the adsManager so we can grab new ads after this. If we don't then we're not
+ * allowed to call new ads based on google policies, as they interpret this as an accidental
+ * video requests. https://developers.google.com/interactive-
+ * media-ads/docs/sdks/android/faq#8
+ */
- default:
- break;
+ }, {
+ key: 'cancel',
+ value: function cancel() {
+ // Pause our video
+ if (this.initialized) {
+ this.resumeContent();
+ }
+
+ // Tell our instance that we're done for now
+ this.trigger('error');
+
+ // Re-create our adsManager
+ this.loadAds();
}
- // Inject the new element
- _this2.elements.container.appendChild(_this2.media);
+ /**
+ * Re-create our adsManager
+ */
+
+ }, {
+ key: 'loadAds',
+ value: function loadAds() {
+ var _this10 = this;
- // Autoplay the new source?
- if (utils.is.boolean(input.autoplay)) {
- _this2.config.autoplay = input.autoplay;
+ // Tell our adsManager to go bye bye
+ this.managerPromise.then(function () {
+ // Destroy our adsManager
+ if (_this10.manager) {
+ _this10.manager.destroy();
+ }
+
+ // Re-set our adsManager promises
+ _this10.managerPromise = new Promise(function (resolve) {
+ _this10.on('loaded', resolve);
+ _this10.player.debug.log(_this10.manager);
+ });
+
+ // Now request some new advertisements
+ _this10.requestAds();
+ }).catch(function () {});
}
- // Set attributes for audio and video
- if (_this2.isHTML5) {
- if (_this2.config.crossorigin) {
- _this2.media.setAttribute('crossorigin', '');
- }
- if (_this2.config.autoplay) {
- _this2.media.setAttribute('autoplay', '');
- }
- if (!utils.is.empty(input.poster)) {
- _this2.poster = input.poster;
- }
- if (_this2.config.loop.active) {
- _this2.media.setAttribute('loop', '');
+ /**
+ * Handles callbacks after an ad event was invoked
+ * @param {string} event - Event type
+ */
+
+ }, {
+ key: 'trigger',
+ value: function trigger(event) {
+ var _this11 = this;
+
+ for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
+ args[_key - 1] = arguments[_key];
}
- if (_this2.config.muted) {
- _this2.media.setAttribute('muted', '');
+
+ var handlers = this.events[event];
+
+ if (is.array(handlers)) {
+ handlers.forEach(function (handler) {
+ if (is.function(handler)) {
+ handler.apply(_this11, args);
+ }
+ });
}
- if (_this2.config.playsinline) {
- _this2.media.setAttribute('playsinline', '');
+ }
+
+ /**
+ * Add event listeners
+ * @param {string} event - Event type
+ * @param {function} callback - Callback for when event occurs
+ * @return {Ads}
+ */
+
+ }, {
+ key: 'on',
+ value: function on$$1(event, callback) {
+ if (!is.array(this.events[event])) {
+ this.events[event] = [];
}
+
+ this.events[event].push(callback);
+
+ return this;
}
- // Restore class hook
- ui.addStyleHook.call(_this2);
+ /**
+ * Setup a safety timer for when the ad network doesn't respond for whatever reason.
+ * The advertisement has 12 seconds to get its things together. We stop this timer when the
+ * advertisement is playing, or when a user action is required to start, then we clear the
+ * timer on ad ready
+ * @param {number} time
+ * @param {string} from
+ */
- // Set new sources for html5
- if (_this2.isHTML5) {
- source.insertElements.call(_this2, 'source', input.sources);
+ }, {
+ key: 'startSafetyTimer',
+ value: function startSafetyTimer(time, from) {
+ var _this12 = this;
+
+ this.player.debug.log('Safety timer invoked from: ' + from);
+
+ this.safetyTimer = setTimeout(function () {
+ _this12.cancel();
+ _this12.clearSafetyTimer('startSafetyTimer()');
+ }, time);
}
- // Set video title
- _this2.config.title = input.title;
+ /**
+ * Clear our safety timer(s)
+ * @param {string} from
+ */
- // Set up from scratch
- media.setup.call(_this2);
+ }, {
+ key: 'clearSafetyTimer',
+ value: function clearSafetyTimer(from) {
+ if (!is.nullOrUndefined(this.safetyTimer)) {
+ this.player.debug.log('Safety timer cleared from: ' + from);
- // HTML5 stuff
- if (_this2.isHTML5) {
- // Setup captions
- if ('tracks' in input) {
- source.insertElements.call(_this2, 'track', input.tracks);
+ clearTimeout(this.safetyTimer);
+ this.safetyTimer = null;
}
+ }
+ }, {
+ key: 'enabled',
+ get: function get$$1() {
+ return this.player.isVideo && this.player.config.ads.enabled && !is.empty(this.publisherId);
+ }
+ }, {
+ key: 'tagUrl',
+ get: function get$$1() {
+ var params = {
+ AV_PUBLISHERID: '58c25bb0073ef448b1087ad6',
+ AV_CHANNELID: '5a0458dc28a06145e4519d21',
+ AV_URL: location.hostname,
+ cb: Date.now(),
+ AV_WIDTH: 640,
+ AV_HEIGHT: 480,
+ AV_CDIM2: this.publisherId
+ };
+
+ var base = 'https://go.aniview.com/api/adserver6/vast/';
- // Load HTML5 sources
- _this2.media.load();
+ return base + '?' + buildUrlParams(params);
}
+ }]);
+ return Ads;
+ }();
+
+ // ==========================================================================
- // If HTML5 or embed but not fully supported, setupInterface and call ready now
- if (_this2.isHTML5 || _this2.isEmbed && !_this2.supported.ui) {
- // Setup interface
- ui.build.call(_this2);
+ var source = {
+ // Add elements to HTML5 media (source, tracks, etc)
+ insertElements: function insertElements(type, attributes) {
+ var _this = this;
+
+ if (is.string(attributes)) {
+ insertElement(type, this.media, {
+ src: attributes
+ });
+ } else if (is.array(attributes)) {
+ attributes.forEach(function (attribute) {
+ insertElement(type, _this.media, attribute);
+ });
}
+ },
- // Update the fullscreen support
- _this2.fullscreen.update();
- }, true);
- }
-};
-// ==========================================================================
+ // Update source
+ // Sources are not checked for support so be careful
+ change: function change(input) {
+ var _this2 = this;
-// Private properties
-// TODO: Use a WeakMap for private globals
-// const globals = new WeakMap();
+ if (!getDeep(input, 'sources.length')) {
+ this.debug.warn('Invalid source format');
+ return;
+ }
-// Plyr instance
+ // Cancel current network requests
+ html5.cancelRequests.call(this);
-var Plyr = function () {
- function Plyr(target, options) {
- var _this = this;
+ // Destroy instance and re-setup
+ this.destroy.call(this, function () {
+ // Reset quality options
+ _this2.options.quality = [];
- classCallCheck(this, Plyr);
+ // Remove elements
+ removeElement(_this2.media);
+ _this2.media = null;
- this.timers = {};
+ // Reset class name
+ if (is.element(_this2.elements.container)) {
+ _this2.elements.container.removeAttribute('class');
+ }
- // State
- this.ready = false;
- this.loading = false;
- this.failed = false;
+ // Set the type and provider
+ var sources = input.sources,
+ type = input.type;
+
+ var _sources = slicedToArray(sources, 1),
+ _sources$ = _sources[0],
+ _sources$$provider = _sources$.provider,
+ provider = _sources$$provider === undefined ? providers.html5 : _sources$$provider,
+ src = _sources$.src;
+
+ var tagName = provider === 'html5' ? type : 'div';
+ var attributes = provider === 'html5' ? {} : { src: src };
+
+ Object.assign(_this2, {
+ provider: provider,
+ type: type,
+ // Check for support
+ supported: support.check(type, provider, _this2.config.playsinline),
+ // Create new element
+ media: createElement(tagName, attributes)
+ });
- // Touch device
- this.touch = support.touch;
+ // Inject the new element
+ _this2.elements.container.appendChild(_this2.media);
- // Set the media element
- this.media = target;
+ // Autoplay the new source?
+ if (is.boolean(input.autoplay)) {
+ _this2.config.autoplay = input.autoplay;
+ }
- // String selector passed
- if (utils.is.string(this.media)) {
- this.media = document.querySelectorAll(this.media);
- }
+ // Set attributes for audio and video
+ if (_this2.isHTML5) {
+ if (_this2.config.crossorigin) {
+ _this2.media.setAttribute('crossorigin', '');
+ }
+ if (_this2.config.autoplay) {
+ _this2.media.setAttribute('autoplay', '');
+ }
+ if (!is.empty(input.poster)) {
+ _this2.poster = input.poster;
+ }
+ if (_this2.config.loop.active) {
+ _this2.media.setAttribute('loop', '');
+ }
+ if (_this2.config.muted) {
+ _this2.media.setAttribute('muted', '');
+ }
+ if (_this2.config.playsinline) {
+ _this2.media.setAttribute('playsinline', '');
+ }
+ }
- // jQuery, NodeList or Array passed, use first element
- if (window.jQuery && this.media instanceof jQuery || utils.is.nodeList(this.media) || utils.is.array(this.media)) {
- // eslint-disable-next-line
- this.media = this.media[0];
- }
+ // Restore class hook
+ ui.addStyleHook.call(_this2);
- // Set config
- this.config = utils.extend({}, defaults$1, Plyr.defaults, options || {}, function () {
- try {
- return JSON.parse(_this.media.getAttribute('data-plyr-config'));
- } catch (e) {
- return {};
- }
- }());
-
- // Elements cache
- this.elements = {
- container: null,
- buttons: {},
- display: {},
- progress: {},
- inputs: {},
- settings: {
- menu: null,
- panes: {},
- tabs: {}
- },
- captions: null
- };
+ // Set new sources for html5
+ if (_this2.isHTML5) {
+ source.insertElements.call(_this2, 'source', sources);
+ }
- // Captions
- this.captions = {
- active: null,
- currentTrack: -1,
- meta: new WeakMap()
- };
+ // Set video title
+ _this2.config.title = input.title;
- // Fullscreen
- this.fullscreen = {
- active: false
- };
+ // Set up from scratch
+ media.setup.call(_this2);
- // Options
- this.options = {
- speed: [],
- quality: []
- };
+ // HTML5 stuff
+ if (_this2.isHTML5) {
+ // Setup captions
+ if ('tracks' in input) {
+ source.insertElements.call(_this2, 'track', input.tracks);
+ }
- // Debugging
- // TODO: move to globals
- this.debug = new Console(this.config.debug);
+ // Load HTML5 sources
+ _this2.media.load();
+ }
- // Log config options and support
- this.debug.log('Config', this.config);
- this.debug.log('Support', support);
+ // If HTML5 or embed but not fully supported, setupInterface and call ready now
+ if (_this2.isHTML5 || _this2.isEmbed && !_this2.supported.ui) {
+ // Setup interface
+ ui.build.call(_this2);
+ }
- // We need an element to setup
- if (utils.is.nullOrUndefined(this.media) || !utils.is.element(this.media)) {
- this.debug.error('Setup failed: no suitable element passed');
- return;
+ // Update the fullscreen support
+ _this2.fullscreen.update();
+ }, true);
}
+ };
- // Bail if the element is initialized
- if (this.media.plyr) {
- this.debug.warn('Target already setup');
- return;
- }
+ // ==========================================================================
- // Bail if not enabled
- if (!this.config.enabled) {
- this.debug.error('Setup failed: disabled by config');
- return;
- }
+ // Private properties
+ // TODO: Use a WeakMap for private globals
+ // const globals = new WeakMap();
- // Bail if disabled or no basic support
- // You may want to disable certain UAs etc
- if (!support.check().api) {
- this.debug.error('Setup failed: no support');
- return;
- }
+ // Plyr instance
- // Cache original element state for .destroy()
- var clone = this.media.cloneNode(true);
- clone.autoplay = false;
- this.elements.original = clone;
-
- // Set media type based on tag or data attribute
- // Supported: video, audio, vimeo, youtube
- var type = this.media.tagName.toLowerCase();
-
- // Embed properties
- var iframe = null;
- var url = null;
- var params = null;
-
- // Different setup based on type
- switch (type) {
- case 'div':
- // Find the frame
- iframe = this.media.querySelector('iframe');
-
- // <iframe> type
- if (utils.is.element(iframe)) {
- // Detect provider
- url = iframe.getAttribute('src');
- this.provider = utils.getProviderByUrl(url);
-
- // Rework elements
- this.elements.container = this.media;
- this.media = iframe;
-
- // Reset classname
- this.elements.container.className = '';
-
- // Get attributes from URL and set config
- params = utils.getUrlParams(url);
- if (!utils.is.empty(params)) {
- var truthy = ['1', 'true'];
-
- if (truthy.includes(params.autoplay)) {
- this.config.autoplay = true;
- }
- if (truthy.includes(params.loop)) {
- this.config.loop.active = true;
- }
+ var Plyr = function () {
+ function Plyr(target, options) {
+ var _this = this;
- // TODO: replace fullscreen.iosNative with this playsinline config option
- // YouTube requires the playsinline in the URL
- if (this.isYouTube) {
- this.config.playsinline = truthy.includes(params.playsinline);
- } else {
- this.config.playsinline = true;
- }
- }
- } else {
- // <div> with attributes
- this.provider = this.media.getAttribute(this.config.attributes.embed.provider);
+ classCallCheck(this, Plyr);
- // Remove attribute
- this.media.removeAttribute(this.config.attributes.embed.provider);
- }
+ this.timers = {};
- // Unsupported or missing provider
- if (utils.is.empty(this.provider) || !Object.keys(providers).includes(this.provider)) {
- this.debug.error('Setup failed: Invalid provider');
- return;
- }
+ // State
+ this.ready = false;
+ this.loading = false;
+ this.failed = false;
- // Audio will come later for external providers
- this.type = types.video;
+ // Touch device
+ this.touch = support.touch;
- break;
+ // Set the media element
+ this.media = target;
- case 'video':
- case 'audio':
- this.type = type;
- this.provider = providers.html5;
+ // String selector passed
+ if (is.string(this.media)) {
+ this.media = document.querySelectorAll(this.media);
+ }
- // Get config from attributes
- if (this.media.hasAttribute('crossorigin')) {
- this.config.crossorigin = true;
- }
- if (this.media.hasAttribute('autoplay')) {
- this.config.autoplay = true;
- }
- if (this.media.hasAttribute('playsinline')) {
- this.config.playsinline = true;
- }
- if (this.media.hasAttribute('muted')) {
- this.config.muted = true;
- }
- if (this.media.hasAttribute('loop')) {
- this.config.loop.active = true;
+ // jQuery, NodeList or Array passed, use first element
+ if (window.jQuery && this.media instanceof jQuery || is.nodeList(this.media) || is.array(this.media)) {
+ // eslint-disable-next-line
+ this.media = this.media[0];
+ }
+
+ // Set config
+ this.config = extend({}, defaults$1, Plyr.defaults, options || {}, function () {
+ try {
+ return JSON.parse(_this.media.getAttribute('data-plyr-config'));
+ } catch (e) {
+ return {};
}
+ }());
+
+ // Elements cache
+ this.elements = {
+ container: null,
+ buttons: {},
+ display: {},
+ progress: {},
+ inputs: {},
+ settings: {
+ menu: null,
+ panes: {},
+ tabs: {}
+ },
+ captions: null
+ };
+
+ // Captions
+ this.captions = {
+ active: null,
+ currentTrack: -1,
+ meta: new WeakMap()
+ };
+
+ // Fullscreen
+ this.fullscreen = {
+ active: false
+ };
- break;
+ // Options
+ this.options = {
+ speed: [],
+ quality: []
+ };
+
+ // Debugging
+ // TODO: move to globals
+ this.debug = new Console(this.config.debug);
+
+ // Log config options and support
+ this.debug.log('Config', this.config);
+ this.debug.log('Support', support);
- default:
- this.debug.error('Setup failed: unsupported type');
+ // We need an element to setup
+ if (is.nullOrUndefined(this.media) || !is.element(this.media)) {
+ this.debug.error('Setup failed: no suitable element passed');
return;
- }
+ }
- // Check for support again but with type
- this.supported = support.check(this.type, this.provider, this.config.playsinline);
+ // Bail if the element is initialized
+ if (this.media.plyr) {
+ this.debug.warn('Target already setup');
+ return;
+ }
- // If no support for even API, bail
- if (!this.supported.api) {
- this.debug.error('Setup failed: no support');
- return;
- }
+ // Bail if not enabled
+ if (!this.config.enabled) {
+ this.debug.error('Setup failed: disabled by config');
+ return;
+ }
- // Create listeners
- this.listeners = new Listeners(this);
+ // Bail if disabled or no basic support
+ // You may want to disable certain UAs etc
+ if (!support.check().api) {
+ this.debug.error('Setup failed: no support');
+ return;
+ }
- // Setup local storage for user settings
- this.storage = new Storage(this);
+ // Cache original element state for .destroy()
+ var clone = this.media.cloneNode(true);
+ clone.autoplay = false;
+ this.elements.original = clone;
- // Store reference
- this.media.plyr = this;
+ // Set media type based on tag or data attribute
+ // Supported: video, audio, vimeo, youtube
+ var type = this.media.tagName.toLowerCase();
- // Wrap media
- if (!utils.is.element(this.elements.container)) {
- this.elements.container = utils.createElement('div');
- utils.wrap(this.media, this.elements.container);
- }
+ // Embed properties
+ var iframe = null;
+ var url = null;
- // Add style hook
- ui.addStyleHook.call(this);
+ // Different setup based on type
+ switch (type) {
+ case 'div':
+ // Find the frame
+ iframe = this.media.querySelector('iframe');
- // Setup media
- media.setup.call(this);
+ // <iframe> type
+ if (is.element(iframe)) {
+ // Detect provider
+ url = parseUrl(iframe.getAttribute('src'));
+ this.provider = getProviderByUrl(url.toString());
- // Listen for events if debugging
- if (this.config.debug) {
- utils.on(this.elements.container, this.config.events.join(' '), function (event) {
- _this.debug.log('event: ' + event.type);
- });
- }
+ // Rework elements
+ this.elements.container = this.media;
+ this.media = iframe;
- // Setup interface
- // If embed but not fully supported, build interface now to avoid flash of controls
- if (this.isHTML5 || this.isEmbed && !this.supported.ui) {
- ui.build.call(this);
- }
+ // Reset classname
+ this.elements.container.className = '';
- // Container listeners
- this.listeners.container();
+ // Get attributes from URL and set config
+ if (url.searchParams.length) {
+ var truthy = ['1', 'true'];
- // Global listeners
- this.listeners.global();
+ if (truthy.includes(url.searchParams.get('autoplay'))) {
+ this.config.autoplay = true;
+ }
+ if (truthy.includes(url.searchParams.get('loop'))) {
+ this.config.loop.active = true;
+ }
- // Setup fullscreen
- this.fullscreen = new Fullscreen(this);
+ // TODO: replace fullscreen.iosNative with this playsinline config option
+ // YouTube requires the playsinline in the URL
+ if (this.isYouTube) {
+ this.config.playsinline = truthy.includes(url.searchParams.get('playsinline'));
+ } else {
+ this.config.playsinline = true;
+ }
+ }
+ } else {
+ // <div> with attributes
+ this.provider = this.media.getAttribute(this.config.attributes.embed.provider);
- // Setup ads if provided
- this.ads = new Ads(this);
+ // Remove attribute
+ this.media.removeAttribute(this.config.attributes.embed.provider);
+ }
- // Autoplay if required
- if (this.config.autoplay) {
- this.play();
- }
- }
+ // Unsupported or missing provider
+ if (is.empty(this.provider) || !Object.keys(providers).includes(this.provider)) {
+ this.debug.error('Setup failed: Invalid provider');
+ return;
+ }
- // ---------------------------------------
- // API
- // ---------------------------------------
+ // Audio will come later for external providers
+ this.type = types.video;
- /**
- * Types and provider helpers
- */
+ break;
+ case 'video':
+ case 'audio':
+ this.type = type;
+ this.provider = providers.html5;
- createClass(Plyr, [{
- key: 'play',
+ // Get config from attributes
+ if (this.media.hasAttribute('crossorigin')) {
+ this.config.crossorigin = true;
+ }
+ if (this.media.hasAttribute('autoplay')) {
+ this.config.autoplay = true;
+ }
+ if (this.media.hasAttribute('playsinline')) {
+ this.config.playsinline = true;
+ }
+ if (this.media.hasAttribute('muted')) {
+ this.config.muted = true;
+ }
+ if (this.media.hasAttribute('loop')) {
+ this.config.loop.active = true;
+ }
+ break;
- /**
- * Play the media, or play the advertisement (if they are not blocked)
- */
- value: function play() {
- if (!utils.is.function(this.media.play)) {
- return null;
+ default:
+ this.debug.error('Setup failed: unsupported type');
+ return;
}
- // Return the promise (for HTML5)
- return this.media.play();
- }
-
- /**
- * Pause the media
- */
+ // Check for support again but with type
+ this.supported = support.check(this.type, this.provider, this.config.playsinline);
- }, {
- key: 'pause',
- value: function pause() {
- if (!this.playing || !utils.is.function(this.media.pause)) {
+ // If no support for even API, bail
+ if (!this.supported.api) {
+ this.debug.error('Setup failed: no support');
return;
}
- this.media.pause();
- }
+ this.eventListeners = [];
- /**
- * Get playing state
- */
+ // Create listeners
+ this.listeners = new Listeners(this);
- }, {
- key: 'togglePlay',
+ // Setup local storage for user settings
+ this.storage = new Storage(this);
+ // Store reference
+ this.media.plyr = this;
- /**
- * Toggle playback based on current status
- * @param {boolean} input
- */
- value: function togglePlay(input) {
- // Toggle based on current state if nothing passed
- var toggle = utils.is.boolean(input) ? input : !this.playing;
-
- if (toggle) {
- this.play();
- } else {
- this.pause();
+ // Wrap media
+ if (!is.element(this.elements.container)) {
+ this.elements.container = createElement('div');
+ wrap(this.media, this.elements.container);
}
- }
- /**
- * Stop playback
- */
+ // Add style hook
+ ui.addStyleHook.call(this);
- }, {
- key: 'stop',
- value: function stop() {
- if (this.isHTML5) {
- this.pause();
- this.restart();
- } else if (utils.is.function(this.media.stop)) {
- this.media.stop();
+ // Setup media
+ media.setup.call(this);
+
+ // Listen for events if debugging
+ if (this.config.debug) {
+ on.call(this, this.elements.container, this.config.events.join(' '), function (event) {
+ _this.debug.log('event: ' + event.type);
+ });
}
- }
- /**
- * Restart playback
- */
+ // Setup interface
+ // If embed but not fully supported, build interface now to avoid flash of controls
+ if (this.isHTML5 || this.isEmbed && !this.supported.ui) {
+ ui.build.call(this);
+ }
- }, {
- key: 'restart',
- value: function restart() {
- this.currentTime = 0;
- }
+ // Container listeners
+ this.listeners.container();
- /**
- * Rewind
- * @param {number} seekTime - how far to rewind in seconds. Defaults to the config.seekTime
- */
+ // Global listeners
+ this.listeners.global();
- }, {
- key: 'rewind',
- value: function rewind(seekTime) {
- this.currentTime = this.currentTime - (utils.is.number(seekTime) ? seekTime : this.config.seekTime);
- }
+ // Setup fullscreen
+ this.fullscreen = new Fullscreen(this);
- /**
- * Fast forward
- * @param {number} seekTime - how far to fast forward in seconds. Defaults to the config.seekTime
- */
+ // Setup ads if provided
+ this.ads = new Ads(this);
- }, {
- key: 'forward',
- value: function forward(seekTime) {
- this.currentTime = this.currentTime + (utils.is.number(seekTime) ? seekTime : this.config.seekTime);
+ // Autoplay if required
+ if (this.config.autoplay) {
+ this.play();
+ }
}
+ // ---------------------------------------
+ // API
+ // ---------------------------------------
+
/**
- * Seek to a time
- * @param {number} input - where to seek to in seconds. Defaults to 0 (the start)
+ * Types and provider helpers
*/
- }, {
- key: 'increaseVolume',
+ createClass(Plyr, [{
+ key: 'play',
- /**
- * Increase volume
- * @param {boolean} step - How much to decrease by (between 0 and 1)
- */
- value: function increaseVolume(step) {
- var volume = this.media.muted ? 0 : this.volume;
- this.volume = volume + (utils.is.number(step) ? step : 1);
- }
- /**
- * Decrease volume
- * @param {boolean} step - How much to decrease by (between 0 and 1)
- */
+ /**
+ * Play the media, or play the advertisement (if they are not blocked)
+ */
+ value: function play() {
+ if (!is.function(this.media.play)) {
+ return null;
+ }
- }, {
- key: 'decreaseVolume',
- value: function decreaseVolume(step) {
- var volume = this.media.muted ? 0 : this.volume;
- this.volume = volume - (utils.is.number(step) ? step : 1);
- }
+ // Return the promise (for HTML5)
+ return this.media.play();
+ }
- /**
- * Set muted state
- * @param {boolean} mute
- */
+ /**
+ * Pause the media
+ */
- }, {
- key: 'toggleCaptions',
+ }, {
+ key: 'pause',
+ value: function pause() {
+ if (!this.playing || !is.function(this.media.pause)) {
+ return;
+ }
+ this.media.pause();
+ }
- /**
- * Toggle captions
- * @param {boolean} input - Whether to enable captions
- */
- value: function toggleCaptions(input) {
- // If there's no full support
- if (!this.supported.ui) {
- return;
+ /**
+ * Get playing state
+ */
+
+ }, {
+ key: 'togglePlay',
+
+
+ /**
+ * Toggle playback based on current status
+ * @param {boolean} input
+ */
+ value: function togglePlay(input) {
+ // Toggle based on current state if nothing passed
+ var toggle = is.boolean(input) ? input : !this.playing;
+
+ if (toggle) {
+ this.play();
+ } else {
+ this.pause();
+ }
}
- // If the method is called without parameter, toggle based on current value
- var active = utils.is.boolean(input) ? input : !this.elements.container.classList.contains(this.config.classNames.captions.active);
+ /**
+ * Stop playback
+ */
- // Toggle state
- this.elements.buttons.captions.pressed = active;
+ }, {
+ key: 'stop',
+ value: function stop() {
+ if (this.isHTML5) {
+ this.pause();
+ this.restart();
+ } else if (is.function(this.media.stop)) {
+ this.media.stop();
+ }
+ }
- // Add class hook
- utils.toggleClass(this.elements.container, this.config.classNames.captions.active, active);
+ /**
+ * Restart playback
+ */
- // Update state and trigger event
- if (active !== this.captions.active) {
- this.captions.active = active;
- utils.dispatchEvent.call(this, this.media, this.captions.active ? 'captionsenabled' : 'captionsdisabled');
+ }, {
+ key: 'restart',
+ value: function restart() {
+ this.currentTime = 0;
}
- }
- /**
- * Set the caption track by index
- * @param {number} - Caption index
- */
+ /**
+ * Rewind
+ * @param {number} seekTime - how far to rewind in seconds. Defaults to the config.seekTime
+ */
- }, {
- key: 'airplay',
+ }, {
+ key: 'rewind',
+ value: function rewind(seekTime) {
+ this.currentTime = this.currentTime - (is.number(seekTime) ? seekTime : this.config.seekTime);
+ }
+ /**
+ * Fast forward
+ * @param {number} seekTime - how far to fast forward in seconds. Defaults to the config.seekTime
+ */
- /**
- * Trigger the airplay dialog
- * TODO: update player with state, support, enabled
- */
- value: function airplay() {
- // Show dialog if supported
- if (support.airplay) {
- this.media.webkitShowPlaybackTargetPicker();
+ }, {
+ key: 'forward',
+ value: function forward(seekTime) {
+ this.currentTime = this.currentTime + (is.number(seekTime) ? seekTime : this.config.seekTime);
}
- }
- /**
- * Toggle the player controls
- * @param {boolean} [toggle] - Whether to show the controls
- */
+ /**
+ * Seek to a time
+ * @param {number} input - where to seek to in seconds. Defaults to 0 (the start)
+ */
+
+ }, {
+ key: 'increaseVolume',
- }, {
- key: 'toggleControls',
- value: function toggleControls(toggle) {
- // Don't toggle if missing UI support or if it's audio
- if (this.supported.ui && !this.isAudio) {
- // Get state before change
- var isHidden = utils.hasClass(this.elements.container, this.config.classNames.hideControls);
- // Negate the argument if not undefined since adding the class to hides the controls
- var force = typeof toggle === 'undefined' ? undefined : !toggle;
+ /**
+ * Increase volume
+ * @param {boolean} step - How much to decrease by (between 0 and 1)
+ */
+ value: function increaseVolume(step) {
+ var volume = this.media.muted ? 0 : this.volume;
+ this.volume = volume + (is.number(step) ? step : 1);
+ }
- // Apply and get updated state
- var hiding = utils.toggleClass(this.elements.container, this.config.classNames.hideControls, force);
+ /**
+ * Decrease volume
+ * @param {boolean} step - How much to decrease by (between 0 and 1)
+ */
- // Close menu
- if (hiding && this.config.controls.includes('settings') && !utils.is.empty(this.config.settings)) {
- controls.toggleMenu.call(this, false);
- }
- // Trigger event on change
- if (hiding !== isHidden) {
- var eventName = hiding ? 'controlshidden' : 'controlsshown';
- utils.dispatchEvent.call(this, this.media, eventName);
- }
- return !hiding;
+ }, {
+ key: 'decreaseVolume',
+ value: function decreaseVolume(step) {
+ var volume = this.media.muted ? 0 : this.volume;
+ this.volume = volume - (is.number(step) ? step : 1);
}
- return false;
- }
- /**
- * Add event listeners
- * @param {string} event - Event type
- * @param {function} callback - Callback for when event occurs
- */
+ /**
+ * Set muted state
+ * @param {boolean} mute
+ */
- }, {
- key: 'on',
- value: function on(event, callback) {
- utils.on(this.elements.container, event, callback);
- }
+ }, {
+ key: 'toggleCaptions',
- /**
- * Remove event listeners
- * @param {string} event - Event type
- * @param {function} callback - Callback for when event occurs
- */
- }, {
- key: 'off',
- value: function off(event, callback) {
- utils.off(this.elements.container, event, callback);
- }
+ /**
+ * Toggle captions
+ * @param {boolean} input - Whether to enable captions
+ */
+ value: function toggleCaptions(input) {
+ captions.toggle.call(this, input, false);
+ }
- /**
- * Destroy an instance
- * Event listeners are removed when elements are removed
- * http://stackoverflow.com/questions/12528049/if-a-dom-element-is-removed-are-its-listeners-also-removed-from-memory
- * @param {function} callback - Callback for when destroy is complete
- * @param {boolean} soft - Whether it's a soft destroy (for source changes etc)
- */
+ /**
+ * Set the caption track by index
+ * @param {number} - Caption index
+ */
- }, {
- key: 'destroy',
- value: function destroy(callback) {
- var _this2 = this;
+ }, {
+ key: 'airplay',
- var soft = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
- if (!this.ready) {
- return;
+ /**
+ * Trigger the airplay dialog
+ * TODO: update player with state, support, enabled
+ */
+ value: function airplay() {
+ // Show dialog if supported
+ if (support.airplay) {
+ this.media.webkitShowPlaybackTargetPicker();
+ }
}
- var done = function done() {
- // Reset overflow (incase destroyed while in fullscreen)
- document.body.style.overflow = '';
+ /**
+ * Toggle the player controls
+ * @param {boolean} [toggle] - Whether to show the controls
+ */
- // GC for embed
- _this2.embed = null;
+ }, {
+ key: 'toggleControls',
+ value: function toggleControls(toggle) {
+ // Don't toggle if missing UI support or if it's audio
+ if (this.supported.ui && !this.isAudio) {
+ // Get state before change
+ var isHidden = hasClass(this.elements.container, this.config.classNames.hideControls);
- // If it's a soft destroy, make minimal changes
- if (soft) {
- if (Object.keys(_this2.elements).length) {
- // Remove elements
- utils.removeElement(_this2.elements.buttons.play);
- utils.removeElement(_this2.elements.captions);
- utils.removeElement(_this2.elements.controls);
- utils.removeElement(_this2.elements.wrapper);
+ // Negate the argument if not undefined since adding the class to hides the controls
+ var force = typeof toggle === 'undefined' ? undefined : !toggle;
- // Clear for GC
- _this2.elements.buttons.play = null;
- _this2.elements.captions = null;
- _this2.elements.controls = null;
- _this2.elements.wrapper = null;
- }
+ // Apply and get updated state
+ var hiding = toggleClass(this.elements.container, this.config.classNames.hideControls, force);
- // Callback
- if (utils.is.function(callback)) {
- callback();
+ // Close menu
+ if (hiding && this.config.controls.includes('settings') && !is.empty(this.config.settings)) {
+ controls.toggleMenu.call(this, false);
}
- } else {
- // Unbind listeners
- _this2.listeners.clear();
+ // Trigger event on change
+ if (hiding !== isHidden) {
+ var eventName = hiding ? 'controlshidden' : 'controlsshown';
+ triggerEvent.call(this, this.media, eventName);
+ }
+ return !hiding;
+ }
+ return false;
+ }
- // Replace the container with the original element provided
- utils.replaceElement(_this2.elements.original, _this2.elements.container);
+ /**
+ * Add event listeners
+ * @param {string} event - Event type
+ * @param {function} callback - Callback for when event occurs
+ */
+
+ }, {
+ key: 'on',
+ value: function on$$1(event, callback) {
+ on.call(this, this.elements.container, event, callback);
+ }
+ /**
+ * Add event listeners once
+ * @param {string} event - Event type
+ * @param {function} callback - Callback for when event occurs
+ */
+
+ }, {
+ key: 'once',
+ value: function once$$1(event, callback) {
+ once.call(this, this.elements.container, event, callback);
+ }
+ /**
+ * Remove event listeners
+ * @param {string} event - Event type
+ * @param {function} callback - Callback for when event occurs
+ */
+
+ }, {
+ key: 'off',
+ value: function off$$1(event, callback) {
+ off(this.elements.container, event, callback);
+ }
+
+ /**
+ * Destroy an instance
+ * Event listeners are removed when elements are removed
+ * http://stackoverflow.com/questions/12528049/if-a-dom-element-is-removed-are-its-listeners-also-removed-from-memory
+ * @param {function} callback - Callback for when destroy is complete
+ * @param {boolean} soft - Whether it's a soft destroy (for source changes etc)
+ */
+
+ }, {
+ key: 'destroy',
+ value: function destroy(callback) {
+ var _this2 = this;
+
+ var soft = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
+
+ if (!this.ready) {
+ return;
+ }
- // Event
- utils.dispatchEvent.call(_this2, _this2.elements.original, 'destroyed', true);
+ var done = function done() {
+ // Reset overflow (incase destroyed while in fullscreen)
+ document.body.style.overflow = '';
+
+ // GC for embed
+ _this2.embed = null;
+
+ // If it's a soft destroy, make minimal changes
+ if (soft) {
+ if (Object.keys(_this2.elements).length) {
+ // Remove elements
+ removeElement(_this2.elements.buttons.play);
+ removeElement(_this2.elements.captions);
+ removeElement(_this2.elements.controls);
+ removeElement(_this2.elements.wrapper);
+
+ // Clear for GC
+ _this2.elements.buttons.play = null;
+ _this2.elements.captions = null;
+ _this2.elements.controls = null;
+ _this2.elements.wrapper = null;
+ }
- // Callback
- if (utils.is.function(callback)) {
- callback.call(_this2.elements.original);
- }
+ // Callback
+ if (is.function(callback)) {
+ callback();
+ }
+ } else {
+ // Unbind listeners
+ unbindListeners.call(_this2);
- // Reset state
- _this2.ready = false;
+ // Replace the container with the original element provided
+ replaceElement(_this2.elements.original, _this2.elements.container);
- // Clear for garbage collection
- setTimeout(function () {
- _this2.elements = null;
- _this2.media = null;
- }, 200);
- }
- };
+ // Event
+ triggerEvent.call(_this2, _this2.elements.original, 'destroyed', true);
- // Stop playback
- this.stop();
+ // Callback
+ if (is.function(callback)) {
+ callback.call(_this2.elements.original);
+ }
+
+ // Reset state
+ _this2.ready = false;
- // Type specific stuff
- switch (this.provider + ':' + this.type) {
- case 'html5:video':
- case 'html5:audio':
+ // Clear for garbage collection
+ setTimeout(function () {
+ _this2.elements = null;
+ _this2.media = null;
+ }, 200);
+ }
+ };
+
+ // Stop playback
+ this.stop();
+
+ // Provider specific stuff
+ if (this.isHTML5) {
// Clear timeout
clearTimeout(this.timers.loading);
@@ -7577,25 +7505,19 @@ var Plyr = function () {
// Clean up
done();
-
- break;
-
- case 'youtube:video':
+ } else if (this.isYouTube) {
// Clear timers
clearInterval(this.timers.buffering);
clearInterval(this.timers.playing);
// Destroy YouTube API
- if (this.embed !== null && utils.is.function(this.embed.destroy)) {
+ if (this.embed !== null && is.function(this.embed.destroy)) {
this.embed.destroy();
}
// Clean up
done();
-
- break;
-
- case 'vimeo:video':
+ } else if (this.isVimeo) {
// Destroy Vimeo API
// then clean up (wait, to prevent postmessage errors)
if (this.embed !== null) {
@@ -7604,636 +7526,621 @@ var Plyr = function () {
// Vimeo does not always return
setTimeout(done, 200);
+ }
+ }
- break;
+ /**
+ * Check for support for a mime type (HTML5 only)
+ * @param {string} type - Mime type
+ */
- default:
- break;
+ }, {
+ key: 'supports',
+ value: function supports(type) {
+ return support.mime.call(this, type);
}
- }
- /**
- * Check for support for a mime type (HTML5 only)
- * @param {string} type - Mime type
- */
+ /**
+ * Check for support
+ * @param {string} type - Player type (audio/video)
+ * @param {string} provider - Provider (html5/youtube/vimeo)
+ * @param {bool} inline - Where player has `playsinline` sttribute
+ */
- }, {
- key: 'supports',
- value: function supports(type) {
- return support.mime.call(this, type);
- }
+ }, {
+ key: 'isHTML5',
+ get: function get$$1() {
+ return Boolean(this.provider === providers.html5);
+ }
+ }, {
+ key: 'isEmbed',
+ get: function get$$1() {
+ return Boolean(this.isYouTube || this.isVimeo);
+ }
+ }, {
+ key: 'isYouTube',
+ get: function get$$1() {
+ return Boolean(this.provider === providers.youtube);
+ }
+ }, {
+ key: 'isVimeo',
+ get: function get$$1() {
+ return Boolean(this.provider === providers.vimeo);
+ }
+ }, {
+ key: 'isVideo',
+ get: function get$$1() {
+ return Boolean(this.type === types.video);
+ }
+ }, {
+ key: 'isAudio',
+ get: function get$$1() {
+ return Boolean(this.type === types.audio);
+ }
+ }, {
+ key: 'playing',
+ get: function get$$1() {
+ return Boolean(this.ready && !this.paused && !this.ended);
+ }
- /**
- * Check for support
- * @param {string} type - Player type (audio/video)
- * @param {string} provider - Provider (html5/youtube/vimeo)
- * @param {bool} inline - Where player has `playsinline` sttribute
- */
+ /**
+ * Get paused state
+ */
- }, {
- key: 'isHTML5',
- get: function get$$1() {
- return Boolean(this.provider === providers.html5);
- }
- }, {
- key: 'isEmbed',
- get: function get$$1() {
- return Boolean(this.isYouTube || this.isVimeo);
- }
- }, {
- key: 'isYouTube',
- get: function get$$1() {
- return Boolean(this.provider === providers.youtube);
- }
- }, {
- key: 'isVimeo',
- get: function get$$1() {
- return Boolean(this.provider === providers.vimeo);
- }
- }, {
- key: 'isVideo',
- get: function get$$1() {
- return Boolean(this.type === types.video);
- }
- }, {
- key: 'isAudio',
- get: function get$$1() {
- return Boolean(this.type === types.audio);
- }
- }, {
- key: 'playing',
- get: function get$$1() {
- return Boolean(this.ready && !this.paused && !this.ended);
- }
+ }, {
+ key: 'paused',
+ get: function get$$1() {
+ return Boolean(this.media.paused);
+ }
- /**
- * Get paused state
- */
+ /**
+ * Get stopped state
+ */
- }, {
- key: 'paused',
- get: function get$$1() {
- return Boolean(this.media.paused);
- }
+ }, {
+ key: 'stopped',
+ get: function get$$1() {
+ return Boolean(this.paused && this.currentTime === 0);
+ }
- /**
- * Get stopped state
- */
+ /**
+ * Get ended state
+ */
- }, {
- key: 'stopped',
- get: function get$$1() {
- return Boolean(this.paused && this.currentTime === 0);
- }
+ }, {
+ key: 'ended',
+ get: function get$$1() {
+ return Boolean(this.media.ended);
+ }
+ }, {
+ key: 'currentTime',
+ set: function set$$1(input) {
+ // Bail if media duration isn't available yet
+ if (!this.duration) {
+ return;
+ }
- /**
- * Get ended state
- */
+ // Validate input
+ var inputIsValid = is.number(input) && input > 0;
- }, {
- key: 'ended',
- get: function get$$1() {
- return Boolean(this.media.ended);
- }
- }, {
- key: 'currentTime',
- set: function set$$1(input) {
- // Bail if media duration isn't available yet
- if (!this.duration) {
- return;
- }
+ // Set
+ this.media.currentTime = inputIsValid ? Math.min(input, this.duration) : 0;
- // Validate input
- var inputIsValid = utils.is.number(input) && input > 0;
+ // Logging
+ this.debug.log('Seeking to ' + this.currentTime + ' seconds');
+ }
- // Set
- this.media.currentTime = inputIsValid ? Math.min(input, this.duration) : 0;
+ /**
+ * Get current time
+ */
+ ,
+ get: function get$$1() {
+ return Number(this.media.currentTime);
+ }
- // Logging
- this.debug.log('Seeking to ' + this.currentTime + ' seconds');
- }
+ /**
+ * Get buffered
+ */
- /**
- * Get current time
- */
- ,
- get: function get$$1() {
- return Number(this.media.currentTime);
- }
+ }, {
+ key: 'buffered',
+ get: function get$$1() {
+ var buffered = this.media.buffered;
- /**
- * Get buffered
- */
+ // YouTube / Vimeo return a float between 0-1
- }, {
- key: 'buffered',
- get: function get$$1() {
- var buffered = this.media.buffered;
+ if (is.number(buffered)) {
+ return buffered;
+ }
- // YouTube / Vimeo return a float between 0-1
+ // HTML5
+ // TODO: Handle buffered chunks of the media
+ // (i.e. seek to another section buffers only that section)
+ if (buffered && buffered.length && this.duration > 0) {
+ return buffered.end(0) / this.duration;
+ }
- if (utils.is.number(buffered)) {
- return buffered;
+ return 0;
}
- // HTML5
- // TODO: Handle buffered chunks of the media
- // (i.e. seek to another section buffers only that section)
- if (buffered && buffered.length && this.duration > 0) {
- return buffered.end(0) / this.duration;
+ /**
+ * Get seeking status
+ */
+
+ }, {
+ key: 'seeking',
+ get: function get$$1() {
+ return Boolean(this.media.seeking);
}
- return 0;
- }
+ /**
+ * Get the duration of the current media
+ */
- /**
- * Get seeking status
- */
+ }, {
+ key: 'duration',
+ get: function get$$1() {
+ // Faux duration set via config
+ var fauxDuration = parseFloat(this.config.duration);
- }, {
- key: 'seeking',
- get: function get$$1() {
- return Boolean(this.media.seeking);
- }
+ // Media duration can be NaN before the media has loaded
+ var duration = (this.media || {}).duration || 0;
- /**
- * Get the duration of the current media
- */
+ // If config duration is funky, use regular duration
+ return fauxDuration || duration;
+ }
- }, {
- key: 'duration',
- get: function get$$1() {
- // Faux duration set via config
- var fauxDuration = parseFloat(this.config.duration);
+ /**
+ * Set the player volume
+ * @param {number} value - must be between 0 and 1. Defaults to the value from local storage and config.volume if not set in storage
+ */
- // Media duration can be NaN before the media has loaded
- var duration = (this.media || {}).duration || 0;
+ }, {
+ key: 'volume',
+ set: function set$$1(value) {
+ var volume = value;
+ var max = 1;
+ var min = 0;
- // If config duration is funky, use regular duration
- return fauxDuration || duration;
- }
+ if (is.string(volume)) {
+ volume = Number(volume);
+ }
- /**
- * Set the player volume
- * @param {number} value - must be between 0 and 1. Defaults to the value from local storage and config.volume if not set in storage
- */
+ // Load volume from storage if no value specified
+ if (!is.number(volume)) {
+ volume = this.storage.get('volume');
+ }
- }, {
- key: 'volume',
- set: function set$$1(value) {
- var volume = value;
- var max = 1;
- var min = 0;
+ // Use config if all else fails
+ if (!is.number(volume)) {
+ volume = this.config.volume;
+ }
- if (utils.is.string(volume)) {
- volume = Number(volume);
- }
+ // Maximum is volumeMax
+ if (volume > max) {
+ volume = max;
+ }
+ // Minimum is volumeMin
+ if (volume < min) {
+ volume = min;
+ }
- // Load volume from storage if no value specified
- if (!utils.is.number(volume)) {
- volume = this.storage.get('volume');
- }
+ // Update config
+ this.config.volume = volume;
- // Use config if all else fails
- if (!utils.is.number(volume)) {
- volume = this.config.volume;
- }
+ // Set the player volume
+ this.media.volume = volume;
- // Maximum is volumeMax
- if (volume > max) {
- volume = max;
- }
- // Minimum is volumeMin
- if (volume < min) {
- volume = min;
+ // If muted, and we're increasing volume manually, reset muted state
+ if (!is.empty(value) && this.muted && volume > 0) {
+ this.muted = false;
+ }
}
- // Update config
- this.config.volume = volume;
+ /**
+ * Get the current player volume
+ */
+ ,
+ get: function get$$1() {
+ return Number(this.media.volume);
+ }
+ }, {
+ key: 'muted',
+ set: function set$$1(mute) {
+ var toggle = mute;
- // Set the player volume
- this.media.volume = volume;
+ // Load muted state from storage
+ if (!is.boolean(toggle)) {
+ toggle = this.storage.get('muted');
+ }
- // If muted, and we're increasing volume manually, reset muted state
- if (!utils.is.empty(value) && this.muted && volume > 0) {
- this.muted = false;
- }
- }
+ // Use config if all else fails
+ if (!is.boolean(toggle)) {
+ toggle = this.config.muted;
+ }
- /**
- * Get the current player volume
- */
- ,
- get: function get$$1() {
- return Number(this.media.volume);
- }
- }, {
- key: 'muted',
- set: function set$$1(mute) {
- var toggle = mute;
+ // Update config
+ this.config.muted = toggle;
- // Load muted state from storage
- if (!utils.is.boolean(toggle)) {
- toggle = this.storage.get('muted');
+ // Set mute on the player
+ this.media.muted = toggle;
}
- // Use config if all else fails
- if (!utils.is.boolean(toggle)) {
- toggle = this.config.muted;
+ /**
+ * Get current muted state
+ */
+ ,
+ get: function get$$1() {
+ return Boolean(this.media.muted);
}
- // Update config
- this.config.muted = toggle;
-
- // Set mute on the player
- this.media.muted = toggle;
- }
+ /**
+ * Check if the media has audio
+ */
- /**
- * Get current muted state
- */
- ,
- get: function get$$1() {
- return Boolean(this.media.muted);
- }
+ }, {
+ key: 'hasAudio',
+ get: function get$$1() {
+ // Assume yes for all non HTML5 (as we can't tell...)
+ if (!this.isHTML5) {
+ return true;
+ }
- /**
- * Check if the media has audio
- */
+ if (this.isAudio) {
+ return true;
+ }
- }, {
- key: 'hasAudio',
- get: function get$$1() {
- // Assume yes for all non HTML5 (as we can't tell...)
- if (!this.isHTML5) {
- return true;
+ // Get audio tracks
+ return Boolean(this.media.mozHasAudio) || Boolean(this.media.webkitAudioDecodedByteCount) || Boolean(this.media.audioTracks && this.media.audioTracks.length);
}
- if (this.isAudio) {
- return true;
- }
+ /**
+ * Set playback speed
+ * @param {number} speed - the speed of playback (0.5-2.0)
+ */
- // Get audio tracks
- return Boolean(this.media.mozHasAudio) || Boolean(this.media.webkitAudioDecodedByteCount) || Boolean(this.media.audioTracks && this.media.audioTracks.length);
- }
+ }, {
+ key: 'speed',
+ set: function set$$1(input) {
+ var speed = null;
- /**
- * Set playback speed
- * @param {number} speed - the speed of playback (0.5-2.0)
- */
+ if (is.number(input)) {
+ speed = input;
+ }
- }, {
- key: 'speed',
- set: function set$$1(input) {
- var speed = null;
+ if (!is.number(speed)) {
+ speed = this.storage.get('speed');
+ }
- if (utils.is.number(input)) {
- speed = input;
- }
+ if (!is.number(speed)) {
+ speed = this.config.speed.selected;
+ }
- if (!utils.is.number(speed)) {
- speed = this.storage.get('speed');
- }
+ // Set min/max
+ if (speed < 0.1) {
+ speed = 0.1;
+ }
+ if (speed > 2.0) {
+ speed = 2.0;
+ }
- if (!utils.is.number(speed)) {
- speed = this.config.speed.selected;
- }
+ if (!this.config.speed.options.includes(speed)) {
+ this.debug.warn('Unsupported speed (' + speed + ')');
+ return;
+ }
- // Set min/max
- if (speed < 0.1) {
- speed = 0.1;
- }
- if (speed > 2.0) {
- speed = 2.0;
- }
+ // Update config
+ this.config.speed.selected = speed;
- if (!this.config.speed.options.includes(speed)) {
- this.debug.warn('Unsupported speed (' + speed + ')');
- return;
+ // Set media speed
+ this.media.playbackRate = speed;
}
- // Update config
- this.config.speed.selected = speed;
+ /**
+ * Get current playback speed
+ */
+ ,
+ get: function get$$1() {
+ return Number(this.media.playbackRate);
+ }
- // Set media speed
- this.media.playbackRate = speed;
- }
+ /**
+ * Set playback quality
+ * Currently HTML5 & YouTube only
+ * @param {number} input - Quality level
+ */
- /**
- * Get current playback speed
- */
- ,
- get: function get$$1() {
- return Number(this.media.playbackRate);
- }
+ }, {
+ key: 'quality',
+ set: function set$$1(input) {
+ var config = this.config.quality;
+ var options = this.options.quality;
- /**
- * Set playback quality
- * Currently HTML5 & YouTube only
- * @param {number} input - Quality level
- */
+ if (!options.length) {
+ return;
+ }
- }, {
- key: 'quality',
- set: function set$$1(input) {
- var quality = null;
+ var quality = [!is.empty(input) && Number(input), this.storage.get('quality'), config.selected, config.default].find(is.number);
- if (!utils.is.empty(input)) {
- quality = Number(input);
- }
+ if (!options.includes(quality)) {
+ var value = closest(options, quality);
+ this.debug.warn('Unsupported quality option: ' + quality + ', using ' + value + ' instead');
+ quality = value;
+ }
- if (!utils.is.number(quality)) {
- quality = this.storage.get('quality');
- }
+ // Trigger request event
+ triggerEvent.call(this, this.media, 'qualityrequested', false, { quality: quality });
- if (!utils.is.number(quality)) {
- quality = this.config.quality.selected;
- }
+ // Update config
+ config.selected = quality;
- if (!utils.is.number(quality)) {
- quality = this.config.quality.default;
+ // Set quality
+ this.media.quality = quality;
}
- if (!this.options.quality.length) {
- return;
+ /**
+ * Get current quality level
+ */
+ ,
+ get: function get$$1() {
+ return this.media.quality;
+ }
+
+ /**
+ * Toggle loop
+ * TODO: Finish fancy new logic. Set the indicator on load as user may pass loop as config
+ * @param {boolean} input - Whether to loop or not
+ */
+
+ }, {
+ key: 'loop',
+ set: function set$$1(input) {
+ var toggle = is.boolean(input) ? input : this.config.loop.active;
+ this.config.loop.active = toggle;
+ this.media.loop = toggle;
+
+ // Set default to be a true toggle
+ /* const type = ['start', 'end', 'all', 'none', 'toggle'].includes(input) ? input : 'toggle';
+ switch (type) {
+ case 'start':
+ if (this.config.loop.end && this.config.loop.end <= this.currentTime) {
+ this.config.loop.end = null;
+ }
+ this.config.loop.start = this.currentTime;
+ // this.config.loop.indicator.start = this.elements.display.played.value;
+ break;
+ case 'end':
+ if (this.config.loop.start >= this.currentTime) {
+ return this;
+ }
+ this.config.loop.end = this.currentTime;
+ // this.config.loop.indicator.end = this.elements.display.played.value;
+ break;
+ case 'all':
+ this.config.loop.start = 0;
+ this.config.loop.end = this.duration - 2;
+ this.config.loop.indicator.start = 0;
+ this.config.loop.indicator.end = 100;
+ break;
+ case 'toggle':
+ if (this.config.loop.active) {
+ this.config.loop.start = 0;
+ this.config.loop.end = null;
+ } else {
+ this.config.loop.start = 0;
+ this.config.loop.end = this.duration - 2;
+ }
+ break;
+ default:
+ this.config.loop.start = 0;
+ this.config.loop.end = null;
+ break;
+ } */
}
- if (!this.options.quality.includes(quality)) {
- var closest = utils.closest(this.options.quality, quality);
- this.debug.warn('Unsupported quality option: ' + quality + ', using ' + closest + ' instead');
- quality = closest;
+ /**
+ * Get current loop state
+ */
+ ,
+ get: function get$$1() {
+ return Boolean(this.media.loop);
}
- // Update config
- this.config.quality.selected = quality;
+ /**
+ * Set new media source
+ * @param {object} input - The new source object (see docs)
+ */
- // Set quality
- this.media.quality = quality;
- }
-
- /**
- * Get current quality level
- */
- ,
- get: function get$$1() {
- return this.media.quality;
- }
+ }, {
+ key: 'source',
+ set: function set$$1(input) {
+ source.change.call(this, input);
+ }
- /**
- * Toggle loop
- * TODO: Finish fancy new logic. Set the indicator on load as user may pass loop as config
- * @param {boolean} input - Whether to loop or not
- */
+ /**
+ * Get current source
+ */
+ ,
+ get: function get$$1() {
+ return this.media.currentSrc;
+ }
- }, {
- key: 'loop',
- set: function set$$1(input) {
- var toggle = utils.is.boolean(input) ? input : this.config.loop.active;
- this.config.loop.active = toggle;
- this.media.loop = toggle;
-
- // Set default to be a true toggle
- /* const type = ['start', 'end', 'all', 'none', 'toggle'].includes(input) ? input : 'toggle';
- switch (type) {
- case 'start':
- if (this.config.loop.end && this.config.loop.end <= this.currentTime) {
- this.config.loop.end = null;
- }
- this.config.loop.start = this.currentTime;
- // this.config.loop.indicator.start = this.elements.display.played.value;
- break;
- case 'end':
- if (this.config.loop.start >= this.currentTime) {
- return this;
- }
- this.config.loop.end = this.currentTime;
- // this.config.loop.indicator.end = this.elements.display.played.value;
- break;
- case 'all':
- this.config.loop.start = 0;
- this.config.loop.end = this.duration - 2;
- this.config.loop.indicator.start = 0;
- this.config.loop.indicator.end = 100;
- break;
- case 'toggle':
- if (this.config.loop.active) {
- this.config.loop.start = 0;
- this.config.loop.end = null;
- } else {
- this.config.loop.start = 0;
- this.config.loop.end = this.duration - 2;
- }
- break;
- default:
- this.config.loop.start = 0;
- this.config.loop.end = null;
- break;
- } */
- }
+ /**
+ * Set the poster image for a video
+ * @param {input} - the URL for the new poster image
+ */
- /**
- * Get current loop state
- */
- ,
- get: function get$$1() {
- return Boolean(this.media.loop);
- }
+ }, {
+ key: 'poster',
+ set: function set$$1(input) {
+ if (!this.isVideo) {
+ this.debug.warn('Poster can only be set for video');
+ return;
+ }
- /**
- * Set new media source
- * @param {object} input - The new source object (see docs)
- */
+ ui.setPoster.call(this, input, false).catch(function () {});
+ }
- }, {
- key: 'source',
- set: function set$$1(input) {
- source.change.call(this, input);
- }
+ /**
+ * Get the current poster image
+ */
+ ,
+ get: function get$$1() {
+ if (!this.isVideo) {
+ return null;
+ }
- /**
- * Get current source
- */
- ,
- get: function get$$1() {
- return this.media.currentSrc;
- }
+ return this.media.getAttribute('poster');
+ }
- /**
- * Set the poster image for a video
- * @param {input} - the URL for the new poster image
- */
+ /**
+ * Set the autoplay state
+ * @param {boolean} input - Whether to autoplay or not
+ */
- }, {
- key: 'poster',
- set: function set$$1(input) {
- if (!this.isVideo) {
- this.debug.warn('Poster can only be set for video');
- return;
+ }, {
+ key: 'autoplay',
+ set: function set$$1(input) {
+ var toggle = is.boolean(input) ? input : this.config.autoplay;
+ this.config.autoplay = toggle;
}
- ui.setPoster.call(this, input);
- }
-
- /**
- * Get the current poster image
- */
- ,
- get: function get$$1() {
- if (!this.isVideo) {
- return null;
+ /**
+ * Get the current autoplay state
+ */
+ ,
+ get: function get$$1() {
+ return Boolean(this.config.autoplay);
+ }
+ }, {
+ key: 'currentTrack',
+ set: function set$$1(input) {
+ captions.set.call(this, input, false);
}
- return this.media.getAttribute('poster');
- }
+ /**
+ * Get the current caption track index (-1 if disabled)
+ */
+ ,
+ get: function get$$1() {
+ var _captions = this.captions,
+ toggled = _captions.toggled,
+ currentTrack = _captions.currentTrack;
- /**
- * Set the autoplay state
- * @param {boolean} input - Whether to autoplay or not
- */
+ return toggled ? currentTrack : -1;
+ }
- }, {
- key: 'autoplay',
- set: function set$$1(input) {
- var toggle = utils.is.boolean(input) ? input : this.config.autoplay;
- this.config.autoplay = toggle;
- }
+ /**
+ * Set the wanted language for captions
+ * Since tracks can be added later it won't update the actual caption track until there is a matching track
+ * @param {string} - Two character ISO language code (e.g. EN, FR, PT, etc)
+ */
- /**
- * Get the current autoplay state
- */
- ,
- get: function get$$1() {
- return Boolean(this.config.autoplay);
- }
- }, {
- key: 'currentTrack',
- set: function set$$1(input) {
- captions.set.call(this, input);
- }
+ }, {
+ key: 'language',
+ set: function set$$1(input) {
+ captions.setLanguage.call(this, input, false);
+ }
- /**
- * Get the current caption track index (-1 if disabled)
- */
- ,
- get: function get$$1() {
- var _captions = this.captions,
- active = _captions.active,
- currentTrack = _captions.currentTrack;
+ /**
+ * Get the current track's language
+ */
+ ,
+ get: function get$$1() {
+ return (captions.getCurrentTrack.call(this) || {}).language;
+ }
- return active ? currentTrack : -1;
- }
+ /**
+ * Toggle picture-in-picture playback on WebKit/MacOS
+ * TODO: update player with state, support, enabled
+ * TODO: detect outside changes
+ */
- /**
- * Set the wanted language for captions
- * Since tracks can be added later it won't update the actual caption track until there is a matching track
- * @param {string} - Two character ISO language code (e.g. EN, FR, PT, etc)
- */
+ }, {
+ key: 'pip',
+ set: function set$$1(input) {
+ var states = {
+ pip: 'picture-in-picture',
+ inline: 'inline'
+ };
- }, {
- key: 'language',
- set: function set$$1(input) {
- captions.setLanguage.call(this, input);
- }
+ // Bail if no support
+ if (!support.pip) {
+ return;
+ }
- /**
- * Get the current track's language
- */
- ,
- get: function get$$1() {
- return (captions.getCurrentTrack.call(this) || {}).language;
- }
+ // Toggle based on current state if not passed
+ var toggle = is.boolean(input) ? input : this.pip === states.inline;
- /**
- * Toggle picture-in-picture playback on WebKit/MacOS
- * TODO: update player with state, support, enabled
- * TODO: detect outside changes
- */
+ // Toggle based on current state
+ this.media.webkitSetPresentationMode(toggle ? states.pip : states.inline);
+ }
- }, {
- key: 'pip',
- set: function set$$1(input) {
- var states = {
- pip: 'picture-in-picture',
- inline: 'inline'
- };
+ /**
+ * Get the current picture-in-picture state
+ */
+ ,
+ get: function get$$1() {
+ if (!support.pip) {
+ return null;
+ }
- // Bail if no support
- if (!support.pip) {
- return;
+ return this.media.webkitPresentationMode;
+ }
+ }], [{
+ key: 'supported',
+ value: function supported(type, provider, inline) {
+ return support.check(type, provider, inline);
}
- // Toggle based on current state if not passed
- var toggle = utils.is.boolean(input) ? input : this.pip === states.inline;
-
- // Toggle based on current state
- this.media.webkitSetPresentationMode(toggle ? states.pip : states.inline);
- }
+ /**
+ * Load an SVG sprite into the page
+ * @param {string} url - URL for the SVG sprite
+ * @param {string} [id] - Unique ID
+ */
- /**
- * Get the current picture-in-picture state
- */
- ,
- get: function get$$1() {
- if (!support.pip) {
- return null;
+ }, {
+ key: 'loadSprite',
+ value: function loadSprite$$1(url, id) {
+ return loadSprite(url, id);
}
- return this.media.webkitPresentationMode;
- }
- }], [{
- key: 'supported',
- value: function supported(type, provider, inline) {
- return support.check(type, provider, inline);
- }
+ /**
+ * Setup multiple instances
+ * @param {*} selector
+ * @param {object} options
+ */
- /**
- * Load an SVG sprite into the page
- * @param {string} url - URL for the SVG sprite
- * @param {string} [id] - Unique ID
- */
+ }, {
+ key: 'setup',
+ value: function setup(selector) {
+ var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
- }, {
- key: 'loadSprite',
- value: function loadSprite(url, id) {
- return utils.loadSprite(url, id);
- }
+ var targets = null;
- /**
- * Setup multiple instances
- * @param {*} selector
- * @param {object} options
- */
-
- }, {
- key: 'setup',
- value: function setup(selector) {
- var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+ if (is.string(selector)) {
+ targets = Array.from(document.querySelectorAll(selector));
+ } else if (is.nodeList(selector)) {
+ targets = Array.from(selector);
+ } else if (is.array(selector)) {
+ targets = selector.filter(is.element);
+ }
- var targets = null;
+ if (is.empty(targets)) {
+ return null;
+ }
- if (utils.is.string(selector)) {
- targets = Array.from(document.querySelectorAll(selector));
- } else if (utils.is.nodeList(selector)) {
- targets = Array.from(selector);
- } else if (utils.is.array(selector)) {
- targets = selector.filter(utils.is.element);
+ return targets.map(function (t) {
+ return new Plyr(t, options);
+ });
}
+ }]);
+ return Plyr;
+ }();
- if (utils.is.empty(targets)) {
- return null;
- }
+ Plyr.defaults = cloneDeep(defaults$1);
- return targets.map(function (t) {
- return new Plyr(t, options);
- });
- }
- }]);
return Plyr;
-}();
-
-Plyr.defaults = utils.cloneDeep(defaults$1);
-
-return Plyr;
})));
diff --git a/dist/plyr.js.map b/dist/plyr.js.map
index af0205e5..58bd1c81 100644
--- a/dist/plyr.js.map
+++ b/dist/plyr.js.map
@@ -1 +1 @@
-{"version":3,"sources":["../../node_modules/loadjs/dist/loadjs.umd.js","storage.js","types.js","utils.js","support.js","html5.js","i18n.js","controls.js","captions.js","console.js","defaults.js","fullscreen.js","ui.js","listeners.js","plugins/vimeo.js","plugins/youtube.js","media.js","plugins/ads.js","source.js","plyr.js"],"names":["define","this","Storage","player","enabled","config","storage","key","supported","store","window","localStorage","getItem","utils","is","empty","json","JSON","parse","string","length","object","get","extend","setItem","stringify","test","removeItem","e","providers","types","input","getConstructor","Object","Number","isNaN","String","Boolean","Function","nullOrUndefined","Array","isArray","instanceof","WeakMap","NodeList","Element","Text","Event","TextTrackCue","VTTCue","TextTrack","kind","array","nodeList","keys","constructor","document","documentMode","documentElement","style","navigator","userAgent","platform","url","responseType","Promise","resolve","reject","request","XMLHttpRequest","addEventListener","responseText","response","Error","statusText","open","send","src","minWidth","image","Image","handler","onload","onerror","naturalWidth","assign","id","prefix","hasId","isCached","exists","getElementById","update","container","data","innerHTML","body","insertAdjacentElement","useStorage","createElement","toggleHidden","setAttribute","cached","content","fetch","then","result","catch","Math","floor","random","elements","wrapper","targets","from","reverse","forEach","element","index","child","cloneNode","parent","parentNode","sibling","nextSibling","appendChild","insertBefore","type","attributes","text","setAttributes","innerText","target","removeElement","removeChild","childNodes","lastChild","newChild","oldChild","replaceChild","entries","value","sel","existingAttributes","existing","split","selector","s","trim","className","replace","stripped","parts","start","charAt","class","hidden","hide","boolean","hasAttribute","removeAttribute","force","method","classList","contains","prototype","match","querySelectorAll","includes","matches","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","call","querySelector","focused","activeElement","toggle","focusable","getElements","first","last","trap","event","keyCode","getFocusElement","shiftKey","focus","preventDefault","on","off","callback","passive","capture","function","Node","toggleListener","events","options","support","passiveListeners","bubbles","detail","CustomEvent","dispatchEvent","args","toString","i","current","max","toFixed","parseInt","time","displayHours","inverted","number","formatTime","format","slice","hours","getHours","mins","getMinutes","secs","getSeconds","find","RegExp","toUpperCase","substr","toLowerCase","replaceAll","toTitleCase","toPascalCase","sources","source","shift","filter","item","indexOf","path","reduce","obj","prev","curr","abs","youtube","vimeo","regex","$2","parser","href","search","startsWith","parseUrl","hashes","params","hash","val","decodeURIComponent","map","encodeURIComponent","join","fragment","createDocumentFragment","firstChild","width","height","getRatio","w","h","ratio","transitionEndEvent","undefined","offsetHeight","provider","playsinline","api","ui","browser","getBrowser","canPlayInline","isIPhone","video","rangeInput","audio","webkitSetPresentationMode","WebKitPlaybackTargetAvailabilityEvent","media","isHTML5","canPlayType","isVideo","isAudio","defineProperty","removeEventListener","range","matchMedia","html5","getSources","sizes","getAttribute","dedupe","mime","currentTime","playing","onLoadedMetaData","load","play","blankVideo","debug","log","i18n","getDeep","seekTime","title","controls","URL","iconUrl","location","cors","host","isIE","svg4everybody","getElement","selectors","buttons","pause","restart","rewind","fastForward","mute","pip","airplay","settings","captions","fullscreen","progress","inputs","seek","volume","display","buffer","duration","seekTooltip","classNames","tooltip","error","warn","toggleNativeControls","namespace","getIconUrl","iconPath","iconPrefix","icon","createElementNS","use","setAttributeNS","attr","badge","menu","buttonType","button","toCamelCase","label","labelPressed","iconPressed","control","createIcon","createLabel","getAttributesFromSelector","push","controlPressed","hasClass","pressed","toggleClass","updateRangeFill","suffix","list","checked","radio","faux","insertAdjacentHTML","forceHours","setRange","muted","setProgress","getElementsByTagName","nodeValue","getPercentage","buffered","percent","isWebkit","setProperty","tooltips","clientRect","getBoundingClientRect","visible","touch","pageX","left","parseFloat","updateTimeDisplay","invert","invertTime","seeking","updateProgress","hasDuration","displayDuration","paused","updateSeekTooltip","setting","tabs","panes","quality","toggleTab","checkMenu","emptyElement","getBadge","createBadge","sort","a","b","sorting","createMenuItem","getLabel","updateSetting","pane","currentTrack","default","tracks","getTracks","track","active","language","unshift","bind","speed","isVimeo","values","some","tab","form","show","isMenuItem","isButton","stopPropagation","clone","position","opacity","name","scrollWidth","scrollHeight","isTab","transitions","reducedMotion","size","getTabSize","restore","propertyName","createButton","createRange","createProgress","createTime","inner","home","back","setQualityMenu","getQualityOptions","setSpeedMenu","loadSprite","props","create","findElements","repaint","labels","isYouTube","textTracks","setCaptionsMenu","insertAfter","hostname","protocol","createObjectURL","blob","userLanguage","setLanguage","trackEvents","meta","set","mode","updateCues","trackRemoved","currentTrackNode","firstMatch","toggleCaptions","getCurrentTrack","embed","enableTextTrack","has","fromLanguage","sortIsDefault","sorted","cues","activeCues","cue","getCueAsHTML","getHTML","cueText","changed","caption","noop","Console","console","defaults","onChange","isIos","trapFocus","toggleFallback","scrollPosition","scrollX","scrollY","scrollTo","x","y","overflow","fallback","Fullscreen","property","native","iosNative","webkitEnterFullscreen","requestFullscreen","webkitExitFullscreen","cancelFullScreen","exitFullscreen","action","enter","exit","fullscreenElement","fullscreenEnabled","webkitFullscreenEnabled","mozFullScreenEnabled","msFullscreenEnabled","prefixes","pre","uiSupported","listeners","inject","setup","loop","updateVolume","timeUpdate","checkPlaying","isTouch","ready","setTitle","poster","backgroundImage","setPoster","durationUpdate","isEmbed","iframe","enable","posterEnabled","loadPromise","loadImage","togglePoster","stopped","toggleControls","loading","timers","setTimeout","hideControls","hover","Listeners","lastKey","handleKey","toggleMenu","firstTouch","code","which","repeat","altKey","ctrlKey","metaKey","seekByKey","editable","togglePlay","increaseVolume","decreaseVolume","forward","keyboard","global","tabFocus","delay","hasAudio","resetOnEnd","checkLoading","ads","initialized","managerPromise","clickToPlay","ended","disableContextMenu","concat","inputEvent","proxy","defaultHandler","customHandlerKey","customHandler","hasCustomHandler","returned","showHomeTab","showTab","currentTarget","eventType","done","seekTo","toggleInvert","noTransition","webkitDirectionInvertedFromDevice","step","direction","deltaY","deltaX","assurePlaybackState","hasPlayed","setAspectRatio","Vimeo","loadScript","urls","sdk","padding","paddingBottom","offset","transform","autoplay","buildUrlParams","parseVimeoId","embedContainer","replaceElement","thumbnail_large","pathname","Player","autopause","disableTextTrack","stop","restorePause","setVolume","setCurrentTime","selected","setPlaybackRate","setLoop","currentSrc","getVideoUrl","all","getVideoWidth","getVideoHeight","getAspectRatio","dimensions","setAutopause","state","getVideoTitle","getCurrentTime","getDuration","getTextTracks","strippedCues","stripHTML","getPaused","frame","seconds","build","mapQualityUnit","mapQualityUnits","levels","level","YT","onYouTubeReadyCallbacks","onYouTubeIframeAPIReady","videoId","getVideoData","google","items","snippet","currentId","parseYouTubeId","generateId","posterSrc","backgroundSize","message","instance","playbackRate","getPlaybackRate","getTitle","playVideo","pauseVideo","stopVideo","getPlaybackQuality","setPlaybackQuality","getAvailablePlaybackRates","buffering","setInterval","getVideoLoadedFraction","lastBuffered","seeked","getAvailableQualityLevels","unMute","wrap","Ads","publisherId","manager","loader","cuePoints","safetyTimer","countdownTimer","ima","googleIMA","trigger","startSafetyTimer","clearSafetyTimer","setupIMA","setVpaidMode","ImaSdkSettings","VpaidMode","ENABLED","setLocale","displayContainer","AdDisplayContainer","requestAds","AdsLoader","AdsManagerLoadedEvent","Type","ADS_MANAGER_LOADED","onAdsManagerLoaded","AdErrorEvent","AD_ERROR","onAdError","AdsRequest","adTagUrl","tagUrl","linearAdSlotWidth","offsetWidth","linearAdSlotHeight","nonLinearAdSlotWidth","nonLinearAdSlotHeight","forceNonLinearFullSlot","setAdWillPlayMuted","getRemainingTime","AdsRenderingSettings","restoreCustomPlaybackStateOnAdBreakComplete","enablePreloading","getAdsManager","getCuePoints","cuePoint","seekElement","cuePercentage","AdEvent","onAdEvent","ad","getAd","LOADED","pollCountdown","isLinear","ALL_ADS_COMPLETED","loadAds","CONTENT_PAUSE_REQUESTED","pauseContent","CONTENT_RESUME_REQUESTED","resumeContent","STARTED","MIDPOINT","COMPLETE","IMPRESSION","CLICK","cancel","contentComplete","seekedTime","discardAdBreak","splice","resize","ViewMode","NORMAL","initialize","init","adError","zIndex","destroy","handlers","apply","Date","now","base","insertElement","attribute","cancelRequests","check","crossorigin","addStyleHook","insertElements","Plyr","failed","jQuery","plyr","original","tagName","getProviderByUrl","getUrlParams","truthy","webkitShowPlaybackTargetPicker","isHidden","hiding","eventName","soft","clear","unload","inputIsValid","min","end","fauxDuration","mozHasAudio","webkitAudioDecodedByteCount","audioTracks","closest","change","states","inline","webkitPresentationMode","t","cloneDeep"],"mappings":"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","file":"plyr.js","sourcesContent":["(function(root, factory) {\n if (typeof define === 'function' && define.amd) {\n define([], factory);\n } else if (typeof exports === 'object') {\n module.exports = factory();\n } else {\n root.loadjs = factory();\n }\n}(this, function() {\n/**\n * Global dependencies.\n * @global {Object} document - DOM\n */\n\nvar devnull = function() {},\n bundleIdCache = {},\n bundleResultCache = {},\n bundleCallbackQueue = {};\n\n\n/**\n * Subscribe to bundle load event.\n * @param {string[]} bundleIds - Bundle ids\n * @param {Function} callbackFn - The callback function\n */\nfunction subscribe(bundleIds, callbackFn) {\n // listify\n bundleIds = bundleIds.push ? bundleIds : [bundleIds];\n\n var depsNotFound = [],\n i = bundleIds.length,\n numWaiting = i,\n fn,\n bundleId,\n r,\n q;\n\n // define callback function\n fn = function (bundleId, pathsNotFound) {\n if (pathsNotFound.length) depsNotFound.push(bundleId);\n\n numWaiting--;\n if (!numWaiting) callbackFn(depsNotFound);\n };\n\n // register callback\n while (i--) {\n bundleId = bundleIds[i];\n\n // execute callback if in result cache\n r = bundleResultCache[bundleId];\n if (r) {\n fn(bundleId, r);\n continue;\n }\n\n // add to callback queue\n q = bundleCallbackQueue[bundleId] = bundleCallbackQueue[bundleId] || [];\n q.push(fn);\n }\n}\n\n\n/**\n * Publish bundle load event.\n * @param {string} bundleId - Bundle id\n * @param {string[]} pathsNotFound - List of files not found\n */\nfunction publish(bundleId, pathsNotFound) {\n // exit if id isn't defined\n if (!bundleId) return;\n\n var q = bundleCallbackQueue[bundleId];\n\n // cache result\n bundleResultCache[bundleId] = pathsNotFound;\n\n // exit if queue is empty\n if (!q) return;\n\n // empty callback queue\n while (q.length) {\n q[0](bundleId, pathsNotFound);\n q.splice(0, 1);\n }\n}\n\n\n/**\n * Execute callbacks.\n * @param {Object or Function} args - The callback args\n * @param {string[]} depsNotFound - List of dependencies not found\n */\nfunction executeCallbacks(args, depsNotFound) {\n // accept function as argument\n if (args.call) args = {success: args};\n\n // success and error callbacks\n if (depsNotFound.length) (args.error || devnull)(depsNotFound);\n else (args.success || devnull)(args);\n}\n\n\n/**\n * Load individual file.\n * @param {string} path - The file path\n * @param {Function} callbackFn - The callback function\n */\nfunction loadFile(path, callbackFn, args, numTries) {\n var doc = document,\n async = args.async,\n maxTries = (args.numRetries || 0) + 1,\n beforeCallbackFn = args.before || devnull,\n pathStripped = path.replace(/^(css|img)!/, ''),\n isCss,\n e;\n\n numTries = numTries || 0;\n\n if (/(^css!|\\.css$)/.test(path)) {\n isCss = true;\n\n // css\n e = doc.createElement('link');\n e.rel = 'stylesheet';\n e.href = pathStripped; //.replace(/^css!/, ''); // remove \"css!\" prefix\n } else if (/(^img!|\\.(png|gif|jpg|svg)$)/.test(path)) {\n // image\n e = doc.createElement('img');\n e.src = pathStripped; \n } else {\n // javascript\n e = doc.createElement('script');\n e.src = path;\n e.async = async === undefined ? true : async;\n }\n\n e.onload = e.onerror = e.onbeforeload = function (ev) {\n var result = ev.type[0];\n\n // Note: The following code isolates IE using `hideFocus` and treats empty\n // stylesheets as failures to get around lack of onerror support\n if (isCss && 'hideFocus' in e) {\n try {\n if (!e.sheet.cssText.length) result = 'e';\n } catch (x) {\n // sheets objects created from load errors don't allow access to\n // `cssText`\n result = 'e';\n }\n }\n\n // handle retries in case of load failure\n if (result == 'e') {\n // increment counter\n numTries += 1;\n\n // exit function and try again\n if (numTries < maxTries) {\n return loadFile(path, callbackFn, args, numTries);\n }\n }\n\n // execute callback\n callbackFn(path, result, ev.defaultPrevented);\n };\n\n // add to document (unless callback returns `false`)\n if (beforeCallbackFn(path, e) !== false) doc.head.appendChild(e);\n}\n\n\n/**\n * Load multiple files.\n * @param {string[]} paths - The file paths\n * @param {Function} callbackFn - The callback function\n */\nfunction loadFiles(paths, callbackFn, args) {\n // listify paths\n paths = paths.push ? paths : [paths];\n\n var numWaiting = paths.length,\n x = numWaiting,\n pathsNotFound = [],\n fn,\n i;\n\n // define callback function\n fn = function(path, result, defaultPrevented) {\n // handle error\n if (result == 'e') pathsNotFound.push(path);\n\n // handle beforeload event. If defaultPrevented then that means the load\n // will be blocked (ex. Ghostery/ABP on Safari)\n if (result == 'b') {\n if (defaultPrevented) pathsNotFound.push(path);\n else return;\n }\n\n numWaiting--;\n if (!numWaiting) callbackFn(pathsNotFound);\n };\n\n // load scripts\n for (i=0; i < x; i++) loadFile(paths[i], fn, args);\n}\n\n\n/**\n * Initiate script load and register bundle.\n * @param {(string|string[])} paths - The file paths\n * @param {(string|Function)} [arg1] - The bundleId or success callback\n * @param {Function} [arg2] - The success or error callback\n * @param {Function} [arg3] - The error callback\n */\nfunction loadjs(paths, arg1, arg2) {\n var bundleId,\n args;\n\n // bundleId (if string)\n if (arg1 && arg1.trim) bundleId = arg1;\n\n // args (default is {})\n args = (bundleId ? arg2 : arg1) || {};\n\n // throw error if bundle is already defined\n if (bundleId) {\n if (bundleId in bundleIdCache) {\n throw \"LoadJS\";\n } else {\n bundleIdCache[bundleId] = true;\n }\n }\n\n // load scripts\n loadFiles(paths, function (pathsNotFound) {\n // execute callbacks\n executeCallbacks(args, pathsNotFound);\n\n // publish bundle load event\n publish(bundleId, pathsNotFound);\n }, args);\n}\n\n\n/**\n * Execute callbacks when dependencies have been satisfied.\n * @param {(string|string[])} deps - List of bundle ids\n * @param {Object} args - success/error arguments\n */\nloadjs.ready = function ready(deps, args) {\n // subscribe to bundle load event\n subscribe(deps, function (depsNotFound) {\n // execute callbacks\n executeCallbacks(args, depsNotFound);\n });\n\n return loadjs;\n};\n\n\n/**\n * Manually satisfy bundle dependencies.\n * @param {string} bundleId - The bundle id\n */\nloadjs.done = function done(bundleId) {\n publish(bundleId, []);\n};\n\n\n/**\n * Reset loadjs dependencies statuses\n */\nloadjs.reset = function reset() {\n bundleIdCache = {};\n bundleResultCache = {};\n bundleCallbackQueue = {};\n};\n\n\n/**\n * Determine if bundle has already been defined\n * @param String} bundleId - The bundle id\n */\nloadjs.isDefined = function isDefined(bundleId) {\n return bundleId in bundleIdCache;\n};\n\n\n// export\nreturn loadjs;\n\n}));\n","// ==========================================================================\n// Plyr storage\n// ==========================================================================\n\nimport utils from './utils';\n\nclass Storage {\n constructor(player) {\n this.enabled = player.config.storage.enabled;\n this.key = player.config.storage.key;\n }\n\n // Check for actual support (see if we can use it)\n static get supported() {\n try {\n if (!('localStorage' in window)) {\n return false;\n }\n\n const test = '___test';\n\n // Try to use it (it might be disabled, e.g. user is in private mode)\n // see: https://github.com/sampotts/plyr/issues/131\n window.localStorage.setItem(test, test);\n window.localStorage.removeItem(test);\n\n return true;\n } catch (e) {\n return false;\n }\n }\n\n get(key) {\n if (!Storage.supported || !this.enabled) {\n return null;\n }\n\n const store = window.localStorage.getItem(this.key);\n\n if (utils.is.empty(store)) {\n return null;\n }\n\n const json = JSON.parse(store);\n\n return utils.is.string(key) && key.length ? json[key] : json;\n }\n\n set(object) {\n // Bail if we don't have localStorage support or it's disabled\n if (!Storage.supported || !this.enabled) {\n return;\n }\n\n // Can only store objectst\n if (!utils.is.object(object)) {\n return;\n }\n\n // Get current storage\n let storage = this.get();\n\n // Default to empty object\n if (utils.is.empty(storage)) {\n storage = {};\n }\n\n // Update the working copy of the values\n utils.extend(storage, object);\n\n // Update storage\n window.localStorage.setItem(this.key, JSON.stringify(storage));\n }\n}\n\nexport default Storage;\n","// ==========================================================================\n// Plyr supported types and providers\n// ==========================================================================\n\nexport const providers = {\n html5: 'html5',\n youtube: 'youtube',\n vimeo: 'vimeo',\n};\n\nexport const types = {\n audio: 'audio',\n video: 'video',\n};\n\nexport default { providers, types };\n","// ==========================================================================\n// Plyr utils\n// ==========================================================================\n\nimport loadjs from 'loadjs';\nimport Storage from './storage';\nimport support from './support';\nimport { providers } from './types';\n\nconst utils = {\n // Check variable types\n is: {\n object(input) {\n return utils.getConstructor(input) === Object;\n },\n number(input) {\n return utils.getConstructor(input) === Number && !Number.isNaN(input);\n },\n string(input) {\n return utils.getConstructor(input) === String;\n },\n boolean(input) {\n return utils.getConstructor(input) === Boolean;\n },\n function(input) {\n return utils.getConstructor(input) === Function;\n },\n array(input) {\n return !utils.is.nullOrUndefined(input) && Array.isArray(input);\n },\n weakMap(input) {\n return utils.is.instanceof(input, WeakMap);\n },\n nodeList(input) {\n return utils.is.instanceof(input, NodeList);\n },\n element(input) {\n return utils.is.instanceof(input, Element);\n },\n textNode(input) {\n return utils.getConstructor(input) === Text;\n },\n event(input) {\n return utils.is.instanceof(input, Event);\n },\n cue(input) {\n return utils.is.instanceof(input, window.TextTrackCue) || utils.is.instanceof(input, window.VTTCue);\n },\n track(input) {\n return utils.is.instanceof(input, TextTrack) || (!utils.is.nullOrUndefined(input) && utils.is.string(input.kind));\n },\n url(input) {\n return !utils.is.nullOrUndefined(input) && /(ftp|http|https):\\/\\/(\\w+:{0,1}\\w*@)?(\\S+)(:[0-9]+)?(\\/|\\/([\\w#!:.?+=&%@!\\-/]))?/.test(input);\n },\n nullOrUndefined(input) {\n return input === null || typeof input === 'undefined';\n },\n empty(input) {\n return (\n utils.is.nullOrUndefined(input) ||\n ((utils.is.string(input) || utils.is.array(input) || utils.is.nodeList(input)) && !input.length) ||\n (utils.is.object(input) && !Object.keys(input).length)\n );\n },\n instanceof(input, constructor) {\n return Boolean(input && constructor && input instanceof constructor);\n },\n },\n\n getConstructor(input) {\n return !utils.is.nullOrUndefined(input) ? input.constructor : null;\n },\n\n // Unfortunately, due to mixed support, UA sniffing is required\n getBrowser() {\n return {\n isIE: /* @cc_on!@ */ false || !!document.documentMode,\n isWebkit: 'WebkitAppearance' in document.documentElement.style && !/Edge/.test(navigator.userAgent),\n isIPhone: /(iPhone|iPod)/gi.test(navigator.platform),\n isIos: /(iPad|iPhone|iPod)/gi.test(navigator.platform),\n };\n },\n\n // Fetch wrapper\n // Using XHR to avoid issues with older browsers\n fetch(url, responseType = 'text') {\n return new Promise((resolve, reject) => {\n try {\n const request = new XMLHttpRequest();\n\n // Check for CORS support\n if (!('withCredentials' in request)) {\n return;\n }\n\n request.addEventListener('load', () => {\n if (responseType === 'text') {\n try {\n resolve(JSON.parse(request.responseText));\n } catch (e) {\n resolve(request.responseText);\n }\n } else {\n resolve(request.response);\n }\n });\n\n request.addEventListener('error', () => {\n throw new Error(request.statusText);\n });\n\n request.open('GET', url, true);\n\n // Set the required response type\n request.responseType = responseType;\n\n request.send();\n } catch (e) {\n reject(e);\n }\n });\n },\n\n // Load image avoiding xhr/fetch CORS issues\n // Server status can't be obtained this way unfortunately, so this uses \"naturalWidth\" to determine if the image has loaded.\n // By default it checks if it is at least 1px, but you can add a second argument to change this.\n loadImage(src, minWidth = 1) {\n return new Promise((resolve, reject) => {\n const image = new Image();\n const handler = () => {\n delete image.onload;\n delete image.onerror;\n (image.naturalWidth >= minWidth ? resolve : reject)(image);\n };\n Object.assign(image, {onload: handler, onerror: handler, src});\n });\n },\n\n // Load an external script\n loadScript(url) {\n return new Promise((resolve, reject) => {\n loadjs(url, {\n success: resolve,\n error: reject,\n });\n });\n },\n\n // Load an external SVG sprite\n loadSprite(url, id) {\n if (!utils.is.string(url)) {\n return;\n }\n\n const prefix = 'cache';\n const hasId = utils.is.string(id);\n let isCached = false;\n\n const exists = () => document.getElementById(id) !== null;\n\n const update = (container, data) => {\n container.innerHTML = data;\n\n // Check again incase of race condition\n if (hasId && exists()) {\n return;\n }\n\n // Inject the SVG to the body\n document.body.insertAdjacentElement('afterbegin', container);\n };\n\n // Only load once if ID set\n if (!hasId || !exists()) {\n const useStorage = Storage.supported;\n\n // Create container\n const container = document.createElement('div');\n utils.toggleHidden(container, true);\n\n if (hasId) {\n container.setAttribute('id', id);\n }\n\n // Check in cache\n if (useStorage) {\n const cached = window.localStorage.getItem(`${prefix}-${id}`);\n isCached = cached !== null;\n\n if (isCached) {\n const data = JSON.parse(cached);\n update(container, data.content);\n }\n }\n\n // Get the sprite\n utils\n .fetch(url)\n .then(result => {\n if (utils.is.empty(result)) {\n return;\n }\n\n if (useStorage) {\n window.localStorage.setItem(\n `${prefix}-${id}`,\n JSON.stringify({\n content: result,\n }),\n );\n }\n\n update(container, result);\n })\n .catch(() => {});\n }\n },\n\n // Generate a random ID\n generateId(prefix) {\n return `${prefix}-${Math.floor(Math.random() * 10000)}`;\n },\n\n // Wrap an element\n wrap(elements, wrapper) {\n // Convert `elements` to an array, if necessary.\n const targets = elements.length ? elements : [elements];\n\n // Loops backwards to prevent having to clone the wrapper on the\n // first element (see `child` below).\n Array.from(targets)\n .reverse()\n .forEach((element, index) => {\n const child = index > 0 ? wrapper.cloneNode(true) : wrapper;\n\n // Cache the current parent and sibling.\n const parent = element.parentNode;\n const sibling = element.nextSibling;\n\n // Wrap the element (is automatically removed from its current\n // parent).\n child.appendChild(element);\n\n // If the element had a sibling, insert the wrapper before\n // the sibling to maintain the HTML structure; otherwise, just\n // append it to the parent.\n if (sibling) {\n parent.insertBefore(child, sibling);\n } else {\n parent.appendChild(child);\n }\n });\n },\n\n // Create a DocumentFragment\n createElement(type, attributes, text) {\n // Create a new <element>\n const element = document.createElement(type);\n\n // Set all passed attributes\n if (utils.is.object(attributes)) {\n utils.setAttributes(element, attributes);\n }\n\n // Add text node\n if (utils.is.string(text)) {\n element.innerText = text;\n }\n\n // Return built element\n return element;\n },\n\n // Inaert an element after another\n insertAfter(element, target) {\n target.parentNode.insertBefore(element, target.nextSibling);\n },\n\n // Insert a DocumentFragment\n insertElement(type, parent, attributes, text) {\n // Inject the new <element>\n parent.appendChild(utils.createElement(type, attributes, text));\n },\n\n // Remove element(s)\n removeElement(element) {\n if (utils.is.nodeList(element) || utils.is.array(element)) {\n Array.from(element).forEach(utils.removeElement);\n return;\n }\n\n if (!utils.is.element(element) || !utils.is.element(element.parentNode)) {\n return;\n }\n\n element.parentNode.removeChild(element);\n },\n\n // Remove all child elements\n emptyElement(element) {\n let { length } = element.childNodes;\n\n while (length > 0) {\n element.removeChild(element.lastChild);\n length -= 1;\n }\n },\n\n // Replace element\n replaceElement(newChild, oldChild) {\n if (!utils.is.element(oldChild) || !utils.is.element(oldChild.parentNode) || !utils.is.element(newChild)) {\n return null;\n }\n\n oldChild.parentNode.replaceChild(newChild, oldChild);\n\n return newChild;\n },\n\n // Set attributes\n setAttributes(element, attributes) {\n if (!utils.is.element(element) || utils.is.empty(attributes)) {\n return;\n }\n\n Object.entries(attributes).forEach(([\n key,\n value,\n ]) => {\n element.setAttribute(key, value);\n });\n },\n\n // Get an attribute object from a string selector\n getAttributesFromSelector(sel, existingAttributes) {\n // For example:\n // '.test' to { class: 'test' }\n // '#test' to { id: 'test' }\n // '[data-test=\"test\"]' to { 'data-test': 'test' }\n\n if (!utils.is.string(sel) || utils.is.empty(sel)) {\n return {};\n }\n\n const attributes = {};\n const existing = existingAttributes;\n\n sel.split(',').forEach(s => {\n // Remove whitespace\n const selector = s.trim();\n const className = selector.replace('.', '');\n const stripped = selector.replace(/[[\\]]/g, '');\n\n // Get the parts and value\n const parts = stripped.split('=');\n const key = parts[0];\n const value = parts.length > 1 ? parts[1].replace(/[\"']/g, '') : '';\n\n // Get the first character\n const start = selector.charAt(0);\n\n switch (start) {\n case '.':\n // Add to existing classname\n if (utils.is.object(existing) && utils.is.string(existing.class)) {\n existing.class += ` ${className}`;\n }\n\n attributes.class = className;\n break;\n\n case '#':\n // ID selector\n attributes.id = selector.replace('#', '');\n break;\n\n case '[':\n // Attribute selector\n attributes[key] = value;\n\n break;\n\n default:\n break;\n }\n });\n\n return attributes;\n },\n\n // Toggle hidden\n toggleHidden(element, hidden) {\n if (!utils.is.element(element)) {\n return;\n }\n\n let hide = hidden;\n\n if (!utils.is.boolean(hide)) {\n hide = !element.hasAttribute('hidden');\n }\n\n if (hide) {\n element.setAttribute('hidden', '');\n } else {\n element.removeAttribute('hidden');\n }\n },\n\n // Mirror Element.classList.toggle, with IE compatibility for \"force\" argument\n toggleClass(element, className, force) {\n if (utils.is.element(element)) {\n let method = 'toggle';\n if (typeof force !== 'undefined') {\n method = force ? 'add' : 'remove';\n }\n\n element.classList[method](className);\n return element.classList.contains(className);\n }\n\n return null;\n },\n\n // Has class name\n hasClass(element, className) {\n return utils.is.element(element) && element.classList.contains(className);\n },\n\n // Element matches selector\n matches(element, selector) {\n const prototype = { Element };\n\n function match() {\n return Array.from(document.querySelectorAll(selector)).includes(this);\n }\n\n const matches = prototype.matches || prototype.webkitMatchesSelector || prototype.mozMatchesSelector || prototype.msMatchesSelector || match;\n\n return matches.call(element, selector);\n },\n\n // Find all elements\n getElements(selector) {\n return this.elements.container.querySelectorAll(selector);\n },\n\n // Find a single element\n getElement(selector) {\n return this.elements.container.querySelector(selector);\n },\n\n // Get the focused element\n getFocusElement() {\n let focused = document.activeElement;\n\n if (!focused || focused === document.body) {\n focused = null;\n } else {\n focused = document.querySelector(':focus');\n }\n\n return focused;\n },\n\n // Trap focus inside container\n trapFocus(element = null, toggle = false) {\n if (!utils.is.element(element)) {\n return;\n }\n\n const focusable = utils.getElements.call(this, 'button:not(:disabled), input:not(:disabled), [tabindex]');\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n\n const trap = event => {\n // Bail if not tab key or not fullscreen\n if (event.key !== 'Tab' || event.keyCode !== 9) {\n return;\n }\n\n // Get the current focused element\n const focused = utils.getFocusElement();\n\n if (focused === last && !event.shiftKey) {\n // Move focus to first element that can be tabbed if Shift isn't used\n first.focus();\n event.preventDefault();\n } else if (focused === first && event.shiftKey) {\n // Move focus to last element that can be tabbed if Shift is used\n last.focus();\n event.preventDefault();\n }\n };\n\n if (toggle) {\n utils.on(this.elements.container, 'keydown', trap, false);\n } else {\n utils.off(this.elements.container, 'keydown', trap, false);\n }\n },\n\n // Toggle event listener\n toggleListener(elements, event, callback, toggle = false, passive = true, capture = false) {\n // Bail if no elemetns, event, or callback\n if (utils.is.empty(elements) || utils.is.empty(event) || !utils.is.function(callback)) {\n return;\n }\n\n // If a nodelist is passed, call itself on each node\n if (utils.is.nodeList(elements) || utils.is.array(elements)) {\n // Create listener for each node\n Array.from(elements).forEach(element => {\n if (element instanceof Node) {\n utils.toggleListener.call(null, element, event, callback, toggle, passive, capture);\n }\n });\n\n return;\n }\n\n // Allow multiple events\n const events = event.split(' ');\n\n // Build options\n // Default to just the capture boolean for browsers with no passive listener support\n let options = capture;\n\n // If passive events listeners are supported\n if (support.passiveListeners) {\n options = {\n // Whether the listener can be passive (i.e. default never prevented)\n passive,\n // Whether the listener is a capturing listener or not\n capture,\n };\n }\n\n // If a single node is passed, bind the event listener\n events.forEach(type => {\n elements[toggle ? 'addEventListener' : 'removeEventListener'](type, callback, options);\n });\n },\n\n // Bind event handler\n on(element, events = '', callback, passive = true, capture = false) {\n utils.toggleListener(element, events, callback, true, passive, capture);\n },\n\n // Unbind event handler\n off(element, events = '', callback, passive = true, capture = false) {\n utils.toggleListener(element, events, callback, false, passive, capture);\n },\n\n // Trigger event\n dispatchEvent(element, type = '', bubbles = false, detail = {}) {\n // Bail if no element\n if (!utils.is.element(element) || utils.is.empty(type)) {\n return;\n }\n\n // Create and dispatch the event\n const event = new CustomEvent(type, {\n bubbles,\n detail: Object.assign({}, detail, {\n plyr: this,\n }),\n });\n\n // Dispatch the event\n element.dispatchEvent(event);\n },\n\n // Format string\n format(input, ...args) {\n if (utils.is.empty(input)) {\n return input;\n }\n\n return input.toString().replace(/{(\\d+)}/g, (match, i) => (utils.is.string(args[i]) ? args[i] : ''));\n },\n\n // Get percentage\n getPercentage(current, max) {\n if (current === 0 || max === 0 || Number.isNaN(current) || Number.isNaN(max)) {\n return 0;\n }\n\n return (current / max * 100).toFixed(2);\n },\n\n // Time helpers\n getHours(value) {\n return parseInt((value / 60 / 60) % 60, 10);\n },\n getMinutes(value) {\n return parseInt((value / 60) % 60, 10);\n },\n getSeconds(value) {\n return parseInt(value % 60, 10);\n },\n\n // Format time to UI friendly string\n formatTime(time = 0, displayHours = false, inverted = false) {\n // Bail if the value isn't a number\n if (!utils.is.number(time)) {\n return utils.formatTime(null, displayHours, inverted);\n }\n\n // Format time component to add leading zero\n const format = value => `0${value}`.slice(-2);\n\n // Breakdown to hours, mins, secs\n let hours = utils.getHours(time);\n const mins = utils.getMinutes(time);\n const secs = utils.getSeconds(time);\n\n // Do we need to display hours?\n if (displayHours || hours > 0) {\n hours = `${hours}:`;\n } else {\n hours = '';\n }\n\n // Render\n return `${inverted ? '-' : ''}${hours}${format(mins)}:${format(secs)}`;\n },\n\n // Replace all occurances of a string in a string\n replaceAll(input = '', find = '', replace = '') {\n return input.replace(new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\\]/\\\\])/g, '\\\\$1'), 'g'), replace.toString());\n },\n\n // Convert to title case\n toTitleCase(input = '') {\n return input.toString().replace(/\\w\\S*/g, text => text.charAt(0).toUpperCase() + text.substr(1).toLowerCase());\n },\n\n // Convert string to pascalCase\n toPascalCase(input = '') {\n let string = input.toString();\n\n // Convert kebab case\n string = utils.replaceAll(string, '-', ' ');\n\n // Convert snake case\n string = utils.replaceAll(string, '_', ' ');\n\n // Convert to title case\n string = utils.toTitleCase(string);\n\n // Convert to pascal case\n return utils.replaceAll(string, ' ', '');\n },\n\n // Convert string to pascalCase\n toCamelCase(input = '') {\n let string = input.toString();\n\n // Convert to pascal case\n string = utils.toPascalCase(string);\n\n // Convert first character to lowercase\n return string.charAt(0).toLowerCase() + string.slice(1);\n },\n\n // Deep extend destination object with N more objects\n extend(target = {}, ...sources) {\n if (!sources.length) {\n return target;\n }\n\n const source = sources.shift();\n\n if (!utils.is.object(source)) {\n return target;\n }\n\n Object.keys(source).forEach(key => {\n if (utils.is.object(source[key])) {\n if (!Object.keys(target).includes(key)) {\n Object.assign(target, { [key]: {} });\n }\n\n utils.extend(target[key], source[key]);\n } else {\n Object.assign(target, { [key]: source[key] });\n }\n });\n\n return utils.extend(target, ...sources);\n },\n\n // Remove duplicates in an array\n dedupe(array) {\n if (!utils.is.array(array)) {\n return array;\n }\n\n return array.filter((item, index) => array.indexOf(item) === index);\n },\n\n // Clone nested objects\n cloneDeep(object) {\n return JSON.parse(JSON.stringify(object));\n },\n\n // Get a nested value in an object\n getDeep(object, path) {\n return path.split('.').reduce((obj, key) => obj && obj[key], object);\n },\n\n // Get the closest value in an array\n closest(array, value) {\n if (!utils.is.array(array) || !array.length) {\n return null;\n }\n\n return array.reduce((prev, curr) => (Math.abs(curr - value) < Math.abs(prev - value) ? curr : prev));\n },\n\n // Get the provider for a given URL\n getProviderByUrl(url) {\n // YouTube\n if (/^(https?:\\/\\/)?(www\\.)?(youtube\\.com|youtu\\.?be)\\/.+$/.test(url)) {\n return providers.youtube;\n }\n\n // Vimeo\n if (/^https?:\\/\\/player.vimeo.com\\/video\\/\\d{0,9}(?=\\b|\\/)/.test(url)) {\n return providers.vimeo;\n }\n\n return null;\n },\n\n // Parse YouTube ID from URL\n parseYouTubeId(url) {\n if (utils.is.empty(url)) {\n return null;\n }\n\n const regex = /^.*(youtu.be\\/|v\\/|u\\/\\w\\/|embed\\/|watch\\?v=|&v=)([^#&?]*).*/;\n return url.match(regex) ? RegExp.$2 : url;\n },\n\n // Parse Vimeo ID from URL\n parseVimeoId(url) {\n if (utils.is.empty(url)) {\n return null;\n }\n\n if (utils.is.number(Number(url))) {\n return url;\n }\n\n const regex = /^.*(vimeo.com\\/|video\\/)(\\d+).*/;\n return url.match(regex) ? RegExp.$2 : url;\n },\n\n // Convert a URL to a location object\n parseUrl(url) {\n const parser = document.createElement('a');\n parser.href = url;\n return parser;\n },\n\n // Get URL query parameters\n getUrlParams(input) {\n let search = input;\n\n // Parse URL if needed\n if (input.startsWith('http://') || input.startsWith('https://')) {\n ({ search } = utils.parseUrl(input));\n }\n\n if (utils.is.empty(search)) {\n return null;\n }\n\n const hashes = search.slice(search.indexOf('?') + 1).split('&');\n\n return hashes.reduce((params, hash) => {\n const [\n key,\n val,\n ] = hash.split('=');\n\n return Object.assign(params, { [key]: decodeURIComponent(val) });\n }, {});\n },\n\n // Convert object to URL parameters\n buildUrlParams(input) {\n if (!utils.is.object(input)) {\n return '';\n }\n\n return Object.keys(input)\n .map(key => `${encodeURIComponent(key)}=${encodeURIComponent(input[key])}`)\n .join('&');\n },\n\n // Remove HTML from a string\n stripHTML(source) {\n const fragment = document.createDocumentFragment();\n const element = document.createElement('div');\n fragment.appendChild(element);\n element.innerHTML = source;\n return fragment.firstChild.innerText;\n },\n\n // Like outerHTML, but also works for DocumentFragment\n getHTML(element) {\n const wrapper = document.createElement('div');\n wrapper.appendChild(element);\n return wrapper.innerHTML;\n },\n\n // Get aspect ratio for dimensions\n getAspectRatio(width, height) {\n const getRatio = (w, h) => (h === 0 ? w : getRatio(h, w % h));\n const ratio = getRatio(width, height);\n return `${width / ratio}:${height / ratio}`;\n },\n\n // Get the transition end event\n get transitionEndEvent() {\n const element = document.createElement('span');\n\n const events = {\n WebkitTransition: 'webkitTransitionEnd',\n MozTransition: 'transitionend',\n OTransition: 'oTransitionEnd otransitionend',\n transition: 'transitionend',\n };\n\n const type = Object.keys(events).find(event => element.style[event] !== undefined);\n\n return utils.is.string(type) ? events[type] : false;\n },\n\n // Force repaint of element\n repaint(element) {\n setTimeout(() => {\n utils.toggleHidden(element, true);\n element.offsetHeight; // eslint-disable-line\n utils.toggleHidden(element, false);\n }, 0);\n },\n};\n\nexport default utils;\n","// ==========================================================================\n// Plyr support checks\n// ==========================================================================\n\nimport utils from './utils';\n\n// Check for feature support\nconst support = {\n // Basic support\n audio: 'canPlayType' in document.createElement('audio'),\n video: 'canPlayType' in document.createElement('video'),\n\n // Check for support\n // Basic functionality vs full UI\n check(type, provider, playsinline) {\n let api = false;\n let ui = false;\n const browser = utils.getBrowser();\n const canPlayInline = browser.isIPhone && playsinline && support.playsinline;\n\n switch (`${provider}:${type}`) {\n case 'html5:video':\n api = support.video;\n ui = api && support.rangeInput && (!browser.isIPhone || canPlayInline);\n break;\n\n case 'html5:audio':\n api = support.audio;\n ui = api && support.rangeInput;\n break;\n\n case 'youtube:video':\n case 'vimeo:video':\n api = true;\n ui = support.rangeInput && (!browser.isIPhone || canPlayInline);\n break;\n\n default:\n api = support.audio && support.video;\n ui = api && support.rangeInput;\n }\n\n return {\n api,\n ui,\n };\n },\n\n // Picture-in-picture support\n // Safari only currently\n pip: (() => {\n const browser = utils.getBrowser();\n return !browser.isIPhone && utils.is.function(utils.createElement('video').webkitSetPresentationMode);\n })(),\n\n // Airplay support\n // Safari only currently\n airplay: utils.is.function(window.WebKitPlaybackTargetAvailabilityEvent),\n\n // Inline playback support\n // https://webkit.org/blog/6784/new-video-policies-for-ios/\n playsinline: 'playsInline' in document.createElement('video'),\n\n // Check for mime type support against a player instance\n // Credits: http://diveintohtml5.info/everything.html\n // Related: http://www.leanbackplayer.com/test/h5mt.html\n mime(type) {\n const { media } = this;\n\n try {\n // Bail if no checking function\n if (!this.isHTML5 || !utils.is.function(media.canPlayType)) {\n return false;\n }\n\n // Check directly if codecs specified\n if (type.includes('codecs=')) {\n return media.canPlayType(type).replace(/no/, '');\n }\n\n // Type specific checks\n if (this.isVideo) {\n switch (type) {\n case 'video/webm':\n return media.canPlayType('video/webm; codecs=\"vp8, vorbis\"').replace(/no/, '');\n\n case 'video/mp4':\n return media.canPlayType('video/mp4; codecs=\"avc1.42E01E, mp4a.40.2\"').replace(/no/, '');\n\n case 'video/ogg':\n return media.canPlayType('video/ogg; codecs=\"theora\"').replace(/no/, '');\n\n default:\n return false;\n }\n } else if (this.isAudio) {\n switch (type) {\n case 'audio/mpeg':\n return media.canPlayType('audio/mpeg;').replace(/no/, '');\n\n case 'audio/ogg':\n return media.canPlayType('audio/ogg; codecs=\"vorbis\"').replace(/no/, '');\n\n case 'audio/wav':\n return media.canPlayType('audio/wav; codecs=\"1\"').replace(/no/, '');\n\n default:\n return false;\n }\n }\n } catch (e) {\n return false;\n }\n\n // If we got this far, we're stuffed\n return false;\n },\n\n // Check for textTracks support\n textTracks: 'textTracks' in document.createElement('video'),\n\n // Check for passive event listener support\n // https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md\n // https://www.youtube.com/watch?v=NPM6172J22g\n passiveListeners: (() => {\n // Test via a getter in the options object to see if the passive property is accessed\n let supported = false;\n try {\n const options = Object.defineProperty({}, 'passive', {\n get() {\n supported = true;\n return null;\n },\n });\n window.addEventListener('test', null, options);\n window.removeEventListener('test', null, options);\n } catch (e) {\n // Do nothing\n }\n\n return supported;\n })(),\n\n // <input type=\"range\"> Sliders\n rangeInput: (() => {\n const range = document.createElement('input');\n range.type = 'range';\n return range.type === 'range';\n })(),\n\n // Touch\n // NOTE: Remember a device can be mouse + touch enabled so we check on first touch event\n touch: 'ontouchstart' in document.documentElement,\n\n // Detect transitions support\n transitions: utils.transitionEndEvent !== false,\n\n // Reduced motion iOS & MacOS setting\n // https://webkit.org/blog/7551/responsive-design-for-motion/\n reducedMotion: 'matchMedia' in window && window.matchMedia('(prefers-reduced-motion)').matches,\n};\n\nexport default support;\n","// ==========================================================================\n// Plyr HTML5 helpers\n// ==========================================================================\n\nimport support from './support';\nimport utils from './utils';\n\nconst html5 = {\n getSources() {\n if (!this.isHTML5) {\n return null;\n }\n\n return this.media.querySelectorAll('source');\n },\n\n // Get quality levels\n getQualityOptions() {\n if (!this.isHTML5) {\n return null;\n }\n\n // Get sources\n const sources = html5.getSources.call(this);\n\n if (utils.is.empty(sources)) {\n return null;\n }\n\n // Get <source> with size attribute\n const sizes = Array.from(sources).filter(source => !utils.is.empty(source.getAttribute('size')));\n\n // If none, bail\n if (utils.is.empty(sizes)) {\n return null;\n }\n\n // Reduce to unique list\n return utils.dedupe(sizes.map(source => Number(source.getAttribute('size'))));\n },\n\n extend() {\n if (!this.isHTML5) {\n return;\n }\n\n const player = this;\n\n // Quality\n Object.defineProperty(player.media, 'quality', {\n get() {\n // Get sources\n const sources = html5.getSources.call(player);\n\n if (utils.is.empty(sources)) {\n return null;\n }\n\n const matches = Array.from(sources).filter(source => source.getAttribute('src') === player.source);\n\n if (utils.is.empty(matches)) {\n return null;\n }\n\n return Number(matches[0].getAttribute('size'));\n },\n set(input) {\n // Get sources\n const sources = html5.getSources.call(player);\n\n if (utils.is.empty(sources)) {\n return;\n }\n\n // Get matches for requested size\n const matches = Array.from(sources).filter(source => Number(source.getAttribute('size')) === input);\n\n // No matches for requested size\n if (utils.is.empty(matches)) {\n return;\n }\n\n // Get supported sources\n const supported = matches.filter(source => support.mime.call(player, source.getAttribute('type')));\n\n // No supported sources\n if (utils.is.empty(supported)) {\n return;\n }\n\n // Trigger change event\n utils.dispatchEvent.call(player, player.media, 'qualityrequested', false, {\n quality: input,\n });\n\n // Get current state\n const { currentTime, playing } = player;\n\n // Set new source\n player.media.src = supported[0].getAttribute('src');\n\n // Restore time\n const onLoadedMetaData = () => {\n player.currentTime = currentTime;\n player.off('loadedmetadata', onLoadedMetaData);\n };\n player.on('loadedmetadata', onLoadedMetaData);\n\n // Load new source\n player.media.load();\n\n // Resume playing\n if (playing) {\n player.play();\n }\n\n // Trigger change event\n utils.dispatchEvent.call(player, player.media, 'qualitychange', false, {\n quality: input,\n });\n },\n });\n },\n\n // Cancel current network requests\n // See https://github.com/sampotts/plyr/issues/174\n cancelRequests() {\n if (!this.isHTML5) {\n return;\n }\n\n // Remove child sources\n utils.removeElement(html5.getSources());\n\n // Set blank video src attribute\n // This is to prevent a MEDIA_ERR_SRC_NOT_SUPPORTED error\n // Info: http://stackoverflow.com/questions/32231579/how-to-properly-dispose-of-an-html5-video-and-close-socket-or-connection\n this.media.setAttribute('src', this.config.blankVideo);\n\n // Load the new empty source\n // This will cancel existing requests\n // See https://github.com/sampotts/plyr/issues/174\n this.media.load();\n\n // Debugging\n this.debug.log('Cancelled network requests');\n },\n};\n\nexport default html5;\n","// ==========================================================================\n// Plyr internationalization\n// ==========================================================================\n\nimport utils from './utils';\n\nconst i18n = {\n get(key = '', config = {}) {\n if (utils.is.empty(key) || utils.is.empty(config)) {\n return '';\n }\n\n let string = utils.getDeep(config.i18n, key);\n\n if (utils.is.empty(string)) {\n return '';\n }\n\n const replace = {\n '{seektime}': config.seekTime,\n '{title}': config.title,\n };\n\n Object.entries(replace).forEach(([\n key,\n value,\n ]) => {\n string = utils.replaceAll(string, key, value);\n });\n\n return string;\n },\n};\n\nexport default i18n;\n","// ==========================================================================\n// Plyr controls\n// ==========================================================================\n\nimport captions from './captions';\nimport html5 from './html5';\nimport i18n from './i18n';\nimport support from './support';\nimport utils from './utils';\n\n// Sniff out the browser\nconst browser = utils.getBrowser();\n\nconst controls = {\n // Get icon URL\n getIconUrl() {\n const url = new URL(this.config.iconUrl, window.location);\n const cors = url.host !== window.location.host || (browser.isIE && !window.svg4everybody);\n\n return {\n url: this.config.iconUrl,\n cors,\n };\n },\n\n // Find the UI controls and store references in custom controls\n // TODO: Allow settings menus with custom controls\n findElements() {\n try {\n this.elements.controls = utils.getElement.call(this, this.config.selectors.controls.wrapper);\n\n // Buttons\n this.elements.buttons = {\n play: utils.getElements.call(this, this.config.selectors.buttons.play),\n pause: utils.getElement.call(this, this.config.selectors.buttons.pause),\n restart: utils.getElement.call(this, this.config.selectors.buttons.restart),\n rewind: utils.getElement.call(this, this.config.selectors.buttons.rewind),\n fastForward: utils.getElement.call(this, this.config.selectors.buttons.fastForward),\n mute: utils.getElement.call(this, this.config.selectors.buttons.mute),\n pip: utils.getElement.call(this, this.config.selectors.buttons.pip),\n airplay: utils.getElement.call(this, this.config.selectors.buttons.airplay),\n settings: utils.getElement.call(this, this.config.selectors.buttons.settings),\n captions: utils.getElement.call(this, this.config.selectors.buttons.captions),\n fullscreen: utils.getElement.call(this, this.config.selectors.buttons.fullscreen),\n };\n\n // Progress\n this.elements.progress = utils.getElement.call(this, this.config.selectors.progress);\n\n // Inputs\n this.elements.inputs = {\n seek: utils.getElement.call(this, this.config.selectors.inputs.seek),\n volume: utils.getElement.call(this, this.config.selectors.inputs.volume),\n };\n\n // Display\n this.elements.display = {\n buffer: utils.getElement.call(this, this.config.selectors.display.buffer),\n currentTime: utils.getElement.call(this, this.config.selectors.display.currentTime),\n duration: utils.getElement.call(this, this.config.selectors.display.duration),\n };\n\n // Seek tooltip\n if (utils.is.element(this.elements.progress)) {\n this.elements.display.seekTooltip = this.elements.progress.querySelector(`.${this.config.classNames.tooltip}`);\n }\n\n return true;\n } catch (error) {\n // Log it\n this.debug.warn('It looks like there is a problem with your custom controls HTML', error);\n\n // Restore native video controls\n this.toggleNativeControls(true);\n\n return false;\n }\n },\n\n // Create <svg> icon\n createIcon(type, attributes) {\n const namespace = 'http://www.w3.org/2000/svg';\n const iconUrl = controls.getIconUrl.call(this);\n const iconPath = `${!iconUrl.cors ? iconUrl.url : ''}#${this.config.iconPrefix}`;\n\n // Create <svg>\n const icon = document.createElementNS(namespace, 'svg');\n utils.setAttributes(\n icon,\n utils.extend(attributes, {\n role: 'presentation',\n focusable: 'false',\n }),\n );\n\n // Create the <use> to reference sprite\n const use = document.createElementNS(namespace, 'use');\n const path = `${iconPath}-${type}`;\n\n // Set `href` attributes\n // https://github.com/sampotts/plyr/issues/460\n // https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/xlink:href\n if ('href' in use) {\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'href', path);\n } else {\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path);\n }\n\n // Add <use> to <svg>\n icon.appendChild(use);\n\n return icon;\n },\n\n // Create hidden text label\n createLabel(type, attr) {\n let text = i18n.get(type, this.config);\n const attributes = Object.assign({}, attr);\n\n switch (type) {\n case 'pip':\n text = 'PIP';\n break;\n\n case 'airplay':\n text = 'AirPlay';\n break;\n\n default:\n break;\n }\n\n if ('class' in attributes) {\n attributes.class += ` ${this.config.classNames.hidden}`;\n } else {\n attributes.class = this.config.classNames.hidden;\n }\n\n return utils.createElement('span', attributes, text);\n },\n\n // Create a badge\n createBadge(text) {\n if (utils.is.empty(text)) {\n return null;\n }\n\n const badge = utils.createElement('span', {\n class: this.config.classNames.menu.value,\n });\n\n badge.appendChild(\n utils.createElement(\n 'span',\n {\n class: this.config.classNames.menu.badge,\n },\n text,\n ),\n );\n\n return badge;\n },\n\n // Create a <button>\n createButton(buttonType, attr) {\n const button = utils.createElement('button');\n const attributes = Object.assign({}, attr);\n let type = utils.toCamelCase(buttonType);\n\n let toggle = false;\n let label;\n let icon;\n let labelPressed;\n let iconPressed;\n\n if (!('type' in attributes)) {\n attributes.type = 'button';\n }\n\n if ('class' in attributes) {\n if (attributes.class.includes(this.config.classNames.control)) {\n attributes.class += ` ${this.config.classNames.control}`;\n }\n } else {\n attributes.class = this.config.classNames.control;\n }\n\n // Large play button\n switch (buttonType) {\n case 'play':\n toggle = true;\n label = 'play';\n labelPressed = 'pause';\n icon = 'play';\n iconPressed = 'pause';\n break;\n\n case 'mute':\n toggle = true;\n label = 'mute';\n labelPressed = 'unmute';\n icon = 'volume';\n iconPressed = 'muted';\n break;\n\n case 'captions':\n toggle = true;\n label = 'enableCaptions';\n labelPressed = 'disableCaptions';\n icon = 'captions-off';\n iconPressed = 'captions-on';\n break;\n\n case 'fullscreen':\n toggle = true;\n label = 'enterFullscreen';\n labelPressed = 'exitFullscreen';\n icon = 'enter-fullscreen';\n iconPressed = 'exit-fullscreen';\n break;\n\n case 'play-large':\n attributes.class += ` ${this.config.classNames.control}--overlaid`;\n type = 'play';\n label = 'play';\n icon = 'play';\n break;\n\n default:\n label = type;\n icon = buttonType;\n }\n\n // Setup toggle icon and labels\n if (toggle) {\n // Icon\n button.appendChild(controls.createIcon.call(this, iconPressed, { class: 'icon--pressed' }));\n button.appendChild(controls.createIcon.call(this, icon, { class: 'icon--not-pressed' }));\n\n // Label/Tooltip\n button.appendChild(controls.createLabel.call(this, labelPressed, { class: 'label--pressed' }));\n button.appendChild(controls.createLabel.call(this, label, { class: 'label--not-pressed' }));\n } else {\n button.appendChild(controls.createIcon.call(this, icon));\n button.appendChild(controls.createLabel.call(this, label));\n }\n\n // Merge attributes\n utils.extend(attributes, utils.getAttributesFromSelector(this.config.selectors.buttons[type], attributes));\n\n utils.setAttributes(button, attributes);\n\n // We have multiple play buttons\n if (type === 'play') {\n if (!utils.is.array(this.elements.buttons[type])) {\n this.elements.buttons[type] = [];\n }\n\n this.elements.buttons[type].push(button);\n } else {\n this.elements.buttons[type] = button;\n }\n\n // Toggle classname when pressed property is set\n const className = this.config.classNames.controlPressed;\n Object.defineProperty(button, 'pressed', {\n enumerable: true,\n get() {\n return utils.hasClass(button, className);\n },\n set(pressed = false) {\n utils.toggleClass(button, className, pressed);\n },\n });\n\n return button;\n },\n\n // Create an <input type='range'>\n createRange(type, attributes) {\n // Seek input\n const input = utils.createElement(\n 'input',\n utils.extend(\n utils.getAttributesFromSelector(this.config.selectors.inputs[type]),\n {\n type: 'range',\n min: 0,\n max: 100,\n step: 0.01,\n value: 0,\n autocomplete: 'off',\n // A11y fixes for https://github.com/sampotts/plyr/issues/905\n role: 'slider',\n 'aria-label': i18n.get(type, this.config),\n 'aria-valuemin': 0,\n 'aria-valuemax': 100,\n 'aria-valuenow': 0,\n },\n attributes,\n ),\n );\n\n this.elements.inputs[type] = input;\n\n // Set the fill for webkit now\n controls.updateRangeFill.call(this, input);\n\n return input;\n },\n\n // Create a <progress>\n createProgress(type, attributes) {\n const progress = utils.createElement(\n 'progress',\n utils.extend(\n utils.getAttributesFromSelector(this.config.selectors.display[type]),\n {\n min: 0,\n max: 100,\n value: 0,\n role: 'presentation',\n 'aria-hidden': true,\n },\n attributes,\n ),\n );\n\n // Create the label inside\n if (type !== 'volume') {\n progress.appendChild(utils.createElement('span', null, '0'));\n\n let suffix = '';\n switch (type) {\n case 'played':\n suffix = i18n.get('played', this.config);\n break;\n\n case 'buffer':\n suffix = i18n.get('buffered', this.config);\n break;\n\n default:\n break;\n }\n\n progress.innerText = `% ${suffix.toLowerCase()}`;\n }\n\n this.elements.display[type] = progress;\n\n return progress;\n },\n\n // Create time display\n createTime(type) {\n const attributes = utils.getAttributesFromSelector(this.config.selectors.display[type]);\n\n const container = utils.createElement(\n 'div',\n utils.extend(attributes, {\n class: `plyr__time ${attributes.class}`,\n 'aria-label': i18n.get(type, this.config),\n }),\n '00:00',\n );\n\n // Reference for updates\n this.elements.display[type] = container;\n\n return container;\n },\n\n // Create a settings menu item\n createMenuItem({value, list, type, title, badge = null, checked = false}) {\n const item = utils.createElement('li');\n\n const label = utils.createElement('label', {\n class: this.config.classNames.control,\n });\n\n const radio = utils.createElement(\n 'input',\n utils.extend(utils.getAttributesFromSelector(this.config.selectors.inputs[type]), {\n type: 'radio',\n name: `plyr-${type}`,\n value,\n checked,\n class: 'plyr__sr-only',\n }),\n );\n\n const faux = utils.createElement('span', { hidden: '' });\n\n label.appendChild(radio);\n label.appendChild(faux);\n label.insertAdjacentHTML('beforeend', title);\n\n if (utils.is.element(badge)) {\n label.appendChild(badge);\n }\n\n item.appendChild(label);\n list.appendChild(item);\n },\n\n // Format a time for display\n formatTime(time = 0, inverted = false) {\n // Bail if the value isn't a number\n if (!utils.is.number(time)) {\n return time;\n }\n\n // Always display hours if duration is over an hour\n const forceHours = utils.getHours(this.duration) > 0;\n\n return utils.formatTime(time, forceHours, inverted);\n },\n\n // Update the displayed time\n updateTimeDisplay(target = null, time = 0, inverted = false) {\n // Bail if there's no element to display or the value isn't a number\n if (!utils.is.element(target) || !utils.is.number(time)) {\n return;\n }\n\n // eslint-disable-next-line no-param-reassign\n target.innerText = controls.formatTime(time, inverted);\n },\n\n // Update volume UI and storage\n updateVolume() {\n if (!this.supported.ui) {\n return;\n }\n\n // Update range\n if (utils.is.element(this.elements.inputs.volume)) {\n controls.setRange.call(this, this.elements.inputs.volume, this.muted ? 0 : this.volume);\n }\n\n // Update mute state\n if (utils.is.element(this.elements.buttons.mute)) {\n this.elements.buttons.mute.pressed = this.muted || this.volume === 0;\n }\n },\n\n // Update seek value and lower fill\n setRange(target, value = 0) {\n if (!utils.is.element(target)) {\n return;\n }\n\n // eslint-disable-next-line\n target.value = value;\n\n // Webkit range fill\n controls.updateRangeFill.call(this, target);\n },\n\n // Update <progress> elements\n updateProgress(event) {\n if (!this.supported.ui || !utils.is.event(event)) {\n return;\n }\n\n let value = 0;\n\n const setProgress = (target, input) => {\n const value = utils.is.number(input) ? input : 0;\n const progress = utils.is.element(target) ? target : this.elements.display.buffer;\n\n // Update value and label\n if (utils.is.element(progress)) {\n progress.value = value;\n\n // Update text label inside\n const label = progress.getElementsByTagName('span')[0];\n if (utils.is.element(label)) {\n label.childNodes[0].nodeValue = value;\n }\n }\n };\n\n if (event) {\n switch (event.type) {\n // Video playing\n case 'timeupdate':\n case 'seeking':\n case 'seeked':\n value = utils.getPercentage(this.currentTime, this.duration);\n\n // Set seek range value only if it's a 'natural' time event\n if (event.type === 'timeupdate') {\n controls.setRange.call(this, this.elements.inputs.seek, value);\n }\n\n break;\n\n // Check buffer status\n case 'playing':\n case 'progress':\n setProgress(this.elements.display.buffer, this.buffered * 100);\n\n break;\n\n default:\n break;\n }\n }\n },\n\n // Webkit polyfill for lower fill range\n updateRangeFill(target) {\n // Get range from event if event passed\n const range = utils.is.event(target) ? target.target : target;\n\n // Needs to be a valid <input type='range'>\n if (!utils.is.element(range) || range.getAttribute('type') !== 'range') {\n return;\n }\n\n // Set aria values for https://github.com/sampotts/plyr/issues/905\n if (utils.matches(range, this.config.selectors.inputs.seek)) {\n range.setAttribute('aria-valuenow', this.currentTime);\n const currentTime = controls.formatTime(this.currentTime);\n const duration = controls.formatTime(this.duration);\n const format = i18n.get('seekLabel', this.config);\n range.setAttribute('aria-valuetext', format.replace('{currentTime}', currentTime).replace('{duration}', duration));\n } else if (utils.matches(range, this.config.selectors.inputs.volume)) {\n const percent = range.value * 100;\n range.setAttribute('aria-valuenow', percent);\n range.setAttribute('aria-valuetext', `${percent}%`);\n } else {\n range.setAttribute('aria-valuenow', range.value);\n }\n\n // WebKit only\n if (!browser.isWebkit) {\n return;\n }\n\n // Set CSS custom property\n range.style.setProperty('--value', `${range.value / range.max * 100}%`);\n },\n\n // Update hover tooltip for seeking\n updateSeekTooltip(event) {\n // Bail if setting not true\n if (\n !this.config.tooltips.seek ||\n !utils.is.element(this.elements.inputs.seek) ||\n !utils.is.element(this.elements.display.seekTooltip) ||\n this.duration === 0\n ) {\n return;\n }\n\n // Calculate percentage\n let percent = 0;\n const clientRect = this.elements.progress.getBoundingClientRect();\n const visible = `${this.config.classNames.tooltip}--visible`;\n\n const toggle = toggle => {\n utils.toggleClass(this.elements.display.seekTooltip, visible, toggle);\n };\n\n // Hide on touch\n if (this.touch) {\n toggle(false);\n return;\n }\n\n // Determine percentage, if already visible\n if (utils.is.event(event)) {\n percent = 100 / clientRect.width * (event.pageX - clientRect.left);\n } else if (utils.hasClass(this.elements.display.seekTooltip, visible)) {\n percent = parseFloat(this.elements.display.seekTooltip.style.left, 10);\n } else {\n return;\n }\n\n // Set bounds\n if (percent < 0) {\n percent = 0;\n } else if (percent > 100) {\n percent = 100;\n }\n\n // Display the time a click would seek to\n controls.updateTimeDisplay.call(this, this.elements.display.seekTooltip, this.duration / 100 * percent);\n\n // Set position\n this.elements.display.seekTooltip.style.left = `${percent}%`;\n\n // Show/hide the tooltip\n // If the event is a moues in/out and percentage is inside bounds\n if (utils.is.event(event) && [\n 'mouseenter',\n 'mouseleave',\n ].includes(event.type)) {\n toggle(event.type === 'mouseenter');\n }\n },\n\n // Handle time change event\n timeUpdate(event) {\n // Only invert if only one time element is displayed and used for both duration and currentTime\n const invert = !utils.is.element(this.elements.display.duration) && this.config.invertTime;\n\n // Duration\n controls.updateTimeDisplay.call(this, this.elements.display.currentTime, invert ? this.duration - this.currentTime : this.currentTime, invert);\n\n // Ignore updates while seeking\n if (event && event.type === 'timeupdate' && this.media.seeking) {\n return;\n }\n\n // Playing progress\n controls.updateProgress.call(this, event);\n },\n\n // Show the duration on metadataloaded or durationchange events\n durationUpdate() {\n // Bail if no UI or durationchange event triggered after playing/seek when invertTime is false\n if (!this.supported.ui || (!this.config.invertTime && this.currentTime)) {\n return;\n }\n\n // Update ARIA values\n if (utils.is.element(this.elements.inputs.seek)) {\n this.elements.inputs.seek.setAttribute('aria-valuemax', this.duration);\n }\n\n // If there's a spot to display duration\n const hasDuration = utils.is.element(this.elements.display.duration);\n\n // If there's only one time display, display duration there\n if (!hasDuration && this.config.displayDuration && this.paused) {\n controls.updateTimeDisplay.call(this, this.elements.display.currentTime, this.duration);\n }\n\n // If there's a duration element, update content\n if (hasDuration) {\n controls.updateTimeDisplay.call(this, this.elements.display.duration, this.duration);\n }\n\n // Update the tooltip (if visible)\n controls.updateSeekTooltip.call(this);\n },\n\n // Hide/show a tab\n toggleTab(setting, toggle) {\n utils.toggleHidden(this.elements.settings.tabs[setting], !toggle);\n },\n\n // Set the quality menu\n // TODO: Vimeo support\n setQualityMenu(options) {\n // Menu required\n if (!utils.is.element(this.elements.settings.panes.quality)) {\n return;\n }\n\n const type = 'quality';\n const list = this.elements.settings.panes.quality.querySelector('ul');\n\n // Set options if passed and filter based on config\n if (utils.is.array(options)) {\n this.options.quality = options.filter(quality => this.config.quality.options.includes(quality));\n }\n\n // Toggle the pane and tab\n const toggle = !utils.is.empty(this.options.quality) && this.options.quality.length > 1;\n controls.toggleTab.call(this, type, toggle);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If we're hiding, nothing more to do\n if (!toggle) {\n return;\n }\n\n // Empty the menu\n utils.emptyElement(list);\n\n // Get the badge HTML for HD, 4K etc\n const getBadge = quality => {\n const label = i18n.get(`qualityBadge.${quality}`, this.config);\n\n if (!label.length) {\n return null;\n }\n\n return controls.createBadge.call(this, label);\n };\n\n // Sort options by the config and then render options\n this.options.quality\n .sort((a, b) => {\n const sorting = this.config.quality.options;\n return sorting.indexOf(a) > sorting.indexOf(b) ? 1 : -1;\n })\n .forEach(quality => {\n controls.createMenuItem.call(this, {\n value: quality,\n list,\n type,\n title: controls.getLabel.call(this, 'quality', quality),\n badge: getBadge(quality),\n });\n });\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Translate a value into a nice label\n getLabel(setting, value) {\n switch (setting) {\n case 'speed':\n return value === 1 ? i18n.get('normal', this.config) : `${value}&times;`;\n\n case 'quality':\n if (utils.is.number(value)) {\n const label = i18n.get(`qualityLabel.${value}`, this.config);\n\n if (!label.length) {\n return `${value}p`;\n }\n\n return label;\n }\n\n return utils.toTitleCase(value);\n\n case 'captions':\n return captions.getLabel.call(this);\n\n default:\n return null;\n }\n },\n\n // Update the selected setting\n updateSetting(setting, container, input) {\n const pane = this.elements.settings.panes[setting];\n let value = null;\n let list = container;\n\n switch (setting) {\n case 'captions':\n value = this.currentTrack;\n break;\n\n default:\n value = !utils.is.empty(input) ? input : this[setting];\n\n // Get default\n if (utils.is.empty(value)) {\n value = this.config[setting].default;\n }\n\n // Unsupported value\n if (!utils.is.empty(this.options[setting]) && !this.options[setting].includes(value)) {\n this.debug.warn(`Unsupported value of '${value}' for ${setting}`);\n return;\n }\n\n // Disabled value\n if (!this.config[setting].options.includes(value)) {\n this.debug.warn(`Disabled value of '${value}' for ${setting}`);\n return;\n }\n\n break;\n }\n\n // Get the list if we need to\n if (!utils.is.element(list)) {\n list = pane && pane.querySelector('ul');\n }\n\n // If there's no list it means it's not been rendered...\n if (!utils.is.element(list)) {\n return;\n }\n\n // Update the label\n const label = this.elements.settings.tabs[setting].querySelector(`.${this.config.classNames.menu.value}`);\n label.innerHTML = controls.getLabel.call(this, setting, value);\n\n // Find the radio option and check it\n const target = list && list.querySelector(`input[value=\"${value}\"]`);\n\n if (utils.is.element(target)) {\n target.checked = true;\n }\n },\n\n // Set the looping options\n /* setLoopMenu() {\n // Menu required\n if (!utils.is.element(this.elements.settings.panes.loop)) {\n return;\n }\n\n const options = ['start', 'end', 'all', 'reset'];\n const list = this.elements.settings.panes.loop.querySelector('ul');\n\n // Show the pane and tab\n utils.toggleHidden(this.elements.settings.tabs.loop, false);\n utils.toggleHidden(this.elements.settings.panes.loop, false);\n\n // Toggle the pane and tab\n const toggle = !utils.is.empty(this.loop.options);\n controls.toggleTab.call(this, 'loop', toggle);\n\n // Empty the menu\n utils.emptyElement(list);\n\n options.forEach(option => {\n const item = utils.createElement('li');\n\n const button = utils.createElement(\n 'button',\n utils.extend(utils.getAttributesFromSelector(this.config.selectors.buttons.loop), {\n type: 'button',\n class: this.config.classNames.control,\n 'data-plyr-loop-action': option,\n }),\n i18n.get(option, this.config)\n );\n\n if (['start', 'end'].includes(option)) {\n const badge = controls.createBadge.call(this, '00:00');\n button.appendChild(badge);\n }\n\n item.appendChild(button);\n list.appendChild(item);\n });\n }, */\n\n // Get current selected caption language\n // TODO: rework this to user the getter in the API?\n\n // Set a list of available captions languages\n setCaptionsMenu() {\n // TODO: Captions or language? Currently it's mixed\n const type = 'captions';\n const list = this.elements.settings.panes.captions.querySelector('ul');\n const tracks = captions.getTracks.call(this);\n\n // Toggle the pane and tab\n controls.toggleTab.call(this, type, tracks.length);\n\n // Empty the menu\n utils.emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If there's no captions, bail\n if (!tracks.length) {\n return;\n }\n\n // Generate options data\n const options = tracks.map((track, value) => ({\n value,\n checked: this.captions.active && this.currentTrack === value,\n title: captions.getLabel.call(this, track),\n badge: track.language && controls.createBadge.call(this, track.language.toUpperCase()),\n list,\n type: 'language',\n }));\n\n // Add the \"Disabled\" option to turn off captions\n options.unshift({\n value: -1,\n checked: !this.captions.active,\n title: i18n.get('disabled', this.config),\n list,\n type: 'language',\n });\n\n // Generate options\n options.forEach(controls.createMenuItem.bind(this));\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Set a list of available captions languages\n setSpeedMenu(options) {\n // Do nothing if not selected\n if (!this.config.controls.includes('settings') || !this.config.settings.includes('speed')) {\n return;\n }\n\n // Menu required\n if (!utils.is.element(this.elements.settings.panes.speed)) {\n return;\n }\n\n const type = 'speed';\n\n // Set the speed options\n if (utils.is.array(options)) {\n this.options.speed = options;\n } else if (this.isHTML5 || this.isVimeo) {\n this.options.speed = [\n 0.5,\n 0.75,\n 1,\n 1.25,\n 1.5,\n 1.75,\n 2,\n ];\n }\n\n // Set options if passed and filter based on config\n this.options.speed = this.options.speed.filter(speed => this.config.speed.options.includes(speed));\n\n // Toggle the pane and tab\n const toggle = !utils.is.empty(this.options.speed) && this.options.speed.length > 1;\n controls.toggleTab.call(this, type, toggle);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If we're hiding, nothing more to do\n if (!toggle) {\n return;\n }\n\n // Get the list to populate\n const list = this.elements.settings.panes.speed.querySelector('ul');\n\n // Empty the menu\n utils.emptyElement(list);\n\n // Create items\n this.options.speed.forEach(speed => {\n controls.createMenuItem.call(this, {\n value: speed,\n list,\n type,\n title: controls.getLabel.call(this, 'speed', speed),\n });\n });\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Check if we need to hide/show the settings menu\n checkMenu() {\n const { tabs } = this.elements.settings;\n const visible = !utils.is.empty(tabs) && Object.values(tabs).some(tab => !tab.hidden);\n\n utils.toggleHidden(this.elements.settings.menu, !visible);\n },\n\n // Show/hide menu\n toggleMenu(event) {\n const { form } = this.elements.settings;\n const button = this.elements.buttons.settings;\n\n // Menu and button are required\n if (!utils.is.element(form) || !utils.is.element(button)) {\n return;\n }\n\n const show = utils.is.boolean(event) ? event : utils.is.element(form) && form.hasAttribute('hidden');\n\n if (utils.is.event(event)) {\n const isMenuItem = utils.is.element(form) && form.contains(event.target);\n const isButton = event.target === this.elements.buttons.settings;\n\n // If the click was inside the form or if the click\n // wasn't the button or menu item and we're trying to\n // show the menu (a doc click shouldn't show the menu)\n if (isMenuItem || (!isMenuItem && !isButton && show)) {\n return;\n }\n\n // Prevent the toggle being caught by the doc listener\n if (isButton) {\n event.stopPropagation();\n }\n }\n\n // Set form and button attributes\n if (utils.is.element(button)) {\n button.setAttribute('aria-expanded', show);\n }\n\n if (utils.is.element(form)) {\n utils.toggleHidden(form, !show);\n utils.toggleClass(this.elements.container, this.config.classNames.menu.open, show);\n\n if (show) {\n form.removeAttribute('tabindex');\n } else {\n form.setAttribute('tabindex', -1);\n }\n }\n },\n\n // Get the natural size of a tab\n getTabSize(tab) {\n const clone = tab.cloneNode(true);\n clone.style.position = 'absolute';\n clone.style.opacity = 0;\n clone.removeAttribute('hidden');\n\n // Prevent input's being unchecked due to the name being identical\n Array.from(clone.querySelectorAll('input[name]')).forEach(input => {\n const name = input.getAttribute('name');\n input.setAttribute('name', `${name}-clone`);\n });\n\n // Append to parent so we get the \"real\" size\n tab.parentNode.appendChild(clone);\n\n // Get the sizes before we remove\n const width = clone.scrollWidth;\n const height = clone.scrollHeight;\n\n // Remove from the DOM\n utils.removeElement(clone);\n\n return {\n width,\n height,\n };\n },\n\n // Toggle Menu\n showTab(target = '') {\n const { menu } = this.elements.settings;\n const pane = document.getElementById(target);\n\n // Nothing to show, bail\n if (!utils.is.element(pane)) {\n return;\n }\n\n // Are we targetting a tab? If not, bail\n const isTab = pane.getAttribute('role') === 'tabpanel';\n if (!isTab) {\n return;\n }\n\n // Hide all other tabs\n // Get other tabs\n const current = menu.querySelector('[role=\"tabpanel\"]:not([hidden])');\n const container = current.parentNode;\n\n // Set other toggles to be expanded false\n Array.from(menu.querySelectorAll(`[aria-controls=\"${current.getAttribute('id')}\"]`)).forEach(toggle => {\n toggle.setAttribute('aria-expanded', false);\n });\n\n // If we can do fancy animations, we'll animate the height/width\n if (support.transitions && !support.reducedMotion) {\n // Set the current width as a base\n container.style.width = `${current.scrollWidth}px`;\n container.style.height = `${current.scrollHeight}px`;\n\n // Get potential sizes\n const size = controls.getTabSize.call(this, pane);\n\n // Restore auto height/width\n const restore = e => {\n // We're only bothered about height and width on the container\n if (e.target !== container || ![\n 'width',\n 'height',\n ].includes(e.propertyName)) {\n return;\n }\n\n // Revert back to auto\n container.style.width = '';\n container.style.height = '';\n\n // Only listen once\n utils.off(container, utils.transitionEndEvent, restore);\n };\n\n // Listen for the transition finishing and restore auto height/width\n utils.on(container, utils.transitionEndEvent, restore);\n\n // Set dimensions to target\n container.style.width = `${size.width}px`;\n container.style.height = `${size.height}px`;\n }\n\n // Set attributes on current tab\n utils.toggleHidden(current, true);\n current.setAttribute('tabindex', -1);\n\n // Set attributes on target\n utils.toggleHidden(pane, false);\n\n const tabs = utils.getElements.call(this, `[aria-controls=\"${target}\"]`);\n Array.from(tabs).forEach(tab => {\n tab.setAttribute('aria-expanded', true);\n });\n pane.removeAttribute('tabindex');\n\n // Focus the first item\n pane.querySelectorAll('button:not(:disabled), input:not(:disabled), [tabindex]')[0].focus();\n },\n\n // Build the default HTML\n // TODO: Set order based on order in the config.controls array?\n create(data) {\n // Do nothing if we want no controls\n if (utils.is.empty(this.config.controls)) {\n return null;\n }\n\n // Create the container\n const container = utils.createElement('div', utils.getAttributesFromSelector(this.config.selectors.controls.wrapper));\n\n // Restart button\n if (this.config.controls.includes('restart')) {\n container.appendChild(controls.createButton.call(this, 'restart'));\n }\n\n // Rewind button\n if (this.config.controls.includes('rewind')) {\n container.appendChild(controls.createButton.call(this, 'rewind'));\n }\n\n // Play/Pause button\n if (this.config.controls.includes('play')) {\n container.appendChild(controls.createButton.call(this, 'play'));\n }\n\n // Fast forward button\n if (this.config.controls.includes('fast-forward')) {\n container.appendChild(controls.createButton.call(this, 'fast-forward'));\n }\n\n // Progress\n if (this.config.controls.includes('progress')) {\n const progress = utils.createElement('div', utils.getAttributesFromSelector(this.config.selectors.progress));\n\n // Seek range slider\n progress.appendChild(\n controls.createRange.call(this, 'seek', {\n id: `plyr-seek-${data.id}`,\n }),\n );\n\n // Buffer progress\n progress.appendChild(controls.createProgress.call(this, 'buffer'));\n\n // TODO: Add loop display indicator\n\n // Seek tooltip\n if (this.config.tooltips.seek) {\n const tooltip = utils.createElement(\n 'span',\n {\n class: this.config.classNames.tooltip,\n },\n '00:00',\n );\n\n progress.appendChild(tooltip);\n this.elements.display.seekTooltip = tooltip;\n }\n\n this.elements.progress = progress;\n container.appendChild(this.elements.progress);\n }\n\n // Media current time display\n if (this.config.controls.includes('current-time')) {\n container.appendChild(controls.createTime.call(this, 'currentTime'));\n }\n\n // Media duration display\n if (this.config.controls.includes('duration')) {\n container.appendChild(controls.createTime.call(this, 'duration'));\n }\n\n // Toggle mute button\n if (this.config.controls.includes('mute')) {\n container.appendChild(controls.createButton.call(this, 'mute'));\n }\n\n // Volume range control\n if (this.config.controls.includes('volume')) {\n const volume = utils.createElement('div', {\n class: 'plyr__volume',\n });\n\n // Set the attributes\n const attributes = {\n max: 1,\n step: 0.05,\n value: this.config.volume,\n };\n\n // Create the volume range slider\n volume.appendChild(\n controls.createRange.call(\n this,\n 'volume',\n utils.extend(attributes, {\n id: `plyr-volume-${data.id}`,\n }),\n ),\n );\n\n this.elements.volume = volume;\n\n container.appendChild(volume);\n }\n\n // Toggle captions button\n if (this.config.controls.includes('captions')) {\n container.appendChild(controls.createButton.call(this, 'captions'));\n }\n\n // Settings button / menu\n if (this.config.controls.includes('settings') && !utils.is.empty(this.config.settings)) {\n const menu = utils.createElement('div', {\n class: 'plyr__menu',\n hidden: '',\n });\n\n menu.appendChild(\n controls.createButton.call(this, 'settings', {\n id: `plyr-settings-toggle-${data.id}`,\n 'aria-haspopup': true,\n 'aria-controls': `plyr-settings-${data.id}`,\n 'aria-expanded': false,\n }),\n );\n\n const form = utils.createElement('form', {\n class: 'plyr__menu__container',\n id: `plyr-settings-${data.id}`,\n hidden: '',\n 'aria-labelled-by': `plyr-settings-toggle-${data.id}`,\n role: 'tablist',\n tabindex: -1,\n });\n\n const inner = utils.createElement('div');\n\n const home = utils.createElement('div', {\n id: `plyr-settings-${data.id}-home`,\n 'aria-labelled-by': `plyr-settings-toggle-${data.id}`,\n role: 'tabpanel',\n });\n\n // Create the tab list\n const tabs = utils.createElement('ul', {\n role: 'tablist',\n });\n\n // Build the tabs\n this.config.settings.forEach(type => {\n const tab = utils.createElement('li', {\n role: 'tab',\n hidden: '',\n });\n\n const button = utils.createElement(\n 'button',\n utils.extend(utils.getAttributesFromSelector(this.config.selectors.buttons.settings), {\n type: 'button',\n class: `${this.config.classNames.control} ${this.config.classNames.control}--forward`,\n id: `plyr-settings-${data.id}-${type}-tab`,\n 'aria-haspopup': true,\n 'aria-controls': `plyr-settings-${data.id}-${type}`,\n 'aria-expanded': false,\n }),\n i18n.get(type, this.config),\n );\n\n const value = utils.createElement('span', {\n class: this.config.classNames.menu.value,\n });\n\n // Speed contains HTML entities\n value.innerHTML = data[type];\n\n button.appendChild(value);\n tab.appendChild(button);\n tabs.appendChild(tab);\n\n this.elements.settings.tabs[type] = tab;\n });\n\n home.appendChild(tabs);\n inner.appendChild(home);\n\n // Build the panes\n this.config.settings.forEach(type => {\n const pane = utils.createElement('div', {\n id: `plyr-settings-${data.id}-${type}`,\n hidden: '',\n 'aria-labelled-by': `plyr-settings-${data.id}-${type}-tab`,\n role: 'tabpanel',\n tabindex: -1,\n });\n\n const back = utils.createElement(\n 'button',\n {\n type: 'button',\n class: `${this.config.classNames.control} ${this.config.classNames.control}--back`,\n 'aria-haspopup': true,\n 'aria-controls': `plyr-settings-${data.id}-home`,\n 'aria-expanded': false,\n },\n i18n.get(type, this.config),\n );\n\n pane.appendChild(back);\n\n const options = utils.createElement('ul');\n\n pane.appendChild(options);\n inner.appendChild(pane);\n\n this.elements.settings.panes[type] = pane;\n });\n\n form.appendChild(inner);\n menu.appendChild(form);\n container.appendChild(menu);\n\n this.elements.settings.form = form;\n this.elements.settings.menu = menu;\n }\n\n // Picture in picture button\n if (this.config.controls.includes('pip') && support.pip) {\n container.appendChild(controls.createButton.call(this, 'pip'));\n }\n\n // Airplay button\n if (this.config.controls.includes('airplay') && support.airplay) {\n container.appendChild(controls.createButton.call(this, 'airplay'));\n }\n\n // Toggle fullscreen button\n if (this.config.controls.includes('fullscreen')) {\n container.appendChild(controls.createButton.call(this, 'fullscreen'));\n }\n\n // Larger overlaid play button\n if (this.config.controls.includes('play-large')) {\n this.elements.container.appendChild(controls.createButton.call(this, 'play-large'));\n }\n\n this.elements.controls = container;\n\n if (this.isHTML5) {\n controls.setQualityMenu.call(this, html5.getQualityOptions.call(this));\n }\n\n controls.setSpeedMenu.call(this);\n\n return container;\n },\n\n // Insert controls\n inject() {\n // Sprite\n if (this.config.loadSprite) {\n const icon = controls.getIconUrl.call(this);\n\n // Only load external sprite using AJAX\n if (icon.cors) {\n utils.loadSprite(icon.url, 'sprite-plyr');\n }\n }\n\n // Create a unique ID\n this.id = Math.floor(Math.random() * 10000);\n\n // Null by default\n let container = null;\n this.elements.controls = null;\n\n // Set template properties\n const props = {\n id: this.id,\n seektime: this.config.seekTime,\n title: this.config.title,\n };\n let update = true;\n\n if (utils.is.string(this.config.controls) || utils.is.element(this.config.controls)) {\n // String or HTMLElement passed as the option\n container = this.config.controls;\n } else if (utils.is.function(this.config.controls)) {\n // A custom function to build controls\n // The function can return a HTMLElement or String\n container = this.config.controls.call(this, props);\n } else {\n // Create controls\n container = controls.create.call(this, {\n id: this.id,\n seektime: this.config.seekTime,\n speed: this.speed,\n quality: this.quality,\n captions: captions.getLabel.call(this),\n // TODO: Looping\n // loop: 'None',\n });\n update = false;\n }\n\n // Replace props with their value\n const replace = input => {\n let result = input;\n\n Object.entries(props).forEach(([\n key,\n value,\n ]) => {\n result = utils.replaceAll(result, `{${key}}`, value);\n });\n\n return result;\n };\n\n // Update markup\n if (update) {\n if (utils.is.string(this.config.controls)) {\n container = replace(container);\n } else if (utils.is.element(container)) {\n container.innerHTML = replace(container.innerHTML);\n }\n }\n\n // Controls container\n let target;\n\n // Inject to custom location\n if (utils.is.string(this.config.selectors.controls.container)) {\n target = document.querySelector(this.config.selectors.controls.container);\n }\n\n // Inject into the container by default\n if (!utils.is.element(target)) {\n target = this.elements.container;\n }\n\n // Inject controls HTML\n if (utils.is.element(container)) {\n target.appendChild(container);\n } else if (container) {\n target.insertAdjacentHTML('beforeend', container);\n }\n\n // Find the elements if need be\n if (!utils.is.element(this.elements.controls)) {\n controls.findElements.call(this);\n }\n\n // Edge sometimes doesn't finish the paint so force a redraw\n if (window.navigator.userAgent.includes('Edge')) {\n utils.repaint(target);\n }\n\n // Setup tooltips\n if (this.config.tooltips.controls) {\n const labels = utils.getElements.call(\n this,\n [\n this.config.selectors.controls.wrapper,\n ' ',\n this.config.selectors.labels,\n ' .',\n this.config.classNames.hidden,\n ].join(''),\n );\n\n Array.from(labels).forEach(label => {\n utils.toggleClass(label, this.config.classNames.hidden, false);\n utils.toggleClass(label, this.config.classNames.tooltip, true);\n });\n }\n },\n};\n\nexport default controls;\n","// ==========================================================================\n// Plyr Captions\n// TODO: Create as class\n// ==========================================================================\n\nimport controls from './controls';\nimport i18n from './i18n';\nimport support from './support';\nimport utils from './utils';\n\nconst captions = {\n // Setup captions\n setup() {\n // Requires UI support\n if (!this.supported.ui) {\n return;\n }\n\n // Only Vimeo and HTML5 video supported at this point\n if (!this.isVideo || this.isYouTube || (this.isHTML5 && !support.textTracks)) {\n // Clear menu and hide\n if (utils.is.array(this.config.controls) && this.config.controls.includes('settings') && this.config.settings.includes('captions')) {\n controls.setCaptionsMenu.call(this);\n }\n\n return;\n }\n\n // Inject the container\n if (!utils.is.element(this.elements.captions)) {\n this.elements.captions = utils.createElement('div', utils.getAttributesFromSelector(this.config.selectors.captions));\n\n utils.insertAfter(this.elements.captions, this.elements.wrapper);\n }\n\n // Get browser info\n const browser = utils.getBrowser();\n\n // Fix IE captions if CORS is used\n // Fetch captions and inject as blobs instead (data URIs not supported!)\n if (browser.isIE && window.URL) {\n const elements = this.media.querySelectorAll('track');\n\n Array.from(elements).forEach(track => {\n const src = track.getAttribute('src');\n const href = utils.parseUrl(src);\n\n if (href.hostname !== window.location.href.hostname && [\n 'http:',\n 'https:',\n ].includes(href.protocol)) {\n utils\n .fetch(src, 'blob')\n .then(blob => {\n track.setAttribute('src', window.URL.createObjectURL(blob));\n })\n .catch(() => {\n utils.removeElement(track);\n });\n }\n });\n }\n\n // Try to load the value from storage\n let active = this.storage.get('captions');\n\n // Otherwise fall back to the default config\n if (!utils.is.boolean(active)) {\n ({ active } = this.config.captions);\n }\n\n // Get language from storage, fallback to config\n let language = this.storage.get('language') || this.config.captions.language;\n if (language === 'auto') {\n [ language ] = (navigator.language || navigator.userLanguage).split('-');\n }\n // Set language and show if active\n captions.setLanguage.call(this, language, active);\n\n // Watch changes to textTracks and update captions menu\n if (this.isHTML5) {\n const trackEvents = this.config.captions.update ? 'addtrack removetrack' : 'removetrack';\n utils.on(this.media.textTracks, trackEvents, captions.update.bind(this));\n }\n\n // Update available languages in list next tick (the event must not be triggered before the listeners)\n setTimeout(captions.update.bind(this), 0);\n },\n\n update() {\n const tracks = captions.getTracks.call(this, true);\n // Get the wanted language\n const { language, meta } = this.captions;\n\n // Handle tracks (add event listener and \"pseudo\"-default)\n if (this.isHTML5 && this.isVideo) {\n tracks\n .filter(track => !meta.get(track))\n .forEach(track => {\n this.debug.log('Track added', track);\n // Attempt to store if the original dom element was \"default\"\n meta.set(track, {\n default: track.mode === 'showing',\n });\n\n // Turn off native caption rendering to avoid double captions\n track.mode = 'hidden';\n\n // Add event listener for cue changes\n utils.on(track, 'cuechange', () => captions.updateCues.call(this));\n });\n }\n\n const trackRemoved = !tracks.find(track => track === this.captions.currentTrackNode);\n const firstMatch = this.language !== language && tracks.find(track => track.language === language);\n\n // Update language if removed or first matching track added\n if (trackRemoved || firstMatch) {\n captions.setLanguage.call(this, language, this.config.captions.active);\n }\n\n // Enable or disable captions based on track length\n utils.toggleClass(this.elements.container, this.config.classNames.captions.enabled, !utils.is.empty(tracks));\n\n // Update available languages in list\n if ((this.config.controls || []).includes('settings') && this.config.settings.includes('captions')) {\n controls.setCaptionsMenu.call(this);\n }\n },\n\n set(index, setLanguage = true, show = true) {\n const tracks = captions.getTracks.call(this);\n\n // Disable captions if setting to -1\n if (index === -1) {\n this.toggleCaptions(false);\n return;\n }\n\n if (!utils.is.number(index)) {\n this.debug.warn('Invalid caption argument', index);\n return;\n }\n\n if (!(index in tracks)) {\n this.debug.warn('Track not found', index);\n return;\n }\n\n if (this.captions.currentTrack !== index) {\n this.captions.currentTrack = index;\n const track = captions.getCurrentTrack.call(this);\n const { language } = track || {};\n\n // Store reference to node for invalidation on remove\n this.captions.currentTrackNode = track;\n\n // Prevent setting language in some cases, since it can violate user's intentions\n if (setLanguage) {\n this.captions.language = language;\n }\n\n // Handle Vimeo captions\n if (this.isVimeo) {\n this.embed.enableTextTrack(language);\n }\n\n // Trigger event\n utils.dispatchEvent.call(this, this.media, 'languagechange');\n }\n\n if (this.isHTML5 && this.isVideo) {\n // If we change the active track while a cue is already displayed we need to update it\n captions.updateCues.call(this);\n }\n\n // Show captions\n if (show) {\n this.toggleCaptions(true);\n }\n },\n\n setLanguage(language, show = true) {\n if (!utils.is.string(language)) {\n this.debug.warn('Invalid language argument', language);\n return;\n }\n // Normalize\n this.captions.language = language.toLowerCase();\n\n // Set currentTrack\n const tracks = captions.getTracks.call(this);\n const track = captions.getCurrentTrack.call(this, true);\n captions.set.call(this, tracks.indexOf(track), false, show);\n },\n\n // Get current valid caption tracks\n // If update is false it will also ignore tracks without metadata\n // This is used to \"freeze\" the language options when captions.update is false\n getTracks(update = false) {\n // Handle media or textTracks missing or null\n const tracks = Array.from((this.media || {}).textTracks || []);\n // For HTML5, use cache instead of current tracks when it exists (if captions.update is false)\n // Filter out removed tracks and tracks that aren't captions/subtitles (for example metadata)\n return tracks\n .filter(track => !this.isHTML5 || update || this.captions.meta.has(track))\n .filter(track => [\n 'captions',\n 'subtitles',\n ].includes(track.kind));\n },\n\n // Get the current track for the current language\n getCurrentTrack(fromLanguage = false) {\n const tracks = captions.getTracks.call(this);\n const sortIsDefault = track => Number((this.captions.meta.get(track) || {}).default);\n const sorted = Array.from(tracks).sort((a, b) => sortIsDefault(b) - sortIsDefault(a));\n return (!fromLanguage && tracks[this.currentTrack]) || sorted.find(track => track.language === this.captions.language) || sorted[0];\n },\n\n // Get UI label for track\n getLabel(track) {\n let currentTrack = track;\n\n if (!utils.is.track(currentTrack) && support.textTracks && this.captions.active) {\n currentTrack = captions.getCurrentTrack.call(this);\n }\n\n if (utils.is.track(currentTrack)) {\n if (!utils.is.empty(currentTrack.label)) {\n return currentTrack.label;\n }\n\n if (!utils.is.empty(currentTrack.language)) {\n return track.language.toUpperCase();\n }\n\n return i18n.get('enabled', this.config);\n }\n\n return i18n.get('disabled', this.config);\n },\n\n // Update captions using current track's active cues\n // Also optional array argument in case there isn't any track (ex: vimeo)\n updateCues(input) {\n // Requires UI\n if (!this.supported.ui) {\n return;\n }\n\n if (!utils.is.element(this.elements.captions)) {\n this.debug.warn('No captions element to render to');\n return;\n }\n\n // Only accept array or empty input\n if (!utils.is.nullOrUndefined(input) && !Array.isArray(input)) {\n this.debug.warn('updateCues: Invalid input', input);\n return;\n }\n\n let cues = input;\n\n // Get cues from track\n if (!cues) {\n const track = captions.getCurrentTrack.call(this);\n cues = Array.from((track || {}).activeCues || [])\n .map(cue => cue.getCueAsHTML())\n .map(utils.getHTML);\n }\n\n // Set new caption text\n const content = cues.map(cueText => cueText.trim()).join('\\n');\n const changed = content !== this.elements.captions.innerHTML;\n\n if (changed) {\n // Empty the container and create a new child element\n utils.emptyElement(this.elements.captions);\n const caption = utils.createElement('span', utils.getAttributesFromSelector(this.config.selectors.caption));\n caption.innerHTML = content;\n this.elements.captions.appendChild(caption);\n\n // Trigger event\n utils.dispatchEvent.call(this, this.media, 'cuechange');\n }\n },\n};\n\nexport default captions;\n","// ==========================================================================\n// Console wrapper\n// ==========================================================================\n\nconst noop = () => {};\n\nexport default class Console {\n constructor(enabled = false) {\n this.enabled = window.console && enabled;\n\n if (this.enabled) {\n this.log('Debugging enabled');\n }\n }\n\n get log() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.log, console) : noop;\n }\n get warn() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.warn, console) : noop;\n }\n get error() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.error, console) : noop;\n }\n}\n","// ==========================================================================\n// Plyr default config\n// ==========================================================================\n\nconst defaults = {\n // Disable\n enabled: true,\n\n // Custom media title\n title: '',\n\n // Logging to console\n debug: false,\n\n // Auto play (if supported)\n autoplay: false,\n\n // Only allow one media playing at once (vimeo only)\n autopause: true,\n\n // Allow inline playback on iOS (this effects YouTube/Vimeo - HTML5 requires the attribute present)\n // TODO: Remove iosNative fullscreen option in favour of this (logic needs work)\n playsinline: true,\n\n // Default time to skip when rewind/fast forward\n seekTime: 10,\n\n // Default volume\n volume: 1,\n muted: false,\n\n // Pass a custom duration\n duration: null,\n\n // Display the media duration on load in the current time position\n // If you have opted to display both duration and currentTime, this is ignored\n displayDuration: true,\n\n // Invert the current time to be a countdown\n invertTime: true,\n\n // Clicking the currentTime inverts it's value to show time left rather than elapsed\n toggleInvert: true,\n\n // Aspect ratio (for embeds)\n ratio: '16:9',\n\n // Click video container to play/pause\n clickToPlay: true,\n\n // Auto hide the controls\n hideControls: true,\n\n // Reset to start when playback ended\n resetOnEnd: false,\n\n // Disable the standard context menu\n disableContextMenu: true,\n\n // Sprite (for icons)\n loadSprite: true,\n iconPrefix: 'plyr',\n iconUrl: 'https://cdn.plyr.io/3.3.12/plyr.svg',\n\n // Blank video (used to prevent errors on source change)\n blankVideo: 'https://cdn.plyr.io/static/blank.mp4',\n\n // Quality default\n quality: {\n default: 576,\n options: [\n 4320,\n 2880,\n 2160,\n 1440,\n 1080,\n 720,\n 576,\n 480,\n 360,\n 240,\n 'default', // YouTube's \"auto\"\n ],\n },\n\n // Set loops\n loop: {\n active: false,\n // start: null,\n // end: null,\n },\n\n // Speed default and options to display\n speed: {\n selected: 1,\n options: [\n 0.5,\n 0.75,\n 1,\n 1.25,\n 1.5,\n 1.75,\n 2,\n ],\n },\n\n // Keyboard shortcut settings\n keyboard: {\n focused: true,\n global: false,\n },\n\n // Display tooltips\n tooltips: {\n controls: false,\n seek: true,\n },\n\n // Captions settings\n captions: {\n active: false,\n language: 'auto',\n // Listen to new tracks added after Plyr is initialized.\n // This is needed for streaming captions, but may result in unselectable options\n update: false,\n },\n\n // Fullscreen settings\n fullscreen: {\n enabled: true, // Allow fullscreen?\n fallback: true, // Fallback for vintage browsers\n iosNative: false, // Use the native fullscreen in iOS (disables custom controls)\n },\n\n // Local storage\n storage: {\n enabled: true,\n key: 'plyr',\n },\n\n // Default controls\n controls: [\n 'play-large',\n // 'restart',\n // 'rewind',\n 'play',\n // 'fast-forward',\n 'progress',\n 'current-time',\n 'mute',\n 'volume',\n 'captions',\n 'settings',\n 'pip',\n 'airplay',\n 'fullscreen',\n ],\n settings: [\n 'captions',\n 'quality',\n 'speed',\n ],\n\n // Localisation\n i18n: {\n restart: 'Restart',\n rewind: 'Rewind {seektime}s',\n play: 'Play',\n pause: 'Pause',\n fastForward: 'Forward {seektime}s',\n seek: 'Seek',\n seekLabel: '{currentTime} of {duration}',\n played: 'Played',\n buffered: 'Buffered',\n currentTime: 'Current time',\n duration: 'Duration',\n volume: 'Volume',\n mute: 'Mute',\n unmute: 'Unmute',\n enableCaptions: 'Enable captions',\n disableCaptions: 'Disable captions',\n enterFullscreen: 'Enter fullscreen',\n exitFullscreen: 'Exit fullscreen',\n frameTitle: 'Player for {title}',\n captions: 'Captions',\n settings: 'Settings',\n menuBack: 'Go back to previous menu',\n speed: 'Speed',\n normal: 'Normal',\n quality: 'Quality',\n loop: 'Loop',\n start: 'Start',\n end: 'End',\n all: 'All',\n reset: 'Reset',\n disabled: 'Disabled',\n enabled: 'Enabled',\n advertisement: 'Ad',\n qualityBadge: {\n 2160: '4K',\n 1440: 'HD',\n 1080: 'HD',\n 720: 'HD',\n 576: 'SD',\n 480: 'SD',\n },\n },\n\n // URLs\n urls: {\n vimeo: {\n sdk: 'https://player.vimeo.com/api/player.js',\n iframe: 'https://player.vimeo.com/video/{0}?{1}',\n api: 'https://vimeo.com/api/v2/video/{0}.json',\n },\n youtube: {\n sdk: 'https://www.youtube.com/iframe_api',\n api: 'https://www.googleapis.com/youtube/v3/videos?id={0}&key={1}&fields=items(snippet(title))&part=snippet',\n },\n googleIMA: {\n sdk: 'https://imasdk.googleapis.com/js/sdkloader/ima3.js',\n },\n },\n\n // Custom control listeners\n listeners: {\n seek: null,\n play: null,\n pause: null,\n restart: null,\n rewind: null,\n fastForward: null,\n mute: null,\n volume: null,\n captions: null,\n fullscreen: null,\n pip: null,\n airplay: null,\n speed: null,\n quality: null,\n loop: null,\n language: null,\n },\n\n // Events to watch and bubble\n events: [\n // Events to watch on HTML5 media elements and bubble\n // https://developer.mozilla.org/en/docs/Web/Guide/Events/Media_events\n 'ended',\n 'progress',\n 'stalled',\n 'playing',\n 'waiting',\n 'canplay',\n 'canplaythrough',\n 'loadstart',\n 'loadeddata',\n 'loadedmetadata',\n 'timeupdate',\n 'volumechange',\n 'play',\n 'pause',\n 'error',\n 'seeking',\n 'seeked',\n 'emptied',\n 'ratechange',\n 'cuechange',\n\n // Custom events\n 'enterfullscreen',\n 'exitfullscreen',\n 'captionsenabled',\n 'captionsdisabled',\n 'languagechange',\n 'controlshidden',\n 'controlsshown',\n 'ready',\n\n // YouTube\n 'statechange',\n 'qualitychange',\n 'qualityrequested',\n\n // Ads\n 'adsloaded',\n 'adscontentpause',\n 'adscontentresume',\n 'adstarted',\n 'adsmidpoint',\n 'adscomplete',\n 'adsallcomplete',\n 'adsimpression',\n 'adsclick',\n ],\n\n // Selectors\n // Change these to match your template if using custom HTML\n selectors: {\n editable: 'input, textarea, select, [contenteditable]',\n container: '.plyr',\n controls: {\n container: null,\n wrapper: '.plyr__controls',\n },\n labels: '[data-plyr]',\n buttons: {\n play: '[data-plyr=\"play\"]',\n pause: '[data-plyr=\"pause\"]',\n restart: '[data-plyr=\"restart\"]',\n rewind: '[data-plyr=\"rewind\"]',\n fastForward: '[data-plyr=\"fast-forward\"]',\n mute: '[data-plyr=\"mute\"]',\n captions: '[data-plyr=\"captions\"]',\n fullscreen: '[data-plyr=\"fullscreen\"]',\n pip: '[data-plyr=\"pip\"]',\n airplay: '[data-plyr=\"airplay\"]',\n settings: '[data-plyr=\"settings\"]',\n loop: '[data-plyr=\"loop\"]',\n },\n inputs: {\n seek: '[data-plyr=\"seek\"]',\n volume: '[data-plyr=\"volume\"]',\n speed: '[data-plyr=\"speed\"]',\n language: '[data-plyr=\"language\"]',\n quality: '[data-plyr=\"quality\"]',\n },\n display: {\n currentTime: '.plyr__time--current',\n duration: '.plyr__time--duration',\n buffer: '.plyr__progress__buffer',\n loop: '.plyr__progress__loop', // Used later\n volume: '.plyr__volume--display',\n },\n progress: '.plyr__progress',\n captions: '.plyr__captions',\n caption: '.plyr__caption',\n menu: {\n quality: '.js-plyr__menu__list--quality',\n },\n },\n\n // Class hooks added to the player in different states\n classNames: {\n type: 'plyr--{0}',\n provider: 'plyr--{0}',\n video: 'plyr__video-wrapper',\n embed: 'plyr__video-embed',\n embedContainer: 'plyr__video-embed__container',\n poster: 'plyr__poster',\n posterEnabled: 'plyr__poster-enabled',\n ads: 'plyr__ads',\n control: 'plyr__control',\n controlPressed: 'plyr__control--pressed',\n playing: 'plyr--playing',\n paused: 'plyr--paused',\n stopped: 'plyr--stopped',\n loading: 'plyr--loading',\n hover: 'plyr--hover',\n tooltip: 'plyr__tooltip',\n cues: 'plyr__cues',\n hidden: 'plyr__sr-only',\n hideControls: 'plyr--hide-controls',\n isIos: 'plyr--is-ios',\n isTouch: 'plyr--is-touch',\n uiSupported: 'plyr--full-ui',\n noTransition: 'plyr--no-transition',\n menu: {\n value: 'plyr__menu__value',\n badge: 'plyr__badge',\n open: 'plyr--menu-open',\n },\n captions: {\n enabled: 'plyr--captions-enabled',\n active: 'plyr--captions-active',\n },\n fullscreen: {\n enabled: 'plyr--fullscreen-enabled',\n fallback: 'plyr--fullscreen-fallback',\n },\n pip: {\n supported: 'plyr--pip-supported',\n active: 'plyr--pip-active',\n },\n airplay: {\n supported: 'plyr--airplay-supported',\n active: 'plyr--airplay-active',\n },\n tabFocus: 'plyr__tab-focus',\n },\n\n // Embed attributes\n attributes: {\n embed: {\n provider: 'data-plyr-provider',\n id: 'data-plyr-embed-id',\n },\n },\n\n // API keys\n keys: {\n google: null,\n },\n\n // Advertisements plugin\n // Register for an account here: http://vi.ai/publisher-video-monetization/?aid=plyrio\n ads: {\n enabled: false,\n publisherId: '',\n },\n};\n\nexport default defaults;\n","// ==========================================================================\n// Fullscreen wrapper\n// https://developer.mozilla.org/en-US/docs/Web/API/Fullscreen_API#prefixing\n// ==========================================================================\n\nimport utils from './utils';\n\nconst browser = utils.getBrowser();\n\nfunction onChange() {\n if (!this.enabled) {\n return;\n }\n\n // Update toggle button\n const button = this.player.elements.buttons.fullscreen;\n if (utils.is.element(button)) {\n button.pressed = this.active;\n }\n\n // Trigger an event\n utils.dispatchEvent.call(this.player, this.target, this.active ? 'enterfullscreen' : 'exitfullscreen', true);\n\n // Trap focus in container\n if (!browser.isIos) {\n utils.trapFocus.call(this.player, this.target, this.active);\n }\n}\n\nfunction toggleFallback(toggle = false) {\n // Store or restore scroll position\n if (toggle) {\n this.scrollPosition = {\n x: window.scrollX || 0,\n y: window.scrollY || 0,\n };\n } else {\n window.scrollTo(this.scrollPosition.x, this.scrollPosition.y);\n }\n\n // Toggle scroll\n document.body.style.overflow = toggle ? 'hidden' : '';\n\n // Toggle class hook\n utils.toggleClass(this.target, this.player.config.classNames.fullscreen.fallback, toggle);\n\n // Toggle button and fire events\n onChange.call(this);\n}\n\nclass Fullscreen {\n constructor(player) {\n // Keep reference to parent\n this.player = player;\n\n // Get prefix\n this.prefix = Fullscreen.prefix;\n this.property = Fullscreen.property;\n\n // Scroll position\n this.scrollPosition = { x: 0, y: 0 };\n\n // Register event listeners\n // Handle event (incase user presses escape etc)\n utils.on(document, this.prefix === 'ms' ? 'MSFullscreenChange' : `${this.prefix}fullscreenchange`, () => {\n // TODO: Filter for target??\n onChange.call(this);\n });\n\n // Fullscreen toggle on double click\n utils.on(this.player.elements.container, 'dblclick', event => {\n // Ignore double click in controls\n if (utils.is.element(this.player.elements.controls) && this.player.elements.controls.contains(event.target)) {\n return;\n }\n\n this.toggle();\n });\n\n // Update the UI\n this.update();\n }\n\n // Determine if native supported\n static get native() {\n return !!(document.fullscreenEnabled || document.webkitFullscreenEnabled || document.mozFullScreenEnabled || document.msFullscreenEnabled);\n }\n\n // Get the prefix for handlers\n static get prefix() {\n // No prefix\n if (utils.is.function(document.exitFullscreen)) {\n return '';\n }\n\n // Check for fullscreen support by vendor prefix\n let value = '';\n const prefixes = [\n 'webkit',\n 'moz',\n 'ms',\n ];\n\n prefixes.some(pre => {\n if (utils.is.function(document[`${pre}ExitFullscreen`]) || utils.is.function(document[`${pre}CancelFullScreen`])) {\n value = pre;\n return true;\n }\n\n return false;\n });\n\n return value;\n }\n\n static get property() {\n return this.prefix === 'moz' ? 'FullScreen' : 'Fullscreen';\n }\n\n // Determine if fullscreen is enabled\n get enabled() {\n return (\n (Fullscreen.native || this.player.config.fullscreen.fallback) &&\n this.player.config.fullscreen.enabled &&\n this.player.supported.ui &&\n this.player.isVideo\n );\n }\n\n // Get active state\n get active() {\n if (!this.enabled) {\n return false;\n }\n\n // Fallback using classname\n if (!Fullscreen.native) {\n return utils.hasClass(this.target, this.player.config.classNames.fullscreen.fallback);\n }\n\n const element = !this.prefix ? document.fullscreenElement : document[`${this.prefix}${this.property}Element`];\n\n return element === this.target;\n }\n\n // Get target element\n get target() {\n return browser.isIos && this.player.config.fullscreen.iosNative ? this.player.media : this.player.elements.container;\n }\n\n // Update UI\n update() {\n if (this.enabled) {\n this.player.debug.log(`${Fullscreen.native ? 'Native' : 'Fallback'} fullscreen enabled`);\n } else {\n this.player.debug.log('Fullscreen not supported and fallback disabled');\n }\n\n // Add styling hook to show button\n utils.toggleClass(this.player.elements.container, this.player.config.classNames.fullscreen.enabled, this.enabled);\n }\n\n // Make an element fullscreen\n enter() {\n if (!this.enabled) {\n return;\n }\n\n // iOS native fullscreen doesn't need the request step\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n if (this.player.playing) {\n this.target.webkitEnterFullscreen();\n }\n } else if (!Fullscreen.native) {\n toggleFallback.call(this, true);\n } else if (!this.prefix) {\n this.target.requestFullscreen();\n } else if (!utils.is.empty(this.prefix)) {\n this.target[`${this.prefix}Request${this.property}`]();\n }\n }\n\n // Bail from fullscreen\n exit() {\n if (!this.enabled) {\n return;\n }\n\n // iOS native fullscreen\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n this.target.webkitExitFullscreen();\n this.player.play();\n } else if (!Fullscreen.native) {\n toggleFallback.call(this, false);\n } else if (!this.prefix) {\n (document.cancelFullScreen || document.exitFullscreen).call(document);\n } else if (!utils.is.empty(this.prefix)) {\n const action = this.prefix === 'moz' ? 'Cancel' : 'Exit';\n document[`${this.prefix}${action}${this.property}`]();\n }\n }\n\n // Toggle state\n toggle() {\n if (!this.active) {\n this.enter();\n } else {\n this.exit();\n }\n }\n}\n\nexport default Fullscreen;\n","// ==========================================================================\n// Plyr UI\n// ==========================================================================\n\nimport captions from './captions';\nimport controls from './controls';\nimport i18n from './i18n';\nimport support from './support';\nimport utils from './utils';\n\n// Sniff out the browser\nconst browser = utils.getBrowser();\n\nconst ui = {\n addStyleHook() {\n utils.toggleClass(this.elements.container, this.config.selectors.container.replace('.', ''), true);\n utils.toggleClass(this.elements.container, this.config.classNames.uiSupported, this.supported.ui);\n },\n\n // Toggle native HTML5 media controls\n toggleNativeControls(toggle = false) {\n if (toggle && this.isHTML5) {\n this.media.setAttribute('controls', '');\n } else {\n this.media.removeAttribute('controls');\n }\n },\n\n // Setup the UI\n build() {\n // Re-attach media element listeners\n // TODO: Use event bubbling?\n this.listeners.media();\n\n // Don't setup interface if no support\n if (!this.supported.ui) {\n this.debug.warn(`Basic support only for ${this.provider} ${this.type}`);\n\n // Restore native controls\n ui.toggleNativeControls.call(this, true);\n\n // Bail\n return;\n }\n\n // Inject custom controls if not present\n if (!utils.is.element(this.elements.controls)) {\n // Inject custom controls\n controls.inject.call(this);\n\n // Re-attach control listeners\n this.listeners.controls();\n }\n\n // Remove native controls\n ui.toggleNativeControls.call(this);\n\n // Setup captions for HTML5\n if (this.isHTML5) {\n captions.setup.call(this);\n }\n\n // Reset volume\n this.volume = null;\n\n // Reset mute state\n this.muted = null;\n\n // Reset speed\n this.speed = null;\n\n // Reset loop state\n this.loop = null;\n\n // Reset quality setting\n this.quality = null;\n\n // Reset volume display\n controls.updateVolume.call(this);\n\n // Reset time display\n controls.timeUpdate.call(this);\n\n // Update the UI\n ui.checkPlaying.call(this);\n\n // Check for picture-in-picture support\n utils.toggleClass(this.elements.container, this.config.classNames.pip.supported, support.pip && this.isHTML5 && this.isVideo);\n\n // Check for airplay support\n utils.toggleClass(this.elements.container, this.config.classNames.airplay.supported, support.airplay && this.isHTML5);\n\n // Add iOS class\n utils.toggleClass(this.elements.container, this.config.classNames.isIos, browser.isIos);\n\n // Add touch class\n utils.toggleClass(this.elements.container, this.config.classNames.isTouch, this.touch);\n\n // Ready for API calls\n this.ready = true;\n\n // Ready event at end of execution stack\n setTimeout(() => {\n utils.dispatchEvent.call(this, this.media, 'ready');\n }, 0);\n\n // Set the title\n ui.setTitle.call(this);\n\n // Assure the poster image is set, if the property was added before the element was created\n if (this.poster && this.elements.poster && !this.elements.poster.style.backgroundImage) {\n ui.setPoster.call(this, this.poster);\n }\n\n // Manually set the duration if user has overridden it.\n // The event listeners for it doesn't get called if preload is disabled (#701)\n if (this.config.duration) {\n controls.durationUpdate.call(this);\n }\n },\n\n // Setup aria attribute for play and iframe title\n setTitle() {\n // Find the current text\n let label = i18n.get('play', this.config);\n\n // If there's a media title set, use that for the label\n if (utils.is.string(this.config.title) && !utils.is.empty(this.config.title)) {\n label += `, ${this.config.title}`;\n }\n\n // If there's a play button, set label\n if (utils.is.nodeList(this.elements.buttons.play)) {\n Array.from(this.elements.buttons.play).forEach(button => {\n button.setAttribute('aria-label', label);\n });\n }\n\n // Set iframe title\n // https://github.com/sampotts/plyr/issues/124\n if (this.isEmbed) {\n const iframe = utils.getElement.call(this, 'iframe');\n\n if (!utils.is.element(iframe)) {\n return;\n }\n\n // Default to media type\n const title = !utils.is.empty(this.config.title) ? this.config.title : 'video';\n const format = i18n.get('frameTitle', this.config);\n\n iframe.setAttribute('title', format.replace('{title}', title));\n }\n },\n\n // Toggle poster\n togglePoster(enable) {\n utils.toggleClass(this.elements.container, this.config.classNames.posterEnabled, enable);\n },\n\n // Set the poster image (async)\n setPoster(poster) {\n // Set property regardless of validity\n this.media.setAttribute('poster', poster);\n\n // Bail if element is missing\n if (!utils.is.element(this.elements.poster)) {\n return Promise.reject();\n }\n\n // Load the image, and set poster if successful\n const loadPromise = utils.loadImage(poster).then(() => {\n this.elements.poster.style.backgroundImage = `url('${poster}')`;\n Object.assign(this.elements.poster.style, {\n backgroundImage: `url('${poster}')`,\n // Reset backgroundSize as well (since it can be set to \"cover\" for padded thumbnails for youtube)\n backgroundSize: '',\n });\n ui.togglePoster.call(this, true);\n return poster;\n });\n\n // Hide the element if the poster can't be loaded (otherwise it will just be a black element covering the video)\n loadPromise.catch(() => ui.togglePoster.call(this, false));\n\n // Return the promise so the caller can use it as well\n return loadPromise;\n },\n\n // Check playing state\n checkPlaying(event) {\n // Class hooks\n utils.toggleClass(this.elements.container, this.config.classNames.playing, this.playing);\n utils.toggleClass(this.elements.container, this.config.classNames.paused, this.paused);\n utils.toggleClass(this.elements.container, this.config.classNames.stopped, this.stopped);\n\n // Set state\n Array.from(this.elements.buttons.play).forEach(target => {\n target.pressed = this.playing;\n });\n\n // Only update controls on non timeupdate events\n if (utils.is.event(event) && event.type === 'timeupdate') {\n return;\n }\n\n // Toggle controls\n ui.toggleControls.call(this);\n },\n\n // Check if media is loading\n checkLoading(event) {\n this.loading = [\n 'stalled',\n 'waiting',\n ].includes(event.type);\n\n // Clear timer\n clearTimeout(this.timers.loading);\n\n // Timer to prevent flicker when seeking\n this.timers.loading = setTimeout(() => {\n // Update progress bar loading class state\n utils.toggleClass(this.elements.container, this.config.classNames.loading, this.loading);\n\n // Update controls visibility\n ui.toggleControls.call(this);\n }, this.loading ? 250 : 0);\n },\n\n // Toggle controls based on state and `force` argument\n toggleControls(force) {\n const { controls } = this.elements;\n\n if (controls && this.config.hideControls) {\n // Show controls if force, loading, paused, or button interaction, otherwise hide\n this.toggleControls(Boolean(force || this.loading || this.paused || controls.pressed || controls.hover));\n }\n },\n};\n\nexport default ui;\n","// ==========================================================================\n// Plyr Event Listeners\n// ==========================================================================\n\nimport controls from './controls';\nimport ui from './ui';\nimport utils from './utils';\n\n// Sniff out the browser\nconst browser = utils.getBrowser();\n\nclass Listeners {\n constructor(player) {\n this.player = player;\n this.lastKey = null;\n\n this.handleKey = this.handleKey.bind(this);\n this.toggleMenu = this.toggleMenu.bind(this);\n this.firstTouch = this.firstTouch.bind(this);\n }\n\n // Handle key presses\n handleKey(event) {\n const code = event.keyCode ? event.keyCode : event.which;\n const pressed = event.type === 'keydown';\n const repeat = pressed && code === this.lastKey;\n\n // Bail if a modifier key is set\n if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) {\n return;\n }\n\n // If the event is bubbled from the media element\n // Firefox doesn't get the keycode for whatever reason\n if (!utils.is.number(code)) {\n return;\n }\n\n // Seek by the number keys\n const seekByKey = () => {\n // Divide the max duration into 10th's and times by the number value\n this.player.currentTime = this.player.duration / 10 * (code - 48);\n };\n\n // Handle the key on keydown\n // Reset on keyup\n if (pressed) {\n // Which keycodes should we prevent default\n const preventDefault = [\n 48,\n 49,\n 50,\n 51,\n 52,\n 53,\n 54,\n 56,\n 57,\n 32,\n 75,\n 38,\n 40,\n 77,\n 39,\n 37,\n 70,\n 67,\n 73,\n 76,\n 79,\n ];\n\n // Check focused element\n // and if the focused element is not editable (e.g. text input)\n // and any that accept key input http://webaim.org/techniques/keyboard/\n const focused = utils.getFocusElement();\n if (utils.is.element(focused) && (\n focused !== this.player.elements.inputs.seek &&\n utils.matches(focused, this.player.config.selectors.editable))\n ) {\n return;\n }\n\n // If the code is found prevent default (e.g. prevent scrolling for arrows)\n if (preventDefault.includes(code)) {\n event.preventDefault();\n event.stopPropagation();\n }\n\n switch (code) {\n case 48:\n case 49:\n case 50:\n case 51:\n case 52:\n case 53:\n case 54:\n case 55:\n case 56:\n case 57:\n // 0-9\n if (!repeat) {\n seekByKey();\n }\n break;\n\n case 32:\n case 75:\n // Space and K key\n if (!repeat) {\n this.player.togglePlay();\n }\n break;\n\n case 38:\n // Arrow up\n this.player.increaseVolume(0.1);\n break;\n\n case 40:\n // Arrow down\n this.player.decreaseVolume(0.1);\n break;\n\n case 77:\n // M key\n if (!repeat) {\n this.player.muted = !this.player.muted;\n }\n break;\n\n case 39:\n // Arrow forward\n this.player.forward();\n break;\n\n case 37:\n // Arrow back\n this.player.rewind();\n break;\n\n case 70:\n // F key\n this.player.fullscreen.toggle();\n break;\n\n case 67:\n // C key\n if (!repeat) {\n this.player.toggleCaptions();\n }\n break;\n\n case 76:\n // L key\n this.player.loop = !this.player.loop;\n break;\n\n /* case 73:\n this.setLoop('start');\n break;\n\n case 76:\n this.setLoop();\n break;\n\n case 79:\n this.setLoop('end');\n break; */\n\n default:\n break;\n }\n\n // Escape is handle natively when in full screen\n // So we only need to worry about non native\n if (!this.player.fullscreen.enabled && this.player.fullscreen.active && code === 27) {\n this.player.fullscreen.toggle();\n }\n\n // Store last code for next cycle\n this.lastKey = code;\n } else {\n this.lastKey = null;\n }\n }\n\n // Toggle menu\n toggleMenu(event) {\n controls.toggleMenu.call(this.player, event);\n }\n\n // Device is touch enabled\n firstTouch() {\n this.player.touch = true;\n\n // Add touch class\n utils.toggleClass(this.player.elements.container, this.player.config.classNames.isTouch, true);\n\n // Clean up\n utils.off(document.body, 'touchstart', this.firstTouch);\n }\n\n // Global window & document listeners\n global(toggle = true) {\n // Keyboard shortcuts\n if (this.player.config.keyboard.global) {\n utils.toggleListener(window, 'keydown keyup', this.handleKey, toggle, false);\n }\n\n // Click anywhere closes menu\n utils.toggleListener(document.body, 'click', this.toggleMenu, toggle);\n\n // Detect touch by events\n utils.on(document.body, 'touchstart', this.firstTouch);\n }\n\n // Container listeners\n container() {\n // Keyboard shortcuts\n if (!this.player.config.keyboard.global && this.player.config.keyboard.focused) {\n utils.on(this.player.elements.container, 'keydown keyup', this.handleKey, false);\n }\n\n // Detect tab focus\n // Remove class on blur/focusout\n utils.on(this.player.elements.container, 'focusout', event => {\n utils.toggleClass(event.target, this.player.config.classNames.tabFocus, false);\n });\n\n // Add classname to tabbed elements\n utils.on(this.player.elements.container, 'keydown', event => {\n if (event.keyCode !== 9) {\n return;\n }\n\n // Delay the adding of classname until the focus has changed\n // This event fires before the focusin event\n setTimeout(() => {\n utils.toggleClass(utils.getFocusElement(), this.player.config.classNames.tabFocus, true);\n }, 0);\n });\n\n // Toggle controls on mouse events and entering fullscreen\n utils.on(this.player.elements.container, 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen', event => {\n const { controls } = this.player.elements;\n\n // Remove button states for fullscreen\n if (event.type === 'enterfullscreen') {\n controls.pressed = false;\n controls.hover = false;\n }\n\n // Show, then hide after a timeout unless another control event occurs\n const show = [\n 'touchstart',\n 'touchmove',\n 'mousemove',\n ].includes(event.type);\n\n let delay = 0;\n\n if (show) {\n ui.toggleControls.call(this.player, true);\n // Use longer timeout for touch devices\n delay = this.player.touch ? 3000 : 2000;\n }\n\n // Clear timer\n clearTimeout(this.player.timers.controls);\n // Timer to prevent flicker when seeking\n this.player.timers.controls = setTimeout(() => ui.toggleControls.call(this.player, false), delay);\n });\n }\n\n // Listen for media events\n media() {\n // Time change on media\n utils.on(this.player.media, 'timeupdate seeking seeked', event => controls.timeUpdate.call(this.player, event));\n\n // Display duration\n utils.on(this.player.media, 'durationchange loadeddata loadedmetadata', event => controls.durationUpdate.call(this.player, event));\n\n // Check for audio tracks on load\n // We can't use `loadedmetadata` as it doesn't seem to have audio tracks at that point\n utils.on(this.player.media, 'loadeddata', () => {\n utils.toggleHidden(this.player.elements.volume, !this.player.hasAudio);\n utils.toggleHidden(this.player.elements.buttons.mute, !this.player.hasAudio);\n });\n\n // Handle the media finishing\n utils.on(this.player.media, 'ended', () => {\n // Show poster on end\n if (this.player.isHTML5 && this.player.isVideo && this.player.config.resetOnEnd) {\n // Restart\n this.player.restart();\n }\n });\n\n // Check for buffer progress\n utils.on(this.player.media, 'progress playing seeking seeked', event => controls.updateProgress.call(this.player, event));\n\n // Handle volume changes\n utils.on(this.player.media, 'volumechange', event => controls.updateVolume.call(this.player, event));\n\n // Handle play/pause\n utils.on(this.player.media, 'playing play pause ended emptied timeupdate', event => ui.checkPlaying.call(this.player, event));\n\n // Loading state\n utils.on(this.player.media, 'waiting canplay seeked playing', event => ui.checkLoading.call(this.player, event));\n\n // If autoplay, then load advertisement if required\n // TODO: Show some sort of loading state while the ad manager loads else there's a delay before ad shows\n utils.on(this.player.media, 'playing', () => {\n if (!this.player.ads) {\n return;\n }\n\n // If ads are enabled, wait for them first\n if (this.player.ads.enabled && !this.player.ads.initialized) {\n // Wait for manager response\n this.player.ads.managerPromise.then(() => this.player.ads.play()).catch(() => this.player.play());\n }\n });\n\n // Click video\n if (this.player.supported.ui && this.player.config.clickToPlay && !this.player.isAudio) {\n // Re-fetch the wrapper\n const wrapper = utils.getElement.call(this.player, `.${this.player.config.classNames.video}`);\n\n // Bail if there's no wrapper (this should never happen)\n if (!utils.is.element(wrapper)) {\n return;\n }\n\n // On click play, pause ore restart\n utils.on(wrapper, 'click', () => {\n // Touch devices will just show controls (if we're hiding controls)\n if (this.player.config.hideControls && this.player.touch && !this.player.paused) {\n return;\n }\n\n if (this.player.paused) {\n this.player.play();\n } else if (this.player.ended) {\n this.player.restart();\n this.player.play();\n } else {\n this.player.pause();\n }\n });\n }\n\n // Disable right click\n if (this.player.supported.ui && this.player.config.disableContextMenu) {\n utils.on(\n this.player.elements.wrapper,\n 'contextmenu',\n event => {\n event.preventDefault();\n },\n false,\n );\n }\n\n // Volume change\n utils.on(this.player.media, 'volumechange', () => {\n // Save to storage\n this.player.storage.set({ volume: this.player.volume, muted: this.player.muted });\n });\n\n // Speed change\n utils.on(this.player.media, 'ratechange', () => {\n // Update UI\n controls.updateSetting.call(this.player, 'speed');\n\n // Save to storage\n this.player.storage.set({ speed: this.player.speed });\n });\n\n // Quality request\n utils.on(this.player.media, 'qualityrequested', event => {\n // Save to storage\n this.player.storage.set({ quality: event.detail.quality });\n });\n\n // Quality change\n utils.on(this.player.media, 'qualitychange', event => {\n // Update UI\n controls.updateSetting.call(this.player, 'quality', null, event.detail.quality);\n });\n\n // Caption language change\n utils.on(this.player.media, 'languagechange', () => {\n // Update UI\n controls.updateSetting.call(this.player, 'captions');\n\n // Save to storage\n this.player.storage.set({ language: this.player.language });\n });\n\n // Captions toggle\n utils.on(this.player.media, 'captionsenabled captionsdisabled', () => {\n // Update UI\n controls.updateSetting.call(this.player, 'captions');\n\n // Save to storage\n this.player.storage.set({ captions: this.player.captions.active });\n });\n\n // Proxy events to container\n // Bubble up key events for Edge\n utils.on(this.player.media, this.player.config.events.concat([\n 'keyup',\n 'keydown',\n ]).join(' '), event => {\n let {detail = {}} = event;\n\n // Get error details from media\n if (event.type === 'error') {\n detail = this.player.media.error;\n }\n\n utils.dispatchEvent.call(this.player, this.player.elements.container, event.type, true, detail);\n });\n }\n\n // Listen for control events\n controls() {\n // IE doesn't support input event, so we fallback to change\n const inputEvent = browser.isIE ? 'change' : 'input';\n\n // Run default and custom handlers\n const proxy = (event, defaultHandler, customHandlerKey) => {\n const customHandler = this.player.config.listeners[customHandlerKey];\n const hasCustomHandler = utils.is.function(customHandler);\n let returned = true;\n\n // Execute custom handler\n if (hasCustomHandler) {\n returned = customHandler.call(this.player, event);\n }\n\n // Only call default handler if not prevented in custom handler\n if (returned && utils.is.function(defaultHandler)) {\n defaultHandler.call(this.player, event);\n }\n };\n\n // Trigger custom and default handlers\n const on = (element, type, defaultHandler, customHandlerKey, passive = true) => {\n const customHandler = this.player.config.listeners[customHandlerKey];\n const hasCustomHandler = utils.is.function(customHandler);\n\n utils.on(element, type, event => proxy(event, defaultHandler, customHandlerKey), passive && !hasCustomHandler);\n };\n\n // Play/pause toggle\n on(this.player.elements.buttons.play, 'click', this.player.togglePlay, 'play');\n\n // Pause\n on(this.player.elements.buttons.restart, 'click', this.player.restart, 'restart');\n\n // Rewind\n on(this.player.elements.buttons.rewind, 'click', this.player.rewind, 'rewind');\n\n // Rewind\n on(this.player.elements.buttons.fastForward, 'click', this.player.forward, 'fastForward');\n\n // Mute toggle\n on(\n this.player.elements.buttons.mute,\n 'click',\n () => {\n this.player.muted = !this.player.muted;\n },\n 'mute',\n );\n\n // Captions toggle\n on(this.player.elements.buttons.captions, 'click', this.player.toggleCaptions);\n\n // Fullscreen toggle\n on(\n this.player.elements.buttons.fullscreen,\n 'click',\n () => {\n this.player.fullscreen.toggle();\n },\n 'fullscreen',\n );\n\n // Picture-in-Picture\n on(\n this.player.elements.buttons.pip,\n 'click',\n () => {\n this.player.pip = 'toggle';\n },\n 'pip',\n );\n\n // Airplay\n on(this.player.elements.buttons.airplay, 'click', this.player.airplay, 'airplay');\n\n // Settings menu\n on(this.player.elements.buttons.settings, 'click', event => {\n controls.toggleMenu.call(this.player, event);\n });\n\n // Settings menu\n on(this.player.elements.settings.form, 'click', event => {\n event.stopPropagation();\n\n // Go back to home tab on click\n const showHomeTab = () => {\n const id = `plyr-settings-${this.player.id}-home`;\n controls.showTab.call(this.player, id);\n };\n\n // Settings menu items - use event delegation as items are added/removed\n if (utils.matches(event.target, this.player.config.selectors.inputs.language)) {\n proxy(\n event,\n () => {\n this.player.currentTrack = Number(event.target.value);\n showHomeTab();\n },\n 'language',\n );\n } else if (utils.matches(event.target, this.player.config.selectors.inputs.quality)) {\n proxy(\n event,\n () => {\n this.player.quality = event.target.value;\n showHomeTab();\n },\n 'quality',\n );\n } else if (utils.matches(event.target, this.player.config.selectors.inputs.speed)) {\n proxy(\n event,\n () => {\n this.player.speed = parseFloat(event.target.value);\n showHomeTab();\n },\n 'speed',\n );\n } else {\n const tab = event.target;\n controls.showTab.call(this.player, tab.getAttribute('aria-controls'));\n }\n });\n\n // Set range input alternative \"value\", which matches the tooltip time (#954)\n on(this.player.elements.inputs.seek, 'mousedown mousemove', event => {\n const clientRect = this.player.elements.progress.getBoundingClientRect();\n const percent = 100 / clientRect.width * (event.pageX - clientRect.left);\n event.currentTarget.setAttribute('seek-value', percent);\n });\n\n // Pause while seeking\n on(this.player.elements.inputs.seek, 'mousedown mouseup keydown keyup touchstart touchend', event => {\n const seek = event.currentTarget;\n\n const code = event.keyCode ? event.keyCode : event.which;\n const eventType = event.type;\n\n if ((eventType === 'keydown' || eventType === 'keyup') && (code !== 39 && code !== 37)) {\n return;\n }\n // Was playing before?\n const play = seek.hasAttribute('play-on-seeked');\n\n // Done seeking\n const done = [\n 'mouseup',\n 'touchend',\n 'keyup',\n ].includes(event.type);\n\n // If we're done seeking and it was playing, resume playback\n if (play && done) {\n seek.removeAttribute('play-on-seeked');\n this.player.play();\n } else if (!done && this.player.playing) {\n seek.setAttribute('play-on-seeked', '');\n this.player.pause();\n }\n });\n\n // Seek\n on(\n this.player.elements.inputs.seek,\n inputEvent,\n event => {\n const seek = event.currentTarget;\n\n // If it exists, use seek-value instead of \"value\" for consistency with tooltip time (#954)\n let seekTo = seek.getAttribute('seek-value');\n\n if (utils.is.empty(seekTo)) {\n seekTo = seek.value;\n }\n\n seek.removeAttribute('seek-value');\n\n this.player.currentTime = seekTo / seek.max * this.player.duration;\n },\n 'seek',\n );\n\n // Current time invert\n // Only if one time element is used for both currentTime and duration\n if (this.player.config.toggleInvert && !utils.is.element(this.player.elements.display.duration)) {\n on(this.player.elements.display.currentTime, 'click', () => {\n // Do nothing if we're at the start\n if (this.player.currentTime === 0) {\n return;\n }\n\n this.player.config.invertTime = !this.player.config.invertTime;\n\n controls.timeUpdate.call(this.player);\n });\n }\n\n // Volume\n on(\n this.player.elements.inputs.volume,\n inputEvent,\n event => {\n this.player.volume = event.target.value;\n },\n 'volume',\n );\n\n // Polyfill for lower fill in <input type=\"range\"> for webkit\n if (browser.isWebkit) {\n on(utils.getElements.call(this.player, 'input[type=\"range\"]'), 'input', event => {\n controls.updateRangeFill.call(this.player, event.target);\n });\n }\n\n // Seek tooltip\n on(this.player.elements.progress, 'mouseenter mouseleave mousemove', event => controls.updateSeekTooltip.call(this.player, event));\n\n // Update controls.hover state (used for ui.toggleControls to avoid hiding when interacting)\n on(this.player.elements.controls, 'mouseenter mouseleave', event => {\n this.player.elements.controls.hover = !this.player.touch && event.type === 'mouseenter';\n });\n\n // Update controls.pressed state (used for ui.toggleControls to avoid hiding when interacting)\n on(this.player.elements.controls, 'mousedown mouseup touchstart touchend touchcancel', event => {\n this.player.elements.controls.pressed = [\n 'mousedown',\n 'touchstart',\n ].includes(event.type);\n });\n\n // Focus in/out on controls\n on(this.player.elements.controls, 'focusin focusout', event => {\n const { config, elements, timers } = this.player;\n\n // Skip transition to prevent focus from scrolling the parent element\n utils.toggleClass(elements.controls, config.classNames.noTransition, event.type === 'focusin');\n\n // Toggle\n ui.toggleControls.call(this.player, event.type === 'focusin');\n\n // If focusin, hide again after delay\n if (event.type === 'focusin') {\n // Restore transition\n setTimeout(() => {\n utils.toggleClass(elements.controls, config.classNames.noTransition, false);\n }, 0);\n\n // Delay a little more for keyboard users\n const delay = this.touch ? 3000 : 4000;\n\n // Clear timer\n clearTimeout(timers.controls);\n // Hide\n timers.controls = setTimeout(() => ui.toggleControls.call(this.player, false), delay);\n }\n });\n\n // Mouse wheel for volume\n on(\n this.player.elements.inputs.volume,\n 'wheel',\n event => {\n // Detect \"natural\" scroll - suppored on OS X Safari only\n // Other browsers on OS X will be inverted until support improves\n const inverted = event.webkitDirectionInvertedFromDevice;\n const step = 1 / 50;\n let direction = 0;\n\n // Scroll down (or up on natural) to decrease\n if (event.deltaY < 0 || event.deltaX > 0) {\n if (inverted) {\n this.player.decreaseVolume(step);\n direction = -1;\n } else {\n this.player.increaseVolume(step);\n direction = 1;\n }\n }\n\n // Scroll up (or down on natural) to increase\n if (event.deltaY > 0 || event.deltaX < 0) {\n if (inverted) {\n this.player.increaseVolume(step);\n direction = 1;\n } else {\n this.player.decreaseVolume(step);\n direction = -1;\n }\n }\n\n // Don't break page scrolling at max and min\n if ((direction === 1 && this.player.media.volume < 1) || (direction === -1 && this.player.media.volume > 0)) {\n event.preventDefault();\n }\n },\n 'volume',\n false,\n );\n }\n\n // Reset on destroy\n clear() {\n this.global(false);\n }\n}\n\nexport default Listeners;\n","// ==========================================================================\n// Vimeo plugin\n// ==========================================================================\n\nimport captions from './../captions';\nimport controls from './../controls';\nimport ui from './../ui';\nimport utils from './../utils';\n\n// Set playback state and trigger change (only on actual change)\nfunction assurePlaybackState(play) {\n if (play && !this.embed.hasPlayed) {\n this.embed.hasPlayed = true;\n }\n if (this.media.paused === play) {\n this.media.paused = !play;\n utils.dispatchEvent.call(this, this.media, play ? 'play' : 'pause');\n }\n}\n\nconst vimeo = {\n setup() {\n // Add embed class for responsive\n utils.toggleClass(this.elements.wrapper, this.config.classNames.embed, true);\n\n // Set intial ratio\n vimeo.setAspectRatio.call(this);\n\n // Load the API if not already\n if (!utils.is.object(window.Vimeo)) {\n utils\n .loadScript(this.config.urls.vimeo.sdk)\n .then(() => {\n vimeo.ready.call(this);\n })\n .catch(error => {\n this.debug.warn('Vimeo API failed to load', error);\n });\n } else {\n vimeo.ready.call(this);\n }\n },\n\n // Set aspect ratio\n // For Vimeo we have an extra 300% height <div> to hide the standard controls and UI\n setAspectRatio(input) {\n const ratio = utils.is.string(input) ? input.split(':') : this.config.ratio.split(':');\n const padding = 100 / ratio[0] * ratio[1];\n this.elements.wrapper.style.paddingBottom = `${padding}%`;\n\n if (this.supported.ui) {\n const height = 240;\n const offset = (height - padding) / (height / 50);\n\n this.media.style.transform = `translateY(-${offset}%)`;\n }\n },\n\n // API Ready\n ready() {\n const player = this;\n\n // Get Vimeo params for the iframe\n const options = {\n loop: player.config.loop.active,\n autoplay: player.autoplay,\n // muted: player.muted,\n byline: false,\n portrait: false,\n title: false,\n speed: true,\n transparent: 0,\n gesture: 'media',\n playsinline: !this.config.fullscreen.iosNative,\n };\n const params = utils.buildUrlParams(options);\n\n // Get the source URL or ID\n let source = player.media.getAttribute('src');\n\n // Get from <div> if needed\n if (utils.is.empty(source)) {\n source = player.media.getAttribute(player.config.attributes.embed.id);\n }\n\n const id = utils.parseVimeoId(source);\n\n // Build an iframe\n const iframe = utils.createElement('iframe');\n const src = utils.format(player.config.urls.vimeo.iframe, id, params);\n iframe.setAttribute('src', src);\n iframe.setAttribute('allowfullscreen', '');\n iframe.setAttribute('allowtransparency', '');\n iframe.setAttribute('allow', 'autoplay');\n\n // Inject the package\n const wrapper = utils.createElement('div', { class: player.config.classNames.embedContainer });\n wrapper.appendChild(iframe);\n player.media = utils.replaceElement(wrapper, player.media);\n\n // Get poster image\n utils.fetch(utils.format(player.config.urls.vimeo.api, id), 'json').then(response => {\n if (utils.is.empty(response)) {\n return;\n }\n\n // Get the URL for thumbnail\n const url = new URL(response[0].thumbnail_large);\n\n // Get original image\n url.pathname = `${url.pathname.split('_')[0]}.jpg`;\n\n // Set and show poster\n ui.setPoster.call(player, url.href);\n });\n\n // Setup instance\n // https://github.com/vimeo/player.js\n player.embed = new window.Vimeo.Player(iframe, {\n autopause: player.config.autopause,\n muted: player.muted,\n });\n\n player.media.paused = true;\n player.media.currentTime = 0;\n\n // Disable native text track rendering\n if (player.supported.ui) {\n player.embed.disableTextTrack();\n }\n\n // Create a faux HTML5 API using the Vimeo API\n player.media.play = () => {\n assurePlaybackState.call(player, true);\n return player.embed.play();\n };\n\n player.media.pause = () => {\n assurePlaybackState.call(player, false);\n return player.embed.pause();\n };\n\n player.media.stop = () => {\n player.pause();\n player.currentTime = 0;\n };\n\n // Seeking\n let { currentTime } = player.media;\n Object.defineProperty(player.media, 'currentTime', {\n get() {\n return currentTime;\n },\n set(time) {\n // Vimeo will automatically play on seek if the video hasn't been played before\n\n // Get current paused state and volume etc\n const { embed, media, paused, volume } = player;\n const restorePause = paused && !embed.hasPlayed;\n\n // Set seeking state and trigger event\n media.seeking = true;\n utils.dispatchEvent.call(player, media, 'seeking');\n\n // If paused, mute until seek is complete\n Promise.resolve(restorePause && embed.setVolume(0))\n // Seek\n .then(() => embed.setCurrentTime(time))\n // Restore paused\n .then(() => restorePause && embed.pause())\n // Restore volume\n .then(() => restorePause && embed.setVolume(volume))\n .catch(() => {\n // Do nothing\n });\n },\n });\n\n // Playback speed\n let speed = player.config.speed.selected;\n Object.defineProperty(player.media, 'playbackRate', {\n get() {\n return speed;\n },\n set(input) {\n player.embed\n .setPlaybackRate(input)\n .then(() => {\n speed = input;\n utils.dispatchEvent.call(player, player.media, 'ratechange');\n })\n .catch(error => {\n // Hide menu item (and menu if empty)\n if (error.name === 'Error') {\n controls.setSpeedMenu.call(player, []);\n }\n });\n },\n });\n\n // Volume\n let { volume } = player.config;\n Object.defineProperty(player.media, 'volume', {\n get() {\n return volume;\n },\n set(input) {\n player.embed.setVolume(input).then(() => {\n volume = input;\n utils.dispatchEvent.call(player, player.media, 'volumechange');\n });\n },\n });\n\n // Muted\n let { muted } = player.config;\n Object.defineProperty(player.media, 'muted', {\n get() {\n return muted;\n },\n set(input) {\n const toggle = utils.is.boolean(input) ? input : false;\n\n player.embed.setVolume(toggle ? 0 : player.config.volume).then(() => {\n muted = toggle;\n utils.dispatchEvent.call(player, player.media, 'volumechange');\n });\n },\n });\n\n // Loop\n let { loop } = player.config;\n Object.defineProperty(player.media, 'loop', {\n get() {\n return loop;\n },\n set(input) {\n const toggle = utils.is.boolean(input) ? input : player.config.loop.active;\n\n player.embed.setLoop(toggle).then(() => {\n loop = toggle;\n });\n },\n });\n\n // Source\n let currentSrc;\n player.embed\n .getVideoUrl()\n .then(value => {\n currentSrc = value;\n })\n .catch(error => {\n this.debug.warn(error);\n });\n\n Object.defineProperty(player.media, 'currentSrc', {\n get() {\n return currentSrc;\n },\n });\n\n // Ended\n Object.defineProperty(player.media, 'ended', {\n get() {\n return player.currentTime === player.duration;\n },\n });\n\n // Set aspect ratio based on video size\n Promise.all([\n player.embed.getVideoWidth(),\n player.embed.getVideoHeight(),\n ]).then(dimensions => {\n const ratio = utils.getAspectRatio(dimensions[0], dimensions[1]);\n vimeo.setAspectRatio.call(this, ratio);\n });\n\n // Set autopause\n player.embed.setAutopause(player.config.autopause).then(state => {\n player.config.autopause = state;\n });\n\n // Get title\n player.embed.getVideoTitle().then(title => {\n player.config.title = title;\n ui.setTitle.call(this);\n });\n\n // Get current time\n player.embed.getCurrentTime().then(value => {\n currentTime = value;\n utils.dispatchEvent.call(player, player.media, 'timeupdate');\n });\n\n // Get duration\n player.embed.getDuration().then(value => {\n player.media.duration = value;\n utils.dispatchEvent.call(player, player.media, 'durationchange');\n });\n\n // Get captions\n player.embed.getTextTracks().then(tracks => {\n player.media.textTracks = tracks;\n captions.setup.call(player);\n });\n\n player.embed.on('cuechange', ({ cues = [] }) => {\n const strippedCues = cues.map(cue => utils.stripHTML(cue.text));\n captions.updateCues.call(player, strippedCues);\n });\n\n player.embed.on('loaded', () => {\n // Assure state and events are updated on autoplay\n player.embed.getPaused().then(paused => {\n assurePlaybackState.call(player, !paused);\n if (!paused) {\n utils.dispatchEvent.call(player, player.media, 'playing');\n }\n });\n\n if (utils.is.element(player.embed.element) && player.supported.ui) {\n const frame = player.embed.element;\n\n // Fix keyboard focus issues\n // https://github.com/sampotts/plyr/issues/317\n frame.setAttribute('tabindex', -1);\n }\n });\n\n player.embed.on('play', () => {\n assurePlaybackState.call(player, true);\n utils.dispatchEvent.call(player, player.media, 'playing');\n });\n\n player.embed.on('pause', () => {\n assurePlaybackState.call(player, false);\n });\n\n player.embed.on('timeupdate', data => {\n player.media.seeking = false;\n currentTime = data.seconds;\n utils.dispatchEvent.call(player, player.media, 'timeupdate');\n });\n\n player.embed.on('progress', data => {\n player.media.buffered = data.percent;\n utils.dispatchEvent.call(player, player.media, 'progress');\n\n // Check all loaded\n if (parseInt(data.percent, 10) === 1) {\n utils.dispatchEvent.call(player, player.media, 'canplaythrough');\n }\n\n // Get duration as if we do it before load, it gives an incorrect value\n // https://github.com/sampotts/plyr/issues/891\n player.embed.getDuration().then(value => {\n if (value !== player.media.duration) {\n player.media.duration = value;\n utils.dispatchEvent.call(player, player.media, 'durationchange');\n }\n });\n });\n\n player.embed.on('seeked', () => {\n player.media.seeking = false;\n utils.dispatchEvent.call(player, player.media, 'seeked');\n });\n\n player.embed.on('ended', () => {\n player.media.paused = true;\n utils.dispatchEvent.call(player, player.media, 'ended');\n });\n\n player.embed.on('error', detail => {\n player.media.error = detail;\n utils.dispatchEvent.call(player, player.media, 'error');\n });\n\n // Rebuild UI\n setTimeout(() => ui.build.call(player), 0);\n },\n};\n\nexport default vimeo;\n","// ==========================================================================\n// YouTube plugin\n// ==========================================================================\n\nimport controls from './../controls';\nimport ui from './../ui';\nimport utils from './../utils';\n\n// Standardise YouTube quality unit\nfunction mapQualityUnit(input) {\n switch (input) {\n case 'hd2160':\n return 2160;\n\n case 2160:\n return 'hd2160';\n\n case 'hd1440':\n return 1440;\n\n case 1440:\n return 'hd1440';\n\n case 'hd1080':\n return 1080;\n\n case 1080:\n return 'hd1080';\n\n case 'hd720':\n return 720;\n\n case 720:\n return 'hd720';\n\n case 'large':\n return 480;\n\n case 480:\n return 'large';\n\n case 'medium':\n return 360;\n\n case 360:\n return 'medium';\n\n case 'small':\n return 240;\n\n case 240:\n return 'small';\n\n default:\n return 'default';\n }\n}\n\nfunction mapQualityUnits(levels) {\n if (utils.is.empty(levels)) {\n return levels;\n }\n\n return utils.dedupe(levels.map(level => mapQualityUnit(level)));\n}\n\n// Set playback state and trigger change (only on actual change)\nfunction assurePlaybackState(play) {\n if (play && !this.embed.hasPlayed) {\n this.embed.hasPlayed = true;\n }\n if (this.media.paused === play) {\n this.media.paused = !play;\n utils.dispatchEvent.call(this, this.media, play ? 'play' : 'pause');\n }\n}\n\nconst youtube = {\n setup() {\n // Add embed class for responsive\n utils.toggleClass(this.elements.wrapper, this.config.classNames.embed, true);\n\n // Set aspect ratio\n youtube.setAspectRatio.call(this);\n\n // Setup API\n if (utils.is.object(window.YT) && utils.is.function(window.YT.Player)) {\n youtube.ready.call(this);\n } else {\n // Load the API\n utils.loadScript(this.config.urls.youtube.sdk).catch(error => {\n this.debug.warn('YouTube API failed to load', error);\n });\n\n // Setup callback for the API\n // YouTube has it's own system of course...\n window.onYouTubeReadyCallbacks = window.onYouTubeReadyCallbacks || [];\n\n // Add to queue\n window.onYouTubeReadyCallbacks.push(() => {\n youtube.ready.call(this);\n });\n\n // Set callback to process queue\n window.onYouTubeIframeAPIReady = () => {\n window.onYouTubeReadyCallbacks.forEach(callback => {\n callback();\n });\n };\n }\n },\n\n // Get the media title\n getTitle(videoId) {\n // Try via undocumented API method first\n // This method disappears now and then though...\n // https://github.com/sampotts/plyr/issues/709\n if (utils.is.function(this.embed.getVideoData)) {\n const { title } = this.embed.getVideoData();\n\n if (utils.is.empty(title)) {\n this.config.title = title;\n ui.setTitle.call(this);\n return;\n }\n }\n\n // Or via Google API\n const key = this.config.keys.google;\n if (utils.is.string(key) && !utils.is.empty(key)) {\n const url = utils.format(this.config.urls.youtube.api, videoId, key);\n\n utils\n .fetch(url)\n .then(result => {\n if (utils.is.object(result)) {\n this.config.title = result.items[0].snippet.title;\n ui.setTitle.call(this);\n }\n })\n .catch(() => {});\n }\n },\n\n // Set aspect ratio\n setAspectRatio() {\n const ratio = this.config.ratio.split(':');\n this.elements.wrapper.style.paddingBottom = `${100 / ratio[0] * ratio[1]}%`;\n },\n\n // API ready\n ready() {\n const player = this;\n\n // Ignore already setup (race condition)\n const currentId = player.media.getAttribute('id');\n if (!utils.is.empty(currentId) && currentId.startsWith('youtube-')) {\n return;\n }\n\n // Get the source URL or ID\n let source = player.media.getAttribute('src');\n\n // Get from <div> if needed\n if (utils.is.empty(source)) {\n source = player.media.getAttribute(this.config.attributes.embed.id);\n }\n\n // Replace the <iframe> with a <div> due to YouTube API issues\n const videoId = utils.parseYouTubeId(source);\n const id = utils.generateId(player.provider);\n const container = utils.createElement('div', { id });\n player.media = utils.replaceElement(container, player.media);\n\n // Set poster image\n const posterSrc = format => `https://img.youtube.com/vi/${videoId}/${format}default.jpg`;\n\n // Check thumbnail images in order of quality, but reject fallback thumbnails (120px wide)\n utils.loadImage(posterSrc('maxres'), 121) // Higest quality and unpadded\n .catch(() => utils.loadImage(posterSrc('sd'), 121)) // 480p padded 4:3\n .catch(() => utils.loadImage(posterSrc('hq'))) // 360p padded 4:3. Always exists\n .then(image => ui.setPoster.call(player, image.src))\n .then(posterSrc => {\n // If the image is padded, use background-size \"cover\" instead (like youtube does too with their posters)\n if (!posterSrc.includes('maxres')) {\n player.elements.poster.style.backgroundSize = 'cover';\n }\n });\n\n // Setup instance\n // https://developers.google.com/youtube/iframe_api_reference\n player.embed = new window.YT.Player(id, {\n videoId,\n playerVars: {\n autoplay: player.config.autoplay ? 1 : 0, // Autoplay\n controls: player.supported.ui ? 0 : 1, // Only show controls if not fully supported\n rel: 0, // No related vids\n showinfo: 0, // Hide info\n iv_load_policy: 3, // Hide annotations\n modestbranding: 1, // Hide logos as much as possible (they still show one in the corner when paused)\n disablekb: 1, // Disable keyboard as we handle it\n playsinline: 1, // Allow iOS inline playback\n\n // Tracking for stats\n // origin: window ? `${window.location.protocol}//${window.location.host}` : null,\n widget_referrer: window ? window.location.href : null,\n\n // Captions are flaky on YouTube\n cc_load_policy: player.captions.active ? 1 : 0,\n cc_lang_pref: player.config.captions.language,\n },\n events: {\n onError(event) {\n // If we've already fired an error, don't do it again\n // YouTube fires onError twice\n if (utils.is.object(player.media.error)) {\n return;\n }\n\n const detail = {\n code: event.data,\n };\n\n // Messages copied from https://developers.google.com/youtube/iframe_api_reference#onError\n switch (event.data) {\n case 2:\n detail.message =\n 'The request contains an invalid parameter value. For example, this error occurs if you specify a video ID that does not have 11 characters, or if the video ID contains invalid characters, such as exclamation points or asterisks.';\n break;\n\n case 5:\n detail.message =\n 'The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.';\n break;\n\n case 100:\n detail.message =\n 'The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.';\n break;\n\n case 101:\n case 150:\n detail.message = 'The owner of the requested video does not allow it to be played in embedded players.';\n break;\n\n default:\n detail.message = 'An unknown error occured';\n break;\n }\n\n player.media.error = detail;\n\n utils.dispatchEvent.call(player, player.media, 'error');\n },\n onPlaybackQualityChange() {\n utils.dispatchEvent.call(player, player.media, 'qualitychange', false, {\n quality: player.media.quality,\n });\n },\n onPlaybackRateChange(event) {\n // Get the instance\n const instance = event.target;\n\n // Get current speed\n player.media.playbackRate = instance.getPlaybackRate();\n\n utils.dispatchEvent.call(player, player.media, 'ratechange');\n },\n onReady(event) {\n // Get the instance\n const instance = event.target;\n\n // Get the title\n youtube.getTitle.call(player, videoId);\n\n // Create a faux HTML5 API using the YouTube API\n player.media.play = () => {\n assurePlaybackState.call(player, true);\n instance.playVideo();\n };\n\n player.media.pause = () => {\n assurePlaybackState.call(player, false);\n instance.pauseVideo();\n };\n\n player.media.stop = () => {\n instance.stopVideo();\n };\n\n player.media.duration = instance.getDuration();\n player.media.paused = true;\n\n // Seeking\n player.media.currentTime = 0;\n Object.defineProperty(player.media, 'currentTime', {\n get() {\n return Number(instance.getCurrentTime());\n },\n set(time) {\n // If paused, mute audio preventively (YouTube starts playing on seek if the video hasn't been played yet).\n if (player.paused) {\n player.embed.mute();\n }\n\n // Set seeking state and trigger event\n player.media.seeking = true;\n utils.dispatchEvent.call(player, player.media, 'seeking');\n\n // Seek after events sent\n instance.seekTo(time);\n },\n });\n\n // Playback speed\n Object.defineProperty(player.media, 'playbackRate', {\n get() {\n return instance.getPlaybackRate();\n },\n set(input) {\n instance.setPlaybackRate(input);\n },\n });\n\n // Quality\n Object.defineProperty(player.media, 'quality', {\n get() {\n return mapQualityUnit(instance.getPlaybackQuality());\n },\n set(input) {\n const quality = input;\n\n // Set via API\n instance.setPlaybackQuality(mapQualityUnit(quality));\n\n // Trigger request event\n utils.dispatchEvent.call(player, player.media, 'qualityrequested', false, {\n quality,\n });\n },\n });\n\n // Volume\n let { volume } = player.config;\n Object.defineProperty(player.media, 'volume', {\n get() {\n return volume;\n },\n set(input) {\n volume = input;\n instance.setVolume(volume * 100);\n utils.dispatchEvent.call(player, player.media, 'volumechange');\n },\n });\n\n // Muted\n let { muted } = player.config;\n Object.defineProperty(player.media, 'muted', {\n get() {\n return muted;\n },\n set(input) {\n const toggle = utils.is.boolean(input) ? input : muted;\n muted = toggle;\n instance[toggle ? 'mute' : 'unMute']();\n utils.dispatchEvent.call(player, player.media, 'volumechange');\n },\n });\n\n // Source\n Object.defineProperty(player.media, 'currentSrc', {\n get() {\n return instance.getVideoUrl();\n },\n });\n\n // Ended\n Object.defineProperty(player.media, 'ended', {\n get() {\n return player.currentTime === player.duration;\n },\n });\n\n // Get available speeds\n player.options.speed = instance.getAvailablePlaybackRates();\n\n // Set the tabindex to avoid focus entering iframe\n if (player.supported.ui) {\n player.media.setAttribute('tabindex', -1);\n }\n\n utils.dispatchEvent.call(player, player.media, 'timeupdate');\n utils.dispatchEvent.call(player, player.media, 'durationchange');\n\n // Reset timer\n clearInterval(player.timers.buffering);\n\n // Setup buffering\n player.timers.buffering = setInterval(() => {\n // Get loaded % from YouTube\n player.media.buffered = instance.getVideoLoadedFraction();\n\n // Trigger progress only when we actually buffer something\n if (player.media.lastBuffered === null || player.media.lastBuffered < player.media.buffered) {\n utils.dispatchEvent.call(player, player.media, 'progress');\n }\n\n // Set last buffer point\n player.media.lastBuffered = player.media.buffered;\n\n // Bail if we're at 100%\n if (player.media.buffered === 1) {\n clearInterval(player.timers.buffering);\n\n // Trigger event\n utils.dispatchEvent.call(player, player.media, 'canplaythrough');\n }\n }, 200);\n\n // Rebuild UI\n setTimeout(() => ui.build.call(player), 50);\n },\n onStateChange(event) {\n // Get the instance\n const instance = event.target;\n\n // Reset timer\n clearInterval(player.timers.playing);\n\n const seeked = player.media.seeking && [\n 1,\n 2,\n ].includes(event.data);\n\n if (seeked) {\n // Unset seeking and fire seeked event\n player.media.seeking = false;\n utils.dispatchEvent.call(player, player.media, 'seeked');\n }\n\n // Handle events\n // -1 Unstarted\n // 0 Ended\n // 1 Playing\n // 2 Paused\n // 3 Buffering\n // 5 Video cued\n switch (event.data) {\n case -1:\n // Update scrubber\n utils.dispatchEvent.call(player, player.media, 'timeupdate');\n\n // Get loaded % from YouTube\n player.media.buffered = instance.getVideoLoadedFraction();\n utils.dispatchEvent.call(player, player.media, 'progress');\n\n break;\n\n case 0:\n assurePlaybackState.call(player, false);\n\n // YouTube doesn't support loop for a single video, so mimick it.\n if (player.media.loop) {\n // YouTube needs a call to `stopVideo` before playing again\n instance.stopVideo();\n instance.playVideo();\n } else {\n utils.dispatchEvent.call(player, player.media, 'ended');\n }\n\n break;\n\n case 1:\n // Restore paused state (YouTube starts playing on seek if the video hasn't been played yet)\n if (player.media.paused && !player.embed.hasPlayed) {\n player.media.pause();\n } else {\n assurePlaybackState.call(player, true);\n\n utils.dispatchEvent.call(player, player.media, 'playing');\n\n // Poll to get playback progress\n player.timers.playing = setInterval(() => {\n utils.dispatchEvent.call(player, player.media, 'timeupdate');\n }, 50);\n\n // Check duration again due to YouTube bug\n // https://github.com/sampotts/plyr/issues/374\n // https://code.google.com/p/gdata-issues/issues/detail?id=8690\n if (player.media.duration !== instance.getDuration()) {\n player.media.duration = instance.getDuration();\n utils.dispatchEvent.call(player, player.media, 'durationchange');\n }\n\n // Get quality\n controls.setQualityMenu.call(player, mapQualityUnits(instance.getAvailableQualityLevels()));\n }\n\n break;\n\n case 2:\n // Restore audio (YouTube starts playing on seek if the video hasn't been played yet)\n if (!player.muted) {\n player.embed.unMute();\n }\n assurePlaybackState.call(player, false);\n\n break;\n\n default:\n break;\n }\n\n utils.dispatchEvent.call(player, player.elements.container, 'statechange', false, {\n code: event.data,\n });\n },\n },\n });\n },\n};\n\nexport default youtube;\n","// ==========================================================================\n// Plyr Media\n// ==========================================================================\n\nimport html5 from './html5';\nimport vimeo from './plugins/vimeo';\nimport youtube from './plugins/youtube';\nimport utils from './utils';\n\nconst media = {\n // Setup media\n setup() {\n // If there's no media, bail\n if (!this.media) {\n this.debug.warn('No media element found!');\n return;\n }\n\n // Add type class\n utils.toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', this.type), true);\n\n // Add provider class\n utils.toggleClass(this.elements.container, this.config.classNames.provider.replace('{0}', this.provider), true);\n\n // Add video class for embeds\n // This will require changes if audio embeds are added\n if (this.isEmbed) {\n utils.toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', 'video'), true);\n }\n\n // Inject the player wrapper\n if (this.isVideo) {\n // Create the wrapper div\n this.elements.wrapper = utils.createElement('div', {\n class: this.config.classNames.video,\n });\n\n // Wrap the video in a container\n utils.wrap(this.media, this.elements.wrapper);\n\n // Faux poster container\n this.elements.poster = utils.createElement('div', {\n class: this.config.classNames.poster,\n });\n\n this.elements.wrapper.appendChild(this.elements.poster);\n }\n\n if (this.isEmbed) {\n switch (this.provider) {\n case 'youtube':\n youtube.setup.call(this);\n break;\n\n case 'vimeo':\n vimeo.setup.call(this);\n break;\n\n default:\n break;\n }\n } else if (this.isHTML5) {\n html5.extend.call(this);\n }\n },\n};\n\nexport default media;\n","// ==========================================================================\n// Advertisement plugin using Google IMA HTML5 SDK\n// Create an account with our ad partner, vi here:\n// https://www.vi.ai/publisher-video-monetization/\n// ==========================================================================\n\n/* global google */\n\nimport i18n from '../i18n';\nimport utils from '../utils';\n\nclass Ads {\n /**\n * Ads constructor.\n * @param {object} player\n * @return {Ads}\n */\n constructor(player) {\n this.player = player;\n this.publisherId = player.config.ads.publisherId;\n this.playing = false;\n this.initialized = false;\n this.elements = {\n container: null,\n displayContainer: null,\n };\n this.manager = null;\n this.loader = null;\n this.cuePoints = null;\n this.events = {};\n this.safetyTimer = null;\n this.countdownTimer = null;\n\n // Setup a promise to resolve when the IMA manager is ready\n this.managerPromise = new Promise((resolve, reject) => {\n // The ad is loaded and ready\n this.on('loaded', resolve);\n\n // Ads failed\n this.on('error', reject);\n });\n\n this.load();\n }\n\n get enabled() {\n return this.player.isVideo && this.player.config.ads.enabled && !utils.is.empty(this.publisherId);\n }\n\n /**\n * Load the IMA SDK\n */\n load() {\n if (this.enabled) {\n // Check if the Google IMA3 SDK is loaded or load it ourselves\n if (!utils.is.object(window.google) || !utils.is.object(window.google.ima)) {\n utils\n .loadScript(this.player.config.urls.googleIMA.sdk)\n .then(() => {\n this.ready();\n })\n .catch(() => {\n // Script failed to load or is blocked\n this.trigger('error', new Error('Google IMA SDK failed to load'));\n });\n } else {\n this.ready();\n }\n }\n }\n\n /**\n * Get the ads instance ready\n */\n ready() {\n // Start ticking our safety timer. If the whole advertisement\n // thing doesn't resolve within our set time; we bail\n this.startSafetyTimer(12000, 'ready()');\n\n // Clear the safety timer\n this.managerPromise.then(() => {\n this.clearSafetyTimer('onAdsManagerLoaded()');\n });\n\n // Set listeners on the Plyr instance\n this.listeners();\n\n // Setup the IMA SDK\n this.setupIMA();\n }\n\n // Build the default tag URL\n get tagUrl() {\n const params = {\n AV_PUBLISHERID: '58c25bb0073ef448b1087ad6',\n AV_CHANNELID: '5a0458dc28a06145e4519d21',\n AV_URL: location.hostname,\n cb: Date.now(),\n AV_WIDTH: 640,\n AV_HEIGHT: 480,\n AV_CDIM2: this.publisherId,\n };\n\n const base = 'https://go.aniview.com/api/adserver6/vast/';\n\n return `${base}?${utils.buildUrlParams(params)}`;\n }\n\n /**\n * In order for the SDK to display ads for our video, we need to tell it where to put them,\n * so here we define our ad container. This div is set up to render on top of the video player.\n * Using the code below, we tell the SDK to render ads within that div. We also provide a\n * handle to the content video player - the SDK will poll the current time of our player to\n * properly place mid-rolls. After we create the ad display container, we initialize it. On\n * mobile devices, this initialization is done as the result of a user action.\n */\n setupIMA() {\n // Create the container for our advertisements\n this.elements.container = utils.createElement('div', {\n class: this.player.config.classNames.ads,\n });\n this.player.elements.container.appendChild(this.elements.container);\n\n // So we can run VPAID2\n google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED);\n\n // Set language\n google.ima.settings.setLocale(this.player.config.ads.language);\n\n // We assume the adContainer is the video container of the plyr element\n // that will house the ads\n this.elements.displayContainer = new google.ima.AdDisplayContainer(this.elements.container);\n\n // Request video ads to be pre-loaded\n this.requestAds();\n }\n\n /**\n * Request advertisements\n */\n requestAds() {\n const { container } = this.player.elements;\n\n try {\n // Create ads loader\n this.loader = new google.ima.AdsLoader(this.elements.displayContainer);\n\n // Listen and respond to ads loaded and error events\n this.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, event => this.onAdsManagerLoaded(event), false);\n this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, error => this.onAdError(error), false);\n\n // Request video ads\n const request = new google.ima.AdsRequest();\n request.adTagUrl = this.tagUrl;\n\n // Specify the linear and nonlinear slot sizes. This helps the SDK\n // to select the correct creative if multiple are returned\n request.linearAdSlotWidth = container.offsetWidth;\n request.linearAdSlotHeight = container.offsetHeight;\n request.nonLinearAdSlotWidth = container.offsetWidth;\n request.nonLinearAdSlotHeight = container.offsetHeight;\n\n // We only overlay ads as we only support video.\n request.forceNonLinearFullSlot = false;\n\n // Mute based on current state\n request.setAdWillPlayMuted(!this.player.muted);\n\n this.loader.requestAds(request);\n } catch (e) {\n this.onAdError(e);\n }\n }\n\n /**\n * Update the ad countdown\n * @param {boolean} start\n */\n pollCountdown(start = false) {\n if (!start) {\n clearInterval(this.countdownTimer);\n this.elements.container.removeAttribute('data-badge-text');\n return;\n }\n\n const update = () => {\n const time = utils.formatTime(Math.max(this.manager.getRemainingTime(), 0));\n const label = `${i18n.get('advertisement', this.player.config)} - ${time}`;\n this.elements.container.setAttribute('data-badge-text', label);\n };\n\n this.countdownTimer = setInterval(update, 100);\n }\n\n /**\n * This method is called whenever the ads are ready inside the AdDisplayContainer\n * @param {Event} adsManagerLoadedEvent\n */\n onAdsManagerLoaded(event) {\n // Get the ads manager\n const settings = new google.ima.AdsRenderingSettings();\n\n // Tell the SDK to save and restore content video state on our behalf\n settings.restoreCustomPlaybackStateOnAdBreakComplete = true;\n settings.enablePreloading = true;\n\n // The SDK is polling currentTime on the contentPlayback. And needs a duration\n // so it can determine when to start the mid- and post-roll\n this.manager = event.getAdsManager(this.player, settings);\n\n // Get the cue points for any mid-rolls by filtering out the pre- and post-roll\n this.cuePoints = this.manager.getCuePoints();\n\n // Add advertisement cue's within the time line if available\n if (!utils.is.empty(this.cuePoints)) {\n this.cuePoints.forEach(cuePoint => {\n if (cuePoint !== 0 && cuePoint !== -1 && cuePoint < this.player.duration) {\n const seekElement = this.player.elements.progress;\n\n if (utils.is.element(seekElement)) {\n const cuePercentage = 100 / this.player.duration * cuePoint;\n const cue = utils.createElement('span', {\n class: this.player.config.classNames.cues,\n });\n\n cue.style.left = `${cuePercentage.toString()}%`;\n seekElement.appendChild(cue);\n }\n }\n });\n }\n\n // Get skippable state\n // TODO: Skip button\n // this.player.debug.warn(this.manager.getAdSkippableState());\n\n // Set volume to match player\n this.manager.setVolume(this.player.volume);\n\n // Add listeners to the required events\n // Advertisement error events\n this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, error => this.onAdError(error));\n\n // Advertisement regular events\n Object.keys(google.ima.AdEvent.Type).forEach(type => {\n this.manager.addEventListener(google.ima.AdEvent.Type[type], event => this.onAdEvent(event));\n });\n\n // Resolve our adsManager\n this.trigger('loaded');\n }\n\n /**\n * This is where all the event handling takes place. Retrieve the ad from the event. Some\n * events (e.g. ALL_ADS_COMPLETED) don't have the ad object associated\n * https://developers.google.com/interactive-media-ads/docs/sdks/html5/v3/apis#ima.AdEvent.Type\n * @param {Event} event\n */\n onAdEvent(event) {\n const { container } = this.player.elements;\n\n // Retrieve the ad from the event. Some events (e.g. ALL_ADS_COMPLETED)\n // don't have ad object associated\n const ad = event.getAd();\n\n // Proxy event\n const dispatchEvent = type => {\n const event = `ads${type.replace(/_/g, '').toLowerCase()}`;\n utils.dispatchEvent.call(this.player, this.player.media, event);\n };\n\n switch (event.type) {\n case google.ima.AdEvent.Type.LOADED:\n // This is the first event sent for an ad - it is possible to determine whether the\n // ad is a video ad or an overlay\n this.trigger('loaded');\n\n // Bubble event\n dispatchEvent(event.type);\n\n // Start countdown\n this.pollCountdown(true);\n\n if (!ad.isLinear()) {\n // Position AdDisplayContainer correctly for overlay\n ad.width = container.offsetWidth;\n ad.height = container.offsetHeight;\n }\n\n // console.info('Ad type: ' + event.getAd().getAdPodInfo().getPodIndex());\n // console.info('Ad time: ' + event.getAd().getAdPodInfo().getTimeOffset());\n break;\n\n case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:\n // All ads for the current videos are done. We can now request new advertisements\n // in case the video is re-played\n\n // Fire event\n dispatchEvent(event.type);\n\n // TODO: Example for what happens when a next video in a playlist would be loaded.\n // So here we load a new video when all ads are done.\n // Then we load new ads within a new adsManager. When the video\n // Is started - after - the ads are loaded, then we get ads.\n // You can also easily test cancelling and reloading by running\n // player.ads.cancel() and player.ads.play from the console I guess.\n // this.player.source = {\n // type: 'video',\n // title: 'View From A Blue Moon',\n // sources: [{\n // src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.mp4', type:\n // 'video/mp4', }], poster:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg', tracks:\n // [ { kind: 'captions', label: 'English', srclang: 'en', src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt',\n // default: true, }, { kind: 'captions', label: 'French', srclang: 'fr', src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt', }, ],\n // };\n\n // TODO: So there is still this thing where a video should only be allowed to start\n // playing when the IMA SDK is ready or has failed\n\n this.loadAds();\n break;\n\n case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:\n // This event indicates the ad has started - the video player can adjust the UI,\n // for example display a pause button and remaining time. Fired when content should\n // be paused. This usually happens right before an ad is about to cover the content\n\n dispatchEvent(event.type);\n\n this.pauseContent();\n\n break;\n\n case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:\n // This event indicates the ad has finished - the video player can perform\n // appropriate UI actions, such as removing the timer for remaining time detection.\n // Fired when content should be resumed. This usually happens when an ad finishes\n // or collapses\n\n dispatchEvent(event.type);\n\n this.pollCountdown();\n\n this.resumeContent();\n\n break;\n\n case google.ima.AdEvent.Type.STARTED:\n case google.ima.AdEvent.Type.MIDPOINT:\n case google.ima.AdEvent.Type.COMPLETE:\n case google.ima.AdEvent.Type.IMPRESSION:\n case google.ima.AdEvent.Type.CLICK:\n dispatchEvent(event.type);\n break;\n\n default:\n break;\n }\n }\n\n /**\n * Any ad error handling comes through here\n * @param {Event} event\n */\n onAdError(event) {\n this.cancel();\n this.player.debug.warn('Ads error', event);\n }\n\n /**\n * Setup hooks for Plyr and window events. This ensures\n * the mid- and post-roll launch at the correct time. And\n * resize the advertisement when the player resizes\n */\n listeners() {\n const { container } = this.player.elements;\n let time;\n\n // Add listeners to the required events\n this.player.on('ended', () => {\n this.loader.contentComplete();\n });\n\n this.player.on('seeking', () => {\n time = this.player.currentTime;\n return time;\n });\n\n this.player.on('seeked', () => {\n const seekedTime = this.player.currentTime;\n\n if (utils.is.empty(this.cuePoints)) {\n return;\n }\n\n this.cuePoints.forEach((cuePoint, index) => {\n if (time < cuePoint && cuePoint < seekedTime) {\n this.manager.discardAdBreak();\n this.cuePoints.splice(index, 1);\n }\n });\n });\n\n // Listen to the resizing of the window. And resize ad accordingly\n // TODO: eventually implement ResizeObserver\n window.addEventListener('resize', () => {\n if (this.manager) {\n this.manager.resize(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);\n }\n });\n }\n\n /**\n * Initialize the adsManager and start playing advertisements\n */\n play() {\n const { container } = this.player.elements;\n\n if (!this.managerPromise) {\n this.resumeContent();\n }\n\n // Play the requested advertisement whenever the adsManager is ready\n this.managerPromise\n .then(() => {\n // Initialize the container. Must be done via a user action on mobile devices\n this.elements.displayContainer.initialize();\n\n try {\n if (!this.initialized) {\n // Initialize the ads manager. Ad rules playlist will start at this time\n this.manager.init(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);\n\n // Call play to start showing the ad. Single video and overlay ads will\n // start at this time; the call will be ignored for ad rules\n this.manager.start();\n }\n\n this.initialized = true;\n } catch (adError) {\n // An error may be thrown if there was a problem with the\n // VAST response\n this.onAdError(adError);\n }\n })\n .catch(() => {});\n }\n\n /**\n * Resume our video\n */\n resumeContent() {\n // Hide the advertisement container\n this.elements.container.style.zIndex = '';\n\n // Ad is stopped\n this.playing = false;\n\n // Play our video\n if (this.player.currentTime < this.player.duration) {\n this.player.play();\n }\n }\n\n /**\n * Pause our video\n */\n pauseContent() {\n // Show the advertisement container\n this.elements.container.style.zIndex = 3;\n\n // Ad is playing.\n this.playing = true;\n\n // Pause our video.\n this.player.pause();\n }\n\n /**\n * Destroy the adsManager so we can grab new ads after this. If we don't then we're not\n * allowed to call new ads based on google policies, as they interpret this as an accidental\n * video requests. https://developers.google.com/interactive-\n * media-ads/docs/sdks/android/faq#8\n */\n cancel() {\n // Pause our video\n if (this.initialized) {\n this.resumeContent();\n }\n\n // Tell our instance that we're done for now\n this.trigger('error');\n\n // Re-create our adsManager\n this.loadAds();\n }\n\n /**\n * Re-create our adsManager\n */\n loadAds() {\n // Tell our adsManager to go bye bye\n this.managerPromise\n .then(() => {\n // Destroy our adsManager\n if (this.manager) {\n this.manager.destroy();\n }\n\n // Re-set our adsManager promises\n this.managerPromise = new Promise(resolve => {\n this.on('loaded', resolve);\n this.player.debug.log(this.manager);\n });\n\n // Now request some new advertisements\n this.requestAds();\n })\n .catch(() => {});\n }\n\n /**\n * Handles callbacks after an ad event was invoked\n * @param {string} event - Event type\n */\n trigger(event, ...args) {\n const handlers = this.events[event];\n\n if (utils.is.array(handlers)) {\n handlers.forEach(handler => {\n if (utils.is.function(handler)) {\n handler.apply(this, args);\n }\n });\n }\n }\n\n /**\n * Add event listeners\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n * @return {Ads}\n */\n on(event, callback) {\n if (!utils.is.array(this.events[event])) {\n this.events[event] = [];\n }\n\n this.events[event].push(callback);\n\n return this;\n }\n\n /**\n * Setup a safety timer for when the ad network doesn't respond for whatever reason.\n * The advertisement has 12 seconds to get its things together. We stop this timer when the\n * advertisement is playing, or when a user action is required to start, then we clear the\n * timer on ad ready\n * @param {number} time\n * @param {string} from\n */\n startSafetyTimer(time, from) {\n this.player.debug.log(`Safety timer invoked from: ${from}`);\n\n this.safetyTimer = setTimeout(() => {\n this.cancel();\n this.clearSafetyTimer('startSafetyTimer()');\n }, time);\n }\n\n /**\n * Clear our safety timer(s)\n * @param {string} from\n */\n clearSafetyTimer(from) {\n if (!utils.is.nullOrUndefined(this.safetyTimer)) {\n this.player.debug.log(`Safety timer cleared from: ${from}`);\n\n clearTimeout(this.safetyTimer);\n this.safetyTimer = null;\n }\n }\n}\n\nexport default Ads;\n","// ==========================================================================\n// Plyr source update\n// ==========================================================================\n\nimport html5 from './html5';\nimport media from './media';\nimport support from './support';\nimport { providers } from './types';\nimport ui from './ui';\nimport utils from './utils';\n\nconst source = {\n // Add elements to HTML5 media (source, tracks, etc)\n insertElements(type, attributes) {\n if (utils.is.string(attributes)) {\n utils.insertElement(type, this.media, {\n src: attributes,\n });\n } else if (utils.is.array(attributes)) {\n attributes.forEach(attribute => {\n utils.insertElement(type, this.media, attribute);\n });\n }\n },\n\n // Update source\n // Sources are not checked for support so be careful\n change(input) {\n if (!utils.is.object(input) || !('sources' in input) || !input.sources.length) {\n this.debug.warn('Invalid source format');\n return;\n }\n\n // Cancel current network requests\n html5.cancelRequests.call(this);\n\n // Destroy instance and re-setup\n this.destroy.call(\n this,\n () => {\n // Reset quality options\n this.options.quality = [];\n\n // Remove elements\n utils.removeElement(this.media);\n this.media = null;\n\n // Reset class name\n if (utils.is.element(this.elements.container)) {\n this.elements.container.removeAttribute('class');\n }\n\n // Set the type and provider\n this.type = input.type;\n this.provider = !utils.is.empty(input.sources[0].provider) ? input.sources[0].provider : providers.html5;\n\n // Check for support\n this.supported = support.check(this.type, this.provider, this.config.playsinline);\n\n // Create new markup\n switch (`${this.provider}:${this.type}`) {\n case 'html5:video':\n this.media = utils.createElement('video');\n break;\n\n case 'html5:audio':\n this.media = utils.createElement('audio');\n break;\n\n case 'youtube:video':\n case 'vimeo:video':\n this.media = utils.createElement('div', {\n src: input.sources[0].src,\n });\n break;\n\n default:\n break;\n }\n\n // Inject the new element\n this.elements.container.appendChild(this.media);\n\n // Autoplay the new source?\n if (utils.is.boolean(input.autoplay)) {\n this.config.autoplay = input.autoplay;\n }\n\n // Set attributes for audio and video\n if (this.isHTML5) {\n if (this.config.crossorigin) {\n this.media.setAttribute('crossorigin', '');\n }\n if (this.config.autoplay) {\n this.media.setAttribute('autoplay', '');\n }\n if (!utils.is.empty(input.poster)) {\n this.poster = input.poster;\n }\n if (this.config.loop.active) {\n this.media.setAttribute('loop', '');\n }\n if (this.config.muted) {\n this.media.setAttribute('muted', '');\n }\n if (this.config.playsinline) {\n this.media.setAttribute('playsinline', '');\n }\n }\n\n // Restore class hook\n ui.addStyleHook.call(this);\n\n // Set new sources for html5\n if (this.isHTML5) {\n source.insertElements.call(this, 'source', input.sources);\n }\n\n // Set video title\n this.config.title = input.title;\n\n // Set up from scratch\n media.setup.call(this);\n\n // HTML5 stuff\n if (this.isHTML5) {\n // Setup captions\n if ('tracks' in input) {\n source.insertElements.call(this, 'track', input.tracks);\n }\n\n // Load HTML5 sources\n this.media.load();\n }\n\n // If HTML5 or embed but not fully supported, setupInterface and call ready now\n if (this.isHTML5 || (this.isEmbed && !this.supported.ui)) {\n // Setup interface\n ui.build.call(this);\n }\n\n // Update the fullscreen support\n this.fullscreen.update();\n },\n true,\n );\n },\n};\n\nexport default source;\n","// ==========================================================================\n// Plyr\n// plyr.js v3.3.12\n// https://github.com/sampotts/plyr\n// License: The MIT License (MIT)\n// ==========================================================================\n\nimport captions from './captions';\nimport Console from './console';\nimport controls from './controls';\nimport defaults from './defaults';\nimport Fullscreen from './fullscreen';\nimport Listeners from './listeners';\nimport media from './media';\nimport Ads from './plugins/ads';\nimport source from './source';\nimport Storage from './storage';\nimport support from './support';\nimport { providers, types } from './types';\nimport ui from './ui';\nimport utils from './utils';\n\n// Private properties\n// TODO: Use a WeakMap for private globals\n// const globals = new WeakMap();\n\n// Plyr instance\nclass Plyr {\n constructor(target, options) {\n this.timers = {};\n\n // State\n this.ready = false;\n this.loading = false;\n this.failed = false;\n\n // Touch device\n this.touch = support.touch;\n\n // Set the media element\n this.media = target;\n\n // String selector passed\n if (utils.is.string(this.media)) {\n this.media = document.querySelectorAll(this.media);\n }\n\n // jQuery, NodeList or Array passed, use first element\n if ((window.jQuery && this.media instanceof jQuery) || utils.is.nodeList(this.media) || utils.is.array(this.media)) {\n // eslint-disable-next-line\n this.media = this.media[0];\n }\n\n // Set config\n this.config = utils.extend(\n {},\n defaults,\n Plyr.defaults,\n options || {},\n (() => {\n try {\n return JSON.parse(this.media.getAttribute('data-plyr-config'));\n } catch (e) {\n return {};\n }\n })(),\n );\n\n // Elements cache\n this.elements = {\n container: null,\n buttons: {},\n display: {},\n progress: {},\n inputs: {},\n settings: {\n menu: null,\n panes: {},\n tabs: {},\n },\n captions: null,\n };\n\n // Captions\n this.captions = {\n active: null,\n currentTrack: -1,\n meta: new WeakMap(),\n };\n\n // Fullscreen\n this.fullscreen = {\n active: false,\n };\n\n // Options\n this.options = {\n speed: [],\n quality: [],\n };\n\n // Debugging\n // TODO: move to globals\n this.debug = new Console(this.config.debug);\n\n // Log config options and support\n this.debug.log('Config', this.config);\n this.debug.log('Support', support);\n\n // We need an element to setup\n if (utils.is.nullOrUndefined(this.media) || !utils.is.element(this.media)) {\n this.debug.error('Setup failed: no suitable element passed');\n return;\n }\n\n // Bail if the element is initialized\n if (this.media.plyr) {\n this.debug.warn('Target already setup');\n return;\n }\n\n // Bail if not enabled\n if (!this.config.enabled) {\n this.debug.error('Setup failed: disabled by config');\n return;\n }\n\n // Bail if disabled or no basic support\n // You may want to disable certain UAs etc\n if (!support.check().api) {\n this.debug.error('Setup failed: no support');\n return;\n }\n\n // Cache original element state for .destroy()\n const clone = this.media.cloneNode(true);\n clone.autoplay = false;\n this.elements.original = clone;\n\n // Set media type based on tag or data attribute\n // Supported: video, audio, vimeo, youtube\n const type = this.media.tagName.toLowerCase();\n\n // Embed properties\n let iframe = null;\n let url = null;\n let params = null;\n\n // Different setup based on type\n switch (type) {\n case 'div':\n // Find the frame\n iframe = this.media.querySelector('iframe');\n\n // <iframe> type\n if (utils.is.element(iframe)) {\n // Detect provider\n url = iframe.getAttribute('src');\n this.provider = utils.getProviderByUrl(url);\n\n // Rework elements\n this.elements.container = this.media;\n this.media = iframe;\n\n // Reset classname\n this.elements.container.className = '';\n\n // Get attributes from URL and set config\n params = utils.getUrlParams(url);\n if (!utils.is.empty(params)) {\n const truthy = [\n '1',\n 'true',\n ];\n\n if (truthy.includes(params.autoplay)) {\n this.config.autoplay = true;\n }\n if (truthy.includes(params.loop)) {\n this.config.loop.active = true;\n }\n\n // TODO: replace fullscreen.iosNative with this playsinline config option\n // YouTube requires the playsinline in the URL\n if (this.isYouTube) {\n this.config.playsinline = truthy.includes(params.playsinline);\n } else {\n this.config.playsinline = true;\n }\n }\n } else {\n // <div> with attributes\n this.provider = this.media.getAttribute(this.config.attributes.embed.provider);\n\n // Remove attribute\n this.media.removeAttribute(this.config.attributes.embed.provider);\n }\n\n // Unsupported or missing provider\n if (utils.is.empty(this.provider) || !Object.keys(providers).includes(this.provider)) {\n this.debug.error('Setup failed: Invalid provider');\n return;\n }\n\n // Audio will come later for external providers\n this.type = types.video;\n\n break;\n\n case 'video':\n case 'audio':\n this.type = type;\n this.provider = providers.html5;\n\n // Get config from attributes\n if (this.media.hasAttribute('crossorigin')) {\n this.config.crossorigin = true;\n }\n if (this.media.hasAttribute('autoplay')) {\n this.config.autoplay = true;\n }\n if (this.media.hasAttribute('playsinline')) {\n this.config.playsinline = true;\n }\n if (this.media.hasAttribute('muted')) {\n this.config.muted = true;\n }\n if (this.media.hasAttribute('loop')) {\n this.config.loop.active = true;\n }\n\n break;\n\n default:\n this.debug.error('Setup failed: unsupported type');\n return;\n }\n\n // Check for support again but with type\n this.supported = support.check(this.type, this.provider, this.config.playsinline);\n\n // If no support for even API, bail\n if (!this.supported.api) {\n this.debug.error('Setup failed: no support');\n return;\n }\n\n // Create listeners\n this.listeners = new Listeners(this);\n\n // Setup local storage for user settings\n this.storage = new Storage(this);\n\n // Store reference\n this.media.plyr = this;\n\n // Wrap media\n if (!utils.is.element(this.elements.container)) {\n this.elements.container = utils.createElement('div');\n utils.wrap(this.media, this.elements.container);\n }\n\n // Add style hook\n ui.addStyleHook.call(this);\n\n // Setup media\n media.setup.call(this);\n\n // Listen for events if debugging\n if (this.config.debug) {\n utils.on(this.elements.container, this.config.events.join(' '), event => {\n this.debug.log(`event: ${event.type}`);\n });\n }\n\n // Setup interface\n // If embed but not fully supported, build interface now to avoid flash of controls\n if (this.isHTML5 || (this.isEmbed && !this.supported.ui)) {\n ui.build.call(this);\n }\n\n // Container listeners\n this.listeners.container();\n\n // Global listeners\n this.listeners.global();\n\n // Setup fullscreen\n this.fullscreen = new Fullscreen(this);\n\n // Setup ads if provided\n this.ads = new Ads(this);\n\n // Autoplay if required\n if (this.config.autoplay) {\n this.play();\n }\n }\n\n // ---------------------------------------\n // API\n // ---------------------------------------\n\n /**\n * Types and provider helpers\n */\n get isHTML5() {\n return Boolean(this.provider === providers.html5);\n }\n get isEmbed() {\n return Boolean(this.isYouTube || this.isVimeo);\n }\n get isYouTube() {\n return Boolean(this.provider === providers.youtube);\n }\n get isVimeo() {\n return Boolean(this.provider === providers.vimeo);\n }\n get isVideo() {\n return Boolean(this.type === types.video);\n }\n get isAudio() {\n return Boolean(this.type === types.audio);\n }\n\n /**\n * Play the media, or play the advertisement (if they are not blocked)\n */\n play() {\n if (!utils.is.function(this.media.play)) {\n return null;\n }\n\n // Return the promise (for HTML5)\n return this.media.play();\n }\n\n /**\n * Pause the media\n */\n pause() {\n if (!this.playing || !utils.is.function(this.media.pause)) {\n return;\n }\n\n this.media.pause();\n }\n\n /**\n * Get playing state\n */\n get playing() {\n return Boolean(this.ready && !this.paused && !this.ended);\n }\n\n /**\n * Get paused state\n */\n get paused() {\n return Boolean(this.media.paused);\n }\n\n /**\n * Get stopped state\n */\n get stopped() {\n return Boolean(this.paused && this.currentTime === 0);\n }\n\n /**\n * Get ended state\n */\n get ended() {\n return Boolean(this.media.ended);\n }\n\n /**\n * Toggle playback based on current status\n * @param {boolean} input\n */\n togglePlay(input) {\n // Toggle based on current state if nothing passed\n const toggle = utils.is.boolean(input) ? input : !this.playing;\n\n if (toggle) {\n this.play();\n } else {\n this.pause();\n }\n }\n\n /**\n * Stop playback\n */\n stop() {\n if (this.isHTML5) {\n this.pause();\n this.restart();\n } else if (utils.is.function(this.media.stop)) {\n this.media.stop();\n }\n }\n\n /**\n * Restart playback\n */\n restart() {\n this.currentTime = 0;\n }\n\n /**\n * Rewind\n * @param {number} seekTime - how far to rewind in seconds. Defaults to the config.seekTime\n */\n rewind(seekTime) {\n this.currentTime = this.currentTime - (utils.is.number(seekTime) ? seekTime : this.config.seekTime);\n }\n\n /**\n * Fast forward\n * @param {number} seekTime - how far to fast forward in seconds. Defaults to the config.seekTime\n */\n forward(seekTime) {\n this.currentTime = this.currentTime + (utils.is.number(seekTime) ? seekTime : this.config.seekTime);\n }\n\n /**\n * Seek to a time\n * @param {number} input - where to seek to in seconds. Defaults to 0 (the start)\n */\n set currentTime(input) {\n // Bail if media duration isn't available yet\n if (!this.duration) {\n return;\n }\n\n // Validate input\n const inputIsValid = utils.is.number(input) && input > 0;\n\n // Set\n this.media.currentTime = inputIsValid ? Math.min(input, this.duration) : 0;\n\n // Logging\n this.debug.log(`Seeking to ${this.currentTime} seconds`);\n }\n\n /**\n * Get current time\n */\n get currentTime() {\n return Number(this.media.currentTime);\n }\n\n /**\n * Get buffered\n */\n get buffered() {\n const { buffered } = this.media;\n\n // YouTube / Vimeo return a float between 0-1\n if (utils.is.number(buffered)) {\n return buffered;\n }\n\n // HTML5\n // TODO: Handle buffered chunks of the media\n // (i.e. seek to another section buffers only that section)\n if (buffered && buffered.length && this.duration > 0) {\n return buffered.end(0) / this.duration;\n }\n\n return 0;\n }\n\n /**\n * Get seeking status\n */\n get seeking() {\n return Boolean(this.media.seeking);\n }\n\n /**\n * Get the duration of the current media\n */\n get duration() {\n // Faux duration set via config\n const fauxDuration = parseFloat(this.config.duration);\n\n // Media duration can be NaN before the media has loaded\n const duration = (this.media || {}).duration || 0;\n\n // If config duration is funky, use regular duration\n return fauxDuration || duration;\n }\n\n /**\n * Set the player volume\n * @param {number} value - must be between 0 and 1. Defaults to the value from local storage and config.volume if not set in storage\n */\n set volume(value) {\n let volume = value;\n const max = 1;\n const min = 0;\n\n if (utils.is.string(volume)) {\n volume = Number(volume);\n }\n\n // Load volume from storage if no value specified\n if (!utils.is.number(volume)) {\n volume = this.storage.get('volume');\n }\n\n // Use config if all else fails\n if (!utils.is.number(volume)) {\n ({ volume } = this.config);\n }\n\n // Maximum is volumeMax\n if (volume > max) {\n volume = max;\n }\n // Minimum is volumeMin\n if (volume < min) {\n volume = min;\n }\n\n // Update config\n this.config.volume = volume;\n\n // Set the player volume\n this.media.volume = volume;\n\n // If muted, and we're increasing volume manually, reset muted state\n if (!utils.is.empty(value) && this.muted && volume > 0) {\n this.muted = false;\n }\n }\n\n /**\n * Get the current player volume\n */\n get volume() {\n return Number(this.media.volume);\n }\n\n /**\n * Increase volume\n * @param {boolean} step - How much to decrease by (between 0 and 1)\n */\n increaseVolume(step) {\n const volume = this.media.muted ? 0 : this.volume;\n this.volume = volume + (utils.is.number(step) ? step : 1);\n }\n\n /**\n * Decrease volume\n * @param {boolean} step - How much to decrease by (between 0 and 1)\n */\n decreaseVolume(step) {\n const volume = this.media.muted ? 0 : this.volume;\n this.volume = volume - (utils.is.number(step) ? step : 1);\n }\n\n /**\n * Set muted state\n * @param {boolean} mute\n */\n set muted(mute) {\n let toggle = mute;\n\n // Load muted state from storage\n if (!utils.is.boolean(toggle)) {\n toggle = this.storage.get('muted');\n }\n\n // Use config if all else fails\n if (!utils.is.boolean(toggle)) {\n toggle = this.config.muted;\n }\n\n // Update config\n this.config.muted = toggle;\n\n // Set mute on the player\n this.media.muted = toggle;\n }\n\n /**\n * Get current muted state\n */\n get muted() {\n return Boolean(this.media.muted);\n }\n\n /**\n * Check if the media has audio\n */\n get hasAudio() {\n // Assume yes for all non HTML5 (as we can't tell...)\n if (!this.isHTML5) {\n return true;\n }\n\n if (this.isAudio) {\n return true;\n }\n\n // Get audio tracks\n return (\n Boolean(this.media.mozHasAudio) ||\n Boolean(this.media.webkitAudioDecodedByteCount) ||\n Boolean(this.media.audioTracks && this.media.audioTracks.length)\n );\n }\n\n /**\n * Set playback speed\n * @param {number} speed - the speed of playback (0.5-2.0)\n */\n set speed(input) {\n let speed = null;\n\n if (utils.is.number(input)) {\n speed = input;\n }\n\n if (!utils.is.number(speed)) {\n speed = this.storage.get('speed');\n }\n\n if (!utils.is.number(speed)) {\n speed = this.config.speed.selected;\n }\n\n // Set min/max\n if (speed < 0.1) {\n speed = 0.1;\n }\n if (speed > 2.0) {\n speed = 2.0;\n }\n\n if (!this.config.speed.options.includes(speed)) {\n this.debug.warn(`Unsupported speed (${speed})`);\n return;\n }\n\n // Update config\n this.config.speed.selected = speed;\n\n // Set media speed\n this.media.playbackRate = speed;\n }\n\n /**\n * Get current playback speed\n */\n get speed() {\n return Number(this.media.playbackRate);\n }\n\n /**\n * Set playback quality\n * Currently HTML5 & YouTube only\n * @param {number} input - Quality level\n */\n set quality(input) {\n let quality = null;\n\n if (!utils.is.empty(input)) {\n quality = Number(input);\n }\n\n if (!utils.is.number(quality)) {\n quality = this.storage.get('quality');\n }\n\n if (!utils.is.number(quality)) {\n quality = this.config.quality.selected;\n }\n\n if (!utils.is.number(quality)) {\n quality = this.config.quality.default;\n }\n\n if (!this.options.quality.length) {\n return;\n }\n\n if (!this.options.quality.includes(quality)) {\n const closest = utils.closest(this.options.quality, quality);\n this.debug.warn(`Unsupported quality option: ${quality}, using ${closest} instead`);\n quality = closest;\n }\n\n // Update config\n this.config.quality.selected = quality;\n\n // Set quality\n this.media.quality = quality;\n }\n\n /**\n * Get current quality level\n */\n get quality() {\n return this.media.quality;\n }\n\n /**\n * Toggle loop\n * TODO: Finish fancy new logic. Set the indicator on load as user may pass loop as config\n * @param {boolean} input - Whether to loop or not\n */\n set loop(input) {\n const toggle = utils.is.boolean(input) ? input : this.config.loop.active;\n this.config.loop.active = toggle;\n this.media.loop = toggle;\n\n // Set default to be a true toggle\n /* const type = ['start', 'end', 'all', 'none', 'toggle'].includes(input) ? input : 'toggle';\n\n switch (type) {\n case 'start':\n if (this.config.loop.end && this.config.loop.end <= this.currentTime) {\n this.config.loop.end = null;\n }\n this.config.loop.start = this.currentTime;\n // this.config.loop.indicator.start = this.elements.display.played.value;\n break;\n\n case 'end':\n if (this.config.loop.start >= this.currentTime) {\n return this;\n }\n this.config.loop.end = this.currentTime;\n // this.config.loop.indicator.end = this.elements.display.played.value;\n break;\n\n case 'all':\n this.config.loop.start = 0;\n this.config.loop.end = this.duration - 2;\n this.config.loop.indicator.start = 0;\n this.config.loop.indicator.end = 100;\n break;\n\n case 'toggle':\n if (this.config.loop.active) {\n this.config.loop.start = 0;\n this.config.loop.end = null;\n } else {\n this.config.loop.start = 0;\n this.config.loop.end = this.duration - 2;\n }\n break;\n\n default:\n this.config.loop.start = 0;\n this.config.loop.end = null;\n break;\n } */\n }\n\n /**\n * Get current loop state\n */\n get loop() {\n return Boolean(this.media.loop);\n }\n\n /**\n * Set new media source\n * @param {object} input - The new source object (see docs)\n */\n set source(input) {\n source.change.call(this, input);\n }\n\n /**\n * Get current source\n */\n get source() {\n return this.media.currentSrc;\n }\n\n /**\n * Set the poster image for a video\n * @param {input} - the URL for the new poster image\n */\n set poster(input) {\n if (!this.isVideo) {\n this.debug.warn('Poster can only be set for video');\n return;\n }\n\n ui.setPoster.call(this, input);\n }\n\n /**\n * Get the current poster image\n */\n get poster() {\n if (!this.isVideo) {\n return null;\n }\n\n return this.media.getAttribute('poster');\n }\n\n /**\n * Set the autoplay state\n * @param {boolean} input - Whether to autoplay or not\n */\n set autoplay(input) {\n const toggle = utils.is.boolean(input) ? input : this.config.autoplay;\n this.config.autoplay = toggle;\n }\n\n /**\n * Get the current autoplay state\n */\n get autoplay() {\n return Boolean(this.config.autoplay);\n }\n\n /**\n * Toggle captions\n * @param {boolean} input - Whether to enable captions\n */\n toggleCaptions(input) {\n // If there's no full support\n if (!this.supported.ui) {\n return;\n }\n\n // If the method is called without parameter, toggle based on current value\n const active = utils.is.boolean(input) ? input : !this.elements.container.classList.contains(this.config.classNames.captions.active);\n\n // Toggle state\n this.elements.buttons.captions.pressed = active;\n\n // Add class hook\n utils.toggleClass(this.elements.container, this.config.classNames.captions.active, active);\n\n // Update state and trigger event\n if (active !== this.captions.active) {\n this.captions.active = active;\n utils.dispatchEvent.call(this, this.media, this.captions.active ? 'captionsenabled' : 'captionsdisabled');\n }\n }\n\n /**\n * Set the caption track by index\n * @param {number} - Caption index\n */\n set currentTrack(input) {\n captions.set.call(this, input);\n }\n\n /**\n * Get the current caption track index (-1 if disabled)\n */\n get currentTrack() {\n const { active, currentTrack } = this.captions;\n return active ? currentTrack : -1;\n }\n\n /**\n * Set the wanted language for captions\n * Since tracks can be added later it won't update the actual caption track until there is a matching track\n * @param {string} - Two character ISO language code (e.g. EN, FR, PT, etc)\n */\n set language(input) {\n captions.setLanguage.call(this, input);\n }\n\n /**\n * Get the current track's language\n */\n get language() {\n return (captions.getCurrentTrack.call(this) || {}).language;\n }\n\n /**\n * Toggle picture-in-picture playback on WebKit/MacOS\n * TODO: update player with state, support, enabled\n * TODO: detect outside changes\n */\n set pip(input) {\n const states = {\n pip: 'picture-in-picture',\n inline: 'inline',\n };\n\n // Bail if no support\n if (!support.pip) {\n return;\n }\n\n // Toggle based on current state if not passed\n const toggle = utils.is.boolean(input) ? input : this.pip === states.inline;\n\n // Toggle based on current state\n this.media.webkitSetPresentationMode(toggle ? states.pip : states.inline);\n }\n\n /**\n * Get the current picture-in-picture state\n */\n get pip() {\n if (!support.pip) {\n return null;\n }\n\n return this.media.webkitPresentationMode;\n }\n\n /**\n * Trigger the airplay dialog\n * TODO: update player with state, support, enabled\n */\n airplay() {\n // Show dialog if supported\n if (support.airplay) {\n this.media.webkitShowPlaybackTargetPicker();\n }\n }\n\n /**\n * Toggle the player controls\n * @param {boolean} [toggle] - Whether to show the controls\n */\n toggleControls(toggle) {\n // Don't toggle if missing UI support or if it's audio\n if (this.supported.ui && !this.isAudio) {\n // Get state before change\n const isHidden = utils.hasClass(this.elements.container, this.config.classNames.hideControls);\n\n // Negate the argument if not undefined since adding the class to hides the controls\n const force = typeof toggle === 'undefined' ? undefined : !toggle;\n\n // Apply and get updated state\n const hiding = utils.toggleClass(this.elements.container, this.config.classNames.hideControls, force);\n\n // Close menu\n if (hiding && this.config.controls.includes('settings') && !utils.is.empty(this.config.settings)) {\n controls.toggleMenu.call(this, false);\n }\n // Trigger event on change\n if (hiding !== isHidden) {\n const eventName = hiding ? 'controlshidden' : 'controlsshown';\n utils.dispatchEvent.call(this, this.media, eventName);\n }\n return !hiding;\n }\n return false;\n }\n\n /**\n * Add event listeners\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n */\n on(event, callback) {\n utils.on(this.elements.container, event, callback);\n }\n\n /**\n * Remove event listeners\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n */\n off(event, callback) {\n utils.off(this.elements.container, event, callback);\n }\n\n /**\n * Destroy an instance\n * Event listeners are removed when elements are removed\n * http://stackoverflow.com/questions/12528049/if-a-dom-element-is-removed-are-its-listeners-also-removed-from-memory\n * @param {function} callback - Callback for when destroy is complete\n * @param {boolean} soft - Whether it's a soft destroy (for source changes etc)\n */\n destroy(callback, soft = false) {\n if (!this.ready) {\n return;\n }\n\n const done = () => {\n // Reset overflow (incase destroyed while in fullscreen)\n document.body.style.overflow = '';\n\n // GC for embed\n this.embed = null;\n\n // If it's a soft destroy, make minimal changes\n if (soft) {\n if (Object.keys(this.elements).length) {\n // Remove elements\n utils.removeElement(this.elements.buttons.play);\n utils.removeElement(this.elements.captions);\n utils.removeElement(this.elements.controls);\n utils.removeElement(this.elements.wrapper);\n\n // Clear for GC\n this.elements.buttons.play = null;\n this.elements.captions = null;\n this.elements.controls = null;\n this.elements.wrapper = null;\n }\n\n // Callback\n if (utils.is.function(callback)) {\n callback();\n }\n } else {\n // Unbind listeners\n this.listeners.clear();\n\n // Replace the container with the original element provided\n utils.replaceElement(this.elements.original, this.elements.container);\n\n // Event\n utils.dispatchEvent.call(this, this.elements.original, 'destroyed', true);\n\n // Callback\n if (utils.is.function(callback)) {\n callback.call(this.elements.original);\n }\n\n // Reset state\n this.ready = false;\n\n // Clear for garbage collection\n setTimeout(() => {\n this.elements = null;\n this.media = null;\n }, 200);\n }\n };\n\n // Stop playback\n this.stop();\n\n // Type specific stuff\n switch (`${this.provider}:${this.type}`) {\n case 'html5:video':\n case 'html5:audio':\n // Clear timeout\n clearTimeout(this.timers.loading);\n\n // Restore native video controls\n ui.toggleNativeControls.call(this, true);\n\n // Clean up\n done();\n\n break;\n\n case 'youtube:video':\n // Clear timers\n clearInterval(this.timers.buffering);\n clearInterval(this.timers.playing);\n\n // Destroy YouTube API\n if (this.embed !== null && utils.is.function(this.embed.destroy)) {\n this.embed.destroy();\n }\n\n // Clean up\n done();\n\n break;\n\n case 'vimeo:video':\n // Destroy Vimeo API\n // then clean up (wait, to prevent postmessage errors)\n if (this.embed !== null) {\n this.embed.unload().then(done);\n }\n\n // Vimeo does not always return\n setTimeout(done, 200);\n\n break;\n\n default:\n break;\n }\n }\n\n /**\n * Check for support for a mime type (HTML5 only)\n * @param {string} type - Mime type\n */\n supports(type) {\n return support.mime.call(this, type);\n }\n\n /**\n * Check for support\n * @param {string} type - Player type (audio/video)\n * @param {string} provider - Provider (html5/youtube/vimeo)\n * @param {bool} inline - Where player has `playsinline` sttribute\n */\n static supported(type, provider, inline) {\n return support.check(type, provider, inline);\n }\n\n /**\n * Load an SVG sprite into the page\n * @param {string} url - URL for the SVG sprite\n * @param {string} [id] - Unique ID\n */\n static loadSprite(url, id) {\n return utils.loadSprite(url, id);\n }\n\n /**\n * Setup multiple instances\n * @param {*} selector\n * @param {object} options\n */\n static setup(selector, options = {}) {\n let targets = null;\n\n if (utils.is.string(selector)) {\n targets = Array.from(document.querySelectorAll(selector));\n } else if (utils.is.nodeList(selector)) {\n targets = Array.from(selector);\n } else if (utils.is.array(selector)) {\n targets = selector.filter(utils.is.element);\n }\n\n if (utils.is.empty(targets)) {\n return null;\n }\n\n return targets.map(t => new Plyr(t, options));\n }\n}\n\nPlyr.defaults = utils.cloneDeep(defaults);\n\nexport default Plyr;\n"]} \ No newline at end of file
+{"version":3,"sources":["src/js/utils/is.js","src/js/utils/events.js","src/js/utils/elements.js","src/js/utils/animation.js","src/js/utils/browser.js","src/js/support.js","src/js/html5.js","src/js/utils/objects.js","src/js/utils/strings.js","src/js/i18n.js","src/js/utils/arrays.js","src/js/storage.js","src/js/utils/loadSprite.js","src/js/utils/time.js","src/js/controls.js","src/js/utils/fetch.js","src/js/utils/urls.js","src/js/captions.js","src/js/config/defaults.js","src/js/config/types.js","src/js/console.js","src/js/fullscreen.js","src/js/utils/loadImage.js","src/js/ui.js","src/js/listeners.js","node_modules/loadjs/dist/loadjs.umd.js","src/js/utils/loadScript.js","src/js/plugins/vimeo.js","src/js/plugins/youtube.js","src/js/media.js","src/js/plugins/ads.js","src/js/source.js","src/js/plyr.js"],"names":["getConstructor","input","constructor","instanceOf","Boolean","is","object","Object","number","Number","isNaN","string","String","boolean","function","Function","array","nullOrUndefined","Array","isArray","weakMap","WeakMap","nodeList","NodeList","element","Element","textNode","Text","event","Event","cue","window","TextTrackCue","VTTCue","track","TextTrack","kind","url","test","empty","length","keys","supportsPassiveListeners","supported","options","defineProperty","get","addEventListener","removeEventListener","e","toggleListener","callback","toggle","passive","capture","events","split","forEach","eventListeners","push","type","on","call","off","once","onceCallback","args","apply","triggerEvent","bubbles","detail","CustomEvent","assign","plyr","dispatchEvent","unbindListeners","item","ready","Promise","setTimeout","resolve","elements","container","then","wrap","wrapper","targets","from","reverse","index","child","cloneNode","parent","parentNode","sibling","nextSibling","appendChild","insertBefore","setAttributes","attributes","entries","filter","value","key","setAttribute","createElement","text","document","innerText","insertAfter","target","insertElement","removeElement","removeChild","emptyElement","childNodes","lastChild","replaceElement","newChild","oldChild","replaceChild","getAttributesFromSelector","sel","existingAttributes","existing","selector","s","trim","className","replace","stripped","parts","start","charAt","class","id","toggleHidden","hidden","hide","hasAttribute","removeAttribute","toggleClass","force","method","classList","contains","hasClass","matches","prototype","match","querySelectorAll","includes","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","getElements","getElement","querySelector","getFocusElement","focused","activeElement","body","trapFocus","focusable","first","last","trap","keyCode","shiftKey","focus","preventDefault","transitionEndEvent","WebkitTransition","MozTransition","OTransition","transition","find","style","undefined","repaint","offsetHeight","browser","isIE","documentMode","isWebkit","documentElement","navigator","userAgent","isIPhone","platform","isIos","defaultCodecs","support","audio","video","check","provider","playsinline","canPlayInline","api","ui","rangeInput","pip","webkitSetPresentationMode","airplay","WebKitPlaybackTargetAvailabilityEvent","mime","inputType","mediaType","isHTML5","media","canPlayType","err","textTracks","range","touch","transitions","reducedMotion","matchMedia","html5","getSources","sources","source","getAttribute","getQualityOptions","map","extend","player","set","currentTime","playing","src","onLoadedMetaData","load","play","quality","cancelRequests","config","blankVideo","debug","log","cloneDeep","JSON","parse","stringify","getDeep","path","reduce","obj","shift","generateId","prefix","Math","floor","random","format","toString","i","getPercentage","current","max","toFixed","replaceAll","RegExp","toTitleCase","toUpperCase","substr","toLowerCase","toPascalCase","toCamelCase","slice","stripHTML","fragment","createDocumentFragment","innerHTML","firstChild","getHTML","i18n","seekTime","title","dedupe","indexOf","closest","prev","curr","abs","Storage","enabled","storage","store","localStorage","getItem","json","setItem","removeItem","loadSprite","hasId","isCached","exists","getElementById","update","data","insertAdjacentElement","useStorage","cached","content","fetch","result","catch","getHours","parseInt","getMinutes","getSeconds","formatTime","time","displayHours","inverted","hours","mins","secs","controls","getIconUrl","URL","iconUrl","location","cors","host","svg4everybody","findElements","selectors","buttons","pause","restart","rewind","fastForward","mute","settings","captions","fullscreen","progress","inputs","seek","volume","display","buffer","duration","seekTooltip","classNames","tooltip","error","warn","toggleNativeControls","createIcon","namespace","iconPath","iconPrefix","icon","createElementNS","role","use","setAttributeNS","createLabel","attr","universals","join","createBadge","badge","menu","createButton","buttonType","button","label","labelPressed","iconPressed","control","controlPressed","enumerable","pressed","createRange","min","step","autocomplete","updateRangeFill","createProgress","suffixKey","played","suffix","createTime","createMenuItem","list","checked","radio","name","faux","insertAdjacentHTML","forceHours","updateTimeDisplay","updateVolume","setRange","muted","updateProgress","setProgress","getElementsByTagName","nodeValue","buffered","percent","setProperty","updateSeekTooltip","tooltips","clientRect","getBoundingClientRect","visible","width","pageX","left","parseFloat","timeUpdate","invert","invertTime","seeking","durationUpdate","hasDuration","displayDuration","paused","toggleTab","setting","tabs","setQualityMenu","panes","checkMenu","getBadge","sort","a","b","sorting","getLabel","updateSetting","pane","currentTrack","default","setCaptionsMenu","tracks","getTracks","toggled","language","unshift","bind","setSpeedMenu","speed","isVimeo","values","some","tab","toggleMenu","form","show","isMenuItem","isButton","stopPropagation","open","getTabSize","clone","position","opacity","scrollWidth","height","scrollHeight","showTab","isTab","size","restore","propertyName","create","tabindex","inner","home","back","inject","props","seektime","labels","responseType","reject","request","XMLHttpRequest","responseText","response","Error","statusText","send","parseUrl","safe","parser","href","buildUrlParams","params","URLSearchParams","setup","isVideo","isYouTube","hostname","protocol","createObjectURL","blob","languages","userLanguage","active","trackEvents","meta","currentTrackNode","languageExists","mode","updateCues","setLanguage","activeClass","findTrack","embed","enableTextTrack","has","sortIsDefault","sorted","every","getCurrentTrack","cues","activeCues","getCueAsHTML","cueText","changed","caption","defaults","autoplay","autopause","toggleInvert","ratio","clickToPlay","hideControls","resetOnEnd","disableContextMenu","loop","selected","keyboard","global","fallback","iosNative","seekLabel","unmute","enableCaptions","disableCaptions","enterFullscreen","exitFullscreen","frameTitle","menuBack","normal","end","all","reset","disabled","advertisement","qualityBadge","urls","vimeo","sdk","iframe","youtube","googleIMA","listeners","editable","embedContainer","poster","posterEnabled","ads","stopped","loading","hover","isTouch","uiSupported","noTransition","tabFocus","google","publisherId","providers","types","getProviderByUrl","noop","Console","console","onChange","toggleFallback","scrollPosition","x","scrollX","y","scrollY","scrollTo","overflow","Fullscreen","property","native","webkitEnterFullscreen","requestFullscreen","webkitExitFullscreen","cancelFullScreen","action","enter","exit","fullscreenElement","fullscreenEnabled","webkitFullscreenEnabled","mozFullScreenEnabled","msFullscreenEnabled","prefixes","pre","loadImage","minWidth","image","Image","handler","onload","onerror","naturalWidth","addStyleHook","build","checkPlaying","setTitle","setPoster","isEmbed","togglePoster","enable","backgroundImage","backgroundSize","toggleControls","checkLoading","clearTimeout","timers","Listeners","lastKey","handleKey","firstTouch","code","which","repeat","altKey","ctrlKey","metaKey","seekByKey","togglePlay","increaseVolume","decreaseVolume","forward","toggleCaptions","delay","hasAudio","initialized","managerPromise","isAudio","ended","proxyEvents","concat","inputEvent","proxy","defaultHandler","customHandlerKey","customHandler","hasCustomHandler","returned","showHomeTab","currentTarget","eventType","done","seekTo","webkitDirectionInvertedFromDevice","direction","deltaY","deltaX","define","this","loadScript","loadjs","success","parseId","regex","$2","getAspectRatio","getRatio","w","h","assurePlaybackState","hasPlayed","setAspectRatio","Vimeo","padding","paddingBottom","offset","transform","byline","portrait","transparent","gesture","thumbnail_large","pathname","Player","disableTextTrack","stop","restorePause","setVolume","setCurrentTime","setPlaybackRate","setLoop","currentSrc","getVideoUrl","getVideoWidth","getVideoHeight","dimensions","setAutopause","state","getVideoTitle","getCurrentTime","getDuration","getTextTracks","strippedCues","getPaused","frame","seconds","mapQualityUnit","qualities","hd2160","hd1440","hd1080","hd720","large","medium","small","tiny","entry","mapQualityUnits","levels","level","YT","onYouTubeReadyCallbacks","onYouTubeIframeAPIReady","getTitle","videoId","getVideoData","items","snippet","currentId","startsWith","posterSrc","playerVars","rel","showinfo","iv_load_policy","modestbranding","disablekb","widget_referrer","cc_load_policy","cc_lang_pref","onError","message","onPlaybackQualityChange","onPlaybackRateChange","instance","playbackRate","getPlaybackRate","onReady","playVideo","pauseVideo","stopVideo","getPlaybackQuality","setPlaybackQuality","getAvailablePlaybackRates","clearInterval","buffering","setInterval","getVideoLoadedFraction","lastBuffered","onStateChange","seeked","getAvailableQualityLevels","unMute","Ads","displayContainer","manager","loader","cuePoints","safetyTimer","countdownTimer","ima","trigger","startSafetyTimer","clearSafetyTimer","setupIMA","setVpaidMode","ImaSdkSettings","VpaidMode","ENABLED","setLocale","AdDisplayContainer","requestAds","AdsLoader","AdsManagerLoadedEvent","Type","ADS_MANAGER_LOADED","onAdsManagerLoaded","AdErrorEvent","AD_ERROR","onAdError","AdsRequest","adTagUrl","tagUrl","linearAdSlotWidth","offsetWidth","linearAdSlotHeight","nonLinearAdSlotWidth","nonLinearAdSlotHeight","forceNonLinearFullSlot","setAdWillPlayMuted","getRemainingTime","AdsRenderingSettings","restoreCustomPlaybackStateOnAdBreakComplete","enablePreloading","getAdsManager","getCuePoints","cuePoint","seekElement","cuePercentage","AdEvent","onAdEvent","ad","getAd","LOADED","pollCountdown","isLinear","ALL_ADS_COMPLETED","loadAds","CONTENT_PAUSE_REQUESTED","pauseContent","CONTENT_RESUME_REQUESTED","resumeContent","STARTED","MIDPOINT","COMPLETE","IMPRESSION","CLICK","cancel","contentComplete","seekedTime","discardAdBreak","splice","resize","ViewMode","NORMAL","initialize","init","adError","zIndex","destroy","handlers","AV_PUBLISHERID","AV_CHANNELID","AV_URL","cb","Date","now","AV_WIDTH","AV_HEIGHT","AV_CDIM2","base","insertElements","attribute","change","tagName","crossorigin","Plyr","failed","jQuery","original","searchParams","truthy","webkitShowPlaybackTargetPicker","isHidden","hiding","eventName","soft","unload","inputIsValid","fauxDuration","mozHasAudio","webkitAudioDecodedByteCount","audioTracks","states","inline","webkitPresentationMode","t"],"mappings":"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","file":"plyr.js","sourcesContent":["// ==========================================================================\n// Type checking utils\n// ==========================================================================\n\nconst getConstructor = input => (input !== null && typeof input !== 'undefined' ? input.constructor : null);\n\nconst instanceOf = (input, constructor) => Boolean(input && constructor && input instanceof constructor);\n\nconst is = {\n object(input) {\n return getConstructor(input) === Object;\n },\n number(input) {\n return getConstructor(input) === Number && !Number.isNaN(input);\n },\n string(input) {\n return getConstructor(input) === String;\n },\n boolean(input) {\n return getConstructor(input) === Boolean;\n },\n function(input) {\n return getConstructor(input) === Function;\n },\n array(input) {\n return !is.nullOrUndefined(input) && Array.isArray(input);\n },\n weakMap(input) {\n return instanceOf(input, WeakMap);\n },\n nodeList(input) {\n return instanceOf(input, NodeList);\n },\n element(input) {\n return instanceOf(input, Element);\n },\n textNode(input) {\n return getConstructor(input) === Text;\n },\n event(input) {\n return instanceOf(input, Event);\n },\n cue(input) {\n return instanceOf(input, window.TextTrackCue) || instanceOf(input, window.VTTCue);\n },\n track(input) {\n return instanceOf(input, TextTrack) || (!is.nullOrUndefined(input) && is.string(input.kind));\n },\n url(input) {\n return (\n !is.nullOrUndefined(input) &&\n /(ftp|http|https):\\/\\/(\\w+:{0,1}\\w*@)?(\\S+)(:[0-9]+)?(\\/|\\/([\\w#!:.?+=&%@!\\-/]))?/.test(input)\n );\n },\n nullOrUndefined(input) {\n return input === null || typeof input === 'undefined';\n },\n empty(input) {\n return (\n is.nullOrUndefined(input) ||\n ((is.string(input) || is.array(input) || is.nodeList(input)) && !input.length) ||\n (is.object(input) && !Object.keys(input).length)\n );\n },\n};\n\nexport default is;\n","// ==========================================================================\n// Event utils\n// ==========================================================================\n\nimport is from './is';\n\n// Check for passive event listener support\n// https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md\n// https://www.youtube.com/watch?v=NPM6172J22g\nconst supportsPassiveListeners = (() => {\n // Test via a getter in the options object to see if the passive property is accessed\n let supported = false;\n try {\n const options = Object.defineProperty({}, 'passive', {\n get() {\n supported = true;\n return null;\n },\n });\n window.addEventListener('test', null, options);\n window.removeEventListener('test', null, options);\n } catch (e) {\n // Do nothing\n }\n\n return supported;\n})();\n\n// Toggle event listener\nexport function toggleListener(element, event, callback, toggle = false, passive = true, capture = false) {\n // Bail if no element, event, or callback\n if (!element || !('addEventListener' in element) || is.empty(event) || !is.function(callback)) {\n return;\n }\n\n // Allow multiple events\n const events = event.split(' ');\n\n // Build options\n // Default to just the capture boolean for browsers with no passive listener support\n let options = capture;\n\n // If passive events listeners are supported\n if (supportsPassiveListeners) {\n options = {\n // Whether the listener can be passive (i.e. default never prevented)\n passive,\n // Whether the listener is a capturing listener or not\n capture,\n };\n }\n\n // If a single node is passed, bind the event listener\n events.forEach(type => {\n if (this && this.eventListeners && toggle) {\n // Cache event listener\n this.eventListeners.push({ element, type, callback, options });\n }\n\n element[toggle ? 'addEventListener' : 'removeEventListener'](type, callback, options);\n });\n}\n\n// Bind event handler\nexport function on(element, events = '', callback, passive = true, capture = false) {\n toggleListener.call(this, element, events, callback, true, passive, capture);\n}\n\n// Unbind event handler\nexport function off(element, events = '', callback, passive = true, capture = false) {\n toggleListener.call(this, element, events, callback, false, passive, capture);\n}\n\n// Bind once-only event handler\nexport function once(element, events = '', callback, passive = true, capture = false) {\n function onceCallback(...args) {\n off(element, events, onceCallback, passive, capture);\n callback.apply(this, args);\n }\n\n toggleListener.call(this, element, events, onceCallback, true, passive, capture);\n}\n\n// Trigger event\nexport function triggerEvent(element, type = '', bubbles = false, detail = {}) {\n // Bail if no element\n if (!is.element(element) || is.empty(type)) {\n return;\n }\n\n // Create and dispatch the event\n const event = new CustomEvent(type, {\n bubbles,\n detail: Object.assign({}, detail, {\n plyr: this,\n }),\n });\n\n // Dispatch the event\n element.dispatchEvent(event);\n}\n\n// Unbind all cached event listeners\nexport function unbindListeners() {\n if (this && this.eventListeners) {\n this.eventListeners.forEach(item => {\n const { element, type, callback, options } = item;\n element.removeEventListener(type, callback, options);\n });\n\n this.eventListeners = [];\n }\n}\n\n// Run method when / if player is ready\nexport function ready() {\n return new Promise(\n resolve => (this.ready ? setTimeout(resolve, 0) : on.call(this, this.elements.container, 'ready', resolve)),\n ).then(() => {});\n}\n","// ==========================================================================\n// Element utils\n// ==========================================================================\n\nimport { toggleListener } from './events';\nimport is from './is';\n\n// Wrap an element\nexport function wrap(elements, wrapper) {\n // Convert `elements` to an array, if necessary.\n const targets = elements.length ? elements : [elements];\n\n // Loops backwards to prevent having to clone the wrapper on the\n // first element (see `child` below).\n Array.from(targets)\n .reverse()\n .forEach((element, index) => {\n const child = index > 0 ? wrapper.cloneNode(true) : wrapper;\n\n // Cache the current parent and sibling.\n const parent = element.parentNode;\n const sibling = element.nextSibling;\n\n // Wrap the element (is automatically removed from its current\n // parent).\n child.appendChild(element);\n\n // If the element had a sibling, insert the wrapper before\n // the sibling to maintain the HTML structure; otherwise, just\n // append it to the parent.\n if (sibling) {\n parent.insertBefore(child, sibling);\n } else {\n parent.appendChild(child);\n }\n });\n}\n\n// Set attributes\nexport function setAttributes(element, attributes) {\n if (!is.element(element) || is.empty(attributes)) {\n return;\n }\n\n // Assume null and undefined attributes should be left out,\n // Setting them would otherwise convert them to \"null\" and \"undefined\"\n Object.entries(attributes)\n .filter(([, value]) => !is.nullOrUndefined(value))\n .forEach(([key, value]) => element.setAttribute(key, value));\n}\n\n// Create a DocumentFragment\nexport function createElement(type, attributes, text) {\n // Create a new <element>\n const element = document.createElement(type);\n\n // Set all passed attributes\n if (is.object(attributes)) {\n setAttributes(element, attributes);\n }\n\n // Add text node\n if (is.string(text)) {\n element.innerText = text;\n }\n\n // Return built element\n return element;\n}\n\n// Inaert an element after another\nexport function insertAfter(element, target) {\n target.parentNode.insertBefore(element, target.nextSibling);\n}\n\n// Insert a DocumentFragment\nexport function insertElement(type, parent, attributes, text) {\n // Inject the new <element>\n parent.appendChild(createElement(type, attributes, text));\n}\n\n// Remove element(s)\nexport function removeElement(element) {\n if (is.nodeList(element) || is.array(element)) {\n Array.from(element).forEach(removeElement);\n return;\n }\n\n if (!is.element(element) || !is.element(element.parentNode)) {\n return;\n }\n\n element.parentNode.removeChild(element);\n}\n\n// Remove all child elements\nexport function emptyElement(element) {\n let { length } = element.childNodes;\n\n while (length > 0) {\n element.removeChild(element.lastChild);\n length -= 1;\n }\n}\n\n// Replace element\nexport function replaceElement(newChild, oldChild) {\n if (!is.element(oldChild) || !is.element(oldChild.parentNode) || !is.element(newChild)) {\n return null;\n }\n\n oldChild.parentNode.replaceChild(newChild, oldChild);\n\n return newChild;\n}\n\n// Get an attribute object from a string selector\nexport function getAttributesFromSelector(sel, existingAttributes) {\n // For example:\n // '.test' to { class: 'test' }\n // '#test' to { id: 'test' }\n // '[data-test=\"test\"]' to { 'data-test': 'test' }\n\n if (!is.string(sel) || is.empty(sel)) {\n return {};\n }\n\n const attributes = {};\n const existing = existingAttributes;\n\n sel.split(',').forEach(s => {\n // Remove whitespace\n const selector = s.trim();\n const className = selector.replace('.', '');\n const stripped = selector.replace(/[[\\]]/g, '');\n\n // Get the parts and value\n const parts = stripped.split('=');\n const key = parts[0];\n const value = parts.length > 1 ? parts[1].replace(/[\"']/g, '') : '';\n\n // Get the first character\n const start = selector.charAt(0);\n\n switch (start) {\n case '.':\n // Add to existing classname\n if (is.object(existing) && is.string(existing.class)) {\n existing.class += ` ${className}`;\n }\n\n attributes.class = className;\n break;\n\n case '#':\n // ID selector\n attributes.id = selector.replace('#', '');\n break;\n\n case '[':\n // Attribute selector\n attributes[key] = value;\n\n break;\n\n default:\n break;\n }\n });\n\n return attributes;\n}\n\n// Toggle hidden\nexport function toggleHidden(element, hidden) {\n if (!is.element(element)) {\n return;\n }\n\n let hide = hidden;\n\n if (!is.boolean(hide)) {\n hide = !element.hasAttribute('hidden');\n }\n\n if (hide) {\n element.setAttribute('hidden', '');\n } else {\n element.removeAttribute('hidden');\n }\n}\n\n// Mirror Element.classList.toggle, with IE compatibility for \"force\" argument\nexport function toggleClass(element, className, force) {\n if (is.element(element)) {\n let method = 'toggle';\n if (typeof force !== 'undefined') {\n method = force ? 'add' : 'remove';\n }\n\n element.classList[method](className);\n return element.classList.contains(className);\n }\n\n return null;\n}\n\n// Has class name\nexport function hasClass(element, className) {\n return is.element(element) && element.classList.contains(className);\n}\n\n// Element matches selector\nexport function matches(element, selector) {\n const prototype = { Element };\n\n function match() {\n return Array.from(document.querySelectorAll(selector)).includes(this);\n }\n\n const matches =\n prototype.matches ||\n prototype.webkitMatchesSelector ||\n prototype.mozMatchesSelector ||\n prototype.msMatchesSelector ||\n match;\n\n return matches.call(element, selector);\n}\n\n// Find all elements\nexport function getElements(selector) {\n return this.elements.container.querySelectorAll(selector);\n}\n\n// Find a single element\nexport function getElement(selector) {\n return this.elements.container.querySelector(selector);\n}\n\n// Get the focused element\nexport function getFocusElement() {\n let focused = document.activeElement;\n\n if (!focused || focused === document.body) {\n focused = null;\n } else {\n focused = document.querySelector(':focus');\n }\n\n return focused;\n}\n\n// Trap focus inside container\nexport function trapFocus(element = null, toggle = false) {\n if (!is.element(element)) {\n return;\n }\n\n const focusable = getElements.call(this, 'button:not(:disabled), input:not(:disabled), [tabindex]');\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n\n const trap = event => {\n // Bail if not tab key or not fullscreen\n if (event.key !== 'Tab' || event.keyCode !== 9) {\n return;\n }\n\n // Get the current focused element\n const focused = getFocusElement();\n\n if (focused === last && !event.shiftKey) {\n // Move focus to first element that can be tabbed if Shift isn't used\n first.focus();\n event.preventDefault();\n } else if (focused === first && event.shiftKey) {\n // Move focus to last element that can be tabbed if Shift is used\n last.focus();\n event.preventDefault();\n }\n };\n\n toggleListener.call(this, this.elements.container, 'keydown', trap, toggle, false);\n}\n","// ==========================================================================\n// Animation utils\n// ==========================================================================\n\nimport { toggleHidden } from './elements';\nimport is from './is';\n\nexport const transitionEndEvent = (() => {\n const element = document.createElement('span');\n\n const events = {\n WebkitTransition: 'webkitTransitionEnd',\n MozTransition: 'transitionend',\n OTransition: 'oTransitionEnd otransitionend',\n transition: 'transitionend',\n };\n\n const type = Object.keys(events).find(event => element.style[event] !== undefined);\n\n return is.string(type) ? events[type] : false;\n})();\n\n// Force repaint of element\nexport function repaint(element) {\n setTimeout(() => {\n toggleHidden(element, true);\n element.offsetHeight; // eslint-disable-line\n toggleHidden(element, false);\n }, 0);\n}\n","// ==========================================================================\n// Browser sniffing\n// Unfortunately, due to mixed support, UA sniffing is required\n// ==========================================================================\n\nconst browser = {\n isIE: /* @cc_on!@ */ false || !!document.documentMode,\n isWebkit: 'WebkitAppearance' in document.documentElement.style && !/Edge/.test(navigator.userAgent),\n isIPhone: /(iPhone|iPod)/gi.test(navigator.platform),\n isIos: /(iPad|iPhone|iPod)/gi.test(navigator.platform),\n};\n\nexport default browser;\n","// ==========================================================================\n// Plyr support checks\n// ==========================================================================\n\nimport { transitionEndEvent } from './utils/animation';\nimport browser from './utils/browser';\nimport { createElement } from './utils/elements';\nimport is from './utils/is';\n\n// Default codecs for checking mimetype support\nconst defaultCodecs = {\n 'audio/ogg': 'vorbis',\n 'audio/wav': '1',\n 'video/webm': 'vp8, vorbis',\n 'video/mp4': 'avc1.42E01E, mp4a.40.2',\n 'video/ogg': 'theora',\n};\n\n// Check for feature support\nconst support = {\n // Basic support\n audio: 'canPlayType' in document.createElement('audio'),\n video: 'canPlayType' in document.createElement('video'),\n\n // Check for support\n // Basic functionality vs full UI\n check(type, provider, playsinline) {\n const canPlayInline = browser.isIPhone && playsinline && support.playsinline;\n const api = support[type] || provider !== 'html5';\n const ui = api && support.rangeInput && (type !== 'video' || !browser.isIPhone || canPlayInline);\n\n return {\n api,\n ui,\n };\n },\n\n // Picture-in-picture support\n // Safari only currently\n pip: (() => !browser.isIPhone && is.function(createElement('video').webkitSetPresentationMode))(),\n\n // Airplay support\n // Safari only currently\n airplay: is.function(window.WebKitPlaybackTargetAvailabilityEvent),\n\n // Inline playback support\n // https://webkit.org/blog/6784/new-video-policies-for-ios/\n playsinline: 'playsInline' in document.createElement('video'),\n\n // Check for mime type support against a player instance\n // Credits: http://diveintohtml5.info/everything.html\n // Related: http://www.leanbackplayer.com/test/h5mt.html\n mime(inputType) {\n const [mediaType] = inputType.split('/');\n if (!this.isHTML5 || mediaType !== this.type) {\n return false;\n }\n\n let type;\n if (inputType && inputType.includes('codecs=')) {\n // Use input directly\n type = inputType;\n } else if (inputType === 'audio/mpeg') {\n // Skip codec\n type = 'audio/mpeg;';\n } else if (inputType in defaultCodecs) {\n // Use codec\n type = `${inputType}; codecs=\"${defaultCodecs[inputType]}\"`;\n }\n\n try {\n return Boolean(type && this.media.canPlayType(type).replace(/no/, ''));\n } catch (err) {\n return false;\n }\n },\n\n // Check for textTracks support\n textTracks: 'textTracks' in document.createElement('video'),\n\n // <input type=\"range\"> Sliders\n rangeInput: (() => {\n const range = document.createElement('input');\n range.type = 'range';\n return range.type === 'range';\n })(),\n\n // Touch\n // NOTE: Remember a device can be mouse + touch enabled so we check on first touch event\n touch: 'ontouchstart' in document.documentElement,\n\n // Detect transitions support\n transitions: transitionEndEvent !== false,\n\n // Reduced motion iOS & MacOS setting\n // https://webkit.org/blog/7551/responsive-design-for-motion/\n reducedMotion: 'matchMedia' in window && window.matchMedia('(prefers-reduced-motion)').matches,\n};\n\nexport default support;\n","// ==========================================================================\n// Plyr HTML5 helpers\n// ==========================================================================\n\nimport support from './support';\nimport { removeElement } from './utils/elements';\nimport { triggerEvent } from './utils/events';\n\nconst html5 = {\n getSources() {\n if (!this.isHTML5) {\n return [];\n }\n\n const sources = Array.from(this.media.querySelectorAll('source'));\n\n // Filter out unsupported sources\n return sources.filter(source => support.mime.call(this, source.getAttribute('type')));\n },\n\n // Get quality levels\n getQualityOptions() {\n // Get sizes from <source> elements\n return html5.getSources\n .call(this)\n .map(source => Number(source.getAttribute('size')))\n .filter(Boolean);\n },\n\n extend() {\n if (!this.isHTML5) {\n return;\n }\n\n const player = this;\n\n // Quality\n Object.defineProperty(player.media, 'quality', {\n get() {\n // Get sources\n const sources = html5.getSources.call(player);\n const [source] = sources.filter(source => source.getAttribute('src') === player.source);\n\n // Return size, if match is found\n return source && Number(source.getAttribute('size'));\n },\n set(input) {\n // Get sources\n const sources = html5.getSources.call(player);\n\n // Get first match for requested size\n const source = sources.find(source => Number(source.getAttribute('size')) === input);\n\n // No matching source found\n if (!source) {\n return;\n }\n\n // Get current state\n const { currentTime, playing } = player;\n\n // Set new source\n player.media.src = source.getAttribute('src');\n\n // Restore time\n const onLoadedMetaData = () => {\n player.currentTime = currentTime;\n };\n player.once('loadedmetadata', onLoadedMetaData);\n\n // Load new source\n player.media.load();\n\n // Resume playing\n if (playing) {\n player.play();\n }\n\n // Trigger change event\n triggerEvent.call(player, player.media, 'qualitychange', false, {\n quality: input,\n });\n },\n });\n },\n\n // Cancel current network requests\n // See https://github.com/sampotts/plyr/issues/174\n cancelRequests() {\n if (!this.isHTML5) {\n return;\n }\n\n // Remove child sources\n removeElement(html5.getSources.call(this));\n\n // Set blank video src attribute\n // This is to prevent a MEDIA_ERR_SRC_NOT_SUPPORTED error\n // Info: http://stackoverflow.com/questions/32231579/how-to-properly-dispose-of-an-html5-video-and-close-socket-or-connection\n this.media.setAttribute('src', this.config.blankVideo);\n\n // Load the new empty source\n // This will cancel existing requests\n // See https://github.com/sampotts/plyr/issues/174\n this.media.load();\n\n // Debugging\n this.debug.log('Cancelled network requests');\n },\n};\n\nexport default html5;\n","// ==========================================================================\n// Object utils\n// ==========================================================================\n\nimport is from './is';\n\n// Clone nested objects\nexport function cloneDeep(object) {\n return JSON.parse(JSON.stringify(object));\n}\n\n// Get a nested value in an object\nexport function getDeep(object, path) {\n return path.split('.').reduce((obj, key) => obj && obj[key], object);\n}\n\n// Deep extend destination object with N more objects\nexport function extend(target = {}, ...sources) {\n if (!sources.length) {\n return target;\n }\n\n const source = sources.shift();\n\n if (!is.object(source)) {\n return target;\n }\n\n Object.keys(source).forEach(key => {\n if (is.object(source[key])) {\n if (!Object.keys(target).includes(key)) {\n Object.assign(target, { [key]: {} });\n }\n\n extend(target[key], source[key]);\n } else {\n Object.assign(target, { [key]: source[key] });\n }\n });\n\n return extend(target, ...sources);\n}\n","// ==========================================================================\n// String utils\n// ==========================================================================\n\nimport is from './is';\n\n// Generate a random ID\nexport function generateId(prefix) {\n return `${prefix}-${Math.floor(Math.random() * 10000)}`;\n}\n\n// Format string\nexport function format(input, ...args) {\n if (is.empty(input)) {\n return input;\n }\n\n return input.toString().replace(/{(\\d+)}/g, (match, i) => args[i].toString());\n}\n\n// Get percentage\nexport function getPercentage(current, max) {\n if (current === 0 || max === 0 || Number.isNaN(current) || Number.isNaN(max)) {\n return 0;\n }\n\n return (current / max * 100).toFixed(2);\n}\n\n// Replace all occurances of a string in a string\nexport function replaceAll(input = '', find = '', replace = '') {\n return input.replace(\n new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\\]/\\\\])/g, '\\\\$1'), 'g'),\n replace.toString(),\n );\n}\n\n// Convert to title case\nexport function toTitleCase(input = '') {\n return input.toString().replace(/\\w\\S*/g, text => text.charAt(0).toUpperCase() + text.substr(1).toLowerCase());\n}\n\n// Convert string to pascalCase\nexport function toPascalCase(input = '') {\n let string = input.toString();\n\n // Convert kebab case\n string = replaceAll(string, '-', ' ');\n\n // Convert snake case\n string = replaceAll(string, '_', ' ');\n\n // Convert to title case\n string = toTitleCase(string);\n\n // Convert to pascal case\n return replaceAll(string, ' ', '');\n}\n\n// Convert string to pascalCase\nexport function toCamelCase(input = '') {\n let string = input.toString();\n\n // Convert to pascal case\n string = toPascalCase(string);\n\n // Convert first character to lowercase\n return string.charAt(0).toLowerCase() + string.slice(1);\n}\n\n// Remove HTML from a string\nexport function stripHTML(source) {\n const fragment = document.createDocumentFragment();\n const element = document.createElement('div');\n fragment.appendChild(element);\n element.innerHTML = source;\n return fragment.firstChild.innerText;\n}\n\n// Like outerHTML, but also works for DocumentFragment\nexport function getHTML(element) {\n const wrapper = document.createElement('div');\n wrapper.appendChild(element);\n return wrapper.innerHTML;\n}\n","// ==========================================================================\n// Plyr internationalization\n// ==========================================================================\n\nimport is from './utils/is';\nimport { getDeep } from './utils/objects';\nimport { replaceAll } from './utils/strings';\n\nconst i18n = {\n get(key = '', config = {}) {\n if (is.empty(key) || is.empty(config)) {\n return '';\n }\n\n let string = getDeep(config.i18n, key);\n\n if (is.empty(string)) {\n return '';\n }\n\n const replace = {\n '{seektime}': config.seekTime,\n '{title}': config.title,\n };\n\n Object.entries(replace).forEach(([key, value]) => {\n string = replaceAll(string, key, value);\n });\n\n return string;\n },\n};\n\nexport default i18n;\n","// ==========================================================================\n// Array utils\n// ==========================================================================\n\nimport is from './is';\n\n// Remove duplicates in an array\nexport function dedupe(array) {\n if (!is.array(array)) {\n return array;\n }\n\n return array.filter((item, index) => array.indexOf(item) === index);\n}\n\n// Get the closest value in an array\nexport function closest(array, value) {\n if (!is.array(array) || !array.length) {\n return null;\n }\n\n return array.reduce((prev, curr) => (Math.abs(curr - value) < Math.abs(prev - value) ? curr : prev));\n}\n","// ==========================================================================\n// Plyr storage\n// ==========================================================================\n\nimport is from './utils/is';\nimport { extend } from './utils/objects';\n\nclass Storage {\n constructor(player) {\n this.enabled = player.config.storage.enabled;\n this.key = player.config.storage.key;\n }\n\n // Check for actual support (see if we can use it)\n static get supported() {\n try {\n if (!('localStorage' in window)) {\n return false;\n }\n\n const test = '___test';\n\n // Try to use it (it might be disabled, e.g. user is in private mode)\n // see: https://github.com/sampotts/plyr/issues/131\n window.localStorage.setItem(test, test);\n window.localStorage.removeItem(test);\n\n return true;\n } catch (e) {\n return false;\n }\n }\n\n get(key) {\n if (!Storage.supported || !this.enabled) {\n return null;\n }\n\n const store = window.localStorage.getItem(this.key);\n\n if (is.empty(store)) {\n return null;\n }\n\n const json = JSON.parse(store);\n\n return is.string(key) && key.length ? json[key] : json;\n }\n\n set(object) {\n // Bail if we don't have localStorage support or it's disabled\n if (!Storage.supported || !this.enabled) {\n return;\n }\n\n // Can only store objectst\n if (!is.object(object)) {\n return;\n }\n\n // Get current storage\n let storage = this.get();\n\n // Default to empty object\n if (is.empty(storage)) {\n storage = {};\n }\n\n // Update the working copy of the values\n extend(storage, object);\n\n // Update storage\n window.localStorage.setItem(this.key, JSON.stringify(storage));\n }\n}\n\nexport default Storage;\n","// ==========================================================================\n// Sprite loader\n// ==========================================================================\n\nimport Storage from './../storage';\nimport is from './is';\n\n// Load an external SVG sprite\nexport default function loadSprite(url, id) {\n if (!is.string(url)) {\n return;\n }\n\n const prefix = 'cache';\n const hasId = is.string(id);\n let isCached = false;\n\n const exists = () => document.getElementById(id) !== null;\n\n const update = (container, data) => {\n container.innerHTML = data;\n\n // Check again incase of race condition\n if (hasId && exists()) {\n return;\n }\n\n // Inject the SVG to the body\n document.body.insertAdjacentElement('afterbegin', container);\n };\n\n // Only load once if ID set\n if (!hasId || !exists()) {\n const useStorage = Storage.supported;\n\n // Create container\n const container = document.createElement('div');\n container.setAttribute('hidden', '');\n\n if (hasId) {\n container.setAttribute('id', id);\n }\n\n // Check in cache\n if (useStorage) {\n const cached = window.localStorage.getItem(`${prefix}-${id}`);\n isCached = cached !== null;\n\n if (isCached) {\n const data = JSON.parse(cached);\n update(container, data.content);\n }\n }\n\n // Get the sprite\n fetch(url)\n .then(result => {\n if (is.empty(result)) {\n return;\n }\n\n if (useStorage) {\n window.localStorage.setItem(\n `${prefix}-${id}`,\n JSON.stringify({\n content: result,\n }),\n );\n }\n\n update(container, result);\n })\n .catch(() => {});\n }\n}\n","// ==========================================================================\n// Time utils\n// ==========================================================================\n\nimport is from './is';\n\n// Time helpers\nexport const getHours = value => parseInt((value / 60 / 60) % 60, 10);\nexport const getMinutes = value => parseInt((value / 60) % 60, 10);\nexport const getSeconds = value => parseInt(value % 60, 10);\n\n// Format time to UI friendly string\nexport function formatTime(time = 0, displayHours = false, inverted = false) {\n // Bail if the value isn't a number\n if (!is.number(time)) {\n return formatTime(null, displayHours, inverted);\n }\n\n // Format time component to add leading zero\n const format = value => `0${value}`.slice(-2);\n\n // Breakdown to hours, mins, secs\n let hours = getHours(time);\n const mins = getMinutes(time);\n const secs = getSeconds(time);\n\n // Do we need to display hours?\n if (displayHours || hours > 0) {\n hours = `${hours}:`;\n } else {\n hours = '';\n }\n\n // Render\n return `${inverted && time > 0 ? '-' : ''}${hours}${format(mins)}:${format(secs)}`;\n}\n","// ==========================================================================\n// Plyr controls\n// ==========================================================================\n\nimport captions from './captions';\nimport html5 from './html5';\nimport i18n from './i18n';\nimport support from './support';\nimport { repaint, transitionEndEvent } from './utils/animation';\nimport { dedupe } from './utils/arrays';\nimport browser from './utils/browser';\nimport {\n createElement,\n emptyElement,\n getAttributesFromSelector,\n getElement,\n getElements,\n hasClass,\n removeElement,\n setAttributes,\n toggleClass,\n toggleHidden,\n matches,\n} from './utils/elements';\nimport { off, on } from './utils/events';\nimport is from './utils/is';\nimport loadSprite from './utils/loadSprite';\nimport { extend } from './utils/objects';\nimport { getPercentage, replaceAll, toCamelCase, toTitleCase } from './utils/strings';\nimport { formatTime, getHours } from './utils/time';\n\n// TODO: Don't export a massive object - break down and create class\nconst controls = {\n // Get icon URL\n getIconUrl() {\n const url = new URL(this.config.iconUrl, window.location);\n const cors = url.host !== window.location.host || (browser.isIE && !window.svg4everybody);\n\n return {\n url: this.config.iconUrl,\n cors,\n };\n },\n\n // Find the UI controls\n findElements() {\n try {\n this.elements.controls = getElement.call(this, this.config.selectors.controls.wrapper);\n\n // Buttons\n this.elements.buttons = {\n play: getElements.call(this, this.config.selectors.buttons.play),\n pause: getElement.call(this, this.config.selectors.buttons.pause),\n restart: getElement.call(this, this.config.selectors.buttons.restart),\n rewind: getElement.call(this, this.config.selectors.buttons.rewind),\n fastForward: getElement.call(this, this.config.selectors.buttons.fastForward),\n mute: getElement.call(this, this.config.selectors.buttons.mute),\n pip: getElement.call(this, this.config.selectors.buttons.pip),\n airplay: getElement.call(this, this.config.selectors.buttons.airplay),\n settings: getElement.call(this, this.config.selectors.buttons.settings),\n captions: getElement.call(this, this.config.selectors.buttons.captions),\n fullscreen: getElement.call(this, this.config.selectors.buttons.fullscreen),\n };\n\n // Progress\n this.elements.progress = getElement.call(this, this.config.selectors.progress);\n\n // Inputs\n this.elements.inputs = {\n seek: getElement.call(this, this.config.selectors.inputs.seek),\n volume: getElement.call(this, this.config.selectors.inputs.volume),\n };\n\n // Display\n this.elements.display = {\n buffer: getElement.call(this, this.config.selectors.display.buffer),\n currentTime: getElement.call(this, this.config.selectors.display.currentTime),\n duration: getElement.call(this, this.config.selectors.display.duration),\n };\n\n // Seek tooltip\n if (is.element(this.elements.progress)) {\n this.elements.display.seekTooltip = this.elements.progress.querySelector(\n `.${this.config.classNames.tooltip}`,\n );\n }\n\n return true;\n } catch (error) {\n // Log it\n this.debug.warn('It looks like there is a problem with your custom controls HTML', error);\n\n // Restore native video controls\n this.toggleNativeControls(true);\n\n return false;\n }\n },\n\n // Create <svg> icon\n createIcon(type, attributes) {\n const namespace = 'http://www.w3.org/2000/svg';\n const iconUrl = controls.getIconUrl.call(this);\n const iconPath = `${!iconUrl.cors ? iconUrl.url : ''}#${this.config.iconPrefix}`;\n\n // Create <svg>\n const icon = document.createElementNS(namespace, 'svg');\n setAttributes(\n icon,\n extend(attributes, {\n role: 'presentation',\n focusable: 'false',\n }),\n );\n\n // Create the <use> to reference sprite\n const use = document.createElementNS(namespace, 'use');\n const path = `${iconPath}-${type}`;\n\n // Set `href` attributes\n // https://github.com/sampotts/plyr/issues/460\n // https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/xlink:href\n if ('href' in use) {\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'href', path);\n } else {\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path);\n }\n\n // Add <use> to <svg>\n icon.appendChild(use);\n\n return icon;\n },\n\n // Create hidden text label\n createLabel(type, attr = {}) {\n // Skip i18n for abbreviations and brand names\n const universals = {\n pip: 'PIP',\n airplay: 'AirPlay',\n };\n const text = universals[type] || i18n.get(type, this.config);\n\n const attributes = Object.assign({}, attr, {\n class: [attr.class, this.config.classNames.hidden].filter(Boolean).join(' '),\n });\n return createElement('span', attributes, text);\n },\n\n // Create a badge\n createBadge(text) {\n if (is.empty(text)) {\n return null;\n }\n\n const badge = createElement('span', {\n class: this.config.classNames.menu.value,\n });\n\n badge.appendChild(\n createElement(\n 'span',\n {\n class: this.config.classNames.menu.badge,\n },\n text,\n ),\n );\n\n return badge;\n },\n\n // Create a <button>\n createButton(buttonType, attr) {\n const button = createElement('button');\n const attributes = Object.assign({}, attr);\n let type = toCamelCase(buttonType);\n\n let toggle = false;\n let label;\n let icon;\n let labelPressed;\n let iconPressed;\n\n if (!('type' in attributes)) {\n attributes.type = 'button';\n }\n\n if ('class' in attributes) {\n if (attributes.class.includes(this.config.classNames.control)) {\n attributes.class += ` ${this.config.classNames.control}`;\n }\n } else {\n attributes.class = this.config.classNames.control;\n }\n\n // Large play button\n switch (buttonType) {\n case 'play':\n toggle = true;\n label = 'play';\n labelPressed = 'pause';\n icon = 'play';\n iconPressed = 'pause';\n break;\n\n case 'mute':\n toggle = true;\n label = 'mute';\n labelPressed = 'unmute';\n icon = 'volume';\n iconPressed = 'muted';\n break;\n\n case 'captions':\n toggle = true;\n label = 'enableCaptions';\n labelPressed = 'disableCaptions';\n icon = 'captions-off';\n iconPressed = 'captions-on';\n break;\n\n case 'fullscreen':\n toggle = true;\n label = 'enterFullscreen';\n labelPressed = 'exitFullscreen';\n icon = 'enter-fullscreen';\n iconPressed = 'exit-fullscreen';\n break;\n\n case 'play-large':\n attributes.class += ` ${this.config.classNames.control}--overlaid`;\n type = 'play';\n label = 'play';\n icon = 'play';\n break;\n\n default:\n label = type;\n icon = buttonType;\n }\n\n // Setup toggle icon and labels\n if (toggle) {\n // Icon\n button.appendChild(controls.createIcon.call(this, iconPressed, { class: 'icon--pressed' }));\n button.appendChild(controls.createIcon.call(this, icon, { class: 'icon--not-pressed' }));\n\n // Label/Tooltip\n button.appendChild(controls.createLabel.call(this, labelPressed, { class: 'label--pressed' }));\n button.appendChild(controls.createLabel.call(this, label, { class: 'label--not-pressed' }));\n } else {\n button.appendChild(controls.createIcon.call(this, icon));\n button.appendChild(controls.createLabel.call(this, label));\n }\n\n // Merge attributes\n extend(attributes, getAttributesFromSelector(this.config.selectors.buttons[type], attributes));\n\n setAttributes(button, attributes);\n\n // We have multiple play buttons\n if (type === 'play') {\n if (!is.array(this.elements.buttons[type])) {\n this.elements.buttons[type] = [];\n }\n\n this.elements.buttons[type].push(button);\n } else {\n this.elements.buttons[type] = button;\n }\n\n // Toggle classname when pressed property is set\n const className = this.config.classNames.controlPressed;\n Object.defineProperty(button, 'pressed', {\n enumerable: true,\n get() {\n return hasClass(button, className);\n },\n set(pressed = false) {\n toggleClass(button, className, pressed);\n },\n });\n\n return button;\n },\n\n // Create an <input type='range'>\n createRange(type, attributes) {\n // Seek input\n const input = createElement(\n 'input',\n extend(\n getAttributesFromSelector(this.config.selectors.inputs[type]),\n {\n type: 'range',\n min: 0,\n max: 100,\n step: 0.01,\n value: 0,\n autocomplete: 'off',\n // A11y fixes for https://github.com/sampotts/plyr/issues/905\n role: 'slider',\n 'aria-label': i18n.get(type, this.config),\n 'aria-valuemin': 0,\n 'aria-valuemax': 100,\n 'aria-valuenow': 0,\n },\n attributes,\n ),\n );\n\n this.elements.inputs[type] = input;\n\n // Set the fill for webkit now\n controls.updateRangeFill.call(this, input);\n\n return input;\n },\n\n // Create a <progress>\n createProgress(type, attributes) {\n const progress = createElement(\n 'progress',\n extend(\n getAttributesFromSelector(this.config.selectors.display[type]),\n {\n min: 0,\n max: 100,\n value: 0,\n role: 'presentation',\n 'aria-hidden': true,\n },\n attributes,\n ),\n );\n\n // Create the label inside\n if (type !== 'volume') {\n progress.appendChild(createElement('span', null, '0'));\n\n const suffixKey = {\n played: 'played',\n buffer: 'buffered',\n }[type];\n const suffix = suffixKey ? i18n.get(suffixKey, this.config) : '';\n\n progress.innerText = `% ${suffix.toLowerCase()}`;\n }\n\n this.elements.display[type] = progress;\n\n return progress;\n },\n\n // Create time display\n createTime(type) {\n const attributes = getAttributesFromSelector(this.config.selectors.display[type]);\n\n const container = createElement(\n 'div',\n extend(attributes, {\n class: `plyr__time ${attributes.class}`,\n 'aria-label': i18n.get(type, this.config),\n }),\n '00:00',\n );\n\n // Reference for updates\n this.elements.display[type] = container;\n\n return container;\n },\n\n // Create a settings menu item\n createMenuItem({ value, list, type, title, badge = null, checked = false }) {\n const item = createElement('li');\n\n const label = createElement('label', {\n class: this.config.classNames.control,\n });\n\n const radio = createElement(\n 'input',\n extend(getAttributesFromSelector(this.config.selectors.inputs[type]), {\n type: 'radio',\n name: `plyr-${type}`,\n value,\n checked,\n class: 'plyr__sr-only',\n }),\n );\n\n const faux = createElement('span', { hidden: '' });\n\n label.appendChild(radio);\n label.appendChild(faux);\n label.insertAdjacentHTML('beforeend', title);\n\n if (is.element(badge)) {\n label.appendChild(badge);\n }\n\n item.appendChild(label);\n list.appendChild(item);\n },\n\n // Format a time for display\n formatTime(time = 0, inverted = false) {\n // Bail if the value isn't a number\n if (!is.number(time)) {\n return time;\n }\n\n // Always display hours if duration is over an hour\n const forceHours = getHours(this.duration) > 0;\n\n return formatTime(time, forceHours, inverted);\n },\n\n // Update the displayed time\n updateTimeDisplay(target = null, time = 0, inverted = false) {\n // Bail if there's no element to display or the value isn't a number\n if (!is.element(target) || !is.number(time)) {\n return;\n }\n\n // eslint-disable-next-line no-param-reassign\n target.innerText = controls.formatTime(time, inverted);\n },\n\n // Update volume UI and storage\n updateVolume() {\n if (!this.supported.ui) {\n return;\n }\n\n // Update range\n if (is.element(this.elements.inputs.volume)) {\n controls.setRange.call(this, this.elements.inputs.volume, this.muted ? 0 : this.volume);\n }\n\n // Update mute state\n if (is.element(this.elements.buttons.mute)) {\n this.elements.buttons.mute.pressed = this.muted || this.volume === 0;\n }\n },\n\n // Update seek value and lower fill\n setRange(target, value = 0) {\n if (!is.element(target)) {\n return;\n }\n\n // eslint-disable-next-line\n target.value = value;\n\n // Webkit range fill\n controls.updateRangeFill.call(this, target);\n },\n\n // Update <progress> elements\n updateProgress(event) {\n if (!this.supported.ui || !is.event(event)) {\n return;\n }\n\n let value = 0;\n\n const setProgress = (target, input) => {\n const value = is.number(input) ? input : 0;\n const progress = is.element(target) ? target : this.elements.display.buffer;\n\n // Update value and label\n if (is.element(progress)) {\n progress.value = value;\n\n // Update text label inside\n const label = progress.getElementsByTagName('span')[0];\n if (is.element(label)) {\n label.childNodes[0].nodeValue = value;\n }\n }\n };\n\n if (event) {\n switch (event.type) {\n // Video playing\n case 'timeupdate':\n case 'seeking':\n case 'seeked':\n value = getPercentage(this.currentTime, this.duration);\n\n // Set seek range value only if it's a 'natural' time event\n if (event.type === 'timeupdate') {\n controls.setRange.call(this, this.elements.inputs.seek, value);\n }\n\n break;\n\n // Check buffer status\n case 'playing':\n case 'progress':\n setProgress(this.elements.display.buffer, this.buffered * 100);\n\n break;\n\n default:\n break;\n }\n }\n },\n\n // Webkit polyfill for lower fill range\n updateRangeFill(target) {\n // Get range from event if event passed\n const range = is.event(target) ? target.target : target;\n\n // Needs to be a valid <input type='range'>\n if (!is.element(range) || range.getAttribute('type') !== 'range') {\n return;\n }\n\n // Set aria values for https://github.com/sampotts/plyr/issues/905\n if (matches(range, this.config.selectors.inputs.seek)) {\n range.setAttribute('aria-valuenow', this.currentTime);\n const currentTime = controls.formatTime(this.currentTime);\n const duration = controls.formatTime(this.duration);\n const format = i18n.get('seekLabel', this.config);\n range.setAttribute(\n 'aria-valuetext',\n format.replace('{currentTime}', currentTime).replace('{duration}', duration),\n );\n } else if (matches(range, this.config.selectors.inputs.volume)) {\n const percent = range.value * 100;\n range.setAttribute('aria-valuenow', percent);\n range.setAttribute('aria-valuetext', `${percent}%`);\n } else {\n range.setAttribute('aria-valuenow', range.value);\n }\n\n // WebKit only\n if (!browser.isWebkit) {\n return;\n }\n\n // Set CSS custom property\n range.style.setProperty('--value', `${range.value / range.max * 100}%`);\n },\n\n // Update hover tooltip for seeking\n updateSeekTooltip(event) {\n // Bail if setting not true\n if (\n !this.config.tooltips.seek ||\n !is.element(this.elements.inputs.seek) ||\n !is.element(this.elements.display.seekTooltip) ||\n this.duration === 0\n ) {\n return;\n }\n\n // Calculate percentage\n let percent = 0;\n const clientRect = this.elements.progress.getBoundingClientRect();\n const visible = `${this.config.classNames.tooltip}--visible`;\n\n const toggle = toggle => {\n toggleClass(this.elements.display.seekTooltip, visible, toggle);\n };\n\n // Hide on touch\n if (this.touch) {\n toggle(false);\n return;\n }\n\n // Determine percentage, if already visible\n if (is.event(event)) {\n percent = 100 / clientRect.width * (event.pageX - clientRect.left);\n } else if (hasClass(this.elements.display.seekTooltip, visible)) {\n percent = parseFloat(this.elements.display.seekTooltip.style.left, 10);\n } else {\n return;\n }\n\n // Set bounds\n if (percent < 0) {\n percent = 0;\n } else if (percent > 100) {\n percent = 100;\n }\n\n // Display the time a click would seek to\n controls.updateTimeDisplay.call(this, this.elements.display.seekTooltip, this.duration / 100 * percent);\n\n // Set position\n this.elements.display.seekTooltip.style.left = `${percent}%`;\n\n // Show/hide the tooltip\n // If the event is a moues in/out and percentage is inside bounds\n if (is.event(event) && ['mouseenter', 'mouseleave'].includes(event.type)) {\n toggle(event.type === 'mouseenter');\n }\n },\n\n // Handle time change event\n timeUpdate(event) {\n // Only invert if only one time element is displayed and used for both duration and currentTime\n const invert = !is.element(this.elements.display.duration) && this.config.invertTime;\n\n // Duration\n controls.updateTimeDisplay.call(\n this,\n this.elements.display.currentTime,\n invert ? this.duration - this.currentTime : this.currentTime,\n invert,\n );\n\n // Ignore updates while seeking\n if (event && event.type === 'timeupdate' && this.media.seeking) {\n return;\n }\n\n // Playing progress\n controls.updateProgress.call(this, event);\n },\n\n // Show the duration on metadataloaded or durationchange events\n durationUpdate() {\n // Bail if no UI or durationchange event triggered after playing/seek when invertTime is false\n if (!this.supported.ui || (!this.config.invertTime && this.currentTime)) {\n return;\n }\n\n // Update ARIA values\n if (is.element(this.elements.inputs.seek)) {\n this.elements.inputs.seek.setAttribute('aria-valuemax', this.duration);\n }\n\n // If there's a spot to display duration\n const hasDuration = is.element(this.elements.display.duration);\n\n // If there's only one time display, display duration there\n if (!hasDuration && this.config.displayDuration && this.paused) {\n controls.updateTimeDisplay.call(this, this.elements.display.currentTime, this.duration);\n }\n\n // If there's a duration element, update content\n if (hasDuration) {\n controls.updateTimeDisplay.call(this, this.elements.display.duration, this.duration);\n }\n\n // Update the tooltip (if visible)\n controls.updateSeekTooltip.call(this);\n },\n\n // Hide/show a tab\n toggleTab(setting, toggle) {\n toggleHidden(this.elements.settings.tabs[setting], !toggle);\n },\n\n // Set the quality menu\n setQualityMenu(options) {\n // Menu required\n if (!is.element(this.elements.settings.panes.quality)) {\n return;\n }\n\n const type = 'quality';\n const list = this.elements.settings.panes.quality.querySelector('ul');\n\n // Set options if passed and filter based on uniqueness and config\n if (is.array(options)) {\n this.options.quality = dedupe(options).filter(quality => this.config.quality.options.includes(quality));\n }\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.options.quality) && this.options.quality.length > 1;\n controls.toggleTab.call(this, type, toggle);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If we're hiding, nothing more to do\n if (!toggle) {\n return;\n }\n\n // Empty the menu\n emptyElement(list);\n\n // Get the badge HTML for HD, 4K etc\n const getBadge = quality => {\n const label = i18n.get(`qualityBadge.${quality}`, this.config);\n\n if (!label.length) {\n return null;\n }\n\n return controls.createBadge.call(this, label);\n };\n\n // Sort options by the config and then render options\n this.options.quality\n .sort((a, b) => {\n const sorting = this.config.quality.options;\n return sorting.indexOf(a) > sorting.indexOf(b) ? 1 : -1;\n })\n .forEach(quality => {\n controls.createMenuItem.call(this, {\n value: quality,\n list,\n type,\n title: controls.getLabel.call(this, 'quality', quality),\n badge: getBadge(quality),\n });\n });\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Translate a value into a nice label\n getLabel(setting, value) {\n switch (setting) {\n case 'speed':\n return value === 1 ? i18n.get('normal', this.config) : `${value}&times;`;\n\n case 'quality':\n if (is.number(value)) {\n const label = i18n.get(`qualityLabel.${value}`, this.config);\n\n if (!label.length) {\n return `${value}p`;\n }\n\n return label;\n }\n\n return toTitleCase(value);\n\n case 'captions':\n return captions.getLabel.call(this);\n\n default:\n return null;\n }\n },\n\n // Update the selected setting\n updateSetting(setting, container, input) {\n const pane = this.elements.settings.panes[setting];\n let value = null;\n let list = container;\n\n if (setting === 'captions') {\n value = this.currentTrack;\n } else {\n value = !is.empty(input) ? input : this[setting];\n\n // Get default\n if (is.empty(value)) {\n value = this.config[setting].default;\n }\n\n // Unsupported value\n if (!is.empty(this.options[setting]) && !this.options[setting].includes(value)) {\n this.debug.warn(`Unsupported value of '${value}' for ${setting}`);\n return;\n }\n\n // Disabled value\n if (!this.config[setting].options.includes(value)) {\n this.debug.warn(`Disabled value of '${value}' for ${setting}`);\n return;\n }\n }\n\n // Get the list if we need to\n if (!is.element(list)) {\n list = pane && pane.querySelector('ul');\n }\n\n // If there's no list it means it's not been rendered...\n if (!is.element(list)) {\n return;\n }\n\n // Update the label\n const label = this.elements.settings.tabs[setting].querySelector(`.${this.config.classNames.menu.value}`);\n label.innerHTML = controls.getLabel.call(this, setting, value);\n\n // Find the radio option and check it\n const target = list && list.querySelector(`input[value=\"${value}\"]`);\n\n if (is.element(target)) {\n target.checked = true;\n }\n },\n\n // Set the looping options\n /* setLoopMenu() {\n // Menu required\n if (!is.element(this.elements.settings.panes.loop)) {\n return;\n }\n\n const options = ['start', 'end', 'all', 'reset'];\n const list = this.elements.settings.panes.loop.querySelector('ul');\n\n // Show the pane and tab\n toggleHidden(this.elements.settings.tabs.loop, false);\n toggleHidden(this.elements.settings.panes.loop, false);\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.loop.options);\n controls.toggleTab.call(this, 'loop', toggle);\n\n // Empty the menu\n emptyElement(list);\n\n options.forEach(option => {\n const item = createElement('li');\n\n const button = createElement(\n 'button',\n extend(getAttributesFromSelector(this.config.selectors.buttons.loop), {\n type: 'button',\n class: this.config.classNames.control,\n 'data-plyr-loop-action': option,\n }),\n i18n.get(option, this.config)\n );\n\n if (['start', 'end'].includes(option)) {\n const badge = controls.createBadge.call(this, '00:00');\n button.appendChild(badge);\n }\n\n item.appendChild(button);\n list.appendChild(item);\n });\n }, */\n\n // Get current selected caption language\n // TODO: rework this to user the getter in the API?\n\n // Set a list of available captions languages\n setCaptionsMenu() {\n // TODO: Captions or language? Currently it's mixed\n const type = 'captions';\n const list = this.elements.settings.panes.captions.querySelector('ul');\n const tracks = captions.getTracks.call(this);\n\n // Toggle the pane and tab\n controls.toggleTab.call(this, type, tracks.length);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If there's no captions, bail\n if (!tracks.length) {\n return;\n }\n\n // Generate options data\n const options = tracks.map((track, value) => ({\n value,\n checked: this.captions.toggled && this.currentTrack === value,\n title: captions.getLabel.call(this, track),\n badge: track.language && controls.createBadge.call(this, track.language.toUpperCase()),\n list,\n type: 'language',\n }));\n\n // Add the \"Disabled\" option to turn off captions\n options.unshift({\n value: -1,\n checked: !this.captions.toggled,\n title: i18n.get('disabled', this.config),\n list,\n type: 'language',\n });\n\n // Generate options\n options.forEach(controls.createMenuItem.bind(this));\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Set a list of available captions languages\n setSpeedMenu(options) {\n // Do nothing if not selected\n if (!this.config.controls.includes('settings') || !this.config.settings.includes('speed')) {\n return;\n }\n\n // Menu required\n if (!is.element(this.elements.settings.panes.speed)) {\n return;\n }\n\n const type = 'speed';\n\n // Set the speed options\n if (is.array(options)) {\n this.options.speed = options;\n } else if (this.isHTML5 || this.isVimeo) {\n this.options.speed = [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2];\n }\n\n // Set options if passed and filter based on config\n this.options.speed = this.options.speed.filter(speed => this.config.speed.options.includes(speed));\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.options.speed) && this.options.speed.length > 1;\n controls.toggleTab.call(this, type, toggle);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If we're hiding, nothing more to do\n if (!toggle) {\n return;\n }\n\n // Get the list to populate\n const list = this.elements.settings.panes.speed.querySelector('ul');\n\n // Empty the menu\n emptyElement(list);\n\n // Create items\n this.options.speed.forEach(speed => {\n controls.createMenuItem.call(this, {\n value: speed,\n list,\n type,\n title: controls.getLabel.call(this, 'speed', speed),\n });\n });\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Check if we need to hide/show the settings menu\n checkMenu() {\n const { tabs } = this.elements.settings;\n const visible = !is.empty(tabs) && Object.values(tabs).some(tab => !tab.hidden);\n\n toggleHidden(this.elements.settings.menu, !visible);\n },\n\n // Show/hide menu\n toggleMenu(event) {\n const { form } = this.elements.settings;\n const button = this.elements.buttons.settings;\n\n // Menu and button are required\n if (!is.element(form) || !is.element(button)) {\n return;\n }\n\n const show = is.boolean(event) ? event : is.element(form) && form.hasAttribute('hidden');\n\n if (is.event(event)) {\n const isMenuItem = is.element(form) && form.contains(event.target);\n const isButton = event.target === this.elements.buttons.settings;\n\n // If the click was inside the form or if the click\n // wasn't the button or menu item and we're trying to\n // show the menu (a doc click shouldn't show the menu)\n if (isMenuItem || (!isMenuItem && !isButton && show)) {\n return;\n }\n\n // Prevent the toggle being caught by the doc listener\n if (isButton) {\n event.stopPropagation();\n }\n }\n\n // Set form and button attributes\n if (is.element(button)) {\n button.setAttribute('aria-expanded', show);\n }\n\n if (is.element(form)) {\n toggleHidden(form, !show);\n toggleClass(this.elements.container, this.config.classNames.menu.open, show);\n\n if (show) {\n form.removeAttribute('tabindex');\n } else {\n form.setAttribute('tabindex', -1);\n }\n }\n },\n\n // Get the natural size of a tab\n getTabSize(tab) {\n const clone = tab.cloneNode(true);\n clone.style.position = 'absolute';\n clone.style.opacity = 0;\n clone.removeAttribute('hidden');\n\n // Prevent input's being unchecked due to the name being identical\n Array.from(clone.querySelectorAll('input[name]')).forEach(input => {\n const name = input.getAttribute('name');\n input.setAttribute('name', `${name}-clone`);\n });\n\n // Append to parent so we get the \"real\" size\n tab.parentNode.appendChild(clone);\n\n // Get the sizes before we remove\n const width = clone.scrollWidth;\n const height = clone.scrollHeight;\n\n // Remove from the DOM\n removeElement(clone);\n\n return {\n width,\n height,\n };\n },\n\n // Toggle Menu\n showTab(target = '') {\n const { menu } = this.elements.settings;\n const pane = document.getElementById(target);\n\n // Nothing to show, bail\n if (!is.element(pane)) {\n return;\n }\n\n // Are we targeting a tab? If not, bail\n const isTab = pane.getAttribute('role') === 'tabpanel';\n if (!isTab) {\n return;\n }\n\n // Hide all other tabs\n // Get other tabs\n const current = menu.querySelector('[role=\"tabpanel\"]:not([hidden])');\n const container = current.parentNode;\n\n // Set other toggles to be expanded false\n Array.from(menu.querySelectorAll(`[aria-controls=\"${current.getAttribute('id')}\"]`)).forEach(toggle => {\n toggle.setAttribute('aria-expanded', false);\n });\n\n // If we can do fancy animations, we'll animate the height/width\n if (support.transitions && !support.reducedMotion) {\n // Set the current width as a base\n container.style.width = `${current.scrollWidth}px`;\n container.style.height = `${current.scrollHeight}px`;\n\n // Get potential sizes\n const size = controls.getTabSize.call(this, pane);\n\n // Restore auto height/width\n const restore = e => {\n // We're only bothered about height and width on the container\n if (e.target !== container || !['width', 'height'].includes(e.propertyName)) {\n return;\n }\n\n // Revert back to auto\n container.style.width = '';\n container.style.height = '';\n\n // Only listen once\n off.call(this, container, transitionEndEvent, restore);\n };\n\n // Listen for the transition finishing and restore auto height/width\n on.call(this, container, transitionEndEvent, restore);\n\n // Set dimensions to target\n container.style.width = `${size.width}px`;\n container.style.height = `${size.height}px`;\n }\n\n // Set attributes on current tab\n toggleHidden(current, true);\n current.setAttribute('tabindex', -1);\n\n // Set attributes on target\n toggleHidden(pane, false);\n\n const tabs = getElements.call(this, `[aria-controls=\"${target}\"]`);\n Array.from(tabs).forEach(tab => {\n tab.setAttribute('aria-expanded', true);\n });\n pane.removeAttribute('tabindex');\n\n // Focus the first item\n pane.querySelectorAll('button:not(:disabled), input:not(:disabled), [tabindex]')[0].focus();\n },\n\n // Build the default HTML\n // TODO: Set order based on order in the config.controls array?\n create(data) {\n // Do nothing if we want no controls\n if (is.empty(this.config.controls)) {\n return null;\n }\n\n // Create the container\n const container = createElement('div', getAttributesFromSelector(this.config.selectors.controls.wrapper));\n\n // Restart button\n if (this.config.controls.includes('restart')) {\n container.appendChild(controls.createButton.call(this, 'restart'));\n }\n\n // Rewind button\n if (this.config.controls.includes('rewind')) {\n container.appendChild(controls.createButton.call(this, 'rewind'));\n }\n\n // Play/Pause button\n if (this.config.controls.includes('play')) {\n container.appendChild(controls.createButton.call(this, 'play'));\n }\n\n // Fast forward button\n if (this.config.controls.includes('fast-forward')) {\n container.appendChild(controls.createButton.call(this, 'fast-forward'));\n }\n\n // Progress\n if (this.config.controls.includes('progress')) {\n const progress = createElement('div', getAttributesFromSelector(this.config.selectors.progress));\n\n // Seek range slider\n progress.appendChild(\n controls.createRange.call(this, 'seek', {\n id: `plyr-seek-${data.id}`,\n }),\n );\n\n // Buffer progress\n progress.appendChild(controls.createProgress.call(this, 'buffer'));\n\n // TODO: Add loop display indicator\n\n // Seek tooltip\n if (this.config.tooltips.seek) {\n const tooltip = createElement(\n 'span',\n {\n class: this.config.classNames.tooltip,\n },\n '00:00',\n );\n\n progress.appendChild(tooltip);\n this.elements.display.seekTooltip = tooltip;\n }\n\n this.elements.progress = progress;\n container.appendChild(this.elements.progress);\n }\n\n // Media current time display\n if (this.config.controls.includes('current-time')) {\n container.appendChild(controls.createTime.call(this, 'currentTime'));\n }\n\n // Media duration display\n if (this.config.controls.includes('duration')) {\n container.appendChild(controls.createTime.call(this, 'duration'));\n }\n\n // Toggle mute button\n if (this.config.controls.includes('mute')) {\n container.appendChild(controls.createButton.call(this, 'mute'));\n }\n\n // Volume range control\n if (this.config.controls.includes('volume')) {\n const volume = createElement('div', {\n class: 'plyr__volume',\n });\n\n // Set the attributes\n const attributes = {\n max: 1,\n step: 0.05,\n value: this.config.volume,\n };\n\n // Create the volume range slider\n volume.appendChild(\n controls.createRange.call(\n this,\n 'volume',\n extend(attributes, {\n id: `plyr-volume-${data.id}`,\n }),\n ),\n );\n\n this.elements.volume = volume;\n\n container.appendChild(volume);\n }\n\n // Toggle captions button\n if (this.config.controls.includes('captions')) {\n container.appendChild(controls.createButton.call(this, 'captions'));\n }\n\n // Settings button / menu\n if (this.config.controls.includes('settings') && !is.empty(this.config.settings)) {\n const menu = createElement('div', {\n class: 'plyr__menu',\n hidden: '',\n });\n\n menu.appendChild(\n controls.createButton.call(this, 'settings', {\n id: `plyr-settings-toggle-${data.id}`,\n 'aria-haspopup': true,\n 'aria-controls': `plyr-settings-${data.id}`,\n 'aria-expanded': false,\n }),\n );\n\n const form = createElement('form', {\n class: 'plyr__menu__container',\n id: `plyr-settings-${data.id}`,\n hidden: '',\n 'aria-labelled-by': `plyr-settings-toggle-${data.id}`,\n role: 'tablist',\n tabindex: -1,\n });\n\n const inner = createElement('div');\n\n const home = createElement('div', {\n id: `plyr-settings-${data.id}-home`,\n 'aria-labelled-by': `plyr-settings-toggle-${data.id}`,\n role: 'tabpanel',\n });\n\n // Create the tab list\n const tabs = createElement('ul', {\n role: 'tablist',\n });\n\n // Build the tabs\n this.config.settings.forEach(type => {\n const tab = createElement('li', {\n role: 'tab',\n hidden: '',\n });\n\n const button = createElement(\n 'button',\n extend(getAttributesFromSelector(this.config.selectors.buttons.settings), {\n type: 'button',\n class: `${this.config.classNames.control} ${this.config.classNames.control}--forward`,\n id: `plyr-settings-${data.id}-${type}-tab`,\n 'aria-haspopup': true,\n 'aria-controls': `plyr-settings-${data.id}-${type}`,\n 'aria-expanded': false,\n }),\n i18n.get(type, this.config),\n );\n\n const value = createElement('span', {\n class: this.config.classNames.menu.value,\n });\n\n // Speed contains HTML entities\n value.innerHTML = data[type];\n\n button.appendChild(value);\n tab.appendChild(button);\n tabs.appendChild(tab);\n\n this.elements.settings.tabs[type] = tab;\n });\n\n home.appendChild(tabs);\n inner.appendChild(home);\n\n // Build the panes\n this.config.settings.forEach(type => {\n const pane = createElement('div', {\n id: `plyr-settings-${data.id}-${type}`,\n hidden: '',\n 'aria-labelled-by': `plyr-settings-${data.id}-${type}-tab`,\n role: 'tabpanel',\n tabindex: -1,\n });\n\n const back = createElement(\n 'button',\n {\n type: 'button',\n class: `${this.config.classNames.control} ${this.config.classNames.control}--back`,\n 'aria-haspopup': true,\n 'aria-controls': `plyr-settings-${data.id}-home`,\n 'aria-expanded': false,\n },\n i18n.get(type, this.config),\n );\n\n pane.appendChild(back);\n\n const options = createElement('ul');\n\n pane.appendChild(options);\n inner.appendChild(pane);\n\n this.elements.settings.panes[type] = pane;\n });\n\n form.appendChild(inner);\n menu.appendChild(form);\n container.appendChild(menu);\n\n this.elements.settings.form = form;\n this.elements.settings.menu = menu;\n }\n\n // Picture in picture button\n if (this.config.controls.includes('pip') && support.pip) {\n container.appendChild(controls.createButton.call(this, 'pip'));\n }\n\n // Airplay button\n if (this.config.controls.includes('airplay') && support.airplay) {\n container.appendChild(controls.createButton.call(this, 'airplay'));\n }\n\n // Toggle fullscreen button\n if (this.config.controls.includes('fullscreen')) {\n container.appendChild(controls.createButton.call(this, 'fullscreen'));\n }\n\n // Larger overlaid play button\n if (this.config.controls.includes('play-large')) {\n this.elements.container.appendChild(controls.createButton.call(this, 'play-large'));\n }\n\n this.elements.controls = container;\n\n if (this.isHTML5) {\n controls.setQualityMenu.call(this, html5.getQualityOptions.call(this));\n }\n\n controls.setSpeedMenu.call(this);\n\n return container;\n },\n\n // Insert controls\n inject() {\n // Sprite\n if (this.config.loadSprite) {\n const icon = controls.getIconUrl.call(this);\n\n // Only load external sprite using AJAX\n if (icon.cors) {\n loadSprite(icon.url, 'sprite-plyr');\n }\n }\n\n // Create a unique ID\n this.id = Math.floor(Math.random() * 10000);\n\n // Null by default\n let container = null;\n this.elements.controls = null;\n\n // Set template properties\n const props = {\n id: this.id,\n seektime: this.config.seekTime,\n title: this.config.title,\n };\n let update = true;\n\n if (is.string(this.config.controls) || is.element(this.config.controls)) {\n // String or HTMLElement passed as the option\n container = this.config.controls;\n } else if (is.function(this.config.controls)) {\n // A custom function to build controls\n // The function can return a HTMLElement or String\n container = this.config.controls.call(this, props);\n } else {\n // Create controls\n container = controls.create.call(this, {\n id: this.id,\n seektime: this.config.seekTime,\n speed: this.speed,\n quality: this.quality,\n captions: captions.getLabel.call(this),\n // TODO: Looping\n // loop: 'None',\n });\n update = false;\n }\n\n // Replace props with their value\n const replace = input => {\n let result = input;\n\n Object.entries(props).forEach(([key, value]) => {\n result = replaceAll(result, `{${key}}`, value);\n });\n\n return result;\n };\n\n // Update markup\n if (update) {\n if (is.string(this.config.controls)) {\n container = replace(container);\n } else if (is.element(container)) {\n container.innerHTML = replace(container.innerHTML);\n }\n }\n\n // Controls container\n let target;\n\n // Inject to custom location\n if (is.string(this.config.selectors.controls.container)) {\n target = document.querySelector(this.config.selectors.controls.container);\n }\n\n // Inject into the container by default\n if (!is.element(target)) {\n target = this.elements.container;\n }\n\n // Inject controls HTML\n if (is.element(container)) {\n target.appendChild(container);\n } else if (container) {\n target.insertAdjacentHTML('beforeend', container);\n }\n\n // Find the elements if need be\n if (!is.element(this.elements.controls)) {\n controls.findElements.call(this);\n }\n\n // Edge sometimes doesn't finish the paint so force a redraw\n if (window.navigator.userAgent.includes('Edge')) {\n repaint(target);\n }\n\n // Setup tooltips\n if (this.config.tooltips.controls) {\n const { classNames, selectors } = this.config;\n const selector = `${selectors.controls.wrapper} ${selectors.labels} .${classNames.hidden}`;\n const labels = getElements.call(this, selector);\n\n Array.from(labels).forEach(label => {\n toggleClass(label, this.config.classNames.hidden, false);\n toggleClass(label, this.config.classNames.tooltip, true);\n });\n }\n },\n};\n\nexport default controls;\n","// ==========================================================================\n// Fetch wrapper\n// Using XHR to avoid issues with older browsers\n// ==========================================================================\n\nexport default function fetch(url, responseType = 'text') {\n return new Promise((resolve, reject) => {\n try {\n const request = new XMLHttpRequest();\n\n // Check for CORS support\n if (!('withCredentials' in request)) {\n return;\n }\n\n request.addEventListener('load', () => {\n if (responseType === 'text') {\n try {\n resolve(JSON.parse(request.responseText));\n } catch (e) {\n resolve(request.responseText);\n }\n } else {\n resolve(request.response);\n }\n });\n\n request.addEventListener('error', () => {\n throw new Error(request.statusText);\n });\n\n request.open('GET', url, true);\n\n // Set the required response type\n request.responseType = responseType;\n\n request.send();\n } catch (e) {\n reject(e);\n }\n });\n}\n","// ==========================================================================\n// URL utils\n// ==========================================================================\n\nimport is from './is';\n\n/**\n * Parse a string to a URL object\n * @param {string} input - the URL to be parsed\n * @param {boolean} safe - failsafe parsing\n */\nexport function parseUrl(input, safe = true) {\n let url = input;\n\n if (safe) {\n const parser = document.createElement('a');\n parser.href = url;\n url = parser.href;\n }\n\n try {\n return new URL(url);\n } catch (e) {\n return null;\n }\n}\n\n// Convert object to URLSearchParams\nexport function buildUrlParams(input) {\n const params = new URLSearchParams();\n\n if (is.object(input)) {\n Object.entries(input).forEach(([key, value]) => {\n params.set(key, value);\n });\n }\n\n return params;\n}\n","// ==========================================================================\n// Plyr Captions\n// TODO: Create as class\n// ==========================================================================\n\nimport controls from './controls';\nimport i18n from './i18n';\nimport support from './support';\nimport { dedupe } from './utils/arrays';\nimport browser from './utils/browser';\nimport {\n createElement,\n emptyElement,\n getAttributesFromSelector,\n insertAfter,\n removeElement,\n toggleClass,\n} from './utils/elements';\nimport { on, triggerEvent } from './utils/events';\nimport fetch from './utils/fetch';\nimport is from './utils/is';\nimport { getHTML } from './utils/strings';\nimport { parseUrl } from './utils/urls';\n\nconst captions = {\n // Setup captions\n setup() {\n // Requires UI support\n if (!this.supported.ui) {\n return;\n }\n\n // Only Vimeo and HTML5 video supported at this point\n if (!this.isVideo || this.isYouTube || (this.isHTML5 && !support.textTracks)) {\n // Clear menu and hide\n if (\n is.array(this.config.controls) &&\n this.config.controls.includes('settings') &&\n this.config.settings.includes('captions')\n ) {\n controls.setCaptionsMenu.call(this);\n }\n\n return;\n }\n\n // Inject the container\n if (!is.element(this.elements.captions)) {\n this.elements.captions = createElement('div', getAttributesFromSelector(this.config.selectors.captions));\n\n insertAfter(this.elements.captions, this.elements.wrapper);\n }\n\n // Fix IE captions if CORS is used\n // Fetch captions and inject as blobs instead (data URIs not supported!)\n if (browser.isIE && window.URL) {\n const elements = this.media.querySelectorAll('track');\n\n Array.from(elements).forEach(track => {\n const src = track.getAttribute('src');\n const url = parseUrl(src);\n\n if (\n url !== null &&\n url.hostname !== window.location.href.hostname &&\n ['http:', 'https:'].includes(url.protocol)\n ) {\n fetch(src, 'blob')\n .then(blob => {\n track.setAttribute('src', window.URL.createObjectURL(blob));\n })\n .catch(() => {\n removeElement(track);\n });\n }\n });\n }\n\n // Get and set initial data\n // The \"preferred\" options are not realized unless / until the wanted language has a match\n // * languages: Array of user's browser languages.\n // * language: The language preferred by user settings or config\n // * active: The state preferred by user settings or config\n // * toggled: The real captions state\n\n const languages = dedupe(\n Array.from(navigator.languages || navigator.userLanguage).map(language => language.split('-')[0]),\n );\n\n let language = (this.storage.get('language') || this.config.captions.language || 'auto').toLowerCase();\n\n // Use first browser language when language is 'auto'\n if (language === 'auto') {\n [language] = languages;\n }\n\n let active = this.storage.get('captions');\n if (!is.boolean(active)) {\n ({ active } = this.config.captions);\n }\n\n Object.assign(this.captions, {\n toggled: false,\n active,\n language,\n languages,\n });\n\n // Watch changes to textTracks and update captions menu\n if (this.isHTML5) {\n const trackEvents = this.config.captions.update ? 'addtrack removetrack' : 'removetrack';\n on.call(this, this.media.textTracks, trackEvents, captions.update.bind(this));\n }\n\n // Update available languages in list next tick (the event must not be triggered before the listeners)\n setTimeout(captions.update.bind(this), 0);\n },\n\n // Update available language options in settings based on tracks\n update() {\n const tracks = captions.getTracks.call(this, true);\n // Get the wanted language\n const { active, language, meta, currentTrackNode } = this.captions;\n const languageExists = Boolean(tracks.find(track => track.language === language));\n\n // Handle tracks (add event listener and \"pseudo\"-default)\n if (this.isHTML5 && this.isVideo) {\n tracks.filter(track => !meta.get(track)).forEach(track => {\n this.debug.log('Track added', track);\n // Attempt to store if the original dom element was \"default\"\n meta.set(track, {\n default: track.mode === 'showing',\n });\n\n // Turn off native caption rendering to avoid double captions\n track.mode = 'hidden';\n\n // Add event listener for cue changes\n on.call(this, track, 'cuechange', () => captions.updateCues.call(this));\n });\n }\n\n // Update language first time it matches, or if the previous matching track was removed\n if ((languageExists && this.language !== language) || !tracks.includes(currentTrackNode)) {\n captions.setLanguage.call(this, language);\n captions.toggle.call(this, active && languageExists);\n }\n\n // Enable or disable captions based on track length\n toggleClass(this.elements.container, this.config.classNames.captions.enabled, !is.empty(tracks));\n\n // Update available languages in list\n if ((this.config.controls || []).includes('settings') && this.config.settings.includes('captions')) {\n controls.setCaptionsMenu.call(this);\n }\n },\n\n // Toggle captions display\n // Used internally for the toggleCaptions method, with the passive option forced to false\n toggle(input, passive = true) {\n // If there's no full support\n if (!this.supported.ui) {\n return;\n }\n\n const { toggled } = this.captions; // Current state\n const activeClass = this.config.classNames.captions.active;\n\n // Get the next state\n // If the method is called without parameter, toggle based on current value\n const active = is.nullOrUndefined(input) ? !toggled : input;\n\n // Update state and trigger event\n if (active !== toggled) {\n // When passive, don't override user preferences\n if (!passive) {\n this.captions.active = active;\n this.storage.set({ captions: active });\n }\n\n // Force language if the call isn't passive and there is no matching language to toggle to\n if (!this.language && active && !passive) {\n const tracks = captions.getTracks.call(this);\n const track = captions.findTrack.call(this, [this.captions.language, ...this.captions.languages], true);\n\n // Override user preferences to avoid switching languages if a matching track is added\n this.captions.language = track.language;\n\n // Set caption, but don't store in localStorage as user preference\n captions.set.call(this, tracks.indexOf(track));\n return;\n }\n\n // Toggle state\n this.elements.buttons.captions.pressed = active;\n\n // Add class hook\n toggleClass(this.elements.container, activeClass, active);\n\n this.captions.toggled = active;\n\n // Update settings menu\n controls.updateSetting.call(this, 'captions');\n\n // Trigger event (not used internally)\n triggerEvent.call(this, this.media, active ? 'captionsenabled' : 'captionsdisabled');\n }\n },\n\n // Set captions by track index\n // Used internally for the currentTrack setter with the passive option forced to false\n set(index, passive = true) {\n const tracks = captions.getTracks.call(this);\n\n // Disable captions if setting to -1\n if (index === -1) {\n captions.toggle.call(this, false, passive);\n return;\n }\n\n if (!is.number(index)) {\n this.debug.warn('Invalid caption argument', index);\n return;\n }\n\n if (!(index in tracks)) {\n this.debug.warn('Track not found', index);\n return;\n }\n\n if (this.captions.currentTrack !== index) {\n this.captions.currentTrack = index;\n const track = tracks[index];\n const { language } = track || {};\n\n // Store reference to node for invalidation on remove\n this.captions.currentTrackNode = track;\n\n // Update settings menu\n controls.updateSetting.call(this, 'captions');\n\n // When passive, don't override user preferences\n if (!passive) {\n this.captions.language = language;\n this.storage.set({ language });\n }\n\n // Handle Vimeo captions\n if (this.isVimeo) {\n this.embed.enableTextTrack(language);\n }\n\n // Trigger event\n triggerEvent.call(this, this.media, 'languagechange');\n }\n\n // Show captions\n captions.toggle.call(this, true, passive);\n\n if (this.isHTML5 && this.isVideo) {\n // If we change the active track while a cue is already displayed we need to update it\n captions.updateCues.call(this);\n }\n },\n\n // Set captions by language\n // Used internally for the language setter with the passive option forced to false\n setLanguage(input, passive = true) {\n if (!is.string(input)) {\n this.debug.warn('Invalid language argument', input);\n return;\n }\n // Normalize\n const language = input.toLowerCase();\n this.captions.language = language;\n\n // Set currentTrack\n const tracks = captions.getTracks.call(this);\n const track = captions.findTrack.call(this, [language]);\n captions.set.call(this, tracks.indexOf(track), passive);\n },\n\n // Get current valid caption tracks\n // If update is false it will also ignore tracks without metadata\n // This is used to \"freeze\" the language options when captions.update is false\n getTracks(update = false) {\n // Handle media or textTracks missing or null\n const tracks = Array.from((this.media || {}).textTracks || []);\n // For HTML5, use cache instead of current tracks when it exists (if captions.update is false)\n // Filter out removed tracks and tracks that aren't captions/subtitles (for example metadata)\n return tracks\n .filter(track => !this.isHTML5 || update || this.captions.meta.has(track))\n .filter(track => ['captions', 'subtitles'].includes(track.kind));\n },\n\n // Match tracks based on languages and get the first\n findTrack(languages, force = false) {\n const tracks = captions.getTracks.call(this);\n const sortIsDefault = track => Number((this.captions.meta.get(track) || {}).default);\n const sorted = Array.from(tracks).sort((a, b) => sortIsDefault(b) - sortIsDefault(a));\n let track;\n languages.every(language => {\n track = sorted.find(track => track.language === language);\n return !track; // Break iteration if there is a match\n });\n // If no match is found but is required, get first\n return track || (force ? sorted[0] : undefined);\n },\n\n // Get the current track\n getCurrentTrack() {\n return captions.getTracks.call(this)[this.currentTrack];\n },\n\n // Get UI label for track\n getLabel(track) {\n let currentTrack = track;\n\n if (!is.track(currentTrack) && support.textTracks && this.captions.toggled) {\n currentTrack = captions.getCurrentTrack.call(this);\n }\n\n if (is.track(currentTrack)) {\n if (!is.empty(currentTrack.label)) {\n return currentTrack.label;\n }\n\n if (!is.empty(currentTrack.language)) {\n return track.language.toUpperCase();\n }\n\n return i18n.get('enabled', this.config);\n }\n\n return i18n.get('disabled', this.config);\n },\n\n // Update captions using current track's active cues\n // Also optional array argument in case there isn't any track (ex: vimeo)\n updateCues(input) {\n // Requires UI\n if (!this.supported.ui) {\n return;\n }\n\n if (!is.element(this.elements.captions)) {\n this.debug.warn('No captions element to render to');\n return;\n }\n\n // Only accept array or empty input\n if (!is.nullOrUndefined(input) && !Array.isArray(input)) {\n this.debug.warn('updateCues: Invalid input', input);\n return;\n }\n\n let cues = input;\n\n // Get cues from track\n if (!cues) {\n const track = captions.getCurrentTrack.call(this);\n cues = Array.from((track || {}).activeCues || [])\n .map(cue => cue.getCueAsHTML())\n .map(getHTML);\n }\n\n // Set new caption text\n const content = cues.map(cueText => cueText.trim()).join('\\n');\n const changed = content !== this.elements.captions.innerHTML;\n\n if (changed) {\n // Empty the container and create a new child element\n emptyElement(this.elements.captions);\n const caption = createElement('span', getAttributesFromSelector(this.config.selectors.caption));\n caption.innerHTML = content;\n this.elements.captions.appendChild(caption);\n\n // Trigger event\n triggerEvent.call(this, this.media, 'cuechange');\n }\n },\n};\n\nexport default captions;\n","// ==========================================================================\n// Plyr default config\n// ==========================================================================\n\nconst defaults = {\n // Disable\n enabled: true,\n\n // Custom media title\n title: '',\n\n // Logging to console\n debug: false,\n\n // Auto play (if supported)\n autoplay: false,\n\n // Only allow one media playing at once (vimeo only)\n autopause: true,\n\n // Allow inline playback on iOS (this effects YouTube/Vimeo - HTML5 requires the attribute present)\n // TODO: Remove iosNative fullscreen option in favour of this (logic needs work)\n playsinline: true,\n\n // Default time to skip when rewind/fast forward\n seekTime: 10,\n\n // Default volume\n volume: 1,\n muted: false,\n\n // Pass a custom duration\n duration: null,\n\n // Display the media duration on load in the current time position\n // If you have opted to display both duration and currentTime, this is ignored\n displayDuration: true,\n\n // Invert the current time to be a countdown\n invertTime: true,\n\n // Clicking the currentTime inverts it's value to show time left rather than elapsed\n toggleInvert: true,\n\n // Aspect ratio (for embeds)\n ratio: '16:9',\n\n // Click video container to play/pause\n clickToPlay: true,\n\n // Auto hide the controls\n hideControls: true,\n\n // Reset to start when playback ended\n resetOnEnd: false,\n\n // Disable the standard context menu\n disableContextMenu: true,\n\n // Sprite (for icons)\n loadSprite: true,\n iconPrefix: 'plyr',\n iconUrl: 'https://cdn.plyr.io/3.3.12/plyr.svg',\n\n // Blank video (used to prevent errors on source change)\n blankVideo: 'https://cdn.plyr.io/static/blank.mp4',\n\n // Quality default\n quality: {\n default: 576,\n options: [\n 4320,\n 2880,\n 2160,\n 1440,\n 1080,\n 720,\n 576,\n 480,\n 360,\n 240,\n 'default', // YouTube's \"auto\"\n ],\n },\n\n // Set loops\n loop: {\n active: false,\n // start: null,\n // end: null,\n },\n\n // Speed default and options to display\n speed: {\n selected: 1,\n options: [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2],\n },\n\n // Keyboard shortcut settings\n keyboard: {\n focused: true,\n global: false,\n },\n\n // Display tooltips\n tooltips: {\n controls: false,\n seek: true,\n },\n\n // Captions settings\n captions: {\n active: false,\n language: 'auto',\n // Listen to new tracks added after Plyr is initialized.\n // This is needed for streaming captions, but may result in unselectable options\n update: false,\n },\n\n // Fullscreen settings\n fullscreen: {\n enabled: true, // Allow fullscreen?\n fallback: true, // Fallback for vintage browsers\n iosNative: false, // Use the native fullscreen in iOS (disables custom controls)\n },\n\n // Local storage\n storage: {\n enabled: true,\n key: 'plyr',\n },\n\n // Default controls\n controls: [\n 'play-large',\n // 'restart',\n // 'rewind',\n 'play',\n // 'fast-forward',\n 'progress',\n 'current-time',\n 'mute',\n 'volume',\n 'captions',\n 'settings',\n 'pip',\n 'airplay',\n 'fullscreen',\n ],\n settings: ['captions', 'quality', 'speed'],\n\n // Localisation\n i18n: {\n restart: 'Restart',\n rewind: 'Rewind {seektime}s',\n play: 'Play',\n pause: 'Pause',\n fastForward: 'Forward {seektime}s',\n seek: 'Seek',\n seekLabel: '{currentTime} of {duration}',\n played: 'Played',\n buffered: 'Buffered',\n currentTime: 'Current time',\n duration: 'Duration',\n volume: 'Volume',\n mute: 'Mute',\n unmute: 'Unmute',\n enableCaptions: 'Enable captions',\n disableCaptions: 'Disable captions',\n enterFullscreen: 'Enter fullscreen',\n exitFullscreen: 'Exit fullscreen',\n frameTitle: 'Player for {title}',\n captions: 'Captions',\n settings: 'Settings',\n menuBack: 'Go back to previous menu',\n speed: 'Speed',\n normal: 'Normal',\n quality: 'Quality',\n loop: 'Loop',\n start: 'Start',\n end: 'End',\n all: 'All',\n reset: 'Reset',\n disabled: 'Disabled',\n enabled: 'Enabled',\n advertisement: 'Ad',\n qualityBadge: {\n 2160: '4K',\n 1440: 'HD',\n 1080: 'HD',\n 720: 'HD',\n 576: 'SD',\n 480: 'SD',\n },\n },\n\n // URLs\n urls: {\n vimeo: {\n sdk: 'https://player.vimeo.com/api/player.js',\n iframe: 'https://player.vimeo.com/video/{0}?{1}',\n api: 'https://vimeo.com/api/v2/video/{0}.json',\n },\n youtube: {\n sdk: 'https://www.youtube.com/iframe_api',\n api:\n 'https://www.googleapis.com/youtube/v3/videos?id={0}&key={1}&fields=items(snippet(title))&part=snippet',\n },\n googleIMA: {\n sdk: 'https://imasdk.googleapis.com/js/sdkloader/ima3.js',\n },\n },\n\n // Custom control listeners\n listeners: {\n seek: null,\n play: null,\n pause: null,\n restart: null,\n rewind: null,\n fastForward: null,\n mute: null,\n volume: null,\n captions: null,\n fullscreen: null,\n pip: null,\n airplay: null,\n speed: null,\n quality: null,\n loop: null,\n language: null,\n },\n\n // Events to watch and bubble\n events: [\n // Events to watch on HTML5 media elements and bubble\n // https://developer.mozilla.org/en/docs/Web/Guide/Events/Media_events\n 'ended',\n 'progress',\n 'stalled',\n 'playing',\n 'waiting',\n 'canplay',\n 'canplaythrough',\n 'loadstart',\n 'loadeddata',\n 'loadedmetadata',\n 'timeupdate',\n 'volumechange',\n 'play',\n 'pause',\n 'error',\n 'seeking',\n 'seeked',\n 'emptied',\n 'ratechange',\n 'cuechange',\n\n // Custom events\n 'enterfullscreen',\n 'exitfullscreen',\n 'captionsenabled',\n 'captionsdisabled',\n 'languagechange',\n 'controlshidden',\n 'controlsshown',\n 'ready',\n\n // YouTube\n 'statechange',\n 'qualitychange',\n 'qualityrequested',\n\n // Ads\n 'adsloaded',\n 'adscontentpause',\n 'adscontentresume',\n 'adstarted',\n 'adsmidpoint',\n 'adscomplete',\n 'adsallcomplete',\n 'adsimpression',\n 'adsclick',\n ],\n\n // Selectors\n // Change these to match your template if using custom HTML\n selectors: {\n editable: 'input, textarea, select, [contenteditable]',\n container: '.plyr',\n controls: {\n container: null,\n wrapper: '.plyr__controls',\n },\n labels: '[data-plyr]',\n buttons: {\n play: '[data-plyr=\"play\"]',\n pause: '[data-plyr=\"pause\"]',\n restart: '[data-plyr=\"restart\"]',\n rewind: '[data-plyr=\"rewind\"]',\n fastForward: '[data-plyr=\"fast-forward\"]',\n mute: '[data-plyr=\"mute\"]',\n captions: '[data-plyr=\"captions\"]',\n fullscreen: '[data-plyr=\"fullscreen\"]',\n pip: '[data-plyr=\"pip\"]',\n airplay: '[data-plyr=\"airplay\"]',\n settings: '[data-plyr=\"settings\"]',\n loop: '[data-plyr=\"loop\"]',\n },\n inputs: {\n seek: '[data-plyr=\"seek\"]',\n volume: '[data-plyr=\"volume\"]',\n speed: '[data-plyr=\"speed\"]',\n language: '[data-plyr=\"language\"]',\n quality: '[data-plyr=\"quality\"]',\n },\n display: {\n currentTime: '.plyr__time--current',\n duration: '.plyr__time--duration',\n buffer: '.plyr__progress__buffer',\n loop: '.plyr__progress__loop', // Used later\n volume: '.plyr__volume--display',\n },\n progress: '.plyr__progress',\n captions: '.plyr__captions',\n caption: '.plyr__caption',\n menu: {\n quality: '.js-plyr__menu__list--quality',\n },\n },\n\n // Class hooks added to the player in different states\n classNames: {\n type: 'plyr--{0}',\n provider: 'plyr--{0}',\n video: 'plyr__video-wrapper',\n embed: 'plyr__video-embed',\n embedContainer: 'plyr__video-embed__container',\n poster: 'plyr__poster',\n posterEnabled: 'plyr__poster-enabled',\n ads: 'plyr__ads',\n control: 'plyr__control',\n controlPressed: 'plyr__control--pressed',\n playing: 'plyr--playing',\n paused: 'plyr--paused',\n stopped: 'plyr--stopped',\n loading: 'plyr--loading',\n hover: 'plyr--hover',\n tooltip: 'plyr__tooltip',\n cues: 'plyr__cues',\n hidden: 'plyr__sr-only',\n hideControls: 'plyr--hide-controls',\n isIos: 'plyr--is-ios',\n isTouch: 'plyr--is-touch',\n uiSupported: 'plyr--full-ui',\n noTransition: 'plyr--no-transition',\n menu: {\n value: 'plyr__menu__value',\n badge: 'plyr__badge',\n open: 'plyr--menu-open',\n },\n captions: {\n enabled: 'plyr--captions-enabled',\n active: 'plyr--captions-active',\n },\n fullscreen: {\n enabled: 'plyr--fullscreen-enabled',\n fallback: 'plyr--fullscreen-fallback',\n },\n pip: {\n supported: 'plyr--pip-supported',\n active: 'plyr--pip-active',\n },\n airplay: {\n supported: 'plyr--airplay-supported',\n active: 'plyr--airplay-active',\n },\n tabFocus: 'plyr__tab-focus',\n },\n\n // Embed attributes\n attributes: {\n embed: {\n provider: 'data-plyr-provider',\n id: 'data-plyr-embed-id',\n },\n },\n\n // API keys\n keys: {\n google: null,\n },\n\n // Advertisements plugin\n // Register for an account here: http://vi.ai/publisher-video-monetization/?aid=plyrio\n ads: {\n enabled: false,\n publisherId: '',\n },\n};\n\nexport default defaults;\n","// ==========================================================================\n// Plyr supported types and providers\n// ==========================================================================\n\nexport const providers = {\n html5: 'html5',\n youtube: 'youtube',\n vimeo: 'vimeo',\n};\n\nexport const types = {\n audio: 'audio',\n video: 'video',\n};\n\n/**\n * Get provider by URL\n * @param {string} url\n */\nexport function getProviderByUrl(url) {\n // YouTube\n if (/^(https?:\\/\\/)?(www\\.)?(youtube\\.com|youtu\\.?be)\\/.+$/.test(url)) {\n return providers.youtube;\n }\n\n // Vimeo\n if (/^https?:\\/\\/player.vimeo.com\\/video\\/\\d{0,9}(?=\\b|\\/)/.test(url)) {\n return providers.vimeo;\n }\n\n return null;\n}\n\nexport default { providers, types };\n","// ==========================================================================\n// Console wrapper\n// ==========================================================================\n\nconst noop = () => {};\n\nexport default class Console {\n constructor(enabled = false) {\n this.enabled = window.console && enabled;\n\n if (this.enabled) {\n this.log('Debugging enabled');\n }\n }\n\n get log() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.log, console) : noop;\n }\n get warn() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.warn, console) : noop;\n }\n get error() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.error, console) : noop;\n }\n}\n","// ==========================================================================\n// Fullscreen wrapper\n// https://developer.mozilla.org/en-US/docs/Web/API/Fullscreen_API#prefixing\n// ==========================================================================\n\nimport browser from './utils/browser';\nimport { hasClass, toggleClass, trapFocus } from './utils/elements';\nimport { on, triggerEvent } from './utils/events';\nimport is from './utils/is';\n\nfunction onChange() {\n if (!this.enabled) {\n return;\n }\n\n // Update toggle button\n const button = this.player.elements.buttons.fullscreen;\n if (is.element(button)) {\n button.pressed = this.active;\n }\n\n // Trigger an event\n triggerEvent.call(this.player, this.target, this.active ? 'enterfullscreen' : 'exitfullscreen', true);\n\n // Trap focus in container\n if (!browser.isIos) {\n trapFocus.call(this.player, this.target, this.active);\n }\n}\n\nfunction toggleFallback(toggle = false) {\n // Store or restore scroll position\n if (toggle) {\n this.scrollPosition = {\n x: window.scrollX || 0,\n y: window.scrollY || 0,\n };\n } else {\n window.scrollTo(this.scrollPosition.x, this.scrollPosition.y);\n }\n\n // Toggle scroll\n document.body.style.overflow = toggle ? 'hidden' : '';\n\n // Toggle class hook\n toggleClass(this.target, this.player.config.classNames.fullscreen.fallback, toggle);\n\n // Toggle button and fire events\n onChange.call(this);\n}\n\nclass Fullscreen {\n constructor(player) {\n // Keep reference to parent\n this.player = player;\n\n // Get prefix\n this.prefix = Fullscreen.prefix;\n this.property = Fullscreen.property;\n\n // Scroll position\n this.scrollPosition = { x: 0, y: 0 };\n\n // Register event listeners\n // Handle event (incase user presses escape etc)\n on.call(\n this.player,\n document,\n this.prefix === 'ms' ? 'MSFullscreenChange' : `${this.prefix}fullscreenchange`,\n () => {\n // TODO: Filter for target??\n onChange.call(this);\n },\n );\n\n // Fullscreen toggle on double click\n on.call(this.player, this.player.elements.container, 'dblclick', event => {\n // Ignore double click in controls\n if (is.element(this.player.elements.controls) && this.player.elements.controls.contains(event.target)) {\n return;\n }\n\n this.toggle();\n });\n\n // Update the UI\n this.update();\n }\n\n // Determine if native supported\n static get native() {\n return !!(\n document.fullscreenEnabled ||\n document.webkitFullscreenEnabled ||\n document.mozFullScreenEnabled ||\n document.msFullscreenEnabled\n );\n }\n\n // Get the prefix for handlers\n static get prefix() {\n // No prefix\n if (is.function(document.exitFullscreen)) {\n return '';\n }\n\n // Check for fullscreen support by vendor prefix\n let value = '';\n const prefixes = ['webkit', 'moz', 'ms'];\n\n prefixes.some(pre => {\n if (is.function(document[`${pre}ExitFullscreen`]) || is.function(document[`${pre}CancelFullScreen`])) {\n value = pre;\n return true;\n }\n\n return false;\n });\n\n return value;\n }\n\n static get property() {\n return this.prefix === 'moz' ? 'FullScreen' : 'Fullscreen';\n }\n\n // Determine if fullscreen is enabled\n get enabled() {\n return (\n (Fullscreen.native || this.player.config.fullscreen.fallback) &&\n this.player.config.fullscreen.enabled &&\n this.player.supported.ui &&\n this.player.isVideo\n );\n }\n\n // Get active state\n get active() {\n if (!this.enabled) {\n return false;\n }\n\n // Fallback using classname\n if (!Fullscreen.native) {\n return hasClass(this.target, this.player.config.classNames.fullscreen.fallback);\n }\n\n const element = !this.prefix ? document.fullscreenElement : document[`${this.prefix}${this.property}Element`];\n\n return element === this.target;\n }\n\n // Get target element\n get target() {\n return browser.isIos && this.player.config.fullscreen.iosNative\n ? this.player.media\n : this.player.elements.container;\n }\n\n // Update UI\n update() {\n if (this.enabled) {\n this.player.debug.log(`${Fullscreen.native ? 'Native' : 'Fallback'} fullscreen enabled`);\n } else {\n this.player.debug.log('Fullscreen not supported and fallback disabled');\n }\n\n // Add styling hook to show button\n toggleClass(this.player.elements.container, this.player.config.classNames.fullscreen.enabled, this.enabled);\n }\n\n // Make an element fullscreen\n enter() {\n if (!this.enabled) {\n return;\n }\n\n // iOS native fullscreen doesn't need the request step\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n if (this.player.playing) {\n this.target.webkitEnterFullscreen();\n }\n } else if (!Fullscreen.native) {\n toggleFallback.call(this, true);\n } else if (!this.prefix) {\n this.target.requestFullscreen();\n } else if (!is.empty(this.prefix)) {\n this.target[`${this.prefix}Request${this.property}`]();\n }\n }\n\n // Bail from fullscreen\n exit() {\n if (!this.enabled) {\n return;\n }\n\n // iOS native fullscreen\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n this.target.webkitExitFullscreen();\n this.player.play();\n } else if (!Fullscreen.native) {\n toggleFallback.call(this, false);\n } else if (!this.prefix) {\n (document.cancelFullScreen || document.exitFullscreen).call(document);\n } else if (!is.empty(this.prefix)) {\n const action = this.prefix === 'moz' ? 'Cancel' : 'Exit';\n document[`${this.prefix}${action}${this.property}`]();\n }\n }\n\n // Toggle state\n toggle() {\n if (!this.active) {\n this.enter();\n } else {\n this.exit();\n }\n }\n}\n\nexport default Fullscreen;\n","// ==========================================================================\n// Load image avoiding xhr/fetch CORS issues\n// Server status can't be obtained this way unfortunately, so this uses \"naturalWidth\" to determine if the image has loaded\n// By default it checks if it is at least 1px, but you can add a second argument to change this\n// ==========================================================================\n\nexport default function loadImage(src, minWidth = 1) {\n return new Promise((resolve, reject) => {\n const image = new Image();\n\n const handler = () => {\n delete image.onload;\n delete image.onerror;\n (image.naturalWidth >= minWidth ? resolve : reject)(image);\n };\n\n Object.assign(image, { onload: handler, onerror: handler, src });\n });\n}\n","// ==========================================================================\n// Plyr UI\n// ==========================================================================\n\nimport captions from './captions';\nimport controls from './controls';\nimport i18n from './i18n';\nimport support from './support';\nimport browser from './utils/browser';\nimport { getElement, toggleClass } from './utils/elements';\nimport { ready, triggerEvent } from './utils/events';\nimport is from './utils/is';\nimport loadImage from './utils/loadImage';\n\nconst ui = {\n addStyleHook() {\n toggleClass(this.elements.container, this.config.selectors.container.replace('.', ''), true);\n toggleClass(this.elements.container, this.config.classNames.uiSupported, this.supported.ui);\n },\n\n // Toggle native HTML5 media controls\n toggleNativeControls(toggle = false) {\n if (toggle && this.isHTML5) {\n this.media.setAttribute('controls', '');\n } else {\n this.media.removeAttribute('controls');\n }\n },\n\n // Setup the UI\n build() {\n // Re-attach media element listeners\n // TODO: Use event bubbling?\n this.listeners.media();\n\n // Don't setup interface if no support\n if (!this.supported.ui) {\n this.debug.warn(`Basic support only for ${this.provider} ${this.type}`);\n\n // Restore native controls\n ui.toggleNativeControls.call(this, true);\n\n // Bail\n return;\n }\n\n // Inject custom controls if not present\n if (!is.element(this.elements.controls)) {\n // Inject custom controls\n controls.inject.call(this);\n\n // Re-attach control listeners\n this.listeners.controls();\n }\n\n // Remove native controls\n ui.toggleNativeControls.call(this);\n\n // Setup captions for HTML5\n if (this.isHTML5) {\n captions.setup.call(this);\n }\n\n // Reset volume\n this.volume = null;\n\n // Reset mute state\n this.muted = null;\n\n // Reset speed\n this.speed = null;\n\n // Reset loop state\n this.loop = null;\n\n // Reset quality setting\n this.quality = null;\n\n // Reset volume display\n controls.updateVolume.call(this);\n\n // Reset time display\n controls.timeUpdate.call(this);\n\n // Update the UI\n ui.checkPlaying.call(this);\n\n // Check for picture-in-picture support\n toggleClass(\n this.elements.container,\n this.config.classNames.pip.supported,\n support.pip && this.isHTML5 && this.isVideo,\n );\n\n // Check for airplay support\n toggleClass(this.elements.container, this.config.classNames.airplay.supported, support.airplay && this.isHTML5);\n\n // Add iOS class\n toggleClass(this.elements.container, this.config.classNames.isIos, browser.isIos);\n\n // Add touch class\n toggleClass(this.elements.container, this.config.classNames.isTouch, this.touch);\n\n // Ready for API calls\n this.ready = true;\n\n // Ready event at end of execution stack\n setTimeout(() => {\n triggerEvent.call(this, this.media, 'ready');\n }, 0);\n\n // Set the title\n ui.setTitle.call(this);\n\n // Assure the poster image is set, if the property was added before the element was created\n if (this.poster) {\n ui.setPoster.call(this, this.poster, false).catch(() => {});\n }\n\n // Manually set the duration if user has overridden it.\n // The event listeners for it doesn't get called if preload is disabled (#701)\n if (this.config.duration) {\n controls.durationUpdate.call(this);\n }\n },\n\n // Setup aria attribute for play and iframe title\n setTitle() {\n // Find the current text\n let label = i18n.get('play', this.config);\n\n // If there's a media title set, use that for the label\n if (is.string(this.config.title) && !is.empty(this.config.title)) {\n label += `, ${this.config.title}`;\n }\n\n // If there's a play button, set label\n if (is.nodeList(this.elements.buttons.play)) {\n Array.from(this.elements.buttons.play).forEach(button => {\n button.setAttribute('aria-label', label);\n });\n }\n\n // Set iframe title\n // https://github.com/sampotts/plyr/issues/124\n if (this.isEmbed) {\n const iframe = getElement.call(this, 'iframe');\n\n if (!is.element(iframe)) {\n return;\n }\n\n // Default to media type\n const title = !is.empty(this.config.title) ? this.config.title : 'video';\n const format = i18n.get('frameTitle', this.config);\n\n iframe.setAttribute('title', format.replace('{title}', title));\n }\n },\n\n // Toggle poster\n togglePoster(enable) {\n toggleClass(this.elements.container, this.config.classNames.posterEnabled, enable);\n },\n\n // Set the poster image (async)\n // Used internally for the poster setter, with the passive option forced to false\n setPoster(poster, passive = true) {\n // Don't override if call is passive\n if (passive && this.poster) {\n return Promise.reject(new Error('Poster already set'));\n }\n\n // Set property synchronously to respect the call order\n this.media.setAttribute('poster', poster);\n\n // Wait until ui is ready\n return (\n ready\n .call(this)\n // Load image\n .then(() => loadImage(poster))\n .catch(err => {\n // Hide poster on error unless it's been set by another call\n if (poster === this.poster) {\n ui.togglePoster.call(this, false);\n }\n // Rethrow\n throw err;\n })\n .then(() => {\n // Prevent race conditions\n if (poster !== this.poster) {\n throw new Error('setPoster cancelled by later call to setPoster');\n }\n })\n .then(() => {\n Object.assign(this.elements.poster.style, {\n backgroundImage: `url('${poster}')`,\n // Reset backgroundSize as well (since it can be set to \"cover\" for padded thumbnails for youtube)\n backgroundSize: '',\n });\n ui.togglePoster.call(this, true);\n return poster;\n })\n );\n },\n\n // Check playing state\n checkPlaying(event) {\n // Class hooks\n toggleClass(this.elements.container, this.config.classNames.playing, this.playing);\n toggleClass(this.elements.container, this.config.classNames.paused, this.paused);\n toggleClass(this.elements.container, this.config.classNames.stopped, this.stopped);\n\n // Set state\n Array.from(this.elements.buttons.play).forEach(target => {\n target.pressed = this.playing;\n });\n\n // Only update controls on non timeupdate events\n if (is.event(event) && event.type === 'timeupdate') {\n return;\n }\n\n // Toggle controls\n ui.toggleControls.call(this);\n },\n\n // Check if media is loading\n checkLoading(event) {\n this.loading = ['stalled', 'waiting'].includes(event.type);\n\n // Clear timer\n clearTimeout(this.timers.loading);\n\n // Timer to prevent flicker when seeking\n this.timers.loading = setTimeout(() => {\n // Update progress bar loading class state\n toggleClass(this.elements.container, this.config.classNames.loading, this.loading);\n\n // Update controls visibility\n ui.toggleControls.call(this);\n }, this.loading ? 250 : 0);\n },\n\n // Toggle controls based on state and `force` argument\n toggleControls(force) {\n const { controls } = this.elements;\n\n if (controls && this.config.hideControls) {\n // Show controls if force, loading, paused, or button interaction, otherwise hide\n this.toggleControls(Boolean(force || this.loading || this.paused || controls.pressed || controls.hover));\n }\n },\n};\n\nexport default ui;\n","// ==========================================================================\n// Plyr Event Listeners\n// ==========================================================================\n\nimport controls from './controls';\nimport ui from './ui';\nimport browser from './utils/browser';\nimport { getElement, getElements, getFocusElement, matches, toggleClass, toggleHidden } from './utils/elements';\nimport { on, once, toggleListener, triggerEvent } from './utils/events';\nimport is from './utils/is';\n\nclass Listeners {\n constructor(player) {\n this.player = player;\n this.lastKey = null;\n\n this.handleKey = this.handleKey.bind(this);\n this.toggleMenu = this.toggleMenu.bind(this);\n this.firstTouch = this.firstTouch.bind(this);\n }\n\n // Handle key presses\n handleKey(event) {\n const code = event.keyCode ? event.keyCode : event.which;\n const pressed = event.type === 'keydown';\n const repeat = pressed && code === this.lastKey;\n\n // Bail if a modifier key is set\n if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) {\n return;\n }\n\n // If the event is bubbled from the media element\n // Firefox doesn't get the keycode for whatever reason\n if (!is.number(code)) {\n return;\n }\n\n // Seek by the number keys\n const seekByKey = () => {\n // Divide the max duration into 10th's and times by the number value\n this.player.currentTime = this.player.duration / 10 * (code - 48);\n };\n\n // Handle the key on keydown\n // Reset on keyup\n if (pressed) {\n // Which keycodes should we prevent default\n const preventDefault = [32, 37, 38, 39, 40, 48, 49, 50, 51, 52, 53, 54, 56, 57, 67, 70, 73, 75, 76, 77, 79];\n\n // Check focused element\n // and if the focused element is not editable (e.g. text input)\n // and any that accept key input http://webaim.org/techniques/keyboard/\n const focused = getFocusElement();\n if (\n is.element(focused) &&\n (focused !== this.player.elements.inputs.seek &&\n matches(focused, this.player.config.selectors.editable))\n ) {\n return;\n }\n\n // If the code is found prevent default (e.g. prevent scrolling for arrows)\n if (preventDefault.includes(code)) {\n event.preventDefault();\n event.stopPropagation();\n }\n\n switch (code) {\n case 48:\n case 49:\n case 50:\n case 51:\n case 52:\n case 53:\n case 54:\n case 55:\n case 56:\n case 57:\n // 0-9\n if (!repeat) {\n seekByKey();\n }\n break;\n\n case 32:\n case 75:\n // Space and K key\n if (!repeat) {\n this.player.togglePlay();\n }\n break;\n\n case 38:\n // Arrow up\n this.player.increaseVolume(0.1);\n break;\n\n case 40:\n // Arrow down\n this.player.decreaseVolume(0.1);\n break;\n\n case 77:\n // M key\n if (!repeat) {\n this.player.muted = !this.player.muted;\n }\n break;\n\n case 39:\n // Arrow forward\n this.player.forward();\n break;\n\n case 37:\n // Arrow back\n this.player.rewind();\n break;\n\n case 70:\n // F key\n this.player.fullscreen.toggle();\n break;\n\n case 67:\n // C key\n if (!repeat) {\n this.player.toggleCaptions();\n }\n break;\n\n case 76:\n // L key\n this.player.loop = !this.player.loop;\n break;\n\n /* case 73:\n this.setLoop('start');\n break;\n\n case 76:\n this.setLoop();\n break;\n\n case 79:\n this.setLoop('end');\n break; */\n\n default:\n break;\n }\n\n // Escape is handle natively when in full screen\n // So we only need to worry about non native\n if (!this.player.fullscreen.enabled && this.player.fullscreen.active && code === 27) {\n this.player.fullscreen.toggle();\n }\n\n // Store last code for next cycle\n this.lastKey = code;\n } else {\n this.lastKey = null;\n }\n }\n\n // Toggle menu\n toggleMenu(event) {\n controls.toggleMenu.call(this.player, event);\n }\n\n // Device is touch enabled\n firstTouch() {\n this.player.touch = true;\n\n // Add touch class\n toggleClass(this.player.elements.container, this.player.config.classNames.isTouch, true);\n }\n\n // Global window & document listeners\n global(toggle = true) {\n // Keyboard shortcuts\n if (this.player.config.keyboard.global) {\n toggleListener.call(this.player, window, 'keydown keyup', this.handleKey, toggle, false);\n }\n\n // Click anywhere closes menu\n toggleListener.call(this.player, document.body, 'click', this.toggleMenu, toggle);\n\n // Detect touch by events\n once.call(this.player, document.body, 'touchstart', this.firstTouch);\n }\n\n // Container listeners\n container() {\n // Keyboard shortcuts\n if (!this.player.config.keyboard.global && this.player.config.keyboard.focused) {\n on.call(this.player, this.player.elements.container, 'keydown keyup', this.handleKey, false);\n }\n\n // Detect tab focus\n // Remove class on blur/focusout\n on.call(this.player, this.player.elements.container, 'focusout', event => {\n toggleClass(event.target, this.player.config.classNames.tabFocus, false);\n });\n // Add classname to tabbed elements\n on.call(this.player, this.player.elements.container, 'keydown', event => {\n if (event.keyCode !== 9) {\n return;\n }\n\n // Delay the adding of classname until the focus has changed\n // This event fires before the focusin event\n setTimeout(() => {\n toggleClass(getFocusElement(), this.player.config.classNames.tabFocus, true);\n }, 0);\n });\n\n // Toggle controls on mouse events and entering fullscreen\n on.call(\n this.player,\n this.player.elements.container,\n 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen',\n event => {\n const { controls } = this.player.elements;\n\n // Remove button states for fullscreen\n if (event.type === 'enterfullscreen') {\n controls.pressed = false;\n controls.hover = false;\n }\n\n // Show, then hide after a timeout unless another control event occurs\n const show = ['touchstart', 'touchmove', 'mousemove'].includes(event.type);\n\n let delay = 0;\n\n if (show) {\n ui.toggleControls.call(this.player, true);\n // Use longer timeout for touch devices\n delay = this.player.touch ? 3000 : 2000;\n }\n\n // Clear timer\n clearTimeout(this.player.timers.controls);\n // Timer to prevent flicker when seeking\n this.player.timers.controls = setTimeout(() => ui.toggleControls.call(this.player, false), delay);\n },\n );\n }\n\n // Listen for media events\n media() {\n // Time change on media\n on.call(this.player, this.player.media, 'timeupdate seeking seeked', event =>\n controls.timeUpdate.call(this.player, event),\n );\n\n // Display duration\n on.call(this.player, this.player.media, 'durationchange loadeddata loadedmetadata', event =>\n controls.durationUpdate.call(this.player, event),\n );\n\n // Check for audio tracks on load\n // We can't use `loadedmetadata` as it doesn't seem to have audio tracks at that point\n on.call(this.player, this.player.media, 'canplay', () => {\n toggleHidden(this.player.elements.volume, !this.player.hasAudio);\n toggleHidden(this.player.elements.buttons.mute, !this.player.hasAudio);\n });\n\n // Handle the media finishing\n on.call(this.player, this.player.media, 'ended', () => {\n // Show poster on end\n if (this.player.isHTML5 && this.player.isVideo && this.player.config.resetOnEnd) {\n // Restart\n this.player.restart();\n }\n });\n\n // Check for buffer progress\n on.call(this.player, this.player.media, 'progress playing seeking seeked', event =>\n controls.updateProgress.call(this.player, event),\n );\n\n // Handle volume changes\n on.call(this.player, this.player.media, 'volumechange', event =>\n controls.updateVolume.call(this.player, event),\n );\n\n // Handle play/pause\n on.call(this.player, this.player.media, 'playing play pause ended emptied timeupdate', event =>\n ui.checkPlaying.call(this.player, event),\n );\n\n // Loading state\n on.call(this.player, this.player.media, 'waiting canplay seeked playing', event =>\n ui.checkLoading.call(this.player, event),\n );\n\n // If autoplay, then load advertisement if required\n // TODO: Show some sort of loading state while the ad manager loads else there's a delay before ad shows\n on.call(this.player, this.player.media, 'playing', () => {\n if (!this.player.ads) {\n return;\n }\n\n // If ads are enabled, wait for them first\n if (this.player.ads.enabled && !this.player.ads.initialized) {\n // Wait for manager response\n this.player.ads.managerPromise.then(() => this.player.ads.play()).catch(() => this.player.play());\n }\n });\n\n // Click video\n if (this.player.supported.ui && this.player.config.clickToPlay && !this.player.isAudio) {\n // Re-fetch the wrapper\n const wrapper = getElement.call(this.player, `.${this.player.config.classNames.video}`);\n\n // Bail if there's no wrapper (this should never happen)\n if (!is.element(wrapper)) {\n return;\n }\n\n // On click play, pause ore restart\n on.call(this.player, wrapper, 'click', () => {\n // Touch devices will just show controls (if we're hiding controls)\n if (this.player.config.hideControls && this.player.touch && !this.player.paused) {\n return;\n }\n\n if (this.player.paused) {\n this.player.play();\n } else if (this.player.ended) {\n this.player.restart();\n this.player.play();\n } else {\n this.player.pause();\n }\n });\n }\n\n // Disable right click\n if (this.player.supported.ui && this.player.config.disableContextMenu) {\n on.call(\n this.player,\n this.player.elements.wrapper,\n 'contextmenu',\n event => {\n event.preventDefault();\n },\n false,\n );\n }\n\n // Volume change\n on.call(this.player, this.player.media, 'volumechange', () => {\n // Save to storage\n this.player.storage.set({ volume: this.player.volume, muted: this.player.muted });\n });\n\n // Speed change\n on.call(this.player, this.player.media, 'ratechange', () => {\n // Update UI\n controls.updateSetting.call(this.player, 'speed');\n\n // Save to storage\n this.player.storage.set({ speed: this.player.speed });\n });\n\n // Quality request\n on.call(this.player, this.player.media, 'qualityrequested', event => {\n // Save to storage\n this.player.storage.set({ quality: event.detail.quality });\n });\n\n // Quality change\n on.call(this.player, this.player.media, 'qualitychange', event => {\n // Update UI\n controls.updateSetting.call(this.player, 'quality', null, event.detail.quality);\n });\n\n // Proxy events to container\n // Bubble up key events for Edge\n const proxyEvents = this.player.config.events.concat(['keyup', 'keydown']).join(' ');\n on.call(this.player, this.player.media, proxyEvents, event => {\n let { detail = {} } = event;\n\n // Get error details from media\n if (event.type === 'error') {\n detail = this.player.media.error;\n }\n\n triggerEvent.call(this.player, this.player.elements.container, event.type, true, detail);\n });\n }\n\n // Listen for control events\n controls() {\n // IE doesn't support input event, so we fallback to change\n const inputEvent = browser.isIE ? 'change' : 'input';\n\n // Run default and custom handlers\n const proxy = (event, defaultHandler, customHandlerKey) => {\n const customHandler = this.player.config.listeners[customHandlerKey];\n const hasCustomHandler = is.function(customHandler);\n let returned = true;\n\n // Execute custom handler\n if (hasCustomHandler) {\n returned = customHandler.call(this.player, event);\n }\n\n // Only call default handler if not prevented in custom handler\n if (returned && is.function(defaultHandler)) {\n defaultHandler.call(this.player, event);\n }\n };\n\n // Trigger custom and default handlers\n const bind = (element, type, defaultHandler, customHandlerKey, passive = true) => {\n const customHandler = this.player.config.listeners[customHandlerKey];\n const hasCustomHandler = is.function(customHandler);\n\n on.call(\n this.player,\n element,\n type,\n event => proxy(event, defaultHandler, customHandlerKey),\n passive && !hasCustomHandler,\n );\n };\n\n // Play/pause toggle\n Array.from(this.player.elements.buttons.play).forEach(button => {\n bind(button, 'click', this.player.togglePlay, 'play');\n });\n\n // Pause\n bind(this.player.elements.buttons.restart, 'click', this.player.restart, 'restart');\n\n // Rewind\n bind(this.player.elements.buttons.rewind, 'click', this.player.rewind, 'rewind');\n\n // Rewind\n bind(this.player.elements.buttons.fastForward, 'click', this.player.forward, 'fastForward');\n\n // Mute toggle\n bind(\n this.player.elements.buttons.mute,\n 'click',\n () => {\n this.player.muted = !this.player.muted;\n },\n 'mute',\n );\n\n // Captions toggle\n bind(this.player.elements.buttons.captions, 'click', () => this.player.toggleCaptions());\n\n // Fullscreen toggle\n bind(\n this.player.elements.buttons.fullscreen,\n 'click',\n () => {\n this.player.fullscreen.toggle();\n },\n 'fullscreen',\n );\n\n // Picture-in-Picture\n bind(\n this.player.elements.buttons.pip,\n 'click',\n () => {\n this.player.pip = 'toggle';\n },\n 'pip',\n );\n\n // Airplay\n bind(this.player.elements.buttons.airplay, 'click', this.player.airplay, 'airplay');\n\n // Settings menu\n bind(this.player.elements.buttons.settings, 'click', event => {\n controls.toggleMenu.call(this.player, event);\n });\n\n // Settings menu\n bind(this.player.elements.settings.form, 'click', event => {\n event.stopPropagation();\n\n // Go back to home tab on click\n const showHomeTab = () => {\n const id = `plyr-settings-${this.player.id}-home`;\n controls.showTab.call(this.player, id);\n };\n\n // Settings menu items - use event delegation as items are added/removed\n if (matches(event.target, this.player.config.selectors.inputs.language)) {\n proxy(\n event,\n () => {\n this.player.currentTrack = Number(event.target.value);\n showHomeTab();\n },\n 'language',\n );\n } else if (matches(event.target, this.player.config.selectors.inputs.quality)) {\n proxy(\n event,\n () => {\n this.player.quality = event.target.value;\n showHomeTab();\n },\n 'quality',\n );\n } else if (matches(event.target, this.player.config.selectors.inputs.speed)) {\n proxy(\n event,\n () => {\n this.player.speed = parseFloat(event.target.value);\n showHomeTab();\n },\n 'speed',\n );\n } else {\n const tab = event.target;\n controls.showTab.call(this.player, tab.getAttribute('aria-controls'));\n }\n });\n\n // Set range input alternative \"value\", which matches the tooltip time (#954)\n bind(this.player.elements.inputs.seek, 'mousedown mousemove', event => {\n const clientRect = this.player.elements.progress.getBoundingClientRect();\n const percent = 100 / clientRect.width * (event.pageX - clientRect.left);\n event.currentTarget.setAttribute('seek-value', percent);\n });\n\n // Pause while seeking\n bind(this.player.elements.inputs.seek, 'mousedown mouseup keydown keyup touchstart touchend', event => {\n const seek = event.currentTarget;\n\n const code = event.keyCode ? event.keyCode : event.which;\n const eventType = event.type;\n\n if ((eventType === 'keydown' || eventType === 'keyup') && (code !== 39 && code !== 37)) {\n return;\n }\n // Was playing before?\n const play = seek.hasAttribute('play-on-seeked');\n\n // Done seeking\n const done = ['mouseup', 'touchend', 'keyup'].includes(event.type);\n\n // If we're done seeking and it was playing, resume playback\n if (play && done) {\n seek.removeAttribute('play-on-seeked');\n this.player.play();\n } else if (!done && this.player.playing) {\n seek.setAttribute('play-on-seeked', '');\n this.player.pause();\n }\n });\n\n // Seek\n bind(\n this.player.elements.inputs.seek,\n inputEvent,\n event => {\n const seek = event.currentTarget;\n\n // If it exists, use seek-value instead of \"value\" for consistency with tooltip time (#954)\n let seekTo = seek.getAttribute('seek-value');\n\n if (is.empty(seekTo)) {\n seekTo = seek.value;\n }\n\n seek.removeAttribute('seek-value');\n\n this.player.currentTime = seekTo / seek.max * this.player.duration;\n },\n 'seek',\n );\n\n // Current time invert\n // Only if one time element is used for both currentTime and duration\n if (this.player.config.toggleInvert && !is.element(this.player.elements.display.duration)) {\n bind(this.player.elements.display.currentTime, 'click', () => {\n // Do nothing if we're at the start\n if (this.player.currentTime === 0) {\n return;\n }\n\n this.player.config.invertTime = !this.player.config.invertTime;\n\n controls.timeUpdate.call(this.player);\n });\n }\n\n // Volume\n bind(\n this.player.elements.inputs.volume,\n inputEvent,\n event => {\n this.player.volume = event.target.value;\n },\n 'volume',\n );\n\n // Polyfill for lower fill in <input type=\"range\"> for webkit\n if (browser.isWebkit) {\n Array.from(getElements.call(this.player, 'input[type=\"range\"]')).forEach(element => {\n bind(element, 'input', event => controls.updateRangeFill.call(this.player, event.target));\n });\n }\n\n // Seek tooltip\n bind(this.player.elements.progress, 'mouseenter mouseleave mousemove', event =>\n controls.updateSeekTooltip.call(this.player, event),\n );\n\n // Update controls.hover state (used for ui.toggleControls to avoid hiding when interacting)\n bind(this.player.elements.controls, 'mouseenter mouseleave', event => {\n this.player.elements.controls.hover = !this.player.touch && event.type === 'mouseenter';\n });\n\n // Update controls.pressed state (used for ui.toggleControls to avoid hiding when interacting)\n bind(this.player.elements.controls, 'mousedown mouseup touchstart touchend touchcancel', event => {\n this.player.elements.controls.pressed = ['mousedown', 'touchstart'].includes(event.type);\n });\n\n // Focus in/out on controls\n bind(this.player.elements.controls, 'focusin focusout', event => {\n const { config, elements, timers } = this.player;\n\n // Skip transition to prevent focus from scrolling the parent element\n toggleClass(elements.controls, config.classNames.noTransition, event.type === 'focusin');\n\n // Toggle\n ui.toggleControls.call(this.player, event.type === 'focusin');\n\n // If focusin, hide again after delay\n if (event.type === 'focusin') {\n // Restore transition\n setTimeout(() => {\n toggleClass(elements.controls, config.classNames.noTransition, false);\n }, 0);\n\n // Delay a little more for keyboard users\n const delay = this.touch ? 3000 : 4000;\n\n // Clear timer\n clearTimeout(timers.controls);\n // Hide\n timers.controls = setTimeout(() => ui.toggleControls.call(this.player, false), delay);\n }\n });\n\n // Mouse wheel for volume\n bind(\n this.player.elements.inputs.volume,\n 'wheel',\n event => {\n // Detect \"natural\" scroll - suppored on OS X Safari only\n // Other browsers on OS X will be inverted until support improves\n const inverted = event.webkitDirectionInvertedFromDevice;\n const step = 1 / 50;\n let direction = 0;\n\n // Scroll down (or up on natural) to decrease\n if (event.deltaY < 0 || event.deltaX > 0) {\n if (inverted) {\n this.player.decreaseVolume(step);\n direction = -1;\n } else {\n this.player.increaseVolume(step);\n direction = 1;\n }\n }\n\n // Scroll up (or down on natural) to increase\n if (event.deltaY > 0 || event.deltaX < 0) {\n if (inverted) {\n this.player.increaseVolume(step);\n direction = 1;\n } else {\n this.player.decreaseVolume(step);\n direction = -1;\n }\n }\n\n // Don't break page scrolling at max and min\n if (\n (direction === 1 && this.player.media.volume < 1) ||\n (direction === -1 && this.player.media.volume > 0)\n ) {\n event.preventDefault();\n }\n },\n 'volume',\n false,\n );\n }\n}\n\nexport default Listeners;\n","(function(root, factory) {\n if (typeof define === 'function' && define.amd) {\n define([], factory);\n } else if (typeof exports === 'object') {\n module.exports = factory();\n } else {\n root.loadjs = factory();\n }\n}(this, function() {\n/**\n * Global dependencies.\n * @global {Object} document - DOM\n */\n\nvar devnull = function() {},\n bundleIdCache = {},\n bundleResultCache = {},\n bundleCallbackQueue = {};\n\n\n/**\n * Subscribe to bundle load event.\n * @param {string[]} bundleIds - Bundle ids\n * @param {Function} callbackFn - The callback function\n */\nfunction subscribe(bundleIds, callbackFn) {\n // listify\n bundleIds = bundleIds.push ? bundleIds : [bundleIds];\n\n var depsNotFound = [],\n i = bundleIds.length,\n numWaiting = i,\n fn,\n bundleId,\n r,\n q;\n\n // define callback function\n fn = function (bundleId, pathsNotFound) {\n if (pathsNotFound.length) depsNotFound.push(bundleId);\n\n numWaiting--;\n if (!numWaiting) callbackFn(depsNotFound);\n };\n\n // register callback\n while (i--) {\n bundleId = bundleIds[i];\n\n // execute callback if in result cache\n r = bundleResultCache[bundleId];\n if (r) {\n fn(bundleId, r);\n continue;\n }\n\n // add to callback queue\n q = bundleCallbackQueue[bundleId] = bundleCallbackQueue[bundleId] || [];\n q.push(fn);\n }\n}\n\n\n/**\n * Publish bundle load event.\n * @param {string} bundleId - Bundle id\n * @param {string[]} pathsNotFound - List of files not found\n */\nfunction publish(bundleId, pathsNotFound) {\n // exit if id isn't defined\n if (!bundleId) return;\n\n var q = bundleCallbackQueue[bundleId];\n\n // cache result\n bundleResultCache[bundleId] = pathsNotFound;\n\n // exit if queue is empty\n if (!q) return;\n\n // empty callback queue\n while (q.length) {\n q[0](bundleId, pathsNotFound);\n q.splice(0, 1);\n }\n}\n\n\n/**\n * Execute callbacks.\n * @param {Object or Function} args - The callback args\n * @param {string[]} depsNotFound - List of dependencies not found\n */\nfunction executeCallbacks(args, depsNotFound) {\n // accept function as argument\n if (args.call) args = {success: args};\n\n // success and error callbacks\n if (depsNotFound.length) (args.error || devnull)(depsNotFound);\n else (args.success || devnull)(args);\n}\n\n\n/**\n * Load individual file.\n * @param {string} path - The file path\n * @param {Function} callbackFn - The callback function\n */\nfunction loadFile(path, callbackFn, args, numTries) {\n var doc = document,\n async = args.async,\n maxTries = (args.numRetries || 0) + 1,\n beforeCallbackFn = args.before || devnull,\n pathStripped = path.replace(/^(css|img)!/, ''),\n isCss,\n e;\n\n numTries = numTries || 0;\n\n if (/(^css!|\\.css$)/.test(path)) {\n isCss = true;\n\n // css\n e = doc.createElement('link');\n e.rel = 'stylesheet';\n e.href = pathStripped; //.replace(/^css!/, ''); // remove \"css!\" prefix\n } else if (/(^img!|\\.(png|gif|jpg|svg)$)/.test(path)) {\n // image\n e = doc.createElement('img');\n e.src = pathStripped; \n } else {\n // javascript\n e = doc.createElement('script');\n e.src = path;\n e.async = async === undefined ? true : async;\n }\n\n e.onload = e.onerror = e.onbeforeload = function (ev) {\n var result = ev.type[0];\n\n // Note: The following code isolates IE using `hideFocus` and treats empty\n // stylesheets as failures to get around lack of onerror support\n if (isCss && 'hideFocus' in e) {\n try {\n if (!e.sheet.cssText.length) result = 'e';\n } catch (x) {\n // sheets objects created from load errors don't allow access to\n // `cssText`\n result = 'e';\n }\n }\n\n // handle retries in case of load failure\n if (result == 'e') {\n // increment counter\n numTries += 1;\n\n // exit function and try again\n if (numTries < maxTries) {\n return loadFile(path, callbackFn, args, numTries);\n }\n }\n\n // execute callback\n callbackFn(path, result, ev.defaultPrevented);\n };\n\n // add to document (unless callback returns `false`)\n if (beforeCallbackFn(path, e) !== false) doc.head.appendChild(e);\n}\n\n\n/**\n * Load multiple files.\n * @param {string[]} paths - The file paths\n * @param {Function} callbackFn - The callback function\n */\nfunction loadFiles(paths, callbackFn, args) {\n // listify paths\n paths = paths.push ? paths : [paths];\n\n var numWaiting = paths.length,\n x = numWaiting,\n pathsNotFound = [],\n fn,\n i;\n\n // define callback function\n fn = function(path, result, defaultPrevented) {\n // handle error\n if (result == 'e') pathsNotFound.push(path);\n\n // handle beforeload event. If defaultPrevented then that means the load\n // will be blocked (ex. Ghostery/ABP on Safari)\n if (result == 'b') {\n if (defaultPrevented) pathsNotFound.push(path);\n else return;\n }\n\n numWaiting--;\n if (!numWaiting) callbackFn(pathsNotFound);\n };\n\n // load scripts\n for (i=0; i < x; i++) loadFile(paths[i], fn, args);\n}\n\n\n/**\n * Initiate script load and register bundle.\n * @param {(string|string[])} paths - The file paths\n * @param {(string|Function)} [arg1] - The bundleId or success callback\n * @param {Function} [arg2] - The success or error callback\n * @param {Function} [arg3] - The error callback\n */\nfunction loadjs(paths, arg1, arg2) {\n var bundleId,\n args;\n\n // bundleId (if string)\n if (arg1 && arg1.trim) bundleId = arg1;\n\n // args (default is {})\n args = (bundleId ? arg2 : arg1) || {};\n\n // throw error if bundle is already defined\n if (bundleId) {\n if (bundleId in bundleIdCache) {\n throw \"LoadJS\";\n } else {\n bundleIdCache[bundleId] = true;\n }\n }\n\n // load scripts\n loadFiles(paths, function (pathsNotFound) {\n // execute callbacks\n executeCallbacks(args, pathsNotFound);\n\n // publish bundle load event\n publish(bundleId, pathsNotFound);\n }, args);\n}\n\n\n/**\n * Execute callbacks when dependencies have been satisfied.\n * @param {(string|string[])} deps - List of bundle ids\n * @param {Object} args - success/error arguments\n */\nloadjs.ready = function ready(deps, args) {\n // subscribe to bundle load event\n subscribe(deps, function (depsNotFound) {\n // execute callbacks\n executeCallbacks(args, depsNotFound);\n });\n\n return loadjs;\n};\n\n\n/**\n * Manually satisfy bundle dependencies.\n * @param {string} bundleId - The bundle id\n */\nloadjs.done = function done(bundleId) {\n publish(bundleId, []);\n};\n\n\n/**\n * Reset loadjs dependencies statuses\n */\nloadjs.reset = function reset() {\n bundleIdCache = {};\n bundleResultCache = {};\n bundleCallbackQueue = {};\n};\n\n\n/**\n * Determine if bundle has already been defined\n * @param String} bundleId - The bundle id\n */\nloadjs.isDefined = function isDefined(bundleId) {\n return bundleId in bundleIdCache;\n};\n\n\n// export\nreturn loadjs;\n\n}));\n","// ==========================================================================\n// Load an external script\n// ==========================================================================\n\nimport loadjs from 'loadjs';\n\nexport default function loadScript(url) {\n return new Promise((resolve, reject) => {\n loadjs(url, {\n success: resolve,\n error: reject,\n });\n });\n}\n","// ==========================================================================\n// Vimeo plugin\n// ==========================================================================\n\nimport captions from './../captions';\nimport controls from './../controls';\nimport ui from './../ui';\nimport { createElement, replaceElement, toggleClass } from './../utils/elements';\nimport { triggerEvent } from './../utils/events';\nimport fetch from './../utils/fetch';\nimport is from './../utils/is';\nimport loadScript from './../utils/loadScript';\nimport { format, stripHTML } from './../utils/strings';\nimport { buildUrlParams } from './../utils/urls';\n\n// Parse Vimeo ID from URL\nfunction parseId(url) {\n if (is.empty(url)) {\n return null;\n }\n\n if (is.number(Number(url))) {\n return url;\n }\n\n const regex = /^.*(vimeo.com\\/|video\\/)(\\d+).*/;\n return url.match(regex) ? RegExp.$2 : url;\n}\n\n// Get aspect ratio for dimensions\nfunction getAspectRatio(width, height) {\n const getRatio = (w, h) => (h === 0 ? w : getRatio(h, w % h));\n const ratio = getRatio(width, height);\n return `${width / ratio}:${height / ratio}`;\n}\n\n// Set playback state and trigger change (only on actual change)\nfunction assurePlaybackState(play) {\n if (play && !this.embed.hasPlayed) {\n this.embed.hasPlayed = true;\n }\n if (this.media.paused === play) {\n this.media.paused = !play;\n triggerEvent.call(this, this.media, play ? 'play' : 'pause');\n }\n}\n\nconst vimeo = {\n setup() {\n // Add embed class for responsive\n toggleClass(this.elements.wrapper, this.config.classNames.embed, true);\n\n // Set intial ratio\n vimeo.setAspectRatio.call(this);\n\n // Load the API if not already\n if (!is.object(window.Vimeo)) {\n loadScript(this.config.urls.vimeo.sdk)\n .then(() => {\n vimeo.ready.call(this);\n })\n .catch(error => {\n this.debug.warn('Vimeo API failed to load', error);\n });\n } else {\n vimeo.ready.call(this);\n }\n },\n\n // Set aspect ratio\n // For Vimeo we have an extra 300% height <div> to hide the standard controls and UI\n setAspectRatio(input) {\n const [x, y] = (is.string(input) ? input : this.config.ratio).split(':');\n const padding = 100 / x * y;\n this.elements.wrapper.style.paddingBottom = `${padding}%`;\n\n if (this.supported.ui) {\n const height = 240;\n const offset = (height - padding) / (height / 50);\n\n this.media.style.transform = `translateY(-${offset}%)`;\n }\n },\n\n // API Ready\n ready() {\n const player = this;\n\n // Get Vimeo params for the iframe\n const options = {\n loop: player.config.loop.active,\n autoplay: player.autoplay,\n // muted: player.muted,\n byline: false,\n portrait: false,\n title: false,\n speed: true,\n transparent: 0,\n gesture: 'media',\n playsinline: !this.config.fullscreen.iosNative,\n };\n const params = buildUrlParams(options);\n\n // Get the source URL or ID\n let source = player.media.getAttribute('src');\n\n // Get from <div> if needed\n if (is.empty(source)) {\n source = player.media.getAttribute(player.config.attributes.embed.id);\n }\n\n const id = parseId(source);\n\n // Build an iframe\n const iframe = createElement('iframe');\n const src = format(player.config.urls.vimeo.iframe, id, params);\n iframe.setAttribute('src', src);\n iframe.setAttribute('allowfullscreen', '');\n iframe.setAttribute('allowtransparency', '');\n iframe.setAttribute('allow', 'autoplay');\n\n // Get poster, if already set\n const { poster } = player;\n\n // Inject the package\n const wrapper = createElement('div', { poster, class: player.config.classNames.embedContainer });\n wrapper.appendChild(iframe);\n player.media = replaceElement(wrapper, player.media);\n\n // Get poster image\n fetch(format(player.config.urls.vimeo.api, id), 'json').then(response => {\n if (is.empty(response)) {\n return;\n }\n\n // Get the URL for thumbnail\n const url = new URL(response[0].thumbnail_large);\n\n // Get original image\n url.pathname = `${url.pathname.split('_')[0]}.jpg`;\n\n // Set and show poster\n ui.setPoster.call(player, url.href).catch(() => {});\n });\n\n // Setup instance\n // https://github.com/vimeo/player.js\n player.embed = new window.Vimeo.Player(iframe, {\n autopause: player.config.autopause,\n muted: player.muted,\n });\n\n player.media.paused = true;\n player.media.currentTime = 0;\n\n // Disable native text track rendering\n if (player.supported.ui) {\n player.embed.disableTextTrack();\n }\n\n // Create a faux HTML5 API using the Vimeo API\n player.media.play = () => {\n assurePlaybackState.call(player, true);\n return player.embed.play();\n };\n\n player.media.pause = () => {\n assurePlaybackState.call(player, false);\n return player.embed.pause();\n };\n\n player.media.stop = () => {\n player.pause();\n player.currentTime = 0;\n };\n\n // Seeking\n let { currentTime } = player.media;\n Object.defineProperty(player.media, 'currentTime', {\n get() {\n return currentTime;\n },\n set(time) {\n // Vimeo will automatically play on seek if the video hasn't been played before\n\n // Get current paused state and volume etc\n const { embed, media, paused, volume } = player;\n const restorePause = paused && !embed.hasPlayed;\n\n // Set seeking state and trigger event\n media.seeking = true;\n triggerEvent.call(player, media, 'seeking');\n\n // If paused, mute until seek is complete\n Promise.resolve(restorePause && embed.setVolume(0))\n // Seek\n .then(() => embed.setCurrentTime(time))\n // Restore paused\n .then(() => restorePause && embed.pause())\n // Restore volume\n .then(() => restorePause && embed.setVolume(volume))\n .catch(() => {\n // Do nothing\n });\n },\n });\n\n // Playback speed\n let speed = player.config.speed.selected;\n Object.defineProperty(player.media, 'playbackRate', {\n get() {\n return speed;\n },\n set(input) {\n player.embed\n .setPlaybackRate(input)\n .then(() => {\n speed = input;\n triggerEvent.call(player, player.media, 'ratechange');\n })\n .catch(error => {\n // Hide menu item (and menu if empty)\n if (error.name === 'Error') {\n controls.setSpeedMenu.call(player, []);\n }\n });\n },\n });\n\n // Volume\n let { volume } = player.config;\n Object.defineProperty(player.media, 'volume', {\n get() {\n return volume;\n },\n set(input) {\n player.embed.setVolume(input).then(() => {\n volume = input;\n triggerEvent.call(player, player.media, 'volumechange');\n });\n },\n });\n\n // Muted\n let { muted } = player.config;\n Object.defineProperty(player.media, 'muted', {\n get() {\n return muted;\n },\n set(input) {\n const toggle = is.boolean(input) ? input : false;\n\n player.embed.setVolume(toggle ? 0 : player.config.volume).then(() => {\n muted = toggle;\n triggerEvent.call(player, player.media, 'volumechange');\n });\n },\n });\n\n // Loop\n let { loop } = player.config;\n Object.defineProperty(player.media, 'loop', {\n get() {\n return loop;\n },\n set(input) {\n const toggle = is.boolean(input) ? input : player.config.loop.active;\n\n player.embed.setLoop(toggle).then(() => {\n loop = toggle;\n });\n },\n });\n\n // Source\n let currentSrc;\n player.embed\n .getVideoUrl()\n .then(value => {\n currentSrc = value;\n })\n .catch(error => {\n this.debug.warn(error);\n });\n\n Object.defineProperty(player.media, 'currentSrc', {\n get() {\n return currentSrc;\n },\n });\n\n // Ended\n Object.defineProperty(player.media, 'ended', {\n get() {\n return player.currentTime === player.duration;\n },\n });\n\n // Set aspect ratio based on video size\n Promise.all([player.embed.getVideoWidth(), player.embed.getVideoHeight()]).then(dimensions => {\n const ratio = getAspectRatio(dimensions[0], dimensions[1]);\n vimeo.setAspectRatio.call(this, ratio);\n });\n\n // Set autopause\n player.embed.setAutopause(player.config.autopause).then(state => {\n player.config.autopause = state;\n });\n\n // Get title\n player.embed.getVideoTitle().then(title => {\n player.config.title = title;\n ui.setTitle.call(this);\n });\n\n // Get current time\n player.embed.getCurrentTime().then(value => {\n currentTime = value;\n triggerEvent.call(player, player.media, 'timeupdate');\n });\n\n // Get duration\n player.embed.getDuration().then(value => {\n player.media.duration = value;\n triggerEvent.call(player, player.media, 'durationchange');\n });\n\n // Get captions\n player.embed.getTextTracks().then(tracks => {\n player.media.textTracks = tracks;\n captions.setup.call(player);\n });\n\n player.embed.on('cuechange', ({ cues = [] }) => {\n const strippedCues = cues.map(cue => stripHTML(cue.text));\n captions.updateCues.call(player, strippedCues);\n });\n\n player.embed.on('loaded', () => {\n // Assure state and events are updated on autoplay\n player.embed.getPaused().then(paused => {\n assurePlaybackState.call(player, !paused);\n if (!paused) {\n triggerEvent.call(player, player.media, 'playing');\n }\n });\n\n if (is.element(player.embed.element) && player.supported.ui) {\n const frame = player.embed.element;\n\n // Fix keyboard focus issues\n // https://github.com/sampotts/plyr/issues/317\n frame.setAttribute('tabindex', -1);\n }\n });\n\n player.embed.on('play', () => {\n assurePlaybackState.call(player, true);\n triggerEvent.call(player, player.media, 'playing');\n });\n\n player.embed.on('pause', () => {\n assurePlaybackState.call(player, false);\n });\n\n player.embed.on('timeupdate', data => {\n player.media.seeking = false;\n currentTime = data.seconds;\n triggerEvent.call(player, player.media, 'timeupdate');\n });\n\n player.embed.on('progress', data => {\n player.media.buffered = data.percent;\n triggerEvent.call(player, player.media, 'progress');\n\n // Check all loaded\n if (parseInt(data.percent, 10) === 1) {\n triggerEvent.call(player, player.media, 'canplaythrough');\n }\n\n // Get duration as if we do it before load, it gives an incorrect value\n // https://github.com/sampotts/plyr/issues/891\n player.embed.getDuration().then(value => {\n if (value !== player.media.duration) {\n player.media.duration = value;\n triggerEvent.call(player, player.media, 'durationchange');\n }\n });\n });\n\n player.embed.on('seeked', () => {\n player.media.seeking = false;\n triggerEvent.call(player, player.media, 'seeked');\n });\n\n player.embed.on('ended', () => {\n player.media.paused = true;\n triggerEvent.call(player, player.media, 'ended');\n });\n\n player.embed.on('error', detail => {\n player.media.error = detail;\n triggerEvent.call(player, player.media, 'error');\n });\n\n // Rebuild UI\n setTimeout(() => ui.build.call(player), 0);\n },\n};\n\nexport default vimeo;\n","// ==========================================================================\n// YouTube plugin\n// ==========================================================================\n\nimport controls from './../controls';\nimport ui from './../ui';\nimport { dedupe } from './../utils/arrays';\nimport { createElement, replaceElement, toggleClass } from './../utils/elements';\nimport { triggerEvent } from './../utils/events';\nimport fetch from './../utils/fetch';\nimport is from './../utils/is';\nimport loadImage from './../utils/loadImage';\nimport loadScript from './../utils/loadScript';\nimport { format, generateId } from './../utils/strings';\n\n// Parse YouTube ID from URL\nfunction parseId(url) {\n if (is.empty(url)) {\n return null;\n }\n\n const regex = /^.*(youtu.be\\/|v\\/|u\\/\\w\\/|embed\\/|watch\\?v=|&v=)([^#&?]*).*/;\n return url.match(regex) ? RegExp.$2 : url;\n}\n\n// Standardise YouTube quality unit\nfunction mapQualityUnit(input) {\n const qualities = {\n hd2160: 2160,\n hd1440: 1440,\n hd1080: 1080,\n hd720: 720,\n large: 480,\n medium: 360,\n small: 240,\n tiny: 144,\n };\n\n const entry = Object.entries(qualities).find(entry => entry.includes(input));\n\n if (entry) {\n // Get the match corresponding to the input\n return entry.find(value => value !== input);\n }\n\n return 'default';\n}\n\nfunction mapQualityUnits(levels) {\n if (is.empty(levels)) {\n return levels;\n }\n\n return dedupe(levels.map(level => mapQualityUnit(level)));\n}\n\n// Set playback state and trigger change (only on actual change)\nfunction assurePlaybackState(play) {\n if (play && !this.embed.hasPlayed) {\n this.embed.hasPlayed = true;\n }\n if (this.media.paused === play) {\n this.media.paused = !play;\n triggerEvent.call(this, this.media, play ? 'play' : 'pause');\n }\n}\n\nconst youtube = {\n setup() {\n // Add embed class for responsive\n toggleClass(this.elements.wrapper, this.config.classNames.embed, true);\n\n // Set aspect ratio\n youtube.setAspectRatio.call(this);\n\n // Setup API\n if (is.object(window.YT) && is.function(window.YT.Player)) {\n youtube.ready.call(this);\n } else {\n // Load the API\n loadScript(this.config.urls.youtube.sdk).catch(error => {\n this.debug.warn('YouTube API failed to load', error);\n });\n\n // Setup callback for the API\n // YouTube has it's own system of course...\n window.onYouTubeReadyCallbacks = window.onYouTubeReadyCallbacks || [];\n\n // Add to queue\n window.onYouTubeReadyCallbacks.push(() => {\n youtube.ready.call(this);\n });\n\n // Set callback to process queue\n window.onYouTubeIframeAPIReady = () => {\n window.onYouTubeReadyCallbacks.forEach(callback => {\n callback();\n });\n };\n }\n },\n\n // Get the media title\n getTitle(videoId) {\n // Try via undocumented API method first\n // This method disappears now and then though...\n // https://github.com/sampotts/plyr/issues/709\n if (is.function(this.embed.getVideoData)) {\n const { title } = this.embed.getVideoData();\n\n if (is.empty(title)) {\n this.config.title = title;\n ui.setTitle.call(this);\n return;\n }\n }\n\n // Or via Google API\n const key = this.config.keys.google;\n if (is.string(key) && !is.empty(key)) {\n const url = format(this.config.urls.youtube.api, videoId, key);\n\n fetch(url)\n .then(result => {\n if (is.object(result)) {\n this.config.title = result.items[0].snippet.title;\n ui.setTitle.call(this);\n }\n })\n .catch(() => {});\n }\n },\n\n // Set aspect ratio\n setAspectRatio() {\n const ratio = this.config.ratio.split(':');\n this.elements.wrapper.style.paddingBottom = `${100 / ratio[0] * ratio[1]}%`;\n },\n\n // API ready\n ready() {\n const player = this;\n\n // Ignore already setup (race condition)\n const currentId = player.media.getAttribute('id');\n if (!is.empty(currentId) && currentId.startsWith('youtube-')) {\n return;\n }\n\n // Get the source URL or ID\n let source = player.media.getAttribute('src');\n\n // Get from <div> if needed\n if (is.empty(source)) {\n source = player.media.getAttribute(this.config.attributes.embed.id);\n }\n\n // Replace the <iframe> with a <div> due to YouTube API issues\n const videoId = parseId(source);\n const id = generateId(player.provider);\n\n // Get poster, if already set\n const { poster } = player;\n\n // Replace media element\n const container = createElement('div', { id, poster });\n player.media = replaceElement(container, player.media);\n\n // Id to poster wrapper\n const posterSrc = format => `https://img.youtube.com/vi/${videoId}/${format}default.jpg`;\n\n // Check thumbnail images in order of quality, but reject fallback thumbnails (120px wide)\n loadImage(posterSrc('maxres'), 121) // Higest quality and unpadded\n .catch(() => loadImage(posterSrc('sd'), 121)) // 480p padded 4:3\n .catch(() => loadImage(posterSrc('hq'))) // 360p padded 4:3. Always exists\n .then(image => ui.setPoster.call(player, image.src))\n .then(posterSrc => {\n // If the image is padded, use background-size \"cover\" instead (like youtube does too with their posters)\n if (!posterSrc.includes('maxres')) {\n player.elements.poster.style.backgroundSize = 'cover';\n }\n })\n .catch(() => {});\n\n // Setup instance\n // https://developers.google.com/youtube/iframe_api_reference\n player.embed = new window.YT.Player(id, {\n videoId,\n playerVars: {\n autoplay: player.config.autoplay ? 1 : 0, // Autoplay\n controls: player.supported.ui ? 0 : 1, // Only show controls if not fully supported\n rel: 0, // No related vids\n showinfo: 0, // Hide info\n iv_load_policy: 3, // Hide annotations\n modestbranding: 1, // Hide logos as much as possible (they still show one in the corner when paused)\n disablekb: 1, // Disable keyboard as we handle it\n playsinline: 1, // Allow iOS inline playback\n\n // Tracking for stats\n // origin: window ? `${window.location.protocol}//${window.location.host}` : null,\n widget_referrer: window ? window.location.href : null,\n\n // Captions are flaky on YouTube\n cc_load_policy: player.captions.active ? 1 : 0,\n cc_lang_pref: player.config.captions.language,\n },\n events: {\n onError(event) {\n // YouTube may fire onError twice, so only handle it once\n if (!player.media.error) {\n const code = event.data;\n // Messages copied from https://developers.google.com/youtube/iframe_api_reference#onError\n const message =\n {\n 2: 'The request contains an invalid parameter value. For example, this error occurs if you specify a video ID that does not have 11 characters, or if the video ID contains invalid characters, such as exclamation points or asterisks.',\n 5: 'The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.',\n 100: 'The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.',\n 101: 'The owner of the requested video does not allow it to be played in embedded players.',\n 150: 'The owner of the requested video does not allow it to be played in embedded players.',\n }[code] || 'An unknown error occured';\n\n player.media.error = { code, message };\n\n triggerEvent.call(player, player.media, 'error');\n }\n },\n onPlaybackQualityChange() {\n triggerEvent.call(player, player.media, 'qualitychange', false, {\n quality: player.media.quality,\n });\n },\n onPlaybackRateChange(event) {\n // Get the instance\n const instance = event.target;\n\n // Get current speed\n player.media.playbackRate = instance.getPlaybackRate();\n\n triggerEvent.call(player, player.media, 'ratechange');\n },\n onReady(event) {\n // Get the instance\n const instance = event.target;\n\n // Get the title\n youtube.getTitle.call(player, videoId);\n\n // Create a faux HTML5 API using the YouTube API\n player.media.play = () => {\n assurePlaybackState.call(player, true);\n instance.playVideo();\n };\n\n player.media.pause = () => {\n assurePlaybackState.call(player, false);\n instance.pauseVideo();\n };\n\n player.media.stop = () => {\n instance.stopVideo();\n };\n\n player.media.duration = instance.getDuration();\n player.media.paused = true;\n\n // Seeking\n player.media.currentTime = 0;\n Object.defineProperty(player.media, 'currentTime', {\n get() {\n return Number(instance.getCurrentTime());\n },\n set(time) {\n // If paused, mute audio preventively (YouTube starts playing on seek if the video hasn't been played yet).\n if (player.paused) {\n player.embed.mute();\n }\n\n // Set seeking state and trigger event\n player.media.seeking = true;\n triggerEvent.call(player, player.media, 'seeking');\n\n // Seek after events sent\n instance.seekTo(time);\n },\n });\n\n // Playback speed\n Object.defineProperty(player.media, 'playbackRate', {\n get() {\n return instance.getPlaybackRate();\n },\n set(input) {\n instance.setPlaybackRate(input);\n },\n });\n\n // Quality\n Object.defineProperty(player.media, 'quality', {\n get() {\n return mapQualityUnit(instance.getPlaybackQuality());\n },\n set(input) {\n instance.setPlaybackQuality(mapQualityUnit(input));\n },\n });\n\n // Volume\n let { volume } = player.config;\n Object.defineProperty(player.media, 'volume', {\n get() {\n return volume;\n },\n set(input) {\n volume = input;\n instance.setVolume(volume * 100);\n triggerEvent.call(player, player.media, 'volumechange');\n },\n });\n\n // Muted\n let { muted } = player.config;\n Object.defineProperty(player.media, 'muted', {\n get() {\n return muted;\n },\n set(input) {\n const toggle = is.boolean(input) ? input : muted;\n muted = toggle;\n instance[toggle ? 'mute' : 'unMute']();\n triggerEvent.call(player, player.media, 'volumechange');\n },\n });\n\n // Source\n Object.defineProperty(player.media, 'currentSrc', {\n get() {\n return instance.getVideoUrl();\n },\n });\n\n // Ended\n Object.defineProperty(player.media, 'ended', {\n get() {\n return player.currentTime === player.duration;\n },\n });\n\n // Get available speeds\n player.options.speed = instance.getAvailablePlaybackRates();\n\n // Set the tabindex to avoid focus entering iframe\n if (player.supported.ui) {\n player.media.setAttribute('tabindex', -1);\n }\n\n triggerEvent.call(player, player.media, 'timeupdate');\n triggerEvent.call(player, player.media, 'durationchange');\n\n // Reset timer\n clearInterval(player.timers.buffering);\n\n // Setup buffering\n player.timers.buffering = setInterval(() => {\n // Get loaded % from YouTube\n player.media.buffered = instance.getVideoLoadedFraction();\n\n // Trigger progress only when we actually buffer something\n if (player.media.lastBuffered === null || player.media.lastBuffered < player.media.buffered) {\n triggerEvent.call(player, player.media, 'progress');\n }\n\n // Set last buffer point\n player.media.lastBuffered = player.media.buffered;\n\n // Bail if we're at 100%\n if (player.media.buffered === 1) {\n clearInterval(player.timers.buffering);\n\n // Trigger event\n triggerEvent.call(player, player.media, 'canplaythrough');\n }\n }, 200);\n\n // Rebuild UI\n setTimeout(() => ui.build.call(player), 50);\n },\n onStateChange(event) {\n // Get the instance\n const instance = event.target;\n\n // Reset timer\n clearInterval(player.timers.playing);\n\n const seeked = player.media.seeking && [1, 2].includes(event.data);\n\n if (seeked) {\n // Unset seeking and fire seeked event\n player.media.seeking = false;\n triggerEvent.call(player, player.media, 'seeked');\n }\n\n // Handle events\n // -1 Unstarted\n // 0 Ended\n // 1 Playing\n // 2 Paused\n // 3 Buffering\n // 5 Video cued\n switch (event.data) {\n case -1:\n // Update scrubber\n triggerEvent.call(player, player.media, 'timeupdate');\n\n // Get loaded % from YouTube\n player.media.buffered = instance.getVideoLoadedFraction();\n triggerEvent.call(player, player.media, 'progress');\n\n break;\n\n case 0:\n assurePlaybackState.call(player, false);\n\n // YouTube doesn't support loop for a single video, so mimick it.\n if (player.media.loop) {\n // YouTube needs a call to `stopVideo` before playing again\n instance.stopVideo();\n instance.playVideo();\n } else {\n triggerEvent.call(player, player.media, 'ended');\n }\n\n break;\n\n case 1:\n // Restore paused state (YouTube starts playing on seek if the video hasn't been played yet)\n if (player.media.paused && !player.embed.hasPlayed) {\n player.media.pause();\n } else {\n assurePlaybackState.call(player, true);\n\n triggerEvent.call(player, player.media, 'playing');\n\n // Poll to get playback progress\n player.timers.playing = setInterval(() => {\n triggerEvent.call(player, player.media, 'timeupdate');\n }, 50);\n\n // Check duration again due to YouTube bug\n // https://github.com/sampotts/plyr/issues/374\n // https://code.google.com/p/gdata-issues/issues/detail?id=8690\n if (player.media.duration !== instance.getDuration()) {\n player.media.duration = instance.getDuration();\n triggerEvent.call(player, player.media, 'durationchange');\n }\n\n // Get quality\n controls.setQualityMenu.call(\n player,\n mapQualityUnits(instance.getAvailableQualityLevels()),\n );\n }\n\n break;\n\n case 2:\n // Restore audio (YouTube starts playing on seek if the video hasn't been played yet)\n if (!player.muted) {\n player.embed.unMute();\n }\n assurePlaybackState.call(player, false);\n\n break;\n\n default:\n break;\n }\n\n triggerEvent.call(player, player.elements.container, 'statechange', false, {\n code: event.data,\n });\n },\n },\n });\n },\n};\n\nexport default youtube;\n","// ==========================================================================\n// Plyr Media\n// ==========================================================================\n\nimport html5 from './html5';\nimport vimeo from './plugins/vimeo';\nimport youtube from './plugins/youtube';\nimport { createElement, toggleClass, wrap } from './utils/elements';\n\nconst media = {\n // Setup media\n setup() {\n // If there's no media, bail\n if (!this.media) {\n this.debug.warn('No media element found!');\n return;\n }\n\n // Add type class\n toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', this.type), true);\n\n // Add provider class\n toggleClass(this.elements.container, this.config.classNames.provider.replace('{0}', this.provider), true);\n\n // Add video class for embeds\n // This will require changes if audio embeds are added\n if (this.isEmbed) {\n toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', 'video'), true);\n }\n\n // Inject the player wrapper\n if (this.isVideo) {\n // Create the wrapper div\n this.elements.wrapper = createElement('div', {\n class: this.config.classNames.video,\n });\n\n // Wrap the video in a container\n wrap(this.media, this.elements.wrapper);\n\n // Faux poster container\n this.elements.poster = createElement('div', {\n class: this.config.classNames.poster,\n });\n\n this.elements.wrapper.appendChild(this.elements.poster);\n }\n\n if (this.isHTML5) {\n html5.extend.call(this);\n } else if (this.isYouTube) {\n youtube.setup.call(this);\n } else if (this.isVimeo) {\n vimeo.setup.call(this);\n }\n },\n};\n\nexport default media;\n","// ==========================================================================\n// Advertisement plugin using Google IMA HTML5 SDK\n// Create an account with our ad partner, vi here:\n// https://www.vi.ai/publisher-video-monetization/\n// ==========================================================================\n\n/* global google */\n\nimport i18n from '../i18n';\nimport { createElement } from './../utils/elements';\nimport { triggerEvent } from './../utils/events';\nimport is from './../utils/is';\nimport loadScript from './../utils/loadScript';\nimport { formatTime } from './../utils/time';\nimport { buildUrlParams } from './../utils/urls';\n\nclass Ads {\n /**\n * Ads constructor.\n * @param {object} player\n * @return {Ads}\n */\n constructor(player) {\n this.player = player;\n this.publisherId = player.config.ads.publisherId;\n this.playing = false;\n this.initialized = false;\n this.elements = {\n container: null,\n displayContainer: null,\n };\n this.manager = null;\n this.loader = null;\n this.cuePoints = null;\n this.events = {};\n this.safetyTimer = null;\n this.countdownTimer = null;\n\n // Setup a promise to resolve when the IMA manager is ready\n this.managerPromise = new Promise((resolve, reject) => {\n // The ad is loaded and ready\n this.on('loaded', resolve);\n\n // Ads failed\n this.on('error', reject);\n });\n\n this.load();\n }\n\n get enabled() {\n return this.player.isVideo && this.player.config.ads.enabled && !is.empty(this.publisherId);\n }\n\n /**\n * Load the IMA SDK\n */\n load() {\n if (this.enabled) {\n // Check if the Google IMA3 SDK is loaded or load it ourselves\n if (!is.object(window.google) || !is.object(window.google.ima)) {\n loadScript(this.player.config.urls.googleIMA.sdk)\n .then(() => {\n this.ready();\n })\n .catch(() => {\n // Script failed to load or is blocked\n this.trigger('error', new Error('Google IMA SDK failed to load'));\n });\n } else {\n this.ready();\n }\n }\n }\n\n /**\n * Get the ads instance ready\n */\n ready() {\n // Start ticking our safety timer. If the whole advertisement\n // thing doesn't resolve within our set time; we bail\n this.startSafetyTimer(12000, 'ready()');\n\n // Clear the safety timer\n this.managerPromise.then(() => {\n this.clearSafetyTimer('onAdsManagerLoaded()');\n });\n\n // Set listeners on the Plyr instance\n this.listeners();\n\n // Setup the IMA SDK\n this.setupIMA();\n }\n\n // Build the default tag URL\n get tagUrl() {\n const params = {\n AV_PUBLISHERID: '58c25bb0073ef448b1087ad6',\n AV_CHANNELID: '5a0458dc28a06145e4519d21',\n AV_URL: location.hostname,\n cb: Date.now(),\n AV_WIDTH: 640,\n AV_HEIGHT: 480,\n AV_CDIM2: this.publisherId,\n };\n\n const base = 'https://go.aniview.com/api/adserver6/vast/';\n\n return `${base}?${buildUrlParams(params)}`;\n }\n\n /**\n * In order for the SDK to display ads for our video, we need to tell it where to put them,\n * so here we define our ad container. This div is set up to render on top of the video player.\n * Using the code below, we tell the SDK to render ads within that div. We also provide a\n * handle to the content video player - the SDK will poll the current time of our player to\n * properly place mid-rolls. After we create the ad display container, we initialize it. On\n * mobile devices, this initialization is done as the result of a user action.\n */\n setupIMA() {\n // Create the container for our advertisements\n this.elements.container = createElement('div', {\n class: this.player.config.classNames.ads,\n });\n this.player.elements.container.appendChild(this.elements.container);\n\n // So we can run VPAID2\n google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED);\n\n // Set language\n google.ima.settings.setLocale(this.player.config.ads.language);\n\n // We assume the adContainer is the video container of the plyr element\n // that will house the ads\n this.elements.displayContainer = new google.ima.AdDisplayContainer(this.elements.container);\n\n // Request video ads to be pre-loaded\n this.requestAds();\n }\n\n /**\n * Request advertisements\n */\n requestAds() {\n const { container } = this.player.elements;\n\n try {\n // Create ads loader\n this.loader = new google.ima.AdsLoader(this.elements.displayContainer);\n\n // Listen and respond to ads loaded and error events\n this.loader.addEventListener(\n google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED,\n event => this.onAdsManagerLoaded(event),\n false,\n );\n this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, error => this.onAdError(error), false);\n\n // Request video ads\n const request = new google.ima.AdsRequest();\n request.adTagUrl = this.tagUrl;\n\n // Specify the linear and nonlinear slot sizes. This helps the SDK\n // to select the correct creative if multiple are returned\n request.linearAdSlotWidth = container.offsetWidth;\n request.linearAdSlotHeight = container.offsetHeight;\n request.nonLinearAdSlotWidth = container.offsetWidth;\n request.nonLinearAdSlotHeight = container.offsetHeight;\n\n // We only overlay ads as we only support video.\n request.forceNonLinearFullSlot = false;\n\n // Mute based on current state\n request.setAdWillPlayMuted(!this.player.muted);\n\n this.loader.requestAds(request);\n } catch (e) {\n this.onAdError(e);\n }\n }\n\n /**\n * Update the ad countdown\n * @param {boolean} start\n */\n pollCountdown(start = false) {\n if (!start) {\n clearInterval(this.countdownTimer);\n this.elements.container.removeAttribute('data-badge-text');\n return;\n }\n\n const update = () => {\n const time = formatTime(Math.max(this.manager.getRemainingTime(), 0));\n const label = `${i18n.get('advertisement', this.player.config)} - ${time}`;\n this.elements.container.setAttribute('data-badge-text', label);\n };\n\n this.countdownTimer = setInterval(update, 100);\n }\n\n /**\n * This method is called whenever the ads are ready inside the AdDisplayContainer\n * @param {Event} adsManagerLoadedEvent\n */\n onAdsManagerLoaded(event) {\n // Get the ads manager\n const settings = new google.ima.AdsRenderingSettings();\n\n // Tell the SDK to save and restore content video state on our behalf\n settings.restoreCustomPlaybackStateOnAdBreakComplete = true;\n settings.enablePreloading = true;\n\n // The SDK is polling currentTime on the contentPlayback. And needs a duration\n // so it can determine when to start the mid- and post-roll\n this.manager = event.getAdsManager(this.player, settings);\n\n // Get the cue points for any mid-rolls by filtering out the pre- and post-roll\n this.cuePoints = this.manager.getCuePoints();\n\n // Add advertisement cue's within the time line if available\n if (!is.empty(this.cuePoints)) {\n this.cuePoints.forEach(cuePoint => {\n if (cuePoint !== 0 && cuePoint !== -1 && cuePoint < this.player.duration) {\n const seekElement = this.player.elements.progress;\n\n if (is.element(seekElement)) {\n const cuePercentage = 100 / this.player.duration * cuePoint;\n const cue = createElement('span', {\n class: this.player.config.classNames.cues,\n });\n\n cue.style.left = `${cuePercentage.toString()}%`;\n seekElement.appendChild(cue);\n }\n }\n });\n }\n\n // Get skippable state\n // TODO: Skip button\n // this.player.debug.warn(this.manager.getAdSkippableState());\n\n // Set volume to match player\n this.manager.setVolume(this.player.volume);\n\n // Add listeners to the required events\n // Advertisement error events\n this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, error => this.onAdError(error));\n\n // Advertisement regular events\n Object.keys(google.ima.AdEvent.Type).forEach(type => {\n this.manager.addEventListener(google.ima.AdEvent.Type[type], event => this.onAdEvent(event));\n });\n\n // Resolve our adsManager\n this.trigger('loaded');\n }\n\n /**\n * This is where all the event handling takes place. Retrieve the ad from the event. Some\n * events (e.g. ALL_ADS_COMPLETED) don't have the ad object associated\n * https://developers.google.com/interactive-media-ads/docs/sdks/html5/v3/apis#ima.AdEvent.Type\n * @param {Event} event\n */\n onAdEvent(event) {\n const { container } = this.player.elements;\n\n // Retrieve the ad from the event. Some events (e.g. ALL_ADS_COMPLETED)\n // don't have ad object associated\n const ad = event.getAd();\n\n // Proxy event\n const dispatchEvent = type => {\n const event = `ads${type.replace(/_/g, '').toLowerCase()}`;\n triggerEvent.call(this.player, this.player.media, event);\n };\n\n switch (event.type) {\n case google.ima.AdEvent.Type.LOADED:\n // This is the first event sent for an ad - it is possible to determine whether the\n // ad is a video ad or an overlay\n this.trigger('loaded');\n\n // Bubble event\n dispatchEvent(event.type);\n\n // Start countdown\n this.pollCountdown(true);\n\n if (!ad.isLinear()) {\n // Position AdDisplayContainer correctly for overlay\n ad.width = container.offsetWidth;\n ad.height = container.offsetHeight;\n }\n\n // console.info('Ad type: ' + event.getAd().getAdPodInfo().getPodIndex());\n // console.info('Ad time: ' + event.getAd().getAdPodInfo().getTimeOffset());\n break;\n\n case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:\n // All ads for the current videos are done. We can now request new advertisements\n // in case the video is re-played\n\n // Fire event\n dispatchEvent(event.type);\n\n // TODO: Example for what happens when a next video in a playlist would be loaded.\n // So here we load a new video when all ads are done.\n // Then we load new ads within a new adsManager. When the video\n // Is started - after - the ads are loaded, then we get ads.\n // You can also easily test cancelling and reloading by running\n // player.ads.cancel() and player.ads.play from the console I guess.\n // this.player.source = {\n // type: 'video',\n // title: 'View From A Blue Moon',\n // sources: [{\n // src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.mp4', type:\n // 'video/mp4', }], poster:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg', tracks:\n // [ { kind: 'captions', label: 'English', srclang: 'en', src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt',\n // default: true, }, { kind: 'captions', label: 'French', srclang: 'fr', src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt', }, ],\n // };\n\n // TODO: So there is still this thing where a video should only be allowed to start\n // playing when the IMA SDK is ready or has failed\n\n this.loadAds();\n break;\n\n case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:\n // This event indicates the ad has started - the video player can adjust the UI,\n // for example display a pause button and remaining time. Fired when content should\n // be paused. This usually happens right before an ad is about to cover the content\n\n dispatchEvent(event.type);\n\n this.pauseContent();\n\n break;\n\n case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:\n // This event indicates the ad has finished - the video player can perform\n // appropriate UI actions, such as removing the timer for remaining time detection.\n // Fired when content should be resumed. This usually happens when an ad finishes\n // or collapses\n\n dispatchEvent(event.type);\n\n this.pollCountdown();\n\n this.resumeContent();\n\n break;\n\n case google.ima.AdEvent.Type.STARTED:\n case google.ima.AdEvent.Type.MIDPOINT:\n case google.ima.AdEvent.Type.COMPLETE:\n case google.ima.AdEvent.Type.IMPRESSION:\n case google.ima.AdEvent.Type.CLICK:\n dispatchEvent(event.type);\n break;\n\n default:\n break;\n }\n }\n\n /**\n * Any ad error handling comes through here\n * @param {Event} event\n */\n onAdError(event) {\n this.cancel();\n this.player.debug.warn('Ads error', event);\n }\n\n /**\n * Setup hooks for Plyr and window events. This ensures\n * the mid- and post-roll launch at the correct time. And\n * resize the advertisement when the player resizes\n */\n listeners() {\n const { container } = this.player.elements;\n let time;\n\n // Add listeners to the required events\n this.player.on('ended', () => {\n this.loader.contentComplete();\n });\n\n this.player.on('seeking', () => {\n time = this.player.currentTime;\n return time;\n });\n\n this.player.on('seeked', () => {\n const seekedTime = this.player.currentTime;\n\n if (is.empty(this.cuePoints)) {\n return;\n }\n\n this.cuePoints.forEach((cuePoint, index) => {\n if (time < cuePoint && cuePoint < seekedTime) {\n this.manager.discardAdBreak();\n this.cuePoints.splice(index, 1);\n }\n });\n });\n\n // Listen to the resizing of the window. And resize ad accordingly\n // TODO: eventually implement ResizeObserver\n window.addEventListener('resize', () => {\n if (this.manager) {\n this.manager.resize(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);\n }\n });\n }\n\n /**\n * Initialize the adsManager and start playing advertisements\n */\n play() {\n const { container } = this.player.elements;\n\n if (!this.managerPromise) {\n this.resumeContent();\n }\n\n // Play the requested advertisement whenever the adsManager is ready\n this.managerPromise\n .then(() => {\n // Initialize the container. Must be done via a user action on mobile devices\n this.elements.displayContainer.initialize();\n\n try {\n if (!this.initialized) {\n // Initialize the ads manager. Ad rules playlist will start at this time\n this.manager.init(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);\n\n // Call play to start showing the ad. Single video and overlay ads will\n // start at this time; the call will be ignored for ad rules\n this.manager.start();\n }\n\n this.initialized = true;\n } catch (adError) {\n // An error may be thrown if there was a problem with the\n // VAST response\n this.onAdError(adError);\n }\n })\n .catch(() => {});\n }\n\n /**\n * Resume our video\n */\n resumeContent() {\n // Hide the advertisement container\n this.elements.container.style.zIndex = '';\n\n // Ad is stopped\n this.playing = false;\n\n // Play our video\n if (this.player.currentTime < this.player.duration) {\n this.player.play();\n }\n }\n\n /**\n * Pause our video\n */\n pauseContent() {\n // Show the advertisement container\n this.elements.container.style.zIndex = 3;\n\n // Ad is playing.\n this.playing = true;\n\n // Pause our video.\n this.player.pause();\n }\n\n /**\n * Destroy the adsManager so we can grab new ads after this. If we don't then we're not\n * allowed to call new ads based on google policies, as they interpret this as an accidental\n * video requests. https://developers.google.com/interactive-\n * media-ads/docs/sdks/android/faq#8\n */\n cancel() {\n // Pause our video\n if (this.initialized) {\n this.resumeContent();\n }\n\n // Tell our instance that we're done for now\n this.trigger('error');\n\n // Re-create our adsManager\n this.loadAds();\n }\n\n /**\n * Re-create our adsManager\n */\n loadAds() {\n // Tell our adsManager to go bye bye\n this.managerPromise\n .then(() => {\n // Destroy our adsManager\n if (this.manager) {\n this.manager.destroy();\n }\n\n // Re-set our adsManager promises\n this.managerPromise = new Promise(resolve => {\n this.on('loaded', resolve);\n this.player.debug.log(this.manager);\n });\n\n // Now request some new advertisements\n this.requestAds();\n })\n .catch(() => {});\n }\n\n /**\n * Handles callbacks after an ad event was invoked\n * @param {string} event - Event type\n */\n trigger(event, ...args) {\n const handlers = this.events[event];\n\n if (is.array(handlers)) {\n handlers.forEach(handler => {\n if (is.function(handler)) {\n handler.apply(this, args);\n }\n });\n }\n }\n\n /**\n * Add event listeners\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n * @return {Ads}\n */\n on(event, callback) {\n if (!is.array(this.events[event])) {\n this.events[event] = [];\n }\n\n this.events[event].push(callback);\n\n return this;\n }\n\n /**\n * Setup a safety timer for when the ad network doesn't respond for whatever reason.\n * The advertisement has 12 seconds to get its things together. We stop this timer when the\n * advertisement is playing, or when a user action is required to start, then we clear the\n * timer on ad ready\n * @param {number} time\n * @param {string} from\n */\n startSafetyTimer(time, from) {\n this.player.debug.log(`Safety timer invoked from: ${from}`);\n\n this.safetyTimer = setTimeout(() => {\n this.cancel();\n this.clearSafetyTimer('startSafetyTimer()');\n }, time);\n }\n\n /**\n * Clear our safety timer(s)\n * @param {string} from\n */\n clearSafetyTimer(from) {\n if (!is.nullOrUndefined(this.safetyTimer)) {\n this.player.debug.log(`Safety timer cleared from: ${from}`);\n\n clearTimeout(this.safetyTimer);\n this.safetyTimer = null;\n }\n }\n}\n\nexport default Ads;\n","// ==========================================================================\n// Plyr source update\n// ==========================================================================\n\nimport { providers } from './config/types';\nimport html5 from './html5';\nimport media from './media';\nimport support from './support';\nimport ui from './ui';\nimport { createElement, insertElement, removeElement } from './utils/elements';\nimport is from './utils/is';\nimport { getDeep } from './utils/objects';\n\nconst source = {\n // Add elements to HTML5 media (source, tracks, etc)\n insertElements(type, attributes) {\n if (is.string(attributes)) {\n insertElement(type, this.media, {\n src: attributes,\n });\n } else if (is.array(attributes)) {\n attributes.forEach(attribute => {\n insertElement(type, this.media, attribute);\n });\n }\n },\n\n // Update source\n // Sources are not checked for support so be careful\n change(input) {\n if (!getDeep(input, 'sources.length')) {\n this.debug.warn('Invalid source format');\n return;\n }\n\n // Cancel current network requests\n html5.cancelRequests.call(this);\n\n // Destroy instance and re-setup\n this.destroy.call(\n this,\n () => {\n // Reset quality options\n this.options.quality = [];\n\n // Remove elements\n removeElement(this.media);\n this.media = null;\n\n // Reset class name\n if (is.element(this.elements.container)) {\n this.elements.container.removeAttribute('class');\n }\n\n // Set the type and provider\n const { sources, type } = input;\n const [{ provider = providers.html5, src }] = sources;\n const tagName = provider === 'html5' ? type : 'div';\n const attributes = provider === 'html5' ? {} : { src };\n\n Object.assign(this, {\n provider,\n type,\n // Check for support\n supported: support.check(type, provider, this.config.playsinline),\n // Create new element\n media: createElement(tagName, attributes),\n });\n\n // Inject the new element\n this.elements.container.appendChild(this.media);\n\n // Autoplay the new source?\n if (is.boolean(input.autoplay)) {\n this.config.autoplay = input.autoplay;\n }\n\n // Set attributes for audio and video\n if (this.isHTML5) {\n if (this.config.crossorigin) {\n this.media.setAttribute('crossorigin', '');\n }\n if (this.config.autoplay) {\n this.media.setAttribute('autoplay', '');\n }\n if (!is.empty(input.poster)) {\n this.poster = input.poster;\n }\n if (this.config.loop.active) {\n this.media.setAttribute('loop', '');\n }\n if (this.config.muted) {\n this.media.setAttribute('muted', '');\n }\n if (this.config.playsinline) {\n this.media.setAttribute('playsinline', '');\n }\n }\n\n // Restore class hook\n ui.addStyleHook.call(this);\n\n // Set new sources for html5\n if (this.isHTML5) {\n source.insertElements.call(this, 'source', sources);\n }\n\n // Set video title\n this.config.title = input.title;\n\n // Set up from scratch\n media.setup.call(this);\n\n // HTML5 stuff\n if (this.isHTML5) {\n // Setup captions\n if ('tracks' in input) {\n source.insertElements.call(this, 'track', input.tracks);\n }\n\n // Load HTML5 sources\n this.media.load();\n }\n\n // If HTML5 or embed but not fully supported, setupInterface and call ready now\n if (this.isHTML5 || (this.isEmbed && !this.supported.ui)) {\n // Setup interface\n ui.build.call(this);\n }\n\n // Update the fullscreen support\n this.fullscreen.update();\n },\n true,\n );\n },\n};\n\nexport default source;\n","// ==========================================================================\n// Plyr\n// plyr.js v3.3.12\n// https://github.com/sampotts/plyr\n// License: The MIT License (MIT)\n// ==========================================================================\n\nimport captions from './captions';\nimport defaults from './config/defaults';\nimport { getProviderByUrl, providers, types } from './config/types';\nimport Console from './console';\nimport controls from './controls';\nimport Fullscreen from './fullscreen';\nimport Listeners from './listeners';\nimport media from './media';\nimport Ads from './plugins/ads';\nimport source from './source';\nimport Storage from './storage';\nimport support from './support';\nimport ui from './ui';\nimport { closest } from './utils/arrays';\nimport { createElement, hasClass, removeElement, replaceElement, toggleClass, wrap } from './utils/elements';\nimport { off, on, once, triggerEvent, unbindListeners } from './utils/events';\nimport is from './utils/is';\nimport loadSprite from './utils/loadSprite';\nimport { cloneDeep, extend } from './utils/objects';\nimport { parseUrl } from './utils/urls';\n\n// Private properties\n// TODO: Use a WeakMap for private globals\n// const globals = new WeakMap();\n\n// Plyr instance\nclass Plyr {\n constructor(target, options) {\n this.timers = {};\n\n // State\n this.ready = false;\n this.loading = false;\n this.failed = false;\n\n // Touch device\n this.touch = support.touch;\n\n // Set the media element\n this.media = target;\n\n // String selector passed\n if (is.string(this.media)) {\n this.media = document.querySelectorAll(this.media);\n }\n\n // jQuery, NodeList or Array passed, use first element\n if ((window.jQuery && this.media instanceof jQuery) || is.nodeList(this.media) || is.array(this.media)) {\n // eslint-disable-next-line\n this.media = this.media[0];\n }\n\n // Set config\n this.config = extend(\n {},\n defaults,\n Plyr.defaults,\n options || {},\n (() => {\n try {\n return JSON.parse(this.media.getAttribute('data-plyr-config'));\n } catch (e) {\n return {};\n }\n })(),\n );\n\n // Elements cache\n this.elements = {\n container: null,\n buttons: {},\n display: {},\n progress: {},\n inputs: {},\n settings: {\n menu: null,\n panes: {},\n tabs: {},\n },\n captions: null,\n };\n\n // Captions\n this.captions = {\n active: null,\n currentTrack: -1,\n meta: new WeakMap(),\n };\n\n // Fullscreen\n this.fullscreen = {\n active: false,\n };\n\n // Options\n this.options = {\n speed: [],\n quality: [],\n };\n\n // Debugging\n // TODO: move to globals\n this.debug = new Console(this.config.debug);\n\n // Log config options and support\n this.debug.log('Config', this.config);\n this.debug.log('Support', support);\n\n // We need an element to setup\n if (is.nullOrUndefined(this.media) || !is.element(this.media)) {\n this.debug.error('Setup failed: no suitable element passed');\n return;\n }\n\n // Bail if the element is initialized\n if (this.media.plyr) {\n this.debug.warn('Target already setup');\n return;\n }\n\n // Bail if not enabled\n if (!this.config.enabled) {\n this.debug.error('Setup failed: disabled by config');\n return;\n }\n\n // Bail if disabled or no basic support\n // You may want to disable certain UAs etc\n if (!support.check().api) {\n this.debug.error('Setup failed: no support');\n return;\n }\n\n // Cache original element state for .destroy()\n const clone = this.media.cloneNode(true);\n clone.autoplay = false;\n this.elements.original = clone;\n\n // Set media type based on tag or data attribute\n // Supported: video, audio, vimeo, youtube\n const type = this.media.tagName.toLowerCase();\n\n // Embed properties\n let iframe = null;\n let url = null;\n\n // Different setup based on type\n switch (type) {\n case 'div':\n // Find the frame\n iframe = this.media.querySelector('iframe');\n\n // <iframe> type\n if (is.element(iframe)) {\n // Detect provider\n url = parseUrl(iframe.getAttribute('src'));\n this.provider = getProviderByUrl(url.toString());\n\n // Rework elements\n this.elements.container = this.media;\n this.media = iframe;\n\n // Reset classname\n this.elements.container.className = '';\n\n // Get attributes from URL and set config\n if (url.searchParams.length) {\n const truthy = ['1', 'true'];\n\n if (truthy.includes(url.searchParams.get('autoplay'))) {\n this.config.autoplay = true;\n }\n if (truthy.includes(url.searchParams.get('loop'))) {\n this.config.loop.active = true;\n }\n\n // TODO: replace fullscreen.iosNative with this playsinline config option\n // YouTube requires the playsinline in the URL\n if (this.isYouTube) {\n this.config.playsinline = truthy.includes(url.searchParams.get('playsinline'));\n } else {\n this.config.playsinline = true;\n }\n }\n } else {\n // <div> with attributes\n this.provider = this.media.getAttribute(this.config.attributes.embed.provider);\n\n // Remove attribute\n this.media.removeAttribute(this.config.attributes.embed.provider);\n }\n\n // Unsupported or missing provider\n if (is.empty(this.provider) || !Object.keys(providers).includes(this.provider)) {\n this.debug.error('Setup failed: Invalid provider');\n return;\n }\n\n // Audio will come later for external providers\n this.type = types.video;\n\n break;\n\n case 'video':\n case 'audio':\n this.type = type;\n this.provider = providers.html5;\n\n // Get config from attributes\n if (this.media.hasAttribute('crossorigin')) {\n this.config.crossorigin = true;\n }\n if (this.media.hasAttribute('autoplay')) {\n this.config.autoplay = true;\n }\n if (this.media.hasAttribute('playsinline')) {\n this.config.playsinline = true;\n }\n if (this.media.hasAttribute('muted')) {\n this.config.muted = true;\n }\n if (this.media.hasAttribute('loop')) {\n this.config.loop.active = true;\n }\n\n break;\n\n default:\n this.debug.error('Setup failed: unsupported type');\n return;\n }\n\n // Check for support again but with type\n this.supported = support.check(this.type, this.provider, this.config.playsinline);\n\n // If no support for even API, bail\n if (!this.supported.api) {\n this.debug.error('Setup failed: no support');\n return;\n }\n\n this.eventListeners = [];\n\n // Create listeners\n this.listeners = new Listeners(this);\n\n // Setup local storage for user settings\n this.storage = new Storage(this);\n\n // Store reference\n this.media.plyr = this;\n\n // Wrap media\n if (!is.element(this.elements.container)) {\n this.elements.container = createElement('div');\n wrap(this.media, this.elements.container);\n }\n\n // Add style hook\n ui.addStyleHook.call(this);\n\n // Setup media\n media.setup.call(this);\n\n // Listen for events if debugging\n if (this.config.debug) {\n on.call(this, this.elements.container, this.config.events.join(' '), event => {\n this.debug.log(`event: ${event.type}`);\n });\n }\n\n // Setup interface\n // If embed but not fully supported, build interface now to avoid flash of controls\n if (this.isHTML5 || (this.isEmbed && !this.supported.ui)) {\n ui.build.call(this);\n }\n\n // Container listeners\n this.listeners.container();\n\n // Global listeners\n this.listeners.global();\n\n // Setup fullscreen\n this.fullscreen = new Fullscreen(this);\n\n // Setup ads if provided\n this.ads = new Ads(this);\n\n // Autoplay if required\n if (this.config.autoplay) {\n this.play();\n }\n }\n\n // ---------------------------------------\n // API\n // ---------------------------------------\n\n /**\n * Types and provider helpers\n */\n get isHTML5() {\n return Boolean(this.provider === providers.html5);\n }\n get isEmbed() {\n return Boolean(this.isYouTube || this.isVimeo);\n }\n get isYouTube() {\n return Boolean(this.provider === providers.youtube);\n }\n get isVimeo() {\n return Boolean(this.provider === providers.vimeo);\n }\n get isVideo() {\n return Boolean(this.type === types.video);\n }\n get isAudio() {\n return Boolean(this.type === types.audio);\n }\n\n /**\n * Play the media, or play the advertisement (if they are not blocked)\n */\n play() {\n if (!is.function(this.media.play)) {\n return null;\n }\n\n // Return the promise (for HTML5)\n return this.media.play();\n }\n\n /**\n * Pause the media\n */\n pause() {\n if (!this.playing || !is.function(this.media.pause)) {\n return;\n }\n\n this.media.pause();\n }\n\n /**\n * Get playing state\n */\n get playing() {\n return Boolean(this.ready && !this.paused && !this.ended);\n }\n\n /**\n * Get paused state\n */\n get paused() {\n return Boolean(this.media.paused);\n }\n\n /**\n * Get stopped state\n */\n get stopped() {\n return Boolean(this.paused && this.currentTime === 0);\n }\n\n /**\n * Get ended state\n */\n get ended() {\n return Boolean(this.media.ended);\n }\n\n /**\n * Toggle playback based on current status\n * @param {boolean} input\n */\n togglePlay(input) {\n // Toggle based on current state if nothing passed\n const toggle = is.boolean(input) ? input : !this.playing;\n\n if (toggle) {\n this.play();\n } else {\n this.pause();\n }\n }\n\n /**\n * Stop playback\n */\n stop() {\n if (this.isHTML5) {\n this.pause();\n this.restart();\n } else if (is.function(this.media.stop)) {\n this.media.stop();\n }\n }\n\n /**\n * Restart playback\n */\n restart() {\n this.currentTime = 0;\n }\n\n /**\n * Rewind\n * @param {number} seekTime - how far to rewind in seconds. Defaults to the config.seekTime\n */\n rewind(seekTime) {\n this.currentTime = this.currentTime - (is.number(seekTime) ? seekTime : this.config.seekTime);\n }\n\n /**\n * Fast forward\n * @param {number} seekTime - how far to fast forward in seconds. Defaults to the config.seekTime\n */\n forward(seekTime) {\n this.currentTime = this.currentTime + (is.number(seekTime) ? seekTime : this.config.seekTime);\n }\n\n /**\n * Seek to a time\n * @param {number} input - where to seek to in seconds. Defaults to 0 (the start)\n */\n set currentTime(input) {\n // Bail if media duration isn't available yet\n if (!this.duration) {\n return;\n }\n\n // Validate input\n const inputIsValid = is.number(input) && input > 0;\n\n // Set\n this.media.currentTime = inputIsValid ? Math.min(input, this.duration) : 0;\n\n // Logging\n this.debug.log(`Seeking to ${this.currentTime} seconds`);\n }\n\n /**\n * Get current time\n */\n get currentTime() {\n return Number(this.media.currentTime);\n }\n\n /**\n * Get buffered\n */\n get buffered() {\n const { buffered } = this.media;\n\n // YouTube / Vimeo return a float between 0-1\n if (is.number(buffered)) {\n return buffered;\n }\n\n // HTML5\n // TODO: Handle buffered chunks of the media\n // (i.e. seek to another section buffers only that section)\n if (buffered && buffered.length && this.duration > 0) {\n return buffered.end(0) / this.duration;\n }\n\n return 0;\n }\n\n /**\n * Get seeking status\n */\n get seeking() {\n return Boolean(this.media.seeking);\n }\n\n /**\n * Get the duration of the current media\n */\n get duration() {\n // Faux duration set via config\n const fauxDuration = parseFloat(this.config.duration);\n\n // Media duration can be NaN before the media has loaded\n const duration = (this.media || {}).duration || 0;\n\n // If config duration is funky, use regular duration\n return fauxDuration || duration;\n }\n\n /**\n * Set the player volume\n * @param {number} value - must be between 0 and 1. Defaults to the value from local storage and config.volume if not set in storage\n */\n set volume(value) {\n let volume = value;\n const max = 1;\n const min = 0;\n\n if (is.string(volume)) {\n volume = Number(volume);\n }\n\n // Load volume from storage if no value specified\n if (!is.number(volume)) {\n volume = this.storage.get('volume');\n }\n\n // Use config if all else fails\n if (!is.number(volume)) {\n ({ volume } = this.config);\n }\n\n // Maximum is volumeMax\n if (volume > max) {\n volume = max;\n }\n // Minimum is volumeMin\n if (volume < min) {\n volume = min;\n }\n\n // Update config\n this.config.volume = volume;\n\n // Set the player volume\n this.media.volume = volume;\n\n // If muted, and we're increasing volume manually, reset muted state\n if (!is.empty(value) && this.muted && volume > 0) {\n this.muted = false;\n }\n }\n\n /**\n * Get the current player volume\n */\n get volume() {\n return Number(this.media.volume);\n }\n\n /**\n * Increase volume\n * @param {boolean} step - How much to decrease by (between 0 and 1)\n */\n increaseVolume(step) {\n const volume = this.media.muted ? 0 : this.volume;\n this.volume = volume + (is.number(step) ? step : 1);\n }\n\n /**\n * Decrease volume\n * @param {boolean} step - How much to decrease by (between 0 and 1)\n */\n decreaseVolume(step) {\n const volume = this.media.muted ? 0 : this.volume;\n this.volume = volume - (is.number(step) ? step : 1);\n }\n\n /**\n * Set muted state\n * @param {boolean} mute\n */\n set muted(mute) {\n let toggle = mute;\n\n // Load muted state from storage\n if (!is.boolean(toggle)) {\n toggle = this.storage.get('muted');\n }\n\n // Use config if all else fails\n if (!is.boolean(toggle)) {\n toggle = this.config.muted;\n }\n\n // Update config\n this.config.muted = toggle;\n\n // Set mute on the player\n this.media.muted = toggle;\n }\n\n /**\n * Get current muted state\n */\n get muted() {\n return Boolean(this.media.muted);\n }\n\n /**\n * Check if the media has audio\n */\n get hasAudio() {\n // Assume yes for all non HTML5 (as we can't tell...)\n if (!this.isHTML5) {\n return true;\n }\n\n if (this.isAudio) {\n return true;\n }\n\n // Get audio tracks\n return (\n Boolean(this.media.mozHasAudio) ||\n Boolean(this.media.webkitAudioDecodedByteCount) ||\n Boolean(this.media.audioTracks && this.media.audioTracks.length)\n );\n }\n\n /**\n * Set playback speed\n * @param {number} speed - the speed of playback (0.5-2.0)\n */\n set speed(input) {\n let speed = null;\n\n if (is.number(input)) {\n speed = input;\n }\n\n if (!is.number(speed)) {\n speed = this.storage.get('speed');\n }\n\n if (!is.number(speed)) {\n speed = this.config.speed.selected;\n }\n\n // Set min/max\n if (speed < 0.1) {\n speed = 0.1;\n }\n if (speed > 2.0) {\n speed = 2.0;\n }\n\n if (!this.config.speed.options.includes(speed)) {\n this.debug.warn(`Unsupported speed (${speed})`);\n return;\n }\n\n // Update config\n this.config.speed.selected = speed;\n\n // Set media speed\n this.media.playbackRate = speed;\n }\n\n /**\n * Get current playback speed\n */\n get speed() {\n return Number(this.media.playbackRate);\n }\n\n /**\n * Set playback quality\n * Currently HTML5 & YouTube only\n * @param {number} input - Quality level\n */\n set quality(input) {\n const config = this.config.quality;\n const options = this.options.quality;\n\n if (!options.length) {\n return;\n }\n\n let quality = [\n !is.empty(input) && Number(input),\n this.storage.get('quality'),\n config.selected,\n config.default,\n ].find(is.number);\n\n if (!options.includes(quality)) {\n const value = closest(options, quality);\n this.debug.warn(`Unsupported quality option: ${quality}, using ${value} instead`);\n quality = value;\n }\n\n // Trigger request event\n triggerEvent.call(this, this.media, 'qualityrequested', false, { quality });\n\n // Update config\n config.selected = quality;\n\n // Set quality\n this.media.quality = quality;\n }\n\n /**\n * Get current quality level\n */\n get quality() {\n return this.media.quality;\n }\n\n /**\n * Toggle loop\n * TODO: Finish fancy new logic. Set the indicator on load as user may pass loop as config\n * @param {boolean} input - Whether to loop or not\n */\n set loop(input) {\n const toggle = is.boolean(input) ? input : this.config.loop.active;\n this.config.loop.active = toggle;\n this.media.loop = toggle;\n\n // Set default to be a true toggle\n /* const type = ['start', 'end', 'all', 'none', 'toggle'].includes(input) ? input : 'toggle';\n\n switch (type) {\n case 'start':\n if (this.config.loop.end && this.config.loop.end <= this.currentTime) {\n this.config.loop.end = null;\n }\n this.config.loop.start = this.currentTime;\n // this.config.loop.indicator.start = this.elements.display.played.value;\n break;\n\n case 'end':\n if (this.config.loop.start >= this.currentTime) {\n return this;\n }\n this.config.loop.end = this.currentTime;\n // this.config.loop.indicator.end = this.elements.display.played.value;\n break;\n\n case 'all':\n this.config.loop.start = 0;\n this.config.loop.end = this.duration - 2;\n this.config.loop.indicator.start = 0;\n this.config.loop.indicator.end = 100;\n break;\n\n case 'toggle':\n if (this.config.loop.active) {\n this.config.loop.start = 0;\n this.config.loop.end = null;\n } else {\n this.config.loop.start = 0;\n this.config.loop.end = this.duration - 2;\n }\n break;\n\n default:\n this.config.loop.start = 0;\n this.config.loop.end = null;\n break;\n } */\n }\n\n /**\n * Get current loop state\n */\n get loop() {\n return Boolean(this.media.loop);\n }\n\n /**\n * Set new media source\n * @param {object} input - The new source object (see docs)\n */\n set source(input) {\n source.change.call(this, input);\n }\n\n /**\n * Get current source\n */\n get source() {\n return this.media.currentSrc;\n }\n\n /**\n * Set the poster image for a video\n * @param {input} - the URL for the new poster image\n */\n set poster(input) {\n if (!this.isVideo) {\n this.debug.warn('Poster can only be set for video');\n return;\n }\n\n ui.setPoster.call(this, input, false).catch(() => {});\n }\n\n /**\n * Get the current poster image\n */\n get poster() {\n if (!this.isVideo) {\n return null;\n }\n\n return this.media.getAttribute('poster');\n }\n\n /**\n * Set the autoplay state\n * @param {boolean} input - Whether to autoplay or not\n */\n set autoplay(input) {\n const toggle = is.boolean(input) ? input : this.config.autoplay;\n this.config.autoplay = toggle;\n }\n\n /**\n * Get the current autoplay state\n */\n get autoplay() {\n return Boolean(this.config.autoplay);\n }\n\n /**\n * Toggle captions\n * @param {boolean} input - Whether to enable captions\n */\n toggleCaptions(input) {\n captions.toggle.call(this, input, false);\n }\n\n /**\n * Set the caption track by index\n * @param {number} - Caption index\n */\n set currentTrack(input) {\n captions.set.call(this, input, false);\n }\n\n /**\n * Get the current caption track index (-1 if disabled)\n */\n get currentTrack() {\n const { toggled, currentTrack } = this.captions;\n return toggled ? currentTrack : -1;\n }\n\n /**\n * Set the wanted language for captions\n * Since tracks can be added later it won't update the actual caption track until there is a matching track\n * @param {string} - Two character ISO language code (e.g. EN, FR, PT, etc)\n */\n set language(input) {\n captions.setLanguage.call(this, input, false);\n }\n\n /**\n * Get the current track's language\n */\n get language() {\n return (captions.getCurrentTrack.call(this) || {}).language;\n }\n\n /**\n * Toggle picture-in-picture playback on WebKit/MacOS\n * TODO: update player with state, support, enabled\n * TODO: detect outside changes\n */\n set pip(input) {\n const states = {\n pip: 'picture-in-picture',\n inline: 'inline',\n };\n\n // Bail if no support\n if (!support.pip) {\n return;\n }\n\n // Toggle based on current state if not passed\n const toggle = is.boolean(input) ? input : this.pip === states.inline;\n\n // Toggle based on current state\n this.media.webkitSetPresentationMode(toggle ? states.pip : states.inline);\n }\n\n /**\n * Get the current picture-in-picture state\n */\n get pip() {\n if (!support.pip) {\n return null;\n }\n\n return this.media.webkitPresentationMode;\n }\n\n /**\n * Trigger the airplay dialog\n * TODO: update player with state, support, enabled\n */\n airplay() {\n // Show dialog if supported\n if (support.airplay) {\n this.media.webkitShowPlaybackTargetPicker();\n }\n }\n\n /**\n * Toggle the player controls\n * @param {boolean} [toggle] - Whether to show the controls\n */\n toggleControls(toggle) {\n // Don't toggle if missing UI support or if it's audio\n if (this.supported.ui && !this.isAudio) {\n // Get state before change\n const isHidden = hasClass(this.elements.container, this.config.classNames.hideControls);\n\n // Negate the argument if not undefined since adding the class to hides the controls\n const force = typeof toggle === 'undefined' ? undefined : !toggle;\n\n // Apply and get updated state\n const hiding = toggleClass(this.elements.container, this.config.classNames.hideControls, force);\n\n // Close menu\n if (hiding && this.config.controls.includes('settings') && !is.empty(this.config.settings)) {\n controls.toggleMenu.call(this, false);\n }\n // Trigger event on change\n if (hiding !== isHidden) {\n const eventName = hiding ? 'controlshidden' : 'controlsshown';\n triggerEvent.call(this, this.media, eventName);\n }\n return !hiding;\n }\n return false;\n }\n\n /**\n * Add event listeners\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n */\n on(event, callback) {\n on.call(this, this.elements.container, event, callback);\n }\n /**\n * Add event listeners once\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n */\n once(event, callback) {\n once.call(this, this.elements.container, event, callback);\n }\n /**\n * Remove event listeners\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n */\n off(event, callback) {\n off(this.elements.container, event, callback);\n }\n\n /**\n * Destroy an instance\n * Event listeners are removed when elements are removed\n * http://stackoverflow.com/questions/12528049/if-a-dom-element-is-removed-are-its-listeners-also-removed-from-memory\n * @param {function} callback - Callback for when destroy is complete\n * @param {boolean} soft - Whether it's a soft destroy (for source changes etc)\n */\n destroy(callback, soft = false) {\n if (!this.ready) {\n return;\n }\n\n const done = () => {\n // Reset overflow (incase destroyed while in fullscreen)\n document.body.style.overflow = '';\n\n // GC for embed\n this.embed = null;\n\n // If it's a soft destroy, make minimal changes\n if (soft) {\n if (Object.keys(this.elements).length) {\n // Remove elements\n removeElement(this.elements.buttons.play);\n removeElement(this.elements.captions);\n removeElement(this.elements.controls);\n removeElement(this.elements.wrapper);\n\n // Clear for GC\n this.elements.buttons.play = null;\n this.elements.captions = null;\n this.elements.controls = null;\n this.elements.wrapper = null;\n }\n\n // Callback\n if (is.function(callback)) {\n callback();\n }\n } else {\n // Unbind listeners\n unbindListeners.call(this);\n\n // Replace the container with the original element provided\n replaceElement(this.elements.original, this.elements.container);\n\n // Event\n triggerEvent.call(this, this.elements.original, 'destroyed', true);\n\n // Callback\n if (is.function(callback)) {\n callback.call(this.elements.original);\n }\n\n // Reset state\n this.ready = false;\n\n // Clear for garbage collection\n setTimeout(() => {\n this.elements = null;\n this.media = null;\n }, 200);\n }\n };\n\n // Stop playback\n this.stop();\n\n // Provider specific stuff\n if (this.isHTML5) {\n // Clear timeout\n clearTimeout(this.timers.loading);\n\n // Restore native video controls\n ui.toggleNativeControls.call(this, true);\n\n // Clean up\n done();\n } else if (this.isYouTube) {\n // Clear timers\n clearInterval(this.timers.buffering);\n clearInterval(this.timers.playing);\n\n // Destroy YouTube API\n if (this.embed !== null && is.function(this.embed.destroy)) {\n this.embed.destroy();\n }\n\n // Clean up\n done();\n } else if (this.isVimeo) {\n // Destroy Vimeo API\n // then clean up (wait, to prevent postmessage errors)\n if (this.embed !== null) {\n this.embed.unload().then(done);\n }\n\n // Vimeo does not always return\n setTimeout(done, 200);\n }\n }\n\n /**\n * Check for support for a mime type (HTML5 only)\n * @param {string} type - Mime type\n */\n supports(type) {\n return support.mime.call(this, type);\n }\n\n /**\n * Check for support\n * @param {string} type - Player type (audio/video)\n * @param {string} provider - Provider (html5/youtube/vimeo)\n * @param {bool} inline - Where player has `playsinline` sttribute\n */\n static supported(type, provider, inline) {\n return support.check(type, provider, inline);\n }\n\n /**\n * Load an SVG sprite into the page\n * @param {string} url - URL for the SVG sprite\n * @param {string} [id] - Unique ID\n */\n static loadSprite(url, id) {\n return loadSprite(url, id);\n }\n\n /**\n * Setup multiple instances\n * @param {*} selector\n * @param {object} options\n */\n static setup(selector, options = {}) {\n let targets = null;\n\n if (is.string(selector)) {\n targets = Array.from(document.querySelectorAll(selector));\n } else if (is.nodeList(selector)) {\n targets = Array.from(selector);\n } else if (is.array(selector)) {\n targets = selector.filter(is.element);\n }\n\n if (is.empty(targets)) {\n return null;\n }\n\n return targets.map(t => new Plyr(t, options));\n }\n}\n\nPlyr.defaults = cloneDeep(defaults);\n\nexport default Plyr;\n"]} \ No newline at end of file
diff --git a/dist/plyr.min.js b/dist/plyr.min.js
index dca29c6c..a581711a 100644
--- a/dist/plyr.min.js
+++ b/dist/plyr.min.js
@@ -1,2 +1,2 @@
-"object"==typeof navigator&&function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define("Plyr",t):e.Plyr=t()}(this,function(){"use strict";"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self&&self;var e,t,i=(function(e,t){var i;i=function(){var e=function(){},t={},i={},n={};function s(e,t){if(e){var s=n[e];if(i[e]=t,s)for(;s.length;)s[0](e,t),s.splice(0,1)}}function a(t,i){t.call&&(t={success:t}),i.length?(t.error||e)(i):(t.success||e)(t)}function r(t,i,n,s){var a,l,o=document,c=n.async,u=(n.numRetries||0)+1,d=n.before||e,p=t.replace(/^(css|img)!/,"");s=s||0,/(^css!|\.css$)/.test(t)?(a=!0,(l=o.createElement("link")).rel="stylesheet",l.href=p):/(^img!|\.(png|gif|jpg|svg)$)/.test(t)?(l=o.createElement("img")).src=p:((l=o.createElement("script")).src=t,l.async=void 0===c||c),l.onload=l.onerror=l.onbeforeload=function(e){var o=e.type[0];if(a&&"hideFocus"in l)try{l.sheet.cssText.length||(o="e")}catch(e){o="e"}if("e"==o&&(s+=1)<u)return r(t,i,n,s);i(t,o,e.defaultPrevented)},!1!==d(t,l)&&o.head.appendChild(l)}function l(e,i,n){var l,o;if(i&&i.trim&&(l=i),o=(l?n:i)||{},l){if(l in t)throw"LoadJS";t[l]=!0}!function(e,t,i){var n,s,a=(e=e.push?e:[e]).length,l=a,o=[];for(n=function(e,i,n){if("e"==i&&o.push(e),"b"==i){if(!n)return;o.push(e)}--a||t(o)},s=0;s<l;s++)r(e[s],n,i)}(e,function(e){a(o,e),s(l,e)},o)}return l.ready=function(e,t){return function(e,t){e=e.push?e:[e];var s,a,r,l=[],o=e.length,c=o;for(s=function(e,i){i.length&&l.push(e),--c||t(l)};o--;)a=e[o],(r=i[a])?s(a,r):(n[a]=n[a]||[]).push(s)}(e,function(e){a(t,e)}),l},l.done=function(e){s(e,[])},l.reset=function(){t={},i={},n={}},l.isDefined=function(e){return e in t},l},e.exports=i()}(e={exports:{}},e.exports),e.exports),n=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},s=function(){function e(e,t){for(var i=0;i<t.length;i++){var n=t[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(t,i,n){return i&&e(t.prototype,i),n&&e(t,n),t}}(),a=function(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e},r=function(){return function(e,t){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return function(e,t){var i=[],n=!0,s=!1,a=void 0;try{for(var r,l=e[Symbol.iterator]();!(n=(r=l.next()).done)&&(i.push(r.value),!t||i.length!==t);n=!0);}catch(e){s=!0,a=e}finally{try{!n&&l.return&&l.return()}finally{if(s)throw a}}return i}(e,t);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),l=function(){function e(t){n(this,e),this.enabled=t.config.storage.enabled,this.key=t.config.storage.key}return s(e,[{key:"get",value:function(t){if(!e.supported||!this.enabled)return null;var i=window.localStorage.getItem(this.key);if(u.is.empty(i))return null;var n=JSON.parse(i);return u.is.string(t)&&t.length?n[t]:n}},{key:"set",value:function(t){if(e.supported&&this.enabled&&u.is.object(t)){var i=this.get();u.is.empty(i)&&(i={}),u.extend(i,t),window.localStorage.setItem(this.key,JSON.stringify(i))}}}],[{key:"supported",get:function(){try{if(!("localStorage"in window))return!1;return window.localStorage.setItem("___test","___test"),window.localStorage.removeItem("___test"),!0}catch(e){return!1}}}]),e}(),o={html5:"html5",youtube:"youtube",vimeo:"vimeo"},c={audio:"audio",video:"video"},u={is:{object:function(e){return u.getConstructor(e)===Object},number:function(e){return u.getConstructor(e)===Number&&!Number.isNaN(e)},string:function(e){return u.getConstructor(e)===String},boolean:function(e){return u.getConstructor(e)===Boolean},function:function(e){return u.getConstructor(e)===Function},array:function(e){return!u.is.nullOrUndefined(e)&&Array.isArray(e)},weakMap:function(e){return u.is.instanceof(e,WeakMap)},nodeList:function(e){return u.is.instanceof(e,NodeList)},element:function(e){return u.is.instanceof(e,Element)},textNode:function(e){return u.getConstructor(e)===Text},event:function(e){return u.is.instanceof(e,Event)},cue:function(e){return u.is.instanceof(e,window.TextTrackCue)||u.is.instanceof(e,window.VTTCue)},track:function(e){return u.is.instanceof(e,TextTrack)||!u.is.nullOrUndefined(e)&&u.is.string(e.kind)},url:function(e){return!u.is.nullOrUndefined(e)&&/(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-/]))?/.test(e)},nullOrUndefined:function(e){return null==e},empty:function(e){return u.is.nullOrUndefined(e)||(u.is.string(e)||u.is.array(e)||u.is.nodeList(e))&&!e.length||u.is.object(e)&&!Object.keys(e).length},instanceof:function(e,t){return Boolean(e&&t&&e instanceof t)}},getConstructor:function(e){return u.is.nullOrUndefined(e)?null:e.constructor},getBrowser:function(){return{isIE:!!document.documentMode,isWebkit:"WebkitAppearance"in document.documentElement.style&&!/Edge/.test(navigator.userAgent),isIPhone:/(iPhone|iPod)/gi.test(navigator.platform),isIos:/(iPad|iPhone|iPod)/gi.test(navigator.platform)}},fetch:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"text";return new Promise(function(i,n){try{var s=new XMLHttpRequest;if(!("withCredentials"in s))return;s.addEventListener("load",function(){if("text"===t)try{i(JSON.parse(s.responseText))}catch(e){i(s.responseText)}else i(s.response)}),s.addEventListener("error",function(){throw new Error(s.statusText)}),s.open("GET",e,!0),s.responseType=t,s.send()}catch(e){n(e)}})},loadImage:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;return new Promise(function(i,n){var s=new Image,a=function(){delete s.onload,delete s.onerror,(s.naturalWidth>=t?i:n)(s)};Object.assign(s,{onload:a,onerror:a,src:e})})},loadScript:function(e){return new Promise(function(t,n){i(e,{success:t,error:n})})},loadSprite:function(e,t){if(u.is.string(e)){var i=u.is.string(t),n=function(){return null!==document.getElementById(t)},s=function(e,t){e.innerHTML=t,i&&n()||document.body.insertAdjacentElement("afterbegin",e)};if(!i||!n()){var a=l.supported,r=document.createElement("div");if(u.toggleHidden(r,!0),i&&r.setAttribute("id",t),a){var o=window.localStorage.getItem("cache-"+t);if(null!==o){var c=JSON.parse(o);s(r,c.content)}}u.fetch(e).then(function(e){u.is.empty(e)||(a&&window.localStorage.setItem("cache-"+t,JSON.stringify({content:e})),s(r,e))}).catch(function(){})}}},generateId:function(e){return e+"-"+Math.floor(1e4*Math.random())},wrap:function(e,t){var i=e.length?e:[e];Array.from(i).reverse().forEach(function(e,i){var n=i>0?t.cloneNode(!0):t,s=e.parentNode,a=e.nextSibling;n.appendChild(e),a?s.insertBefore(n,a):s.appendChild(n)})},createElement:function(e,t,i){var n=document.createElement(e);return u.is.object(t)&&u.setAttributes(n,t),u.is.string(i)&&(n.innerText=i),n},insertAfter:function(e,t){t.parentNode.insertBefore(e,t.nextSibling)},insertElement:function(e,t,i,n){t.appendChild(u.createElement(e,i,n))},removeElement:function(e){u.is.nodeList(e)||u.is.array(e)?Array.from(e).forEach(u.removeElement):u.is.element(e)&&u.is.element(e.parentNode)&&e.parentNode.removeChild(e)},emptyElement:function(e){for(var t=e.childNodes.length;t>0;)e.removeChild(e.lastChild),t-=1},replaceElement:function(e,t){return u.is.element(t)&&u.is.element(t.parentNode)&&u.is.element(e)?(t.parentNode.replaceChild(e,t),e):null},setAttributes:function(e,t){u.is.element(e)&&!u.is.empty(t)&&Object.entries(t).forEach(function(t){var i=r(t,2),n=i[0],s=i[1];e.setAttribute(n,s)})},getAttributesFromSelector:function(e,t){if(!u.is.string(e)||u.is.empty(e))return{};var i={},n=t;return e.split(",").forEach(function(e){var t=e.trim(),s=t.replace(".",""),a=t.replace(/[[\]]/g,"").split("="),r=a[0],l=a.length>1?a[1].replace(/["']/g,""):"";switch(t.charAt(0)){case".":u.is.object(n)&&u.is.string(n.class)&&(n.class+=" "+s),i.class=s;break;case"#":i.id=t.replace("#","");break;case"[":i[r]=l}}),i},toggleHidden:function(e,t){if(u.is.element(e)){var i=t;u.is.boolean(i)||(i=!e.hasAttribute("hidden")),i?e.setAttribute("hidden",""):e.removeAttribute("hidden")}},toggleClass:function(e,t,i){if(u.is.element(e)){var n="toggle";return void 0!==i&&(n=i?"add":"remove"),e.classList[n](t),e.classList.contains(t)}return null},hasClass:function(e,t){return u.is.element(e)&&e.classList.contains(t)},matches:function(e,t){var i={Element:Element};var n=i.matches||i.webkitMatchesSelector||i.mozMatchesSelector||i.msMatchesSelector||function(){return Array.from(document.querySelectorAll(t)).includes(this)};return n.call(e,t)},getElements:function(e){return this.elements.container.querySelectorAll(e)},getElement:function(e){return this.elements.container.querySelector(e)},getFocusElement:function(){var e=document.activeElement;return e=e&&e!==document.body?document.querySelector(":focus"):null},trapFocus:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(u.is.element(e)){var i=u.getElements.call(this,"button:not(:disabled), input:not(:disabled), [tabindex]"),n=i[0],s=i[i.length-1],a=function(e){if("Tab"===e.key&&9===e.keyCode){var t=u.getFocusElement();t!==s||e.shiftKey?t===n&&e.shiftKey&&(s.focus(),e.preventDefault()):(n.focus(),e.preventDefault())}};t?u.on(this.elements.container,"keydown",a,!1):u.off(this.elements.container,"keydown",a,!1)}},toggleListener:function(e,t,i){var n=arguments.length>3&&void 0!==arguments[3]&&arguments[3],s=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],a=arguments.length>5&&void 0!==arguments[5]&&arguments[5];if(!u.is.empty(e)&&!u.is.empty(t)&&u.is.function(i))if(u.is.nodeList(e)||u.is.array(e))Array.from(e).forEach(function(e){e instanceof Node&&u.toggleListener.call(null,e,t,i,n,s,a)});else{var r=t.split(" "),l=a;d.passiveListeners&&(l={passive:s,capture:a}),r.forEach(function(t){e[n?"addEventListener":"removeEventListener"](t,i,l)})}},on:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",i=arguments[2],n=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],s=arguments.length>4&&void 0!==arguments[4]&&arguments[4];u.toggleListener(e,t,i,!0,n,s)},off:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",i=arguments[2],n=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],s=arguments.length>4&&void 0!==arguments[4]&&arguments[4];u.toggleListener(e,t,i,!1,n,s)},dispatchEvent:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",i=arguments.length>2&&void 0!==arguments[2]&&arguments[2],n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};if(u.is.element(e)&&!u.is.empty(t)){var s=new CustomEvent(t,{bubbles:i,detail:Object.assign({},n,{plyr:this})});e.dispatchEvent(s)}},format:function(e){for(var t=arguments.length,i=Array(t>1?t-1:0),n=1;n<t;n++)i[n-1]=arguments[n];return u.is.empty(e)?e:e.toString().replace(/{(\d+)}/g,function(e,t){return u.is.string(i[t])?i[t]:""})},getPercentage:function(e,t){return 0===e||0===t||Number.isNaN(e)||Number.isNaN(t)?0:(e/t*100).toFixed(2)},getHours:function(e){return parseInt(e/60/60%60,10)},getMinutes:function(e){return parseInt(e/60%60,10)},getSeconds:function(e){return parseInt(e%60,10)},formatTime:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if(!u.is.number(e))return u.formatTime(null,t,i);var n=function(e){return("0"+e).slice(-2)},s=u.getHours(e),a=u.getMinutes(e),r=u.getSeconds(e);return t||s>0?s+=":":s="",(i?"-":"")+s+n(a)+":"+n(r)},replaceAll:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"";return e.replace(new RegExp(t.toString().replace(/([.*+?^=!:${}()|[\]/\\])/g,"\\$1"),"g"),i.toString())},toTitleCase:function(){return(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"").toString().replace(/\w\S*/g,function(e){return e.charAt(0).toUpperCase()+e.substr(1).toLowerCase()})},toPascalCase:function(){var e=(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"").toString();return e=u.replaceAll(e,"-"," "),e=u.replaceAll(e,"_"," "),e=u.toTitleCase(e),u.replaceAll(e," ","")},toCamelCase:function(){var e=(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"").toString();return(e=u.toPascalCase(e)).charAt(0).toLowerCase()+e.slice(1)},extend:function(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length,i=Array(t>1?t-1:0),n=1;n<t;n++)i[n-1]=arguments[n];if(!i.length)return e;var s=i.shift();return u.is.object(s)?(Object.keys(s).forEach(function(t){u.is.object(s[t])?(Object.keys(e).includes(t)||Object.assign(e,a({},t,{})),u.extend(e[t],s[t])):Object.assign(e,a({},t,s[t]))}),u.extend.apply(u,[e].concat(function(e){if(Array.isArray(e)){for(var t=0,i=Array(e.length);t<e.length;t++)i[t]=e[t];return i}return Array.from(e)}(i)))):e},dedupe:function(e){return u.is.array(e)?e.filter(function(t,i){return e.indexOf(t)===i}):e},cloneDeep:function(e){return JSON.parse(JSON.stringify(e))},getDeep:function(e,t){return t.split(".").reduce(function(e,t){return e&&e[t]},e)},closest:function(e,t){return u.is.array(e)&&e.length?e.reduce(function(e,i){return Math.abs(i-t)<Math.abs(e-t)?i:e}):null},getProviderByUrl:function(e){return/^(https?:\/\/)?(www\.)?(youtube\.com|youtu\.?be)\/.+$/.test(e)?o.youtube:/^https?:\/\/player.vimeo.com\/video\/\d{0,9}(?=\b|\/)/.test(e)?o.vimeo:null},parseYouTubeId:function(e){if(u.is.empty(e))return null;return e.match(/^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|&v=)([^#&?]*).*/)?RegExp.$2:e},parseVimeoId:function(e){if(u.is.empty(e))return null;if(u.is.number(Number(e)))return e;return e.match(/^.*(vimeo.com\/|video\/)(\d+).*/)?RegExp.$2:e},parseUrl:function(e){var t=document.createElement("a");return t.href=e,t},getUrlParams:function(e){var t=e;(e.startsWith("http://")||e.startsWith("https://"))&&(t=u.parseUrl(e).search);return u.is.empty(t)?null:t.slice(t.indexOf("?")+1).split("&").reduce(function(e,t){var i=t.split("="),n=r(i,2),s=n[0],l=n[1];return Object.assign(e,a({},s,decodeURIComponent(l)))},{})},buildUrlParams:function(e){return u.is.object(e)?Object.keys(e).map(function(t){return encodeURIComponent(t)+"="+encodeURIComponent(e[t])}).join("&"):""},stripHTML:function(e){var t=document.createDocumentFragment(),i=document.createElement("div");return t.appendChild(i),i.innerHTML=e,t.firstChild.innerText},getHTML:function(e){var t=document.createElement("div");return t.appendChild(e),t.innerHTML},getAspectRatio:function(e,t){var i=function e(t,i){return 0===i?t:e(i,t%i)}(e,t);return e/i+":"+t/i},get transitionEndEvent(){var e=document.createElement("span"),t={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},i=Object.keys(t).find(function(t){return void 0!==e.style[t]});return!!u.is.string(i)&&t[i]},repaint:function(e){setTimeout(function(){u.toggleHidden(e,!0),e.offsetHeight,u.toggleHidden(e,!1)},0)}},d={audio:"canPlayType"in document.createElement("audio"),video:"canPlayType"in document.createElement("video"),check:function(e,t,i){var n=!1,s=!1,a=u.getBrowser(),r=a.isIPhone&&i&&d.playsinline;switch(t+":"+e){case"html5:video":s=(n=d.video)&&d.rangeInput&&(!a.isIPhone||r);break;case"html5:audio":s=(n=d.audio)&&d.rangeInput;break;case"youtube:video":case"vimeo:video":n=!0,s=d.rangeInput&&(!a.isIPhone||r);break;default:s=(n=d.audio&&d.video)&&d.rangeInput}return{api:n,ui:s}},pip:!u.getBrowser().isIPhone&&u.is.function(u.createElement("video").webkitSetPresentationMode),airplay:u.is.function(window.WebKitPlaybackTargetAvailabilityEvent),playsinline:"playsInline"in document.createElement("video"),mime:function(e){var t=this.media;try{if(!this.isHTML5||!u.is.function(t.canPlayType))return!1;if(e.includes("codecs="))return t.canPlayType(e).replace(/no/,"");if(this.isVideo)switch(e){case"video/webm":return t.canPlayType('video/webm; codecs="vp8, vorbis"').replace(/no/,"");case"video/mp4":return t.canPlayType('video/mp4; codecs="avc1.42E01E, mp4a.40.2"').replace(/no/,"");case"video/ogg":return t.canPlayType('video/ogg; codecs="theora"').replace(/no/,"");default:return!1}else if(this.isAudio)switch(e){case"audio/mpeg":return t.canPlayType("audio/mpeg;").replace(/no/,"");case"audio/ogg":return t.canPlayType('audio/ogg; codecs="vorbis"').replace(/no/,"");case"audio/wav":return t.canPlayType('audio/wav; codecs="1"').replace(/no/,"");default:return!1}}catch(e){return!1}return!1},textTracks:"textTracks"in document.createElement("video"),passiveListeners:function(){var e=!1;try{var t=Object.defineProperty({},"passive",{get:function(){return e=!0,null}});window.addEventListener("test",null,t),window.removeEventListener("test",null,t)}catch(e){}return e}(),rangeInput:(t=document.createElement("input"),t.type="range","range"===t.type),touch:"ontouchstart"in document.documentElement,transitions:!1!==u.transitionEndEvent,reducedMotion:"matchMedia"in window&&window.matchMedia("(prefers-reduced-motion)").matches},p={getSources:function(){return this.isHTML5?this.media.querySelectorAll("source"):null},getQualityOptions:function(){if(!this.isHTML5)return null;var e=p.getSources.call(this);if(u.is.empty(e))return null;var t=Array.from(e).filter(function(e){return!u.is.empty(e.getAttribute("size"))});return u.is.empty(t)?null:u.dedupe(t.map(function(e){return Number(e.getAttribute("size"))}))},extend:function(){if(this.isHTML5){var e=this;Object.defineProperty(e.media,"quality",{get:function(){var t=p.getSources.call(e);if(u.is.empty(t))return null;var i=Array.from(t).filter(function(t){return t.getAttribute("src")===e.source});return u.is.empty(i)?null:Number(i[0].getAttribute("size"))},set:function(t){var i=p.getSources.call(e);if(!u.is.empty(i)){var n=Array.from(i).filter(function(e){return Number(e.getAttribute("size"))===t});if(!u.is.empty(n)){var s=n.filter(function(t){return d.mime.call(e,t.getAttribute("type"))});if(!u.is.empty(s)){u.dispatchEvent.call(e,e.media,"qualityrequested",!1,{quality:t});var a=e.currentTime,r=e.playing;e.media.src=s[0].getAttribute("src");e.on("loadedmetadata",function t(){e.currentTime=a,e.off("loadedmetadata",t)}),e.media.load(),r&&e.play(),u.dispatchEvent.call(e,e.media,"qualitychange",!1,{quality:t})}}}}})}},cancelRequests:function(){this.isHTML5&&(u.removeElement(p.getSources()),this.media.setAttribute("src",this.config.blankVideo),this.media.load(),this.debug.log("Cancelled network requests"))}},h=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(u.is.empty(e)||u.is.empty(t))return"";var i=u.getDeep(t.i18n,e);if(u.is.empty(i))return"";var n={"{seektime}":t.seekTime,"{title}":t.title};return Object.entries(n).forEach(function(e){var t=r(e,2),n=t[0],s=t[1];i=u.replaceAll(i,n,s)}),i},m=u.getBrowser(),g={getIconUrl:function(){var e=new URL(this.config.iconUrl,window.location).host!==window.location.host||m.isIE&&!window.svg4everybody;return{url:this.config.iconUrl,cors:e}},findElements:function(){try{return this.elements.controls=u.getElement.call(this,this.config.selectors.controls.wrapper),this.elements.buttons={play:u.getElements.call(this,this.config.selectors.buttons.play),pause:u.getElement.call(this,this.config.selectors.buttons.pause),restart:u.getElement.call(this,this.config.selectors.buttons.restart),rewind:u.getElement.call(this,this.config.selectors.buttons.rewind),fastForward:u.getElement.call(this,this.config.selectors.buttons.fastForward),mute:u.getElement.call(this,this.config.selectors.buttons.mute),pip:u.getElement.call(this,this.config.selectors.buttons.pip),airplay:u.getElement.call(this,this.config.selectors.buttons.airplay),settings:u.getElement.call(this,this.config.selectors.buttons.settings),captions:u.getElement.call(this,this.config.selectors.buttons.captions),fullscreen:u.getElement.call(this,this.config.selectors.buttons.fullscreen)},this.elements.progress=u.getElement.call(this,this.config.selectors.progress),this.elements.inputs={seek:u.getElement.call(this,this.config.selectors.inputs.seek),volume:u.getElement.call(this,this.config.selectors.inputs.volume)},this.elements.display={buffer:u.getElement.call(this,this.config.selectors.display.buffer),currentTime:u.getElement.call(this,this.config.selectors.display.currentTime),duration:u.getElement.call(this,this.config.selectors.display.duration)},u.is.element(this.elements.progress)&&(this.elements.display.seekTooltip=this.elements.progress.querySelector("."+this.config.classNames.tooltip)),!0}catch(e){return this.debug.warn("It looks like there is a problem with your custom controls HTML",e),this.toggleNativeControls(!0),!1}},createIcon:function(e,t){var i=g.getIconUrl.call(this),n=(i.cors?"":i.url)+"#"+this.config.iconPrefix,s=document.createElementNS("http://www.w3.org/2000/svg","svg");u.setAttributes(s,u.extend(t,{role:"presentation",focusable:"false"}));var a=document.createElementNS("http://www.w3.org/2000/svg","use"),r=n+"-"+e;return"href"in a?a.setAttributeNS("http://www.w3.org/1999/xlink","href",r):a.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href",r),s.appendChild(a),s},createLabel:function(e,t){var i=h(e,this.config),n=Object.assign({},t);switch(e){case"pip":i="PIP";break;case"airplay":i="AirPlay"}return"class"in n?n.class+=" "+this.config.classNames.hidden:n.class=this.config.classNames.hidden,u.createElement("span",n,i)},createBadge:function(e){if(u.is.empty(e))return null;var t=u.createElement("span",{class:this.config.classNames.menu.value});return t.appendChild(u.createElement("span",{class:this.config.classNames.menu.badge},e)),t},createButton:function(e,t){var i=u.createElement("button"),n=Object.assign({},t),s=u.toCamelCase(e),a=!1,r=void 0,l=void 0,o=void 0,c=void 0;switch("type"in n||(n.type="button"),"class"in n?n.class.includes(this.config.classNames.control)&&(n.class+=" "+this.config.classNames.control):n.class=this.config.classNames.control,e){case"play":a=!0,r="play",o="pause",l="play",c="pause";break;case"mute":a=!0,r="mute",o="unmute",l="volume",c="muted";break;case"captions":a=!0,r="enableCaptions",o="disableCaptions",l="captions-off",c="captions-on";break;case"fullscreen":a=!0,r="enterFullscreen",o="exitFullscreen",l="enter-fullscreen",c="exit-fullscreen";break;case"play-large":n.class+=" "+this.config.classNames.control+"--overlaid",s="play",r="play",l="play";break;default:r=s,l=e}a?(i.appendChild(g.createIcon.call(this,c,{class:"icon--pressed"})),i.appendChild(g.createIcon.call(this,l,{class:"icon--not-pressed"})),i.appendChild(g.createLabel.call(this,o,{class:"label--pressed"})),i.appendChild(g.createLabel.call(this,r,{class:"label--not-pressed"}))):(i.appendChild(g.createIcon.call(this,l)),i.appendChild(g.createLabel.call(this,r))),u.extend(n,u.getAttributesFromSelector(this.config.selectors.buttons[s],n)),u.setAttributes(i,n),"play"===s?(u.is.array(this.elements.buttons[s])||(this.elements.buttons[s]=[]),this.elements.buttons[s].push(i)):this.elements.buttons[s]=i;var d=this.config.classNames.controlPressed;return Object.defineProperty(i,"pressed",{enumerable:!0,get:function(){return u.hasClass(i,d)},set:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];u.toggleClass(i,d,e)}}),i},createRange:function(e,t){var i=u.createElement("input",u.extend(u.getAttributesFromSelector(this.config.selectors.inputs[e]),{type:"range",min:0,max:100,step:.01,value:0,autocomplete:"off",role:"slider","aria-label":h(e,this.config),"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":0},t));return this.elements.inputs[e]=i,g.updateRangeFill.call(this,i),i},createProgress:function(e,t){var i=u.createElement("progress",u.extend(u.getAttributesFromSelector(this.config.selectors.display[e]),{min:0,max:100,value:0,role:"presentation","aria-hidden":!0},t));if("volume"!==e){i.appendChild(u.createElement("span",null,"0"));var n="";switch(e){case"played":n=h("played",this.config);break;case"buffer":n=h("buffered",this.config)}i.innerText="% "+n.toLowerCase()}return this.elements.display[e]=i,i},createTime:function(e){var t=u.getAttributesFromSelector(this.config.selectors.display[e]),i=u.createElement("div",u.extend(t,{class:"plyr__time "+t.class,"aria-label":h(e,this.config)}),"00:00");return this.elements.display[e]=i,i},createMenuItem:function(e){var t=e.value,i=e.list,n=e.type,s=e.title,a=e.badge,r=void 0===a?null:a,l=e.checked,o=void 0!==l&&l,c=u.createElement("li"),d=u.createElement("label",{class:this.config.classNames.control}),p=u.createElement("input",u.extend(u.getAttributesFromSelector(this.config.selectors.inputs[n]),{type:"radio",name:"plyr-"+n,value:t,checked:o,class:"plyr__sr-only"})),h=u.createElement("span",{hidden:""});d.appendChild(p),d.appendChild(h),d.insertAdjacentHTML("beforeend",s),u.is.element(r)&&d.appendChild(r),c.appendChild(d),i.appendChild(c)},formatTime:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(!u.is.number(e))return e;var i=u.getHours(this.duration)>0;return u.formatTime(e,i,t)},updateTimeDisplay:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,i=arguments.length>2&&void 0!==arguments[2]&&arguments[2];u.is.element(e)&&u.is.number(t)&&(e.innerText=g.formatTime(t,i))},updateVolume:function(){this.supported.ui&&(u.is.element(this.elements.inputs.volume)&&g.setRange.call(this,this.elements.inputs.volume,this.muted?0:this.volume),u.is.element(this.elements.buttons.mute)&&(this.elements.buttons.mute.pressed=this.muted||0===this.volume))},setRange:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;u.is.element(e)&&(e.value=t,g.updateRangeFill.call(this,e))},updateProgress:function(e){var t=this;if(this.supported.ui&&u.is.event(e)){var i=0;if(e)switch(e.type){case"timeupdate":case"seeking":case"seeked":i=u.getPercentage(this.currentTime,this.duration),"timeupdate"===e.type&&g.setRange.call(this,this.elements.inputs.seek,i);break;case"playing":case"progress":!function(e,i){var n=u.is.number(i)?i:0,s=u.is.element(e)?e:t.elements.display.buffer;if(u.is.element(s)){s.value=n;var a=s.getElementsByTagName("span")[0];u.is.element(a)&&(a.childNodes[0].nodeValue=n)}}(this.elements.display.buffer,100*this.buffered)}}},updateRangeFill:function(e){var t=u.is.event(e)?e.target:e;if(u.is.element(t)&&"range"===t.getAttribute("type")){if(u.matches(t,this.config.selectors.inputs.seek)){t.setAttribute("aria-valuenow",this.currentTime);var i=g.formatTime(this.currentTime),n=g.formatTime(this.duration),s=h("seekLabel",this.config);t.setAttribute("aria-valuetext",s.replace("{currentTime}",i).replace("{duration}",n))}else if(u.matches(t,this.config.selectors.inputs.volume)){var a=100*t.value;t.setAttribute("aria-valuenow",a),t.setAttribute("aria-valuetext",a+"%")}else t.setAttribute("aria-valuenow",t.value);m.isWebkit&&t.style.setProperty("--value",t.value/t.max*100+"%")}},updateSeekTooltip:function(e){var t=this;if(this.config.tooltips.seek&&u.is.element(this.elements.inputs.seek)&&u.is.element(this.elements.display.seekTooltip)&&0!==this.duration){var i=0,n=this.elements.progress.getBoundingClientRect(),s=this.config.classNames.tooltip+"--visible",a=function(e){u.toggleClass(t.elements.display.seekTooltip,s,e)};if(this.touch)a(!1);else{if(u.is.event(e))i=100/n.width*(e.pageX-n.left);else{if(!u.hasClass(this.elements.display.seekTooltip,s))return;i=parseFloat(this.elements.display.seekTooltip.style.left,10)}i<0?i=0:i>100&&(i=100),g.updateTimeDisplay.call(this,this.elements.display.seekTooltip,this.duration/100*i),this.elements.display.seekTooltip.style.left=i+"%",u.is.event(e)&&["mouseenter","mouseleave"].includes(e.type)&&a("mouseenter"===e.type)}}},timeUpdate:function(e){var t=!u.is.element(this.elements.display.duration)&&this.config.invertTime;g.updateTimeDisplay.call(this,this.elements.display.currentTime,t?this.duration-this.currentTime:this.currentTime,t),e&&"timeupdate"===e.type&&this.media.seeking||g.updateProgress.call(this,e)},durationUpdate:function(){if(this.supported.ui&&(this.config.invertTime||!this.currentTime)){u.is.element(this.elements.inputs.seek)&&this.elements.inputs.seek.setAttribute("aria-valuemax",this.duration);var e=u.is.element(this.elements.display.duration);!e&&this.config.displayDuration&&this.paused&&g.updateTimeDisplay.call(this,this.elements.display.currentTime,this.duration),e&&g.updateTimeDisplay.call(this,this.elements.display.duration,this.duration),g.updateSeekTooltip.call(this)}},toggleTab:function(e,t){u.toggleHidden(this.elements.settings.tabs[e],!t)},setQualityMenu:function(e){var t=this;if(u.is.element(this.elements.settings.panes.quality)){var i=this.elements.settings.panes.quality.querySelector("ul");u.is.array(e)&&(this.options.quality=e.filter(function(e){return t.config.quality.options.includes(e)}));var n=!u.is.empty(this.options.quality)&&this.options.quality.length>1;if(g.toggleTab.call(this,"quality",n),g.checkMenu.call(this),n){u.emptyElement(i);this.options.quality.sort(function(e,i){var n=t.config.quality.options;return n.indexOf(e)>n.indexOf(i)?1:-1}).forEach(function(e){g.createMenuItem.call(t,{value:e,list:i,type:"quality",title:g.getLabel.call(t,"quality",e),badge:function(e){var i=h("qualityBadge."+e,t.config);return i.length?g.createBadge.call(t,i):null}(e)})}),g.updateSetting.call(this,"quality",i)}}},getLabel:function(e,t){switch(e){case"speed":return 1===t?h("normal",this.config):t+"&times;";case"quality":if(u.is.number(t)){var i=h("qualityLabel."+t,this.config);return i.length?i:t+"p"}return u.toTitleCase(t);case"captions":return f.getLabel.call(this);default:return null}},updateSetting:function(e,t,i){var n=this.elements.settings.panes[e],s=null,a=t;switch(e){case"captions":s=this.currentTrack;break;default:if(s=u.is.empty(i)?this[e]:i,u.is.empty(s)&&(s=this.config[e].default),!u.is.empty(this.options[e])&&!this.options[e].includes(s))return void this.debug.warn("Unsupported value of '"+s+"' for "+e);if(!this.config[e].options.includes(s))return void this.debug.warn("Disabled value of '"+s+"' for "+e)}if(u.is.element(a)||(a=n&&n.querySelector("ul")),u.is.element(a)){this.elements.settings.tabs[e].querySelector("."+this.config.classNames.menu.value).innerHTML=g.getLabel.call(this,e,s);var r=a&&a.querySelector('input[value="'+s+'"]');u.is.element(r)&&(r.checked=!0)}},setCaptionsMenu:function(){var e=this,t=this.elements.settings.panes.captions.querySelector("ul"),i=f.getTracks.call(this);if(g.toggleTab.call(this,"captions",i.length),u.emptyElement(t),g.checkMenu.call(this),i.length){var n=i.map(function(i,n){return{value:n,checked:e.captions.active&&e.currentTrack===n,title:f.getLabel.call(e,i),badge:i.language&&g.createBadge.call(e,i.language.toUpperCase()),list:t,type:"language"}});n.unshift({value:-1,checked:!this.captions.active,title:h("disabled",this.config),list:t,type:"language"}),n.forEach(g.createMenuItem.bind(this)),g.updateSetting.call(this,"captions",t)}},setSpeedMenu:function(e){var t=this;if(this.config.controls.includes("settings")&&this.config.settings.includes("speed")&&u.is.element(this.elements.settings.panes.speed)){u.is.array(e)?this.options.speed=e:(this.isHTML5||this.isVimeo)&&(this.options.speed=[.5,.75,1,1.25,1.5,1.75,2]),this.options.speed=this.options.speed.filter(function(e){return t.config.speed.options.includes(e)});var i=!u.is.empty(this.options.speed)&&this.options.speed.length>1;if(g.toggleTab.call(this,"speed",i),g.checkMenu.call(this),i){var n=this.elements.settings.panes.speed.querySelector("ul");u.emptyElement(n),this.options.speed.forEach(function(e){g.createMenuItem.call(t,{value:e,list:n,type:"speed",title:g.getLabel.call(t,"speed",e)})}),g.updateSetting.call(this,"speed",n)}}},checkMenu:function(){var e=this.elements.settings.tabs,t=!u.is.empty(e)&&Object.values(e).some(function(e){return!e.hidden});u.toggleHidden(this.elements.settings.menu,!t)},toggleMenu:function(e){var t=this.elements.settings.form,i=this.elements.buttons.settings;if(u.is.element(t)&&u.is.element(i)){var n=u.is.boolean(e)?e:u.is.element(t)&&t.hasAttribute("hidden");if(u.is.event(e)){var s=u.is.element(t)&&t.contains(e.target),a=e.target===this.elements.buttons.settings;if(s||!s&&!a&&n)return;a&&e.stopPropagation()}u.is.element(i)&&i.setAttribute("aria-expanded",n),u.is.element(t)&&(u.toggleHidden(t,!n),u.toggleClass(this.elements.container,this.config.classNames.menu.open,n),n?t.removeAttribute("tabindex"):t.setAttribute("tabindex",-1))}},getTabSize:function(e){var t=e.cloneNode(!0);t.style.position="absolute",t.style.opacity=0,t.removeAttribute("hidden"),Array.from(t.querySelectorAll("input[name]")).forEach(function(e){var t=e.getAttribute("name");e.setAttribute("name",t+"-clone")}),e.parentNode.appendChild(t);var i=t.scrollWidth,n=t.scrollHeight;return u.removeElement(t),{width:i,height:n}},showTab:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=this.elements.settings.menu,i=document.getElementById(e);if(u.is.element(i)&&"tabpanel"===i.getAttribute("role")){var n=t.querySelector('[role="tabpanel"]:not([hidden])'),s=n.parentNode;if(Array.from(t.querySelectorAll('[aria-controls="'+n.getAttribute("id")+'"]')).forEach(function(e){e.setAttribute("aria-expanded",!1)}),d.transitions&&!d.reducedMotion){s.style.width=n.scrollWidth+"px",s.style.height=n.scrollHeight+"px";var a=g.getTabSize.call(this,i);u.on(s,u.transitionEndEvent,function e(t){t.target===s&&["width","height"].includes(t.propertyName)&&(s.style.width="",s.style.height="",u.off(s,u.transitionEndEvent,e))}),s.style.width=a.width+"px",s.style.height=a.height+"px"}u.toggleHidden(n,!0),n.setAttribute("tabindex",-1),u.toggleHidden(i,!1);var r=u.getElements.call(this,'[aria-controls="'+e+'"]');Array.from(r).forEach(function(e){e.setAttribute("aria-expanded",!0)}),i.removeAttribute("tabindex"),i.querySelectorAll("button:not(:disabled), input:not(:disabled), [tabindex]")[0].focus()}},create:function(e){var t=this;if(u.is.empty(this.config.controls))return null;var i=u.createElement("div",u.getAttributesFromSelector(this.config.selectors.controls.wrapper));if(this.config.controls.includes("restart")&&i.appendChild(g.createButton.call(this,"restart")),this.config.controls.includes("rewind")&&i.appendChild(g.createButton.call(this,"rewind")),this.config.controls.includes("play")&&i.appendChild(g.createButton.call(this,"play")),this.config.controls.includes("fast-forward")&&i.appendChild(g.createButton.call(this,"fast-forward")),this.config.controls.includes("progress")){var n=u.createElement("div",u.getAttributesFromSelector(this.config.selectors.progress));if(n.appendChild(g.createRange.call(this,"seek",{id:"plyr-seek-"+e.id})),n.appendChild(g.createProgress.call(this,"buffer")),this.config.tooltips.seek){var s=u.createElement("span",{class:this.config.classNames.tooltip},"00:00");n.appendChild(s),this.elements.display.seekTooltip=s}this.elements.progress=n,i.appendChild(this.elements.progress)}if(this.config.controls.includes("current-time")&&i.appendChild(g.createTime.call(this,"currentTime")),this.config.controls.includes("duration")&&i.appendChild(g.createTime.call(this,"duration")),this.config.controls.includes("mute")&&i.appendChild(g.createButton.call(this,"mute")),this.config.controls.includes("volume")){var a=u.createElement("div",{class:"plyr__volume"}),r={max:1,step:.05,value:this.config.volume};a.appendChild(g.createRange.call(this,"volume",u.extend(r,{id:"plyr-volume-"+e.id}))),this.elements.volume=a,i.appendChild(a)}if(this.config.controls.includes("captions")&&i.appendChild(g.createButton.call(this,"captions")),this.config.controls.includes("settings")&&!u.is.empty(this.config.settings)){var l=u.createElement("div",{class:"plyr__menu",hidden:""});l.appendChild(g.createButton.call(this,"settings",{id:"plyr-settings-toggle-"+e.id,"aria-haspopup":!0,"aria-controls":"plyr-settings-"+e.id,"aria-expanded":!1}));var o=u.createElement("form",{class:"plyr__menu__container",id:"plyr-settings-"+e.id,hidden:"","aria-labelled-by":"plyr-settings-toggle-"+e.id,role:"tablist",tabindex:-1}),c=u.createElement("div"),m=u.createElement("div",{id:"plyr-settings-"+e.id+"-home","aria-labelled-by":"plyr-settings-toggle-"+e.id,role:"tabpanel"}),f=u.createElement("ul",{role:"tablist"});this.config.settings.forEach(function(i){var n=u.createElement("li",{role:"tab",hidden:""}),s=u.createElement("button",u.extend(u.getAttributesFromSelector(t.config.selectors.buttons.settings),{type:"button",class:t.config.classNames.control+" "+t.config.classNames.control+"--forward",id:"plyr-settings-"+e.id+"-"+i+"-tab","aria-haspopup":!0,"aria-controls":"plyr-settings-"+e.id+"-"+i,"aria-expanded":!1}),h(i,t.config)),a=u.createElement("span",{class:t.config.classNames.menu.value});a.innerHTML=e[i],s.appendChild(a),n.appendChild(s),f.appendChild(n),t.elements.settings.tabs[i]=n}),m.appendChild(f),c.appendChild(m),this.config.settings.forEach(function(i){var n=u.createElement("div",{id:"plyr-settings-"+e.id+"-"+i,hidden:"","aria-labelled-by":"plyr-settings-"+e.id+"-"+i+"-tab",role:"tabpanel",tabindex:-1}),s=u.createElement("button",{type:"button",class:t.config.classNames.control+" "+t.config.classNames.control+"--back","aria-haspopup":!0,"aria-controls":"plyr-settings-"+e.id+"-home","aria-expanded":!1},h(i,t.config));n.appendChild(s);var a=u.createElement("ul");n.appendChild(a),c.appendChild(n),t.elements.settings.panes[i]=n}),o.appendChild(c),l.appendChild(o),i.appendChild(l),this.elements.settings.form=o,this.elements.settings.menu=l}return this.config.controls.includes("pip")&&d.pip&&i.appendChild(g.createButton.call(this,"pip")),this.config.controls.includes("airplay")&&d.airplay&&i.appendChild(g.createButton.call(this,"airplay")),this.config.controls.includes("fullscreen")&&i.appendChild(g.createButton.call(this,"fullscreen")),this.config.controls.includes("play-large")&&this.elements.container.appendChild(g.createButton.call(this,"play-large")),this.elements.controls=i,this.isHTML5&&g.setQualityMenu.call(this,p.getQualityOptions.call(this)),g.setSpeedMenu.call(this),i},inject:function(){var e=this;if(this.config.loadSprite){var t=g.getIconUrl.call(this);t.cors&&u.loadSprite(t.url,"sprite-plyr")}this.id=Math.floor(1e4*Math.random());var i=null;this.elements.controls=null;var n={id:this.id,seektime:this.config.seekTime,title:this.config.title},s=!0;u.is.string(this.config.controls)||u.is.element(this.config.controls)?i=this.config.controls:u.is.function(this.config.controls)?i=this.config.controls.call(this,n):(i=g.create.call(this,{id:this.id,seektime:this.config.seekTime,speed:this.speed,quality:this.quality,captions:f.getLabel.call(this)}),s=!1);var a=function(e){var t=e;return Object.entries(n).forEach(function(e){var i=r(e,2),n=i[0],s=i[1];t=u.replaceAll(t,"{"+n+"}",s)}),t};s&&(u.is.string(this.config.controls)?i=a(i):u.is.element(i)&&(i.innerHTML=a(i.innerHTML)));var l=void 0;if(u.is.string(this.config.selectors.controls.container)&&(l=document.querySelector(this.config.selectors.controls.container)),u.is.element(l)||(l=this.elements.container),u.is.element(i)?l.appendChild(i):i&&l.insertAdjacentHTML("beforeend",i),u.is.element(this.elements.controls)||g.findElements.call(this),window.navigator.userAgent.includes("Edge")&&u.repaint(l),this.config.tooltips.controls){var o=u.getElements.call(this,[this.config.selectors.controls.wrapper," ",this.config.selectors.labels," .",this.config.classNames.hidden].join(""));Array.from(o).forEach(function(t){u.toggleClass(t,e.config.classNames.hidden,!1),u.toggleClass(t,e.config.classNames.tooltip,!0)})}}},f={setup:function(){if(this.supported.ui)if(!this.isVideo||this.isYouTube||this.isHTML5&&!d.textTracks)u.is.array(this.config.controls)&&this.config.controls.includes("settings")&&this.config.settings.includes("captions")&&g.setCaptionsMenu.call(this);else{if(u.is.element(this.elements.captions)||(this.elements.captions=u.createElement("div",u.getAttributesFromSelector(this.config.selectors.captions)),u.insertAfter(this.elements.captions,this.elements.wrapper)),u.getBrowser().isIE&&window.URL){var e=this.media.querySelectorAll("track");Array.from(e).forEach(function(e){var t=e.getAttribute("src"),i=u.parseUrl(t);i.hostname!==window.location.href.hostname&&["http:","https:"].includes(i.protocol)&&u.fetch(t,"blob").then(function(t){e.setAttribute("src",window.URL.createObjectURL(t))}).catch(function(){u.removeElement(e)})})}var t=this.storage.get("captions");u.is.boolean(t)||(t=this.config.captions.active);var i=this.storage.get("language")||this.config.captions.language;if("auto"===i){var n=(navigator.language||navigator.userLanguage).split("-");i=r(n,1)[0]}if(f.setLanguage.call(this,i,t),this.isHTML5){var s=this.config.captions.update?"addtrack removetrack":"removetrack";u.on(this.media.textTracks,s,f.update.bind(this))}setTimeout(f.update.bind(this),0)}},update:function(){var e=this,t=f.getTracks.call(this,!0),i=this.captions,n=i.language,s=i.meta;this.isHTML5&&this.isVideo&&t.filter(function(e){return!s.get(e)}).forEach(function(t){e.debug.log("Track added",t),s.set(t,{default:"showing"===t.mode}),t.mode="hidden",u.on(t,"cuechange",function(){return f.updateCues.call(e)})});var a=!t.find(function(t){return t===e.captions.currentTrackNode}),r=this.language!==n&&t.find(function(e){return e.language===n});(a||r)&&f.setLanguage.call(this,n,this.config.captions.active),u.toggleClass(this.elements.container,this.config.classNames.captions.enabled,!u.is.empty(t)),(this.config.controls||[]).includes("settings")&&this.config.settings.includes("captions")&&g.setCaptionsMenu.call(this)},set:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],i=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],n=f.getTracks.call(this);if(-1!==e)if(u.is.number(e))if(e in n){if(this.captions.currentTrack!==e){this.captions.currentTrack=e;var s=f.getCurrentTrack.call(this),a=(s||{}).language;this.captions.currentTrackNode=s,t&&(this.captions.language=a),this.isVimeo&&this.embed.enableTextTrack(a),u.dispatchEvent.call(this,this.media,"languagechange")}this.isHTML5&&this.isVideo&&f.updateCues.call(this),i&&this.toggleCaptions(!0)}else this.debug.warn("Track not found",e);else this.debug.warn("Invalid caption argument",e);else this.toggleCaptions(!1)},setLanguage:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(u.is.string(e)){this.captions.language=e.toLowerCase();var i=f.getTracks.call(this),n=f.getCurrentTrack.call(this,!0);f.set.call(this,i.indexOf(n),!1,t)}else this.debug.warn("Invalid language argument",e)},getTracks:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return Array.from((this.media||{}).textTracks||[]).filter(function(i){return!e.isHTML5||t||e.captions.meta.has(i)}).filter(function(e){return["captions","subtitles"].includes(e.kind)})},getCurrentTrack:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]&&arguments[0],i=f.getTracks.call(this),n=function(t){return Number((e.captions.meta.get(t)||{}).default)},s=Array.from(i).sort(function(e,t){return n(t)-n(e)});return!t&&i[this.currentTrack]||s.find(function(t){return t.language===e.captions.language})||s[0]},getLabel:function(e){var t=e;return!u.is.track(t)&&d.textTracks&&this.captions.active&&(t=f.getCurrentTrack.call(this)),u.is.track(t)?u.is.empty(t.label)?u.is.empty(t.language)?h("enabled",this.config):e.language.toUpperCase():t.label:h("disabled",this.config)},updateCues:function(e){if(this.supported.ui)if(u.is.element(this.elements.captions))if(u.is.nullOrUndefined(e)||Array.isArray(e)){var t=e;if(!t){var i=f.getCurrentTrack.call(this);t=Array.from((i||{}).activeCues||[]).map(function(e){return e.getCueAsHTML()}).map(u.getHTML)}var n=t.map(function(e){return e.trim()}).join("\n");if(n!==this.elements.captions.innerHTML){u.emptyElement(this.elements.captions);var s=u.createElement("span",u.getAttributesFromSelector(this.config.selectors.caption));s.innerHTML=n,this.elements.captions.appendChild(s),u.dispatchEvent.call(this,this.media,"cuechange")}}else this.debug.warn("updateCues: Invalid input",e);else this.debug.warn("No captions element to render to")}},y=function(){},v=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];n(this,e),this.enabled=window.console&&t,this.enabled&&this.log("Debugging enabled")}return s(e,[{key:"log",get:function(){return this.enabled?Function.prototype.bind.call(console.log,console):y}},{key:"warn",get:function(){return this.enabled?Function.prototype.bind.call(console.warn,console):y}},{key:"error",get:function(){return this.enabled?Function.prototype.bind.call(console.error,console):y}}]),e}(),b={enabled:!0,title:"",debug:!1,autoplay:!1,autopause:!0,playsinline:!0,seekTime:10,volume:1,muted:!1,duration:null,displayDuration:!0,invertTime:!0,toggleInvert:!0,ratio:"16:9",clickToPlay:!0,hideControls:!0,resetOnEnd:!1,disableContextMenu:!0,loadSprite:!0,iconPrefix:"plyr",iconUrl:"https://cdn.plyr.io/3.3.12/plyr.svg",blankVideo:"https://cdn.plyr.io/static/blank.mp4",quality:{default:576,options:[4320,2880,2160,1440,1080,720,576,480,360,240,"default"]},loop:{active:!1},speed:{selected:1,options:[.5,.75,1,1.25,1.5,1.75,2]},keyboard:{focused:!0,global:!1},tooltips:{controls:!1,seek:!0},captions:{active:!1,language:"auto",update:!1},fullscreen:{enabled:!0,fallback:!0,iosNative:!1},storage:{enabled:!0,key:"plyr"},controls:["play-large","play","progress","current-time","mute","volume","captions","settings","pip","airplay","fullscreen"],settings:["captions","quality","speed"],i18n:{restart:"Restart",rewind:"Rewind {seektime}s",play:"Play",pause:"Pause",fastForward:"Forward {seektime}s",seek:"Seek",seekLabel:"{currentTime} of {duration}",played:"Played",buffered:"Buffered",currentTime:"Current time",duration:"Duration",volume:"Volume",mute:"Mute",unmute:"Unmute",enableCaptions:"Enable captions",disableCaptions:"Disable captions",enterFullscreen:"Enter fullscreen",exitFullscreen:"Exit fullscreen",frameTitle:"Player for {title}",captions:"Captions",settings:"Settings",menuBack:"Go back to previous menu",speed:"Speed",normal:"Normal",quality:"Quality",loop:"Loop",start:"Start",end:"End",all:"All",reset:"Reset",disabled:"Disabled",enabled:"Enabled",advertisement:"Ad",qualityBadge:{2160:"4K",1440:"HD",1080:"HD",720:"HD",576:"SD",480:"SD"}},urls:{vimeo:{sdk:"https://player.vimeo.com/api/player.js",iframe:"https://player.vimeo.com/video/{0}?{1}",api:"https://vimeo.com/api/v2/video/{0}.json"},youtube:{sdk:"https://www.youtube.com/iframe_api",api:"https://www.googleapis.com/youtube/v3/videos?id={0}&key={1}&fields=items(snippet(title))&part=snippet"},googleIMA:{sdk:"https://imasdk.googleapis.com/js/sdkloader/ima3.js"}},listeners:{seek:null,play:null,pause:null,restart:null,rewind:null,fastForward:null,mute:null,volume:null,captions:null,fullscreen:null,pip:null,airplay:null,speed:null,quality:null,loop:null,language:null},events:["ended","progress","stalled","playing","waiting","canplay","canplaythrough","loadstart","loadeddata","loadedmetadata","timeupdate","volumechange","play","pause","error","seeking","seeked","emptied","ratechange","cuechange","enterfullscreen","exitfullscreen","captionsenabled","captionsdisabled","languagechange","controlshidden","controlsshown","ready","statechange","qualitychange","qualityrequested","adsloaded","adscontentpause","adscontentresume","adstarted","adsmidpoint","adscomplete","adsallcomplete","adsimpression","adsclick"],selectors:{editable:"input, textarea, select, [contenteditable]",container:".plyr",controls:{container:null,wrapper:".plyr__controls"},labels:"[data-plyr]",buttons:{play:'[data-plyr="play"]',pause:'[data-plyr="pause"]',restart:'[data-plyr="restart"]',rewind:'[data-plyr="rewind"]',fastForward:'[data-plyr="fast-forward"]',mute:'[data-plyr="mute"]',captions:'[data-plyr="captions"]',fullscreen:'[data-plyr="fullscreen"]',pip:'[data-plyr="pip"]',airplay:'[data-plyr="airplay"]',settings:'[data-plyr="settings"]',loop:'[data-plyr="loop"]'},inputs:{seek:'[data-plyr="seek"]',volume:'[data-plyr="volume"]',speed:'[data-plyr="speed"]',language:'[data-plyr="language"]',quality:'[data-plyr="quality"]'},display:{currentTime:".plyr__time--current",duration:".plyr__time--duration",buffer:".plyr__progress__buffer",loop:".plyr__progress__loop",volume:".plyr__volume--display"},progress:".plyr__progress",captions:".plyr__captions",caption:".plyr__caption",menu:{quality:".js-plyr__menu__list--quality"}},classNames:{type:"plyr--{0}",provider:"plyr--{0}",video:"plyr__video-wrapper",embed:"plyr__video-embed",embedContainer:"plyr__video-embed__container",poster:"plyr__poster",posterEnabled:"plyr__poster-enabled",ads:"plyr__ads",control:"plyr__control",controlPressed:"plyr__control--pressed",playing:"plyr--playing",paused:"plyr--paused",stopped:"plyr--stopped",loading:"plyr--loading",hover:"plyr--hover",tooltip:"plyr__tooltip",cues:"plyr__cues",hidden:"plyr__sr-only",hideControls:"plyr--hide-controls",isIos:"plyr--is-ios",isTouch:"plyr--is-touch",uiSupported:"plyr--full-ui",noTransition:"plyr--no-transition",menu:{value:"plyr__menu__value",badge:"plyr__badge",open:"plyr--menu-open"},captions:{enabled:"plyr--captions-enabled",active:"plyr--captions-active"},fullscreen:{enabled:"plyr--fullscreen-enabled",fallback:"plyr--fullscreen-fallback"},pip:{supported:"plyr--pip-supported",active:"plyr--pip-active"},airplay:{supported:"plyr--airplay-supported",active:"plyr--airplay-active"},tabFocus:"plyr__tab-focus"},attributes:{embed:{provider:"data-plyr-provider",id:"data-plyr-embed-id"}},keys:{google:null},ads:{enabled:!1,publisherId:""}},k=u.getBrowser();function w(){if(this.enabled){var e=this.player.elements.buttons.fullscreen;u.is.element(e)&&(e.pressed=this.active),u.dispatchEvent.call(this.player,this.target,this.active?"enterfullscreen":"exitfullscreen",!0),k.isIos||u.trapFocus.call(this.player,this.target,this.active)}}function T(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];e?this.scrollPosition={x:window.scrollX||0,y:window.scrollY||0}:window.scrollTo(this.scrollPosition.x,this.scrollPosition.y),document.body.style.overflow=e?"hidden":"",u.toggleClass(this.target,this.player.config.classNames.fullscreen.fallback,e),w.call(this)}var E=function(){function e(t){var i=this;n(this,e),this.player=t,this.prefix=e.prefix,this.property=e.property,this.scrollPosition={x:0,y:0},u.on(document,"ms"===this.prefix?"MSFullscreenChange":this.prefix+"fullscreenchange",function(){w.call(i)}),u.on(this.player.elements.container,"dblclick",function(e){u.is.element(i.player.elements.controls)&&i.player.elements.controls.contains(e.target)||i.toggle()}),this.update()}return s(e,[{key:"update",value:function(){this.enabled?this.player.debug.log((e.native?"Native":"Fallback")+" fullscreen enabled"):this.player.debug.log("Fullscreen not supported and fallback disabled"),u.toggleClass(this.player.elements.container,this.player.config.classNames.fullscreen.enabled,this.enabled)}},{key:"enter",value:function(){this.enabled&&(k.isIos&&this.player.config.fullscreen.iosNative?this.player.playing&&this.target.webkitEnterFullscreen():e.native?this.prefix?u.is.empty(this.prefix)||this.target[this.prefix+"Request"+this.property]():this.target.requestFullscreen():T.call(this,!0))}},{key:"exit",value:function(){if(this.enabled)if(k.isIos&&this.player.config.fullscreen.iosNative)this.target.webkitExitFullscreen(),this.player.play();else if(e.native)if(this.prefix){if(!u.is.empty(this.prefix)){var t="moz"===this.prefix?"Cancel":"Exit";document[""+this.prefix+t+this.property]()}}else(document.cancelFullScreen||document.exitFullscreen).call(document);else T.call(this,!1)}},{key:"toggle",value:function(){this.active?this.exit():this.enter()}},{key:"enabled",get:function(){return(e.native||this.player.config.fullscreen.fallback)&&this.player.config.fullscreen.enabled&&this.player.supported.ui&&this.player.isVideo}},{key:"active",get:function(){return!!this.enabled&&(e.native?(this.prefix?document[""+this.prefix+this.property+"Element"]:document.fullscreenElement)===this.target:u.hasClass(this.target,this.player.config.classNames.fullscreen.fallback))}},{key:"target",get:function(){return k.isIos&&this.player.config.fullscreen.iosNative?this.player.media:this.player.elements.container}}],[{key:"native",get:function(){return!!(document.fullscreenEnabled||document.webkitFullscreenEnabled||document.mozFullScreenEnabled||document.msFullscreenEnabled)}},{key:"prefix",get:function(){if(u.is.function(document.exitFullscreen))return"";var e="";return["webkit","moz","ms"].some(function(t){return!(!u.is.function(document[t+"ExitFullscreen"])&&!u.is.function(document[t+"CancelFullScreen"]))&&(e=t,!0)}),e}},{key:"property",get:function(){return"moz"===this.prefix?"FullScreen":"Fullscreen"}}]),e}(),A=u.getBrowser(),C={addStyleHook:function(){u.toggleClass(this.elements.container,this.config.selectors.container.replace(".",""),!0),u.toggleClass(this.elements.container,this.config.classNames.uiSupported,this.supported.ui)},toggleNativeControls:function(){arguments.length>0&&void 0!==arguments[0]&&arguments[0]&&this.isHTML5?this.media.setAttribute("controls",""):this.media.removeAttribute("controls")},build:function(){var e=this;if(this.listeners.media(),!this.supported.ui)return this.debug.warn("Basic support only for "+this.provider+" "+this.type),void C.toggleNativeControls.call(this,!0);u.is.element(this.elements.controls)||(g.inject.call(this),this.listeners.controls()),C.toggleNativeControls.call(this),this.isHTML5&&f.setup.call(this),this.volume=null,this.muted=null,this.speed=null,this.loop=null,this.quality=null,g.updateVolume.call(this),g.timeUpdate.call(this),C.checkPlaying.call(this),u.toggleClass(this.elements.container,this.config.classNames.pip.supported,d.pip&&this.isHTML5&&this.isVideo),u.toggleClass(this.elements.container,this.config.classNames.airplay.supported,d.airplay&&this.isHTML5),u.toggleClass(this.elements.container,this.config.classNames.isIos,A.isIos),u.toggleClass(this.elements.container,this.config.classNames.isTouch,this.touch),this.ready=!0,setTimeout(function(){u.dispatchEvent.call(e,e.media,"ready")},0),C.setTitle.call(this),this.poster&&this.elements.poster&&!this.elements.poster.style.backgroundImage&&C.setPoster.call(this,this.poster),this.config.duration&&g.durationUpdate.call(this)},setTitle:function(){var e=h("play",this.config);if(u.is.string(this.config.title)&&!u.is.empty(this.config.title)&&(e+=", "+this.config.title),u.is.nodeList(this.elements.buttons.play)&&Array.from(this.elements.buttons.play).forEach(function(t){t.setAttribute("aria-label",e)}),this.isEmbed){var t=u.getElement.call(this,"iframe");if(!u.is.element(t))return;var i=u.is.empty(this.config.title)?"video":this.config.title,n=h("frameTitle",this.config);t.setAttribute("title",n.replace("{title}",i))}},togglePoster:function(e){u.toggleClass(this.elements.container,this.config.classNames.posterEnabled,e)},setPoster:function(e){var t=this;if(this.media.setAttribute("poster",e),!u.is.element(this.elements.poster))return Promise.reject();var i=u.loadImage(e).then(function(){return t.elements.poster.style.backgroundImage="url('"+e+"')",Object.assign(t.elements.poster.style,{backgroundImage:"url('"+e+"')",backgroundSize:""}),C.togglePoster.call(t,!0),e});return i.catch(function(){return C.togglePoster.call(t,!1)}),i},checkPlaying:function(e){var t=this;u.toggleClass(this.elements.container,this.config.classNames.playing,this.playing),u.toggleClass(this.elements.container,this.config.classNames.paused,this.paused),u.toggleClass(this.elements.container,this.config.classNames.stopped,this.stopped),Array.from(this.elements.buttons.play).forEach(function(e){e.pressed=t.playing}),u.is.event(e)&&"timeupdate"===e.type||C.toggleControls.call(this)},checkLoading:function(e){var t=this;this.loading=["stalled","waiting"].includes(e.type),clearTimeout(this.timers.loading),this.timers.loading=setTimeout(function(){u.toggleClass(t.elements.container,t.config.classNames.loading,t.loading),C.toggleControls.call(t)},this.loading?250:0)},toggleControls:function(e){var t=this.elements.controls;t&&this.config.hideControls&&this.toggleControls(Boolean(e||this.loading||this.paused||t.pressed||t.hover))}},S=u.getBrowser(),P=function(){function e(t){n(this,e),this.player=t,this.lastKey=null,this.handleKey=this.handleKey.bind(this),this.toggleMenu=this.toggleMenu.bind(this),this.firstTouch=this.firstTouch.bind(this)}return s(e,[{key:"handleKey",value:function(e){var t=this,i=e.keyCode?e.keyCode:e.which,n="keydown"===e.type,s=n&&i===this.lastKey;if(!(e.altKey||e.ctrlKey||e.metaKey||e.shiftKey)&&u.is.number(i)){if(n){var a=u.getFocusElement();if(u.is.element(a)&&a!==this.player.elements.inputs.seek&&u.matches(a,this.player.config.selectors.editable))return;switch([48,49,50,51,52,53,54,56,57,32,75,38,40,77,39,37,70,67,73,76,79].includes(i)&&(e.preventDefault(),e.stopPropagation()),i){case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:s||(t.player.currentTime=t.player.duration/10*(i-48));break;case 32:case 75:s||this.player.togglePlay();break;case 38:this.player.increaseVolume(.1);break;case 40:this.player.decreaseVolume(.1);break;case 77:s||(this.player.muted=!this.player.muted);break;case 39:this.player.forward();break;case 37:this.player.rewind();break;case 70:this.player.fullscreen.toggle();break;case 67:s||this.player.toggleCaptions();break;case 76:this.player.loop=!this.player.loop}!this.player.fullscreen.enabled&&this.player.fullscreen.active&&27===i&&this.player.fullscreen.toggle(),this.lastKey=i}else this.lastKey=null}}},{key:"toggleMenu",value:function(e){g.toggleMenu.call(this.player,e)}},{key:"firstTouch",value:function(){this.player.touch=!0,u.toggleClass(this.player.elements.container,this.player.config.classNames.isTouch,!0),u.off(document.body,"touchstart",this.firstTouch)}},{key:"global",value:function(){var e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.player.config.keyboard.global&&u.toggleListener(window,"keydown keyup",this.handleKey,e,!1),u.toggleListener(document.body,"click",this.toggleMenu,e),u.on(document.body,"touchstart",this.firstTouch)}},{key:"container",value:function(){var e=this;!this.player.config.keyboard.global&&this.player.config.keyboard.focused&&u.on(this.player.elements.container,"keydown keyup",this.handleKey,!1),u.on(this.player.elements.container,"focusout",function(t){u.toggleClass(t.target,e.player.config.classNames.tabFocus,!1)}),u.on(this.player.elements.container,"keydown",function(t){9===t.keyCode&&setTimeout(function(){u.toggleClass(u.getFocusElement(),e.player.config.classNames.tabFocus,!0)},0)}),u.on(this.player.elements.container,"mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen",function(t){var i=e.player.elements.controls;"enterfullscreen"===t.type&&(i.pressed=!1,i.hover=!1);var n=0;["touchstart","touchmove","mousemove"].includes(t.type)&&(C.toggleControls.call(e.player,!0),n=e.player.touch?3e3:2e3),clearTimeout(e.player.timers.controls),e.player.timers.controls=setTimeout(function(){return C.toggleControls.call(e.player,!1)},n)})}},{key:"media",value:function(){var e=this;if(u.on(this.player.media,"timeupdate seeking seeked",function(t){return g.timeUpdate.call(e.player,t)}),u.on(this.player.media,"durationchange loadeddata loadedmetadata",function(t){return g.durationUpdate.call(e.player,t)}),u.on(this.player.media,"loadeddata",function(){u.toggleHidden(e.player.elements.volume,!e.player.hasAudio),u.toggleHidden(e.player.elements.buttons.mute,!e.player.hasAudio)}),u.on(this.player.media,"ended",function(){e.player.isHTML5&&e.player.isVideo&&e.player.config.resetOnEnd&&e.player.restart()}),u.on(this.player.media,"progress playing seeking seeked",function(t){return g.updateProgress.call(e.player,t)}),u.on(this.player.media,"volumechange",function(t){return g.updateVolume.call(e.player,t)}),u.on(this.player.media,"playing play pause ended emptied timeupdate",function(t){return C.checkPlaying.call(e.player,t)}),u.on(this.player.media,"waiting canplay seeked playing",function(t){return C.checkLoading.call(e.player,t)}),u.on(this.player.media,"playing",function(){e.player.ads&&e.player.ads.enabled&&!e.player.ads.initialized&&e.player.ads.managerPromise.then(function(){return e.player.ads.play()}).catch(function(){return e.player.play()})}),this.player.supported.ui&&this.player.config.clickToPlay&&!this.player.isAudio){var t=u.getElement.call(this.player,"."+this.player.config.classNames.video);if(!u.is.element(t))return;u.on(t,"click",function(){e.player.config.hideControls&&e.player.touch&&!e.player.paused||(e.player.paused?e.player.play():e.player.ended?(e.player.restart(),e.player.play()):e.player.pause())})}this.player.supported.ui&&this.player.config.disableContextMenu&&u.on(this.player.elements.wrapper,"contextmenu",function(e){e.preventDefault()},!1),u.on(this.player.media,"volumechange",function(){e.player.storage.set({volume:e.player.volume,muted:e.player.muted})}),u.on(this.player.media,"ratechange",function(){g.updateSetting.call(e.player,"speed"),e.player.storage.set({speed:e.player.speed})}),u.on(this.player.media,"qualityrequested",function(t){e.player.storage.set({quality:t.detail.quality})}),u.on(this.player.media,"qualitychange",function(t){g.updateSetting.call(e.player,"quality",null,t.detail.quality)}),u.on(this.player.media,"languagechange",function(){g.updateSetting.call(e.player,"captions"),e.player.storage.set({language:e.player.language})}),u.on(this.player.media,"captionsenabled captionsdisabled",function(){g.updateSetting.call(e.player,"captions"),e.player.storage.set({captions:e.player.captions.active})}),u.on(this.player.media,this.player.config.events.concat(["keyup","keydown"]).join(" "),function(t){var i=t.detail,n=void 0===i?{}:i;"error"===t.type&&(n=e.player.media.error),u.dispatchEvent.call(e.player,e.player.elements.container,t.type,!0,n)})}},{key:"controls",value:function(){var e=this,t=S.isIE?"change":"input",i=function(t,i,n){var s=e.player.config.listeners[n],a=!0;u.is.function(s)&&(a=s.call(e.player,t)),a&&u.is.function(i)&&i.call(e.player,t)},n=function(t,n,s,a){var r=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],l=e.player.config.listeners[a],o=u.is.function(l);u.on(t,n,function(e){return i(e,s,a)},r&&!o)};n(this.player.elements.buttons.play,"click",this.player.togglePlay,"play"),n(this.player.elements.buttons.restart,"click",this.player.restart,"restart"),n(this.player.elements.buttons.rewind,"click",this.player.rewind,"rewind"),n(this.player.elements.buttons.fastForward,"click",this.player.forward,"fastForward"),n(this.player.elements.buttons.mute,"click",function(){e.player.muted=!e.player.muted},"mute"),n(this.player.elements.buttons.captions,"click",this.player.toggleCaptions),n(this.player.elements.buttons.fullscreen,"click",function(){e.player.fullscreen.toggle()},"fullscreen"),n(this.player.elements.buttons.pip,"click",function(){e.player.pip="toggle"},"pip"),n(this.player.elements.buttons.airplay,"click",this.player.airplay,"airplay"),n(this.player.elements.buttons.settings,"click",function(t){g.toggleMenu.call(e.player,t)}),n(this.player.elements.settings.form,"click",function(t){t.stopPropagation();var n=function(){var t="plyr-settings-"+e.player.id+"-home";g.showTab.call(e.player,t)};if(u.matches(t.target,e.player.config.selectors.inputs.language))i(t,function(){e.player.currentTrack=Number(t.target.value),n()},"language");else if(u.matches(t.target,e.player.config.selectors.inputs.quality))i(t,function(){e.player.quality=t.target.value,n()},"quality");else if(u.matches(t.target,e.player.config.selectors.inputs.speed))i(t,function(){e.player.speed=parseFloat(t.target.value),n()},"speed");else{var s=t.target;g.showTab.call(e.player,s.getAttribute("aria-controls"))}}),n(this.player.elements.inputs.seek,"mousedown mousemove",function(t){var i=e.player.elements.progress.getBoundingClientRect(),n=100/i.width*(t.pageX-i.left);t.currentTarget.setAttribute("seek-value",n)}),n(this.player.elements.inputs.seek,"mousedown mouseup keydown keyup touchstart touchend",function(t){var i=t.currentTarget,n=t.keyCode?t.keyCode:t.which,s=t.type;if("keydown"!==s&&"keyup"!==s||39===n||37===n){var a=i.hasAttribute("play-on-seeked"),r=["mouseup","touchend","keyup"].includes(t.type);a&&r?(i.removeAttribute("play-on-seeked"),e.player.play()):!r&&e.player.playing&&(i.setAttribute("play-on-seeked",""),e.player.pause())}}),n(this.player.elements.inputs.seek,t,function(t){var i=t.currentTarget,n=i.getAttribute("seek-value");u.is.empty(n)&&(n=i.value),i.removeAttribute("seek-value"),e.player.currentTime=n/i.max*e.player.duration},"seek"),this.player.config.toggleInvert&&!u.is.element(this.player.elements.display.duration)&&n(this.player.elements.display.currentTime,"click",function(){0!==e.player.currentTime&&(e.player.config.invertTime=!e.player.config.invertTime,g.timeUpdate.call(e.player))}),n(this.player.elements.inputs.volume,t,function(t){e.player.volume=t.target.value},"volume"),S.isWebkit&&n(u.getElements.call(this.player,'input[type="range"]'),"input",function(t){g.updateRangeFill.call(e.player,t.target)}),n(this.player.elements.progress,"mouseenter mouseleave mousemove",function(t){return g.updateSeekTooltip.call(e.player,t)}),n(this.player.elements.controls,"mouseenter mouseleave",function(t){e.player.elements.controls.hover=!e.player.touch&&"mouseenter"===t.type}),n(this.player.elements.controls,"mousedown mouseup touchstart touchend touchcancel",function(t){e.player.elements.controls.pressed=["mousedown","touchstart"].includes(t.type)}),n(this.player.elements.controls,"focusin focusout",function(t){var i=e.player,n=i.config,s=i.elements,a=i.timers;if(u.toggleClass(s.controls,n.classNames.noTransition,"focusin"===t.type),C.toggleControls.call(e.player,"focusin"===t.type),"focusin"===t.type){setTimeout(function(){u.toggleClass(s.controls,n.classNames.noTransition,!1)},0);var r=e.touch?3e3:4e3;clearTimeout(a.controls),a.controls=setTimeout(function(){return C.toggleControls.call(e.player,!1)},r)}}),n(this.player.elements.inputs.volume,"wheel",function(t){var i=t.webkitDirectionInvertedFromDevice,n=0;(t.deltaY<0||t.deltaX>0)&&(i?(e.player.decreaseVolume(.02),n=-1):(e.player.increaseVolume(.02),n=1)),(t.deltaY>0||t.deltaX<0)&&(i?(e.player.increaseVolume(.02),n=1):(e.player.decreaseVolume(.02),n=-1)),(1===n&&e.player.media.volume<1||-1===n&&e.player.media.volume>0)&&t.preventDefault()},"volume",!1)}},{key:"clear",value:function(){this.global(!1)}}]),e}();function N(e){e&&!this.embed.hasPlayed&&(this.embed.hasPlayed=!0),this.media.paused===e&&(this.media.paused=!e,u.dispatchEvent.call(this,this.media,e?"play":"pause"))}var L={setup:function(){var e=this;u.toggleClass(this.elements.wrapper,this.config.classNames.embed,!0),L.setAspectRatio.call(this),u.is.object(window.Vimeo)?L.ready.call(this):u.loadScript(this.config.urls.vimeo.sdk).then(function(){L.ready.call(e)}).catch(function(t){e.debug.warn("Vimeo API failed to load",t)})},setAspectRatio:function(e){var t=u.is.string(e)?e.split(":"):this.config.ratio.split(":"),i=100/t[0]*t[1];if(this.elements.wrapper.style.paddingBottom=i+"%",this.supported.ui){var n=(240-i)/4.8;this.media.style.transform="translateY(-"+n+"%)"}},ready:function(){var e=this,t=this,i={loop:t.config.loop.active,autoplay:t.autoplay,byline:!1,portrait:!1,title:!1,speed:!0,transparent:0,gesture:"media",playsinline:!this.config.fullscreen.iosNative},n=u.buildUrlParams(i),s=t.media.getAttribute("src");u.is.empty(s)&&(s=t.media.getAttribute(t.config.attributes.embed.id));var a=u.parseVimeoId(s),r=u.createElement("iframe"),l=u.format(t.config.urls.vimeo.iframe,a,n);r.setAttribute("src",l),r.setAttribute("allowfullscreen",""),r.setAttribute("allowtransparency",""),r.setAttribute("allow","autoplay");var o=u.createElement("div",{class:t.config.classNames.embedContainer});o.appendChild(r),t.media=u.replaceElement(o,t.media),u.fetch(u.format(t.config.urls.vimeo.api,a),"json").then(function(e){if(!u.is.empty(e)){var i=new URL(e[0].thumbnail_large);i.pathname=i.pathname.split("_")[0]+".jpg",C.setPoster.call(t,i.href)}}),t.embed=new window.Vimeo.Player(r,{autopause:t.config.autopause,muted:t.muted}),t.media.paused=!0,t.media.currentTime=0,t.supported.ui&&t.embed.disableTextTrack(),t.media.play=function(){return N.call(t,!0),t.embed.play()},t.media.pause=function(){return N.call(t,!1),t.embed.pause()},t.media.stop=function(){t.pause(),t.currentTime=0};var c=t.media.currentTime;Object.defineProperty(t.media,"currentTime",{get:function(){return c},set:function(e){var i=t.embed,n=t.media,s=t.paused,a=t.volume,r=s&&!i.hasPlayed;n.seeking=!0,u.dispatchEvent.call(t,n,"seeking"),Promise.resolve(r&&i.setVolume(0)).then(function(){return i.setCurrentTime(e)}).then(function(){return r&&i.pause()}).then(function(){return r&&i.setVolume(a)}).catch(function(){})}});var d=t.config.speed.selected;Object.defineProperty(t.media,"playbackRate",{get:function(){return d},set:function(e){t.embed.setPlaybackRate(e).then(function(){d=e,u.dispatchEvent.call(t,t.media,"ratechange")}).catch(function(e){"Error"===e.name&&g.setSpeedMenu.call(t,[])})}});var p=t.config.volume;Object.defineProperty(t.media,"volume",{get:function(){return p},set:function(e){t.embed.setVolume(e).then(function(){p=e,u.dispatchEvent.call(t,t.media,"volumechange")})}});var h=t.config.muted;Object.defineProperty(t.media,"muted",{get:function(){return h},set:function(e){var i=!!u.is.boolean(e)&&e;t.embed.setVolume(i?0:t.config.volume).then(function(){h=i,u.dispatchEvent.call(t,t.media,"volumechange")})}});var m=t.config.loop;Object.defineProperty(t.media,"loop",{get:function(){return m},set:function(e){var i=u.is.boolean(e)?e:t.config.loop.active;t.embed.setLoop(i).then(function(){m=i})}});var y=void 0;t.embed.getVideoUrl().then(function(e){y=e}).catch(function(t){e.debug.warn(t)}),Object.defineProperty(t.media,"currentSrc",{get:function(){return y}}),Object.defineProperty(t.media,"ended",{get:function(){return t.currentTime===t.duration}}),Promise.all([t.embed.getVideoWidth(),t.embed.getVideoHeight()]).then(function(t){var i=u.getAspectRatio(t[0],t[1]);L.setAspectRatio.call(e,i)}),t.embed.setAutopause(t.config.autopause).then(function(e){t.config.autopause=e}),t.embed.getVideoTitle().then(function(i){t.config.title=i,C.setTitle.call(e)}),t.embed.getCurrentTime().then(function(e){c=e,u.dispatchEvent.call(t,t.media,"timeupdate")}),t.embed.getDuration().then(function(e){t.media.duration=e,u.dispatchEvent.call(t,t.media,"durationchange")}),t.embed.getTextTracks().then(function(e){t.media.textTracks=e,f.setup.call(t)}),t.embed.on("cuechange",function(e){var i=e.cues,n=(void 0===i?[]:i).map(function(e){return u.stripHTML(e.text)});f.updateCues.call(t,n)}),t.embed.on("loaded",function(){(t.embed.getPaused().then(function(e){N.call(t,!e),e||u.dispatchEvent.call(t,t.media,"playing")}),u.is.element(t.embed.element)&&t.supported.ui)&&t.embed.element.setAttribute("tabindex",-1)}),t.embed.on("play",function(){N.call(t,!0),u.dispatchEvent.call(t,t.media,"playing")}),t.embed.on("pause",function(){N.call(t,!1)}),t.embed.on("timeupdate",function(e){t.media.seeking=!1,c=e.seconds,u.dispatchEvent.call(t,t.media,"timeupdate")}),t.embed.on("progress",function(e){t.media.buffered=e.percent,u.dispatchEvent.call(t,t.media,"progress"),1===parseInt(e.percent,10)&&u.dispatchEvent.call(t,t.media,"canplaythrough"),t.embed.getDuration().then(function(e){e!==t.media.duration&&(t.media.duration=e,u.dispatchEvent.call(t,t.media,"durationchange"))})}),t.embed.on("seeked",function(){t.media.seeking=!1,u.dispatchEvent.call(t,t.media,"seeked")}),t.embed.on("ended",function(){t.media.paused=!0,u.dispatchEvent.call(t,t.media,"ended")}),t.embed.on("error",function(e){t.media.error=e,u.dispatchEvent.call(t,t.media,"error")}),setTimeout(function(){return C.build.call(t)},0)}};function x(e){switch(e){case"hd2160":return 2160;case 2160:return"hd2160";case"hd1440":return 1440;case 1440:return"hd1440";case"hd1080":return 1080;case 1080:return"hd1080";case"hd720":return 720;case 720:return"hd720";case"large":return 480;case 480:return"large";case"medium":return 360;case 360:return"medium";case"small":return 240;case 240:return"small";default:return"default"}}function M(e){e&&!this.embed.hasPlayed&&(this.embed.hasPlayed=!0),this.media.paused===e&&(this.media.paused=!e,u.dispatchEvent.call(this,this.media,e?"play":"pause"))}var I={setup:function(){var e=this;u.toggleClass(this.elements.wrapper,this.config.classNames.embed,!0),I.setAspectRatio.call(this),u.is.object(window.YT)&&u.is.function(window.YT.Player)?I.ready.call(this):(u.loadScript(this.config.urls.youtube.sdk).catch(function(t){e.debug.warn("YouTube API failed to load",t)}),window.onYouTubeReadyCallbacks=window.onYouTubeReadyCallbacks||[],window.onYouTubeReadyCallbacks.push(function(){I.ready.call(e)}),window.onYouTubeIframeAPIReady=function(){window.onYouTubeReadyCallbacks.forEach(function(e){e()})})},getTitle:function(e){var t=this;if(u.is.function(this.embed.getVideoData)){var i=this.embed.getVideoData().title;if(u.is.empty(i))return this.config.title=i,void C.setTitle.call(this)}var n=this.config.keys.google;if(u.is.string(n)&&!u.is.empty(n)){var s=u.format(this.config.urls.youtube.api,e,n);u.fetch(s).then(function(e){u.is.object(e)&&(t.config.title=e.items[0].snippet.title,C.setTitle.call(t))}).catch(function(){})}},setAspectRatio:function(){var e=this.config.ratio.split(":");this.elements.wrapper.style.paddingBottom=100/e[0]*e[1]+"%"},ready:function(){var e=this,t=e.media.getAttribute("id");if(u.is.empty(t)||!t.startsWith("youtube-")){var i=e.media.getAttribute("src");u.is.empty(i)&&(i=e.media.getAttribute(this.config.attributes.embed.id));var n=u.parseYouTubeId(i),s=u.generateId(e.provider),a=u.createElement("div",{id:s});e.media=u.replaceElement(a,e.media);var r=function(e){return"https://img.youtube.com/vi/"+n+"/"+e+"default.jpg"};u.loadImage(r("maxres"),121).catch(function(){return u.loadImage(r("sd"),121)}).catch(function(){return u.loadImage(r("hq"))}).then(function(t){return C.setPoster.call(e,t.src)}).then(function(t){t.includes("maxres")||(e.elements.poster.style.backgroundSize="cover")}),e.embed=new window.YT.Player(s,{videoId:n,playerVars:{autoplay:e.config.autoplay?1:0,controls:e.supported.ui?0:1,rel:0,showinfo:0,iv_load_policy:3,modestbranding:1,disablekb:1,playsinline:1,widget_referrer:window?window.location.href:null,cc_load_policy:e.captions.active?1:0,cc_lang_pref:e.config.captions.language},events:{onError:function(t){if(!u.is.object(e.media.error)){var i={code:t.data};switch(t.data){case 2:i.message="The request contains an invalid parameter value. For example, this error occurs if you specify a video ID that does not have 11 characters, or if the video ID contains invalid characters, such as exclamation points or asterisks.";break;case 5:i.message="The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.";break;case 100:i.message="The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.";break;case 101:case 150:i.message="The owner of the requested video does not allow it to be played in embedded players.";break;default:i.message="An unknown error occured"}e.media.error=i,u.dispatchEvent.call(e,e.media,"error")}},onPlaybackQualityChange:function(){u.dispatchEvent.call(e,e.media,"qualitychange",!1,{quality:e.media.quality})},onPlaybackRateChange:function(t){var i=t.target;e.media.playbackRate=i.getPlaybackRate(),u.dispatchEvent.call(e,e.media,"ratechange")},onReady:function(t){var i=t.target;I.getTitle.call(e,n),e.media.play=function(){M.call(e,!0),i.playVideo()},e.media.pause=function(){M.call(e,!1),i.pauseVideo()},e.media.stop=function(){i.stopVideo()},e.media.duration=i.getDuration(),e.media.paused=!0,e.media.currentTime=0,Object.defineProperty(e.media,"currentTime",{get:function(){return Number(i.getCurrentTime())},set:function(t){e.paused&&e.embed.mute(),e.media.seeking=!0,u.dispatchEvent.call(e,e.media,"seeking"),i.seekTo(t)}}),Object.defineProperty(e.media,"playbackRate",{get:function(){return i.getPlaybackRate()},set:function(e){i.setPlaybackRate(e)}}),Object.defineProperty(e.media,"quality",{get:function(){return x(i.getPlaybackQuality())},set:function(t){var n=t;i.setPlaybackQuality(x(n)),u.dispatchEvent.call(e,e.media,"qualityrequested",!1,{quality:n})}});var s=e.config.volume;Object.defineProperty(e.media,"volume",{get:function(){return s},set:function(t){s=t,i.setVolume(100*s),u.dispatchEvent.call(e,e.media,"volumechange")}});var a=e.config.muted;Object.defineProperty(e.media,"muted",{get:function(){return a},set:function(t){var n=u.is.boolean(t)?t:a;a=n,i[n?"mute":"unMute"](),u.dispatchEvent.call(e,e.media,"volumechange")}}),Object.defineProperty(e.media,"currentSrc",{get:function(){return i.getVideoUrl()}}),Object.defineProperty(e.media,"ended",{get:function(){return e.currentTime===e.duration}}),e.options.speed=i.getAvailablePlaybackRates(),e.supported.ui&&e.media.setAttribute("tabindex",-1),u.dispatchEvent.call(e,e.media,"timeupdate"),u.dispatchEvent.call(e,e.media,"durationchange"),clearInterval(e.timers.buffering),e.timers.buffering=setInterval(function(){e.media.buffered=i.getVideoLoadedFraction(),(null===e.media.lastBuffered||e.media.lastBuffered<e.media.buffered)&&u.dispatchEvent.call(e,e.media,"progress"),e.media.lastBuffered=e.media.buffered,1===e.media.buffered&&(clearInterval(e.timers.buffering),u.dispatchEvent.call(e,e.media,"canplaythrough"))},200),setTimeout(function(){return C.build.call(e)},50)},onStateChange:function(t){var i,n=t.target;switch(clearInterval(e.timers.playing),e.media.seeking&&[1,2].includes(t.data)&&(e.media.seeking=!1,u.dispatchEvent.call(e,e.media,"seeked")),t.data){case-1:u.dispatchEvent.call(e,e.media,"timeupdate"),e.media.buffered=n.getVideoLoadedFraction(),u.dispatchEvent.call(e,e.media,"progress");break;case 0:M.call(e,!1),e.media.loop?(n.stopVideo(),n.playVideo()):u.dispatchEvent.call(e,e.media,"ended");break;case 1:e.media.paused&&!e.embed.hasPlayed?e.media.pause():(M.call(e,!0),u.dispatchEvent.call(e,e.media,"playing"),e.timers.playing=setInterval(function(){u.dispatchEvent.call(e,e.media,"timeupdate")},50),e.media.duration!==n.getDuration()&&(e.media.duration=n.getDuration(),u.dispatchEvent.call(e,e.media,"durationchange")),g.setQualityMenu.call(e,(i=n.getAvailableQualityLevels(),u.is.empty(i)?i:u.dedupe(i.map(function(e){return x(e)})))));break;case 2:e.muted||e.embed.unMute(),M.call(e,!1)}u.dispatchEvent.call(e,e.elements.container,"statechange",!1,{code:t.data})}}})}}},_={setup:function(){if(this.media)if(u.toggleClass(this.elements.container,this.config.classNames.type.replace("{0}",this.type),!0),u.toggleClass(this.elements.container,this.config.classNames.provider.replace("{0}",this.provider),!0),this.isEmbed&&u.toggleClass(this.elements.container,this.config.classNames.type.replace("{0}","video"),!0),this.isVideo&&(this.elements.wrapper=u.createElement("div",{class:this.config.classNames.video}),u.wrap(this.media,this.elements.wrapper),this.elements.poster=u.createElement("div",{class:this.config.classNames.poster}),this.elements.wrapper.appendChild(this.elements.poster)),this.isEmbed)switch(this.provider){case"youtube":I.setup.call(this);break;case"vimeo":L.setup.call(this)}else this.isHTML5&&p.extend.call(this);else this.debug.warn("No media element found!")}},q=function(){function e(t){var i=this;n(this,e),this.player=t,this.publisherId=t.config.ads.publisherId,this.playing=!1,this.initialized=!1,this.elements={container:null,displayContainer:null},this.manager=null,this.loader=null,this.cuePoints=null,this.events={},this.safetyTimer=null,this.countdownTimer=null,this.managerPromise=new Promise(function(e,t){i.on("loaded",e),i.on("error",t)}),this.load()}return s(e,[{key:"load",value:function(){var e=this;this.enabled&&(u.is.object(window.google)&&u.is.object(window.google.ima)?this.ready():u.loadScript(this.player.config.urls.googleIMA.sdk).then(function(){e.ready()}).catch(function(){e.trigger("error",new Error("Google IMA SDK failed to load"))}))}},{key:"ready",value:function(){var e=this;this.startSafetyTimer(12e3,"ready()"),this.managerPromise.then(function(){e.clearSafetyTimer("onAdsManagerLoaded()")}),this.listeners(),this.setupIMA()}},{key:"setupIMA",value:function(){this.elements.container=u.createElement("div",{class:this.player.config.classNames.ads}),this.player.elements.container.appendChild(this.elements.container),google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED),google.ima.settings.setLocale(this.player.config.ads.language),this.elements.displayContainer=new google.ima.AdDisplayContainer(this.elements.container),this.requestAds()}},{key:"requestAds",value:function(){var e=this,t=this.player.elements.container;try{this.loader=new google.ima.AdsLoader(this.elements.displayContainer),this.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED,function(t){return e.onAdsManagerLoaded(t)},!1),this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR,function(t){return e.onAdError(t)},!1);var i=new google.ima.AdsRequest;i.adTagUrl=this.tagUrl,i.linearAdSlotWidth=t.offsetWidth,i.linearAdSlotHeight=t.offsetHeight,i.nonLinearAdSlotWidth=t.offsetWidth,i.nonLinearAdSlotHeight=t.offsetHeight,i.forceNonLinearFullSlot=!1,i.setAdWillPlayMuted(!this.player.muted),this.loader.requestAds(i)}catch(e){this.onAdError(e)}}},{key:"pollCountdown",value:function(){var e=this;if(!(arguments.length>0&&void 0!==arguments[0]&&arguments[0]))return clearInterval(this.countdownTimer),void this.elements.container.removeAttribute("data-badge-text");this.countdownTimer=setInterval(function(){var t=u.formatTime(Math.max(e.manager.getRemainingTime(),0)),i=h("advertisement",e.player.config)+" - "+t;e.elements.container.setAttribute("data-badge-text",i)},100)}},{key:"onAdsManagerLoaded",value:function(e){var t=this,i=new google.ima.AdsRenderingSettings;i.restoreCustomPlaybackStateOnAdBreakComplete=!0,i.enablePreloading=!0,this.manager=e.getAdsManager(this.player,i),this.cuePoints=this.manager.getCuePoints(),u.is.empty(this.cuePoints)||this.cuePoints.forEach(function(e){if(0!==e&&-1!==e&&e<t.player.duration){var i=t.player.elements.progress;if(u.is.element(i)){var n=100/t.player.duration*e,s=u.createElement("span",{class:t.player.config.classNames.cues});s.style.left=n.toString()+"%",i.appendChild(s)}}}),this.manager.setVolume(this.player.volume),this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR,function(e){return t.onAdError(e)}),Object.keys(google.ima.AdEvent.Type).forEach(function(e){t.manager.addEventListener(google.ima.AdEvent.Type[e],function(e){return t.onAdEvent(e)})}),this.trigger("loaded")}},{key:"onAdEvent",value:function(e){var t=this,i=this.player.elements.container,n=e.getAd(),s=function(e){var i="ads"+e.replace(/_/g,"").toLowerCase();u.dispatchEvent.call(t.player,t.player.media,i)};switch(e.type){case google.ima.AdEvent.Type.LOADED:this.trigger("loaded"),s(e.type),this.pollCountdown(!0),n.isLinear()||(n.width=i.offsetWidth,n.height=i.offsetHeight);break;case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:s(e.type),this.loadAds();break;case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:s(e.type),this.pauseContent();break;case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:s(e.type),this.pollCountdown(),this.resumeContent();break;case google.ima.AdEvent.Type.STARTED:case google.ima.AdEvent.Type.MIDPOINT:case google.ima.AdEvent.Type.COMPLETE:case google.ima.AdEvent.Type.IMPRESSION:case google.ima.AdEvent.Type.CLICK:s(e.type)}}},{key:"onAdError",value:function(e){this.cancel(),this.player.debug.warn("Ads error",e)}},{key:"listeners",value:function(){var e=this,t=this.player.elements.container,i=void 0;this.player.on("ended",function(){e.loader.contentComplete()}),this.player.on("seeking",function(){return i=e.player.currentTime}),this.player.on("seeked",function(){var t=e.player.currentTime;u.is.empty(e.cuePoints)||e.cuePoints.forEach(function(n,s){i<n&&n<t&&(e.manager.discardAdBreak(),e.cuePoints.splice(s,1))})}),window.addEventListener("resize",function(){e.manager&&e.manager.resize(t.offsetWidth,t.offsetHeight,google.ima.ViewMode.NORMAL)})}},{key:"play",value:function(){var e=this,t=this.player.elements.container;this.managerPromise||this.resumeContent(),this.managerPromise.then(function(){e.elements.displayContainer.initialize();try{e.initialized||(e.manager.init(t.offsetWidth,t.offsetHeight,google.ima.ViewMode.NORMAL),e.manager.start()),e.initialized=!0}catch(t){e.onAdError(t)}}).catch(function(){})}},{key:"resumeContent",value:function(){this.elements.container.style.zIndex="",this.playing=!1,this.player.currentTime<this.player.duration&&this.player.play()}},{key:"pauseContent",value:function(){this.elements.container.style.zIndex=3,this.playing=!0,this.player.pause()}},{key:"cancel",value:function(){this.initialized&&this.resumeContent(),this.trigger("error"),this.loadAds()}},{key:"loadAds",value:function(){var e=this;this.managerPromise.then(function(){e.manager&&e.manager.destroy(),e.managerPromise=new Promise(function(t){e.on("loaded",t),e.player.debug.log(e.manager)}),e.requestAds()}).catch(function(){})}},{key:"trigger",value:function(e){for(var t=this,i=arguments.length,n=Array(i>1?i-1:0),s=1;s<i;s++)n[s-1]=arguments[s];var a=this.events[e];u.is.array(a)&&a.forEach(function(e){u.is.function(e)&&e.apply(t,n)})}},{key:"on",value:function(e,t){return u.is.array(this.events[e])||(this.events[e]=[]),this.events[e].push(t),this}},{key:"startSafetyTimer",value:function(e,t){var i=this;this.player.debug.log("Safety timer invoked from: "+t),this.safetyTimer=setTimeout(function(){i.cancel(),i.clearSafetyTimer("startSafetyTimer()")},e)}},{key:"clearSafetyTimer",value:function(e){u.is.nullOrUndefined(this.safetyTimer)||(this.player.debug.log("Safety timer cleared from: "+e),clearTimeout(this.safetyTimer),this.safetyTimer=null)}},{key:"enabled",get:function(){return this.player.isVideo&&this.player.config.ads.enabled&&!u.is.empty(this.publisherId)}},{key:"tagUrl",get:function(){var e={AV_PUBLISHERID:"58c25bb0073ef448b1087ad6",AV_CHANNELID:"5a0458dc28a06145e4519d21",AV_URL:location.hostname,cb:Date.now(),AV_WIDTH:640,AV_HEIGHT:480,AV_CDIM2:this.publisherId};return"https://go.aniview.com/api/adserver6/vast/?"+u.buildUrlParams(e)}}]),e}(),H={insertElements:function(e,t){var i=this;u.is.string(t)?u.insertElement(e,this.media,{src:t}):u.is.array(t)&&t.forEach(function(t){u.insertElement(e,i.media,t)})},change:function(e){var t=this;u.is.object(e)&&"sources"in e&&e.sources.length?(p.cancelRequests.call(this),this.destroy.call(this,function(){switch(t.options.quality=[],u.removeElement(t.media),t.media=null,u.is.element(t.elements.container)&&t.elements.container.removeAttribute("class"),t.type=e.type,t.provider=u.is.empty(e.sources[0].provider)?o.html5:e.sources[0].provider,t.supported=d.check(t.type,t.provider,t.config.playsinline),t.provider+":"+t.type){case"html5:video":t.media=u.createElement("video");break;case"html5:audio":t.media=u.createElement("audio");break;case"youtube:video":case"vimeo:video":t.media=u.createElement("div",{src:e.sources[0].src})}t.elements.container.appendChild(t.media),u.is.boolean(e.autoplay)&&(t.config.autoplay=e.autoplay),t.isHTML5&&(t.config.crossorigin&&t.media.setAttribute("crossorigin",""),t.config.autoplay&&t.media.setAttribute("autoplay",""),u.is.empty(e.poster)||(t.poster=e.poster),t.config.loop.active&&t.media.setAttribute("loop",""),t.config.muted&&t.media.setAttribute("muted",""),t.config.playsinline&&t.media.setAttribute("playsinline","")),C.addStyleHook.call(t),t.isHTML5&&H.insertElements.call(t,"source",e.sources),t.config.title=e.title,_.setup.call(t),t.isHTML5&&("tracks"in e&&H.insertElements.call(t,"track",e.tracks),t.media.load()),(t.isHTML5||t.isEmbed&&!t.supported.ui)&&C.build.call(t),t.fullscreen.update()},!0)):this.debug.warn("Invalid source format")}},O=function(){function e(t,i){var s=this;if(n(this,e),this.timers={},this.ready=!1,this.loading=!1,this.failed=!1,this.touch=d.touch,this.media=t,u.is.string(this.media)&&(this.media=document.querySelectorAll(this.media)),(window.jQuery&&this.media instanceof jQuery||u.is.nodeList(this.media)||u.is.array(this.media))&&(this.media=this.media[0]),this.config=u.extend({},b,e.defaults,i||{},function(){try{return JSON.parse(s.media.getAttribute("data-plyr-config"))}catch(e){return{}}}()),this.elements={container:null,buttons:{},display:{},progress:{},inputs:{},settings:{menu:null,panes:{},tabs:{}},captions:null},this.captions={active:null,currentTrack:-1,meta:new WeakMap},this.fullscreen={active:!1},this.options={speed:[],quality:[]},this.debug=new v(this.config.debug),this.debug.log("Config",this.config),this.debug.log("Support",d),!u.is.nullOrUndefined(this.media)&&u.is.element(this.media))if(this.media.plyr)this.debug.warn("Target already setup");else if(this.config.enabled)if(d.check().api){var a=this.media.cloneNode(!0);a.autoplay=!1,this.elements.original=a;var r=this.media.tagName.toLowerCase(),p=null,h=null,m=null;switch(r){case"div":if(p=this.media.querySelector("iframe"),u.is.element(p)){if(h=p.getAttribute("src"),this.provider=u.getProviderByUrl(h),this.elements.container=this.media,this.media=p,this.elements.container.className="",m=u.getUrlParams(h),!u.is.empty(m)){var g=["1","true"];g.includes(m.autoplay)&&(this.config.autoplay=!0),g.includes(m.loop)&&(this.config.loop.active=!0),this.isYouTube?this.config.playsinline=g.includes(m.playsinline):this.config.playsinline=!0}}else this.provider=this.media.getAttribute(this.config.attributes.embed.provider),this.media.removeAttribute(this.config.attributes.embed.provider);if(u.is.empty(this.provider)||!Object.keys(o).includes(this.provider))return void this.debug.error("Setup failed: Invalid provider");this.type=c.video;break;case"video":case"audio":this.type=r,this.provider=o.html5,this.media.hasAttribute("crossorigin")&&(this.config.crossorigin=!0),this.media.hasAttribute("autoplay")&&(this.config.autoplay=!0),this.media.hasAttribute("playsinline")&&(this.config.playsinline=!0),this.media.hasAttribute("muted")&&(this.config.muted=!0),this.media.hasAttribute("loop")&&(this.config.loop.active=!0);break;default:return void this.debug.error("Setup failed: unsupported type")}this.supported=d.check(this.type,this.provider,this.config.playsinline),this.supported.api?(this.listeners=new P(this),this.storage=new l(this),this.media.plyr=this,u.is.element(this.elements.container)||(this.elements.container=u.createElement("div"),u.wrap(this.media,this.elements.container)),C.addStyleHook.call(this),_.setup.call(this),this.config.debug&&u.on(this.elements.container,this.config.events.join(" "),function(e){s.debug.log("event: "+e.type)}),(this.isHTML5||this.isEmbed&&!this.supported.ui)&&C.build.call(this),this.listeners.container(),this.listeners.global(),this.fullscreen=new E(this),this.ads=new q(this),this.config.autoplay&&this.play()):this.debug.error("Setup failed: no support")}else this.debug.error("Setup failed: no support");else this.debug.error("Setup failed: disabled by config");else this.debug.error("Setup failed: no suitable element passed")}return s(e,[{key:"play",value:function(){return u.is.function(this.media.play)?this.media.play():null}},{key:"pause",value:function(){this.playing&&u.is.function(this.media.pause)&&this.media.pause()}},{key:"togglePlay",value:function(e){(u.is.boolean(e)?e:!this.playing)?this.play():this.pause()}},{key:"stop",value:function(){this.isHTML5?(this.pause(),this.restart()):u.is.function(this.media.stop)&&this.media.stop()}},{key:"restart",value:function(){this.currentTime=0}},{key:"rewind",value:function(e){this.currentTime=this.currentTime-(u.is.number(e)?e:this.config.seekTime)}},{key:"forward",value:function(e){this.currentTime=this.currentTime+(u.is.number(e)?e:this.config.seekTime)}},{key:"increaseVolume",value:function(e){var t=this.media.muted?0:this.volume;this.volume=t+(u.is.number(e)?e:1)}},{key:"decreaseVolume",value:function(e){var t=this.media.muted?0:this.volume;this.volume=t-(u.is.number(e)?e:1)}},{key:"toggleCaptions",value:function(e){if(this.supported.ui){var t=u.is.boolean(e)?e:!this.elements.container.classList.contains(this.config.classNames.captions.active);this.elements.buttons.captions.pressed=t,u.toggleClass(this.elements.container,this.config.classNames.captions.active,t),t!==this.captions.active&&(this.captions.active=t,u.dispatchEvent.call(this,this.media,this.captions.active?"captionsenabled":"captionsdisabled"))}}},{key:"airplay",value:function(){d.airplay&&this.media.webkitShowPlaybackTargetPicker()}},{key:"toggleControls",value:function(e){if(this.supported.ui&&!this.isAudio){var t=u.hasClass(this.elements.container,this.config.classNames.hideControls),i=void 0===e?void 0:!e,n=u.toggleClass(this.elements.container,this.config.classNames.hideControls,i);if(n&&this.config.controls.includes("settings")&&!u.is.empty(this.config.settings)&&g.toggleMenu.call(this,!1),n!==t){var s=n?"controlshidden":"controlsshown";u.dispatchEvent.call(this,this.media,s)}return!n}return!1}},{key:"on",value:function(e,t){u.on(this.elements.container,e,t)}},{key:"off",value:function(e,t){u.off(this.elements.container,e,t)}},{key:"destroy",value:function(e){var t=this,i=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(this.ready){var n=function(){document.body.style.overflow="",t.embed=null,i?(Object.keys(t.elements).length&&(u.removeElement(t.elements.buttons.play),u.removeElement(t.elements.captions),u.removeElement(t.elements.controls),u.removeElement(t.elements.wrapper),t.elements.buttons.play=null,t.elements.captions=null,t.elements.controls=null,t.elements.wrapper=null),u.is.function(e)&&e()):(t.listeners.clear(),u.replaceElement(t.elements.original,t.elements.container),u.dispatchEvent.call(t,t.elements.original,"destroyed",!0),u.is.function(e)&&e.call(t.elements.original),t.ready=!1,setTimeout(function(){t.elements=null,t.media=null},200))};switch(this.stop(),this.provider+":"+this.type){case"html5:video":case"html5:audio":clearTimeout(this.timers.loading),C.toggleNativeControls.call(this,!0),n();break;case"youtube:video":clearInterval(this.timers.buffering),clearInterval(this.timers.playing),null!==this.embed&&u.is.function(this.embed.destroy)&&this.embed.destroy(),n();break;case"vimeo:video":null!==this.embed&&this.embed.unload().then(n),setTimeout(n,200)}}}},{key:"supports",value:function(e){return d.mime.call(this,e)}},{key:"isHTML5",get:function(){return Boolean(this.provider===o.html5)}},{key:"isEmbed",get:function(){return Boolean(this.isYouTube||this.isVimeo)}},{key:"isYouTube",get:function(){return Boolean(this.provider===o.youtube)}},{key:"isVimeo",get:function(){return Boolean(this.provider===o.vimeo)}},{key:"isVideo",get:function(){return Boolean(this.type===c.video)}},{key:"isAudio",get:function(){return Boolean(this.type===c.audio)}},{key:"playing",get:function(){return Boolean(this.ready&&!this.paused&&!this.ended)}},{key:"paused",get:function(){return Boolean(this.media.paused)}},{key:"stopped",get:function(){return Boolean(this.paused&&0===this.currentTime)}},{key:"ended",get:function(){return Boolean(this.media.ended)}},{key:"currentTime",set:function(e){if(this.duration){var t=u.is.number(e)&&e>0;this.media.currentTime=t?Math.min(e,this.duration):0,this.debug.log("Seeking to "+this.currentTime+" seconds")}},get:function(){return Number(this.media.currentTime)}},{key:"buffered",get:function(){var e=this.media.buffered;return u.is.number(e)?e:e&&e.length&&this.duration>0?e.end(0)/this.duration:0}},{key:"seeking",get:function(){return Boolean(this.media.seeking)}},{key:"duration",get:function(){var e=parseFloat(this.config.duration),t=(this.media||{}).duration||0;return e||t}},{key:"volume",set:function(e){var t=e;u.is.string(t)&&(t=Number(t)),u.is.number(t)||(t=this.storage.get("volume")),u.is.number(t)||(t=this.config.volume),t>1&&(t=1),t<0&&(t=0),this.config.volume=t,this.media.volume=t,!u.is.empty(e)&&this.muted&&t>0&&(this.muted=!1)},get:function(){return Number(this.media.volume)}},{key:"muted",set:function(e){var t=e;u.is.boolean(t)||(t=this.storage.get("muted")),u.is.boolean(t)||(t=this.config.muted),this.config.muted=t,this.media.muted=t},get:function(){return Boolean(this.media.muted)}},{key:"hasAudio",get:function(){return!this.isHTML5||(!!this.isAudio||(Boolean(this.media.mozHasAudio)||Boolean(this.media.webkitAudioDecodedByteCount)||Boolean(this.media.audioTracks&&this.media.audioTracks.length)))}},{key:"speed",set:function(e){var t=null;u.is.number(e)&&(t=e),u.is.number(t)||(t=this.storage.get("speed")),u.is.number(t)||(t=this.config.speed.selected),t<.1&&(t=.1),t>2&&(t=2),this.config.speed.options.includes(t)?(this.config.speed.selected=t,this.media.playbackRate=t):this.debug.warn("Unsupported speed ("+t+")")},get:function(){return Number(this.media.playbackRate)}},{key:"quality",set:function(e){var t=null;if(u.is.empty(e)||(t=Number(e)),u.is.number(t)||(t=this.storage.get("quality")),u.is.number(t)||(t=this.config.quality.selected),u.is.number(t)||(t=this.config.quality.default),this.options.quality.length){if(!this.options.quality.includes(t)){var i=u.closest(this.options.quality,t);this.debug.warn("Unsupported quality option: "+t+", using "+i+" instead"),t=i}this.config.quality.selected=t,this.media.quality=t}},get:function(){return this.media.quality}},{key:"loop",set:function(e){var t=u.is.boolean(e)?e:this.config.loop.active;this.config.loop.active=t,this.media.loop=t},get:function(){return Boolean(this.media.loop)}},{key:"source",set:function(e){H.change.call(this,e)},get:function(){return this.media.currentSrc}},{key:"poster",set:function(e){this.isVideo?C.setPoster.call(this,e):this.debug.warn("Poster can only be set for video")},get:function(){return this.isVideo?this.media.getAttribute("poster"):null}},{key:"autoplay",set:function(e){var t=u.is.boolean(e)?e:this.config.autoplay;this.config.autoplay=t},get:function(){return Boolean(this.config.autoplay)}},{key:"currentTrack",set:function(e){f.set.call(this,e)},get:function(){var e=this.captions,t=e.active,i=e.currentTrack;return t?i:-1}},{key:"language",set:function(e){f.setLanguage.call(this,e)},get:function(){return(f.getCurrentTrack.call(this)||{}).language}},{key:"pip",set:function(e){var t="picture-in-picture",i="inline";if(d.pip){var n=u.is.boolean(e)?e:this.pip===i;this.media.webkitSetPresentationMode(n?t:i)}},get:function(){return d.pip?this.media.webkitPresentationMode:null}}],[{key:"supported",value:function(e,t,i){return d.check(e,t,i)}},{key:"loadSprite",value:function(e,t){return u.loadSprite(e,t)}},{key:"setup",value:function(t){var i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=null;return u.is.string(t)?n=Array.from(document.querySelectorAll(t)):u.is.nodeList(t)?n=Array.from(t):u.is.array(t)&&(n=t.filter(u.is.element)),u.is.empty(n)?null:n.map(function(t){return new e(t,i)})}}]),e}();return O.defaults=u.cloneDeep(b),O});
+"object"==typeof navigator&&function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define("Plyr",t):e.Plyr=t()}(this,function(){"use strict";var e=function(e){return null!=e?e.constructor:null},t=function(e,t){return Boolean(e&&t&&e instanceof t)},i={object:function(t){return e(t)===Object},number:function(t){return e(t)===Number&&!Number.isNaN(t)},string:function(t){return e(t)===String},boolean:function(t){return e(t)===Boolean},function:function(t){return e(t)===Function},array:function(e){return!i.nullOrUndefined(e)&&Array.isArray(e)},weakMap:function(e){return t(e,WeakMap)},nodeList:function(e){return t(e,NodeList)},element:function(e){return t(e,Element)},textNode:function(t){return e(t)===Text},event:function(e){return t(e,Event)},cue:function(e){return t(e,window.TextTrackCue)||t(e,window.VTTCue)},track:function(e){return t(e,TextTrack)||!i.nullOrUndefined(e)&&i.string(e.kind)},url:function(e){return!i.nullOrUndefined(e)&&/(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-/]))?/.test(e)},nullOrUndefined:function(e){return null==e},empty:function(e){return i.nullOrUndefined(e)||(i.string(e)||i.array(e)||i.nodeList(e))&&!e.length||i.object(e)&&!Object.keys(e).length}},n=function(){var e=!1;try{var t=Object.defineProperty({},"passive",{get:function(){return e=!0,null}});window.addEventListener("test",null,t),window.removeEventListener("test",null,t)}catch(e){}return e}();function a(e,t,a){var s=arguments.length>3&&void 0!==arguments[3]&&arguments[3],r=this,l=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],o=arguments.length>5&&void 0!==arguments[5]&&arguments[5];if(e&&"addEventListener"in e&&!i.empty(t)&&i.function(a)){var c=t.split(" "),u=o;n&&(u={passive:l,capture:o}),c.forEach(function(t){r&&r.eventListeners&&s&&r.eventListeners.push({element:e,type:t,callback:a,options:u}),e[s?"addEventListener":"removeEventListener"](t,a,u)})}}function s(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",i=arguments[2],n=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],s=arguments.length>4&&void 0!==arguments[4]&&arguments[4];a.call(this,e,t,i,!0,n,s)}function r(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",i=arguments[2],n=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],s=arguments.length>4&&void 0!==arguments[4]&&arguments[4];a.call(this,e,t,i,!1,n,s)}function l(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",i=arguments[2],n=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],s=arguments.length>4&&void 0!==arguments[4]&&arguments[4];a.call(this,e,t,function a(){r(e,t,a,n,s);for(var l=arguments.length,o=Array(l),c=0;c<l;c++)o[c]=arguments[c];i.apply(this,o)},!0,n,s)}function o(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};if(i.element(e)&&!i.empty(t)){var s=new CustomEvent(t,{bubbles:n,detail:Object.assign({},a,{plyr:this})});e.dispatchEvent(s)}}var c=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},u=function(){function e(e,t){for(var i=0;i<t.length;i++){var n=t[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(t,i,n){return i&&e(t.prototype,i),n&&e(t,n),t}}(),d=function(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e},p=function(){return function(e,t){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return function(e,t){var i=[],n=!0,a=!1,s=void 0;try{for(var r,l=e[Symbol.iterator]();!(n=(r=l.next()).done)&&(i.push(r.value),!t||i.length!==t);n=!0);}catch(e){a=!0,s=e}finally{try{!n&&l.return&&l.return()}finally{if(a)throw s}}return i}(e,t);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}();function h(e,t){var i=e.length?e:[e];Array.from(i).reverse().forEach(function(e,i){var n=i>0?t.cloneNode(!0):t,a=e.parentNode,s=e.nextSibling;n.appendChild(e),s?a.insertBefore(n,s):a.appendChild(n)})}function m(e,t){i.element(e)&&!i.empty(t)&&Object.entries(t).filter(function(e){var t=p(e,2)[1];return!i.nullOrUndefined(t)}).forEach(function(t){var i=p(t,2),n=i[0],a=i[1];return e.setAttribute(n,a)})}function f(e,t,n){var a=document.createElement(e);return i.object(t)&&m(a,t),i.string(n)&&(a.innerText=n),a}function g(e,t,i,n){t.appendChild(f(e,i,n))}function y(e){i.nodeList(e)||i.array(e)?Array.from(e).forEach(y):i.element(e)&&i.element(e.parentNode)&&e.parentNode.removeChild(e)}function v(e){for(var t=e.childNodes.length;t>0;)e.removeChild(e.lastChild),t-=1}function b(e,t){return i.element(t)&&i.element(t.parentNode)&&i.element(e)?(t.parentNode.replaceChild(e,t),e):null}function k(e,t){if(!i.string(e)||i.empty(e))return{};var n={},a=t;return e.split(",").forEach(function(e){var t=e.trim(),s=t.replace(".",""),r=t.replace(/[[\]]/g,"").split("="),l=r[0],o=r.length>1?r[1].replace(/["']/g,""):"";switch(t.charAt(0)){case".":i.object(a)&&i.string(a.class)&&(a.class+=" "+s),n.class=s;break;case"#":n.id=t.replace("#","");break;case"[":n[l]=o}}),n}function w(e,t){if(i.element(e)){var n=t;i.boolean(n)||(n=!e.hasAttribute("hidden")),n?e.setAttribute("hidden",""):e.removeAttribute("hidden")}}function T(e,t,n){if(i.element(e)){var a="toggle";return void 0!==n&&(a=n?"add":"remove"),e.classList[a](t),e.classList.contains(t)}return null}function A(e,t){return i.element(e)&&e.classList.contains(t)}function C(e,t){var i={Element:Element};return(i.matches||i.webkitMatchesSelector||i.mozMatchesSelector||i.msMatchesSelector||function(){return Array.from(document.querySelectorAll(t)).includes(this)}).call(e,t)}function E(e){return this.elements.container.querySelectorAll(e)}function S(e){return this.elements.container.querySelector(e)}function P(){var e=document.activeElement;return e=e&&e!==document.body?document.querySelector(":focus"):null}var N,L,x,M=(N=document.createElement("span"),L={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},x=Object.keys(L).find(function(e){return void 0!==N.style[e]}),!!i.string(x)&&L[x]);var _,q={isIE:!!document.documentMode,isWebkit:"WebkitAppearance"in document.documentElement.style&&!/Edge/.test(navigator.userAgent),isIPhone:/(iPhone|iPod)/gi.test(navigator.platform),isIos:/(iPad|iPhone|iPod)/gi.test(navigator.platform)},I={"audio/ogg":"vorbis","audio/wav":"1","video/webm":"vp8, vorbis","video/mp4":"avc1.42E01E, mp4a.40.2","video/ogg":"theora"},O={audio:"canPlayType"in document.createElement("audio"),video:"canPlayType"in document.createElement("video"),check:function(e,t,i){var n=q.isIPhone&&i&&O.playsinline,a=O[e]||"html5"!==t;return{api:a,ui:a&&O.rangeInput&&("video"!==e||!q.isIPhone||n)}},pip:!q.isIPhone&&i.function(f("video").webkitSetPresentationMode),airplay:i.function(window.WebKitPlaybackTargetAvailabilityEvent),playsinline:"playsInline"in document.createElement("video"),mime:function(e){var t=e.split("/"),i=p(t,1)[0];if(!this.isHTML5||i!==this.type)return!1;var n=void 0;e&&e.includes("codecs=")?n=e:"audio/mpeg"===e?n="audio/mpeg;":e in I&&(n=e+'; codecs="'+I[e]+'"');try{return Boolean(n&&this.media.canPlayType(n).replace(/no/,""))}catch(e){return!1}},textTracks:"textTracks"in document.createElement("video"),rangeInput:(_=document.createElement("input"),_.type="range","range"===_.type),touch:"ontouchstart"in document.documentElement,transitions:!1!==M,reducedMotion:"matchMedia"in window&&window.matchMedia("(prefers-reduced-motion)").matches},j={getSources:function(){var e=this;return this.isHTML5?Array.from(this.media.querySelectorAll("source")).filter(function(t){return O.mime.call(e,t.getAttribute("type"))}):[]},getQualityOptions:function(){return j.getSources.call(this).map(function(e){return Number(e.getAttribute("size"))}).filter(Boolean)},extend:function(){if(this.isHTML5){var e=this;Object.defineProperty(e.media,"quality",{get:function(){var t=j.getSources.call(e).filter(function(t){return t.getAttribute("src")===e.source}),i=p(t,1)[0];return i&&Number(i.getAttribute("size"))},set:function(t){var i=j.getSources.call(e).find(function(e){return Number(e.getAttribute("size"))===t});if(i){var n=e.currentTime,a=e.playing;e.media.src=i.getAttribute("src");e.once("loadedmetadata",function(){e.currentTime=n}),e.media.load(),a&&e.play(),o.call(e,e.media,"qualitychange",!1,{quality:t})}}})}},cancelRequests:function(){this.isHTML5&&(y(j.getSources.call(this)),this.media.setAttribute("src",this.config.blankVideo),this.media.load(),this.debug.log("Cancelled network requests"))}};function R(e,t){return t.split(".").reduce(function(e,t){return e&&e[t]},e)}function V(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length,n=Array(t>1?t-1:0),a=1;a<t;a++)n[a-1]=arguments[a];if(!n.length)return e;var s=n.shift();return i.object(s)?(Object.keys(s).forEach(function(t){i.object(s[t])?(Object.keys(e).includes(t)||Object.assign(e,d({},t,{})),V(e[t],s[t])):Object.assign(e,d({},t,s[t]))}),V.apply(void 0,[e].concat(n))):e}function H(e){for(var t=arguments.length,n=Array(t>1?t-1:0),a=1;a<t;a++)n[a-1]=arguments[a];return i.empty(e)?e:e.toString().replace(/{(\d+)}/g,function(e,t){return n[t].toString()})}function B(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"";return e.replace(new RegExp(t.toString().replace(/([.*+?^=!:${}()|[\]/\\])/g,"\\$1"),"g"),i.toString())}function D(){return(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"").toString().replace(/\w\S*/g,function(e){return e.charAt(0).toUpperCase()+e.substr(1).toLowerCase()})}function F(){var e=(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"").toString();return(e=function(){var e=(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"").toString();return e=B(e,"-"," "),e=B(e,"_"," "),B(e=D(e)," ","")}(e)).charAt(0).toLowerCase()+e.slice(1)}function U(e){var t=document.createElement("div");return t.appendChild(e),t.innerHTML}var z=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(i.empty(e)||i.empty(t))return"";var n=R(t.i18n,e);if(i.empty(n))return"";var a={"{seektime}":t.seekTime,"{title}":t.title};return Object.entries(a).forEach(function(e){var t=p(e,2),i=t[0],a=t[1];n=B(n,i,a)}),n};function W(e){return i.array(e)?e.filter(function(t,i){return e.indexOf(t)===i}):e}var K=function(){function e(t){c(this,e),this.enabled=t.config.storage.enabled,this.key=t.config.storage.key}return u(e,[{key:"get",value:function(t){if(!e.supported||!this.enabled)return null;var n=window.localStorage.getItem(this.key);if(i.empty(n))return null;var a=JSON.parse(n);return i.string(t)&&t.length?a[t]:a}},{key:"set",value:function(t){if(e.supported&&this.enabled&&i.object(t)){var n=this.get();i.empty(n)&&(n={}),V(n,t),window.localStorage.setItem(this.key,JSON.stringify(n))}}}],[{key:"supported",get:function(){try{if(!("localStorage"in window))return!1;return window.localStorage.setItem("___test","___test"),window.localStorage.removeItem("___test"),!0}catch(e){return!1}}}]),e}();function Y(e,t){if(i.string(e)){var n=i.string(t),a=function(){return null!==document.getElementById(t)},s=function(e,t){e.innerHTML=t,n&&a()||document.body.insertAdjacentElement("afterbegin",e)};if(!n||!a()){var r=K.supported,l=document.createElement("div");if(l.setAttribute("hidden",""),n&&l.setAttribute("id",t),r){var o=window.localStorage.getItem("cache-"+t);if(null!==o){var c=JSON.parse(o);s(l,c.content)}}fetch(e).then(function(e){i.empty(e)||(r&&window.localStorage.setItem("cache-"+t,JSON.stringify({content:e})),s(l,e))}).catch(function(){})}}}var Q=function(e){return parseInt(e/60/60%60,10)},J=function(e){return parseInt(e/60%60,10)},$=function(e){return parseInt(e%60,10)};function X(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if(!i.number(e))return X(null,t,n);var a=function(e){return("0"+e).slice(-2)},s=Q(e),r=J(e),l=$(e);return t||s>0?s+=":":s="",(n&&e>0?"-":"")+s+a(r)+":"+a(l)}var G={getIconUrl:function(){var e=new URL(this.config.iconUrl,window.location).host!==window.location.host||q.isIE&&!window.svg4everybody;return{url:this.config.iconUrl,cors:e}},findElements:function(){try{return this.elements.controls=S.call(this,this.config.selectors.controls.wrapper),this.elements.buttons={play:E.call(this,this.config.selectors.buttons.play),pause:S.call(this,this.config.selectors.buttons.pause),restart:S.call(this,this.config.selectors.buttons.restart),rewind:S.call(this,this.config.selectors.buttons.rewind),fastForward:S.call(this,this.config.selectors.buttons.fastForward),mute:S.call(this,this.config.selectors.buttons.mute),pip:S.call(this,this.config.selectors.buttons.pip),airplay:S.call(this,this.config.selectors.buttons.airplay),settings:S.call(this,this.config.selectors.buttons.settings),captions:S.call(this,this.config.selectors.buttons.captions),fullscreen:S.call(this,this.config.selectors.buttons.fullscreen)},this.elements.progress=S.call(this,this.config.selectors.progress),this.elements.inputs={seek:S.call(this,this.config.selectors.inputs.seek),volume:S.call(this,this.config.selectors.inputs.volume)},this.elements.display={buffer:S.call(this,this.config.selectors.display.buffer),currentTime:S.call(this,this.config.selectors.display.currentTime),duration:S.call(this,this.config.selectors.display.duration)},i.element(this.elements.progress)&&(this.elements.display.seekTooltip=this.elements.progress.querySelector("."+this.config.classNames.tooltip)),!0}catch(e){return this.debug.warn("It looks like there is a problem with your custom controls HTML",e),this.toggleNativeControls(!0),!1}},createIcon:function(e,t){var i=G.getIconUrl.call(this),n=(i.cors?"":i.url)+"#"+this.config.iconPrefix,a=document.createElementNS("http://www.w3.org/2000/svg","svg");m(a,V(t,{role:"presentation",focusable:"false"}));var s=document.createElementNS("http://www.w3.org/2000/svg","use"),r=n+"-"+e;return"href"in s?s.setAttributeNS("http://www.w3.org/1999/xlink","href",r):s.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href",r),a.appendChild(s),a},createLabel:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i={pip:"PIP",airplay:"AirPlay"}[e]||z(e,this.config);return f("span",Object.assign({},t,{class:[t.class,this.config.classNames.hidden].filter(Boolean).join(" ")}),i)},createBadge:function(e){if(i.empty(e))return null;var t=f("span",{class:this.config.classNames.menu.value});return t.appendChild(f("span",{class:this.config.classNames.menu.badge},e)),t},createButton:function(e,t){var n=f("button"),a=Object.assign({},t),s=F(e),r=!1,l=void 0,o=void 0,c=void 0,u=void 0;switch("type"in a||(a.type="button"),"class"in a?a.class.includes(this.config.classNames.control)&&(a.class+=" "+this.config.classNames.control):a.class=this.config.classNames.control,e){case"play":r=!0,l="play",c="pause",o="play",u="pause";break;case"mute":r=!0,l="mute",c="unmute",o="volume",u="muted";break;case"captions":r=!0,l="enableCaptions",c="disableCaptions",o="captions-off",u="captions-on";break;case"fullscreen":r=!0,l="enterFullscreen",c="exitFullscreen",o="enter-fullscreen",u="exit-fullscreen";break;case"play-large":a.class+=" "+this.config.classNames.control+"--overlaid",s="play",l="play",o="play";break;default:l=s,o=e}r?(n.appendChild(G.createIcon.call(this,u,{class:"icon--pressed"})),n.appendChild(G.createIcon.call(this,o,{class:"icon--not-pressed"})),n.appendChild(G.createLabel.call(this,c,{class:"label--pressed"})),n.appendChild(G.createLabel.call(this,l,{class:"label--not-pressed"}))):(n.appendChild(G.createIcon.call(this,o)),n.appendChild(G.createLabel.call(this,l))),V(a,k(this.config.selectors.buttons[s],a)),m(n,a),"play"===s?(i.array(this.elements.buttons[s])||(this.elements.buttons[s]=[]),this.elements.buttons[s].push(n)):this.elements.buttons[s]=n;var d=this.config.classNames.controlPressed;return Object.defineProperty(n,"pressed",{enumerable:!0,get:function(){return A(n,d)},set:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];T(n,d,e)}}),n},createRange:function(e,t){var i=f("input",V(k(this.config.selectors.inputs[e]),{type:"range",min:0,max:100,step:.01,value:0,autocomplete:"off",role:"slider","aria-label":z(e,this.config),"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":0},t));return this.elements.inputs[e]=i,G.updateRangeFill.call(this,i),i},createProgress:function(e,t){var i=f("progress",V(k(this.config.selectors.display[e]),{min:0,max:100,value:0,role:"presentation","aria-hidden":!0},t));if("volume"!==e){i.appendChild(f("span",null,"0"));var n={played:"played",buffer:"buffered"}[e],a=n?z(n,this.config):"";i.innerText="% "+a.toLowerCase()}return this.elements.display[e]=i,i},createTime:function(e){var t=k(this.config.selectors.display[e]),i=f("div",V(t,{class:"plyr__time "+t.class,"aria-label":z(e,this.config)}),"00:00");return this.elements.display[e]=i,i},createMenuItem:function(e){var t=e.value,n=e.list,a=e.type,s=e.title,r=e.badge,l=void 0===r?null:r,o=e.checked,c=void 0!==o&&o,u=f("li"),d=f("label",{class:this.config.classNames.control}),p=f("input",V(k(this.config.selectors.inputs[a]),{type:"radio",name:"plyr-"+a,value:t,checked:c,class:"plyr__sr-only"})),h=f("span",{hidden:""});d.appendChild(p),d.appendChild(h),d.insertAdjacentHTML("beforeend",s),i.element(l)&&d.appendChild(l),u.appendChild(d),n.appendChild(u)},formatTime:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return i.number(e)?X(e,Q(this.duration)>0,t):e},updateTimeDisplay:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];i.element(e)&&i.number(t)&&(e.innerText=G.formatTime(t,n))},updateVolume:function(){this.supported.ui&&(i.element(this.elements.inputs.volume)&&G.setRange.call(this,this.elements.inputs.volume,this.muted?0:this.volume),i.element(this.elements.buttons.mute)&&(this.elements.buttons.mute.pressed=this.muted||0===this.volume))},setRange:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;i.element(e)&&(e.value=t,G.updateRangeFill.call(this,e))},updateProgress:function(e){var t=this;if(this.supported.ui&&i.event(e)){var n,a,s=0;if(e)switch(e.type){case"timeupdate":case"seeking":case"seeked":n=this.currentTime,a=this.duration,s=0===n||0===a||Number.isNaN(n)||Number.isNaN(a)?0:(n/a*100).toFixed(2),"timeupdate"===e.type&&G.setRange.call(this,this.elements.inputs.seek,s);break;case"playing":case"progress":!function(e,n){var a=i.number(n)?n:0,s=i.element(e)?e:t.elements.display.buffer;if(i.element(s)){s.value=a;var r=s.getElementsByTagName("span")[0];i.element(r)&&(r.childNodes[0].nodeValue=a)}}(this.elements.display.buffer,100*this.buffered)}}},updateRangeFill:function(e){var t=i.event(e)?e.target:e;if(i.element(t)&&"range"===t.getAttribute("type")){if(C(t,this.config.selectors.inputs.seek)){t.setAttribute("aria-valuenow",this.currentTime);var n=G.formatTime(this.currentTime),a=G.formatTime(this.duration),s=z("seekLabel",this.config);t.setAttribute("aria-valuetext",s.replace("{currentTime}",n).replace("{duration}",a))}else if(C(t,this.config.selectors.inputs.volume)){var r=100*t.value;t.setAttribute("aria-valuenow",r),t.setAttribute("aria-valuetext",r+"%")}else t.setAttribute("aria-valuenow",t.value);q.isWebkit&&t.style.setProperty("--value",t.value/t.max*100+"%")}},updateSeekTooltip:function(e){var t=this;if(this.config.tooltips.seek&&i.element(this.elements.inputs.seek)&&i.element(this.elements.display.seekTooltip)&&0!==this.duration){var n=0,a=this.elements.progress.getBoundingClientRect(),s=this.config.classNames.tooltip+"--visible",r=function(e){T(t.elements.display.seekTooltip,s,e)};if(this.touch)r(!1);else{if(i.event(e))n=100/a.width*(e.pageX-a.left);else{if(!A(this.elements.display.seekTooltip,s))return;n=parseFloat(this.elements.display.seekTooltip.style.left,10)}n<0?n=0:n>100&&(n=100),G.updateTimeDisplay.call(this,this.elements.display.seekTooltip,this.duration/100*n),this.elements.display.seekTooltip.style.left=n+"%",i.event(e)&&["mouseenter","mouseleave"].includes(e.type)&&r("mouseenter"===e.type)}}},timeUpdate:function(e){var t=!i.element(this.elements.display.duration)&&this.config.invertTime;G.updateTimeDisplay.call(this,this.elements.display.currentTime,t?this.duration-this.currentTime:this.currentTime,t),e&&"timeupdate"===e.type&&this.media.seeking||G.updateProgress.call(this,e)},durationUpdate:function(){if(this.supported.ui&&(this.config.invertTime||!this.currentTime)){i.element(this.elements.inputs.seek)&&this.elements.inputs.seek.setAttribute("aria-valuemax",this.duration);var e=i.element(this.elements.display.duration);!e&&this.config.displayDuration&&this.paused&&G.updateTimeDisplay.call(this,this.elements.display.currentTime,this.duration),e&&G.updateTimeDisplay.call(this,this.elements.display.duration,this.duration),G.updateSeekTooltip.call(this)}},toggleTab:function(e,t){w(this.elements.settings.tabs[e],!t)},setQualityMenu:function(e){var t=this;if(i.element(this.elements.settings.panes.quality)){var n=this.elements.settings.panes.quality.querySelector("ul");i.array(e)&&(this.options.quality=W(e).filter(function(e){return t.config.quality.options.includes(e)}));var a=!i.empty(this.options.quality)&&this.options.quality.length>1;if(G.toggleTab.call(this,"quality",a),G.checkMenu.call(this),a){v(n);this.options.quality.sort(function(e,i){var n=t.config.quality.options;return n.indexOf(e)>n.indexOf(i)?1:-1}).forEach(function(e){G.createMenuItem.call(t,{value:e,list:n,type:"quality",title:G.getLabel.call(t,"quality",e),badge:function(e){var i=z("qualityBadge."+e,t.config);return i.length?G.createBadge.call(t,i):null}(e)})}),G.updateSetting.call(this,"quality",n)}}},getLabel:function(e,t){switch(e){case"speed":return 1===t?z("normal",this.config):t+"&times;";case"quality":if(i.number(t)){var n=z("qualityLabel."+t,this.config);return n.length?n:t+"p"}return D(t);case"captions":return ie.getLabel.call(this);default:return null}},updateSetting:function(e,t,n){var a=this.elements.settings.panes[e],s=null,r=t;if("captions"===e)s=this.currentTrack;else{if(s=i.empty(n)?this[e]:n,i.empty(s)&&(s=this.config[e].default),!i.empty(this.options[e])&&!this.options[e].includes(s))return void this.debug.warn("Unsupported value of '"+s+"' for "+e);if(!this.config[e].options.includes(s))return void this.debug.warn("Disabled value of '"+s+"' for "+e)}if(i.element(r)||(r=a&&a.querySelector("ul")),i.element(r)){this.elements.settings.tabs[e].querySelector("."+this.config.classNames.menu.value).innerHTML=G.getLabel.call(this,e,s);var l=r&&r.querySelector('input[value="'+s+'"]');i.element(l)&&(l.checked=!0)}},setCaptionsMenu:function(){var e=this,t=this.elements.settings.panes.captions.querySelector("ul"),i=ie.getTracks.call(this);if(G.toggleTab.call(this,"captions",i.length),v(t),G.checkMenu.call(this),i.length){var n=i.map(function(i,n){return{value:n,checked:e.captions.toggled&&e.currentTrack===n,title:ie.getLabel.call(e,i),badge:i.language&&G.createBadge.call(e,i.language.toUpperCase()),list:t,type:"language"}});n.unshift({value:-1,checked:!this.captions.toggled,title:z("disabled",this.config),list:t,type:"language"}),n.forEach(G.createMenuItem.bind(this)),G.updateSetting.call(this,"captions",t)}},setSpeedMenu:function(e){var t=this;if(this.config.controls.includes("settings")&&this.config.settings.includes("speed")&&i.element(this.elements.settings.panes.speed)){i.array(e)?this.options.speed=e:(this.isHTML5||this.isVimeo)&&(this.options.speed=[.5,.75,1,1.25,1.5,1.75,2]),this.options.speed=this.options.speed.filter(function(e){return t.config.speed.options.includes(e)});var n=!i.empty(this.options.speed)&&this.options.speed.length>1;if(G.toggleTab.call(this,"speed",n),G.checkMenu.call(this),n){var a=this.elements.settings.panes.speed.querySelector("ul");v(a),this.options.speed.forEach(function(e){G.createMenuItem.call(t,{value:e,list:a,type:"speed",title:G.getLabel.call(t,"speed",e)})}),G.updateSetting.call(this,"speed",a)}}},checkMenu:function(){var e=this.elements.settings.tabs,t=!i.empty(e)&&Object.values(e).some(function(e){return!e.hidden});w(this.elements.settings.menu,!t)},toggleMenu:function(e){var t=this.elements.settings.form,n=this.elements.buttons.settings;if(i.element(t)&&i.element(n)){var a=i.boolean(e)?e:i.element(t)&&t.hasAttribute("hidden");if(i.event(e)){var s=i.element(t)&&t.contains(e.target),r=e.target===this.elements.buttons.settings;if(s||!s&&!r&&a)return;r&&e.stopPropagation()}i.element(n)&&n.setAttribute("aria-expanded",a),i.element(t)&&(w(t,!a),T(this.elements.container,this.config.classNames.menu.open,a),a?t.removeAttribute("tabindex"):t.setAttribute("tabindex",-1))}},getTabSize:function(e){var t=e.cloneNode(!0);t.style.position="absolute",t.style.opacity=0,t.removeAttribute("hidden"),Array.from(t.querySelectorAll("input[name]")).forEach(function(e){var t=e.getAttribute("name");e.setAttribute("name",t+"-clone")}),e.parentNode.appendChild(t);var i=t.scrollWidth,n=t.scrollHeight;return y(t),{width:i,height:n}},showTab:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",n=this.elements.settings.menu,a=document.getElementById(t);if(i.element(a)&&"tabpanel"===a.getAttribute("role")){var l=n.querySelector('[role="tabpanel"]:not([hidden])'),o=l.parentNode;if(Array.from(n.querySelectorAll('[aria-controls="'+l.getAttribute("id")+'"]')).forEach(function(e){e.setAttribute("aria-expanded",!1)}),O.transitions&&!O.reducedMotion){o.style.width=l.scrollWidth+"px",o.style.height=l.scrollHeight+"px";var c=G.getTabSize.call(this,a);s.call(this,o,M,function t(i){i.target===o&&["width","height"].includes(i.propertyName)&&(o.style.width="",o.style.height="",r.call(e,o,M,t))}),o.style.width=c.width+"px",o.style.height=c.height+"px"}w(l,!0),l.setAttribute("tabindex",-1),w(a,!1);var u=E.call(this,'[aria-controls="'+t+'"]');Array.from(u).forEach(function(e){e.setAttribute("aria-expanded",!0)}),a.removeAttribute("tabindex"),a.querySelectorAll("button:not(:disabled), input:not(:disabled), [tabindex]")[0].focus()}},create:function(e){var t=this;if(i.empty(this.config.controls))return null;var n=f("div",k(this.config.selectors.controls.wrapper));if(this.config.controls.includes("restart")&&n.appendChild(G.createButton.call(this,"restart")),this.config.controls.includes("rewind")&&n.appendChild(G.createButton.call(this,"rewind")),this.config.controls.includes("play")&&n.appendChild(G.createButton.call(this,"play")),this.config.controls.includes("fast-forward")&&n.appendChild(G.createButton.call(this,"fast-forward")),this.config.controls.includes("progress")){var a=f("div",k(this.config.selectors.progress));if(a.appendChild(G.createRange.call(this,"seek",{id:"plyr-seek-"+e.id})),a.appendChild(G.createProgress.call(this,"buffer")),this.config.tooltips.seek){var s=f("span",{class:this.config.classNames.tooltip},"00:00");a.appendChild(s),this.elements.display.seekTooltip=s}this.elements.progress=a,n.appendChild(this.elements.progress)}if(this.config.controls.includes("current-time")&&n.appendChild(G.createTime.call(this,"currentTime")),this.config.controls.includes("duration")&&n.appendChild(G.createTime.call(this,"duration")),this.config.controls.includes("mute")&&n.appendChild(G.createButton.call(this,"mute")),this.config.controls.includes("volume")){var r=f("div",{class:"plyr__volume"}),l={max:1,step:.05,value:this.config.volume};r.appendChild(G.createRange.call(this,"volume",V(l,{id:"plyr-volume-"+e.id}))),this.elements.volume=r,n.appendChild(r)}if(this.config.controls.includes("captions")&&n.appendChild(G.createButton.call(this,"captions")),this.config.controls.includes("settings")&&!i.empty(this.config.settings)){var o=f("div",{class:"plyr__menu",hidden:""});o.appendChild(G.createButton.call(this,"settings",{id:"plyr-settings-toggle-"+e.id,"aria-haspopup":!0,"aria-controls":"plyr-settings-"+e.id,"aria-expanded":!1}));var c=f("form",{class:"plyr__menu__container",id:"plyr-settings-"+e.id,hidden:"","aria-labelled-by":"plyr-settings-toggle-"+e.id,role:"tablist",tabindex:-1}),u=f("div"),d=f("div",{id:"plyr-settings-"+e.id+"-home","aria-labelled-by":"plyr-settings-toggle-"+e.id,role:"tabpanel"}),p=f("ul",{role:"tablist"});this.config.settings.forEach(function(i){var n=f("li",{role:"tab",hidden:""}),a=f("button",V(k(t.config.selectors.buttons.settings),{type:"button",class:t.config.classNames.control+" "+t.config.classNames.control+"--forward",id:"plyr-settings-"+e.id+"-"+i+"-tab","aria-haspopup":!0,"aria-controls":"plyr-settings-"+e.id+"-"+i,"aria-expanded":!1}),z(i,t.config)),s=f("span",{class:t.config.classNames.menu.value});s.innerHTML=e[i],a.appendChild(s),n.appendChild(a),p.appendChild(n),t.elements.settings.tabs[i]=n}),d.appendChild(p),u.appendChild(d),this.config.settings.forEach(function(i){var n=f("div",{id:"plyr-settings-"+e.id+"-"+i,hidden:"","aria-labelled-by":"plyr-settings-"+e.id+"-"+i+"-tab",role:"tabpanel",tabindex:-1}),a=f("button",{type:"button",class:t.config.classNames.control+" "+t.config.classNames.control+"--back","aria-haspopup":!0,"aria-controls":"plyr-settings-"+e.id+"-home","aria-expanded":!1},z(i,t.config));n.appendChild(a);var s=f("ul");n.appendChild(s),u.appendChild(n),t.elements.settings.panes[i]=n}),c.appendChild(u),o.appendChild(c),n.appendChild(o),this.elements.settings.form=c,this.elements.settings.menu=o}return this.config.controls.includes("pip")&&O.pip&&n.appendChild(G.createButton.call(this,"pip")),this.config.controls.includes("airplay")&&O.airplay&&n.appendChild(G.createButton.call(this,"airplay")),this.config.controls.includes("fullscreen")&&n.appendChild(G.createButton.call(this,"fullscreen")),this.config.controls.includes("play-large")&&this.elements.container.appendChild(G.createButton.call(this,"play-large")),this.elements.controls=n,this.isHTML5&&G.setQualityMenu.call(this,j.getQualityOptions.call(this)),G.setSpeedMenu.call(this),n},inject:function(){var e=this;if(this.config.loadSprite){var t=G.getIconUrl.call(this);t.cors&&Y(t.url,"sprite-plyr")}this.id=Math.floor(1e4*Math.random());var n=null;this.elements.controls=null;var a={id:this.id,seektime:this.config.seekTime,title:this.config.title},s=!0;i.string(this.config.controls)||i.element(this.config.controls)?n=this.config.controls:i.function(this.config.controls)?n=this.config.controls.call(this,a):(n=G.create.call(this,{id:this.id,seektime:this.config.seekTime,speed:this.speed,quality:this.quality,captions:ie.getLabel.call(this)}),s=!1);var r=function(e){var t=e;return Object.entries(a).forEach(function(e){var i=p(e,2),n=i[0],a=i[1];t=B(t,"{"+n+"}",a)}),t};s&&(i.string(this.config.controls)?n=r(n):i.element(n)&&(n.innerHTML=r(n.innerHTML)));var l,o=void 0;if(i.string(this.config.selectors.controls.container)&&(o=document.querySelector(this.config.selectors.controls.container)),i.element(o)||(o=this.elements.container),i.element(n)?o.appendChild(n):n&&o.insertAdjacentHTML("beforeend",n),i.element(this.elements.controls)||G.findElements.call(this),window.navigator.userAgent.includes("Edge")&&(l=o,setTimeout(function(){w(l,!0),l.offsetHeight,w(l,!1)},0)),this.config.tooltips.controls){var c=this.config,u=c.classNames,d=c.selectors,h=d.controls.wrapper+" "+d.labels+" ."+u.hidden,m=E.call(this,h);Array.from(m).forEach(function(t){T(t,e.config.classNames.hidden,!1),T(t,e.config.classNames.tooltip,!0)})}}};function Z(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"text";return new Promise(function(i,n){try{var a=new XMLHttpRequest;if(!("withCredentials"in a))return;a.addEventListener("load",function(){if("text"===t)try{i(JSON.parse(a.responseText))}catch(e){i(a.responseText)}else i(a.response)}),a.addEventListener("error",function(){throw new Error(a.statusText)}),a.open("GET",e,!0),a.responseType=t,a.send()}catch(e){n(e)}})}function ee(e){var t=e;if(!(arguments.length>1&&void 0!==arguments[1])||arguments[1]){var i=document.createElement("a");i.href=t,t=i.href}try{return new URL(t)}catch(e){return null}}function te(e){var t=new URLSearchParams;return i.object(e)&&Object.entries(e).forEach(function(e){var i=p(e,2),n=i[0],a=i[1];t.set(n,a)}),t}var ie={setup:function(){if(this.supported.ui)if(!this.isVideo||this.isYouTube||this.isHTML5&&!O.textTracks)i.array(this.config.controls)&&this.config.controls.includes("settings")&&this.config.settings.includes("captions")&&G.setCaptionsMenu.call(this);else{var e,t;if(i.element(this.elements.captions)||(this.elements.captions=f("div",k(this.config.selectors.captions)),e=this.elements.captions,(t=this.elements.wrapper).parentNode.insertBefore(e,t.nextSibling)),q.isIE&&window.URL){var n=this.media.querySelectorAll("track");Array.from(n).forEach(function(e){var t=e.getAttribute("src"),i=ee(t);null!==i&&i.hostname!==window.location.href.hostname&&["http:","https:"].includes(i.protocol)&&Z(t,"blob").then(function(t){e.setAttribute("src",window.URL.createObjectURL(t))}).catch(function(){y(e)})})}var a=W(Array.from(navigator.languages||navigator.userLanguage).map(function(e){return e.split("-")[0]})),r=(this.storage.get("language")||this.config.captions.language||"auto").toLowerCase();if("auto"===r)r=p(a,1)[0];var l=this.storage.get("captions");if(i.boolean(l)||(l=this.config.captions.active),Object.assign(this.captions,{toggled:!1,active:l,language:r,languages:a}),this.isHTML5){var o=this.config.captions.update?"addtrack removetrack":"removetrack";s.call(this,this.media.textTracks,o,ie.update.bind(this))}setTimeout(ie.update.bind(this),0)}},update:function(){var e=this,t=ie.getTracks.call(this,!0),n=this.captions,a=n.active,r=n.language,l=n.meta,o=n.currentTrackNode,c=Boolean(t.find(function(e){return e.language===r}));this.isHTML5&&this.isVideo&&t.filter(function(e){return!l.get(e)}).forEach(function(t){e.debug.log("Track added",t),l.set(t,{default:"showing"===t.mode}),t.mode="hidden",s.call(e,t,"cuechange",function(){return ie.updateCues.call(e)})}),(c&&this.language!==r||!t.includes(o))&&(ie.setLanguage.call(this,r),ie.toggle.call(this,a&&c)),T(this.elements.container,this.config.classNames.captions.enabled,!i.empty(t)),(this.config.controls||[]).includes("settings")&&this.config.settings.includes("captions")&&G.setCaptionsMenu.call(this)},toggle:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(this.supported.ui){var n=this.captions.toggled,a=this.config.classNames.captions.active,s=i.nullOrUndefined(e)?!n:e;if(s!==n){if(t||(this.captions.active=s,this.storage.set({captions:s})),!this.language&&s&&!t){var r=ie.getTracks.call(this),l=ie.findTrack.call(this,[this.captions.language].concat(function(e){if(Array.isArray(e)){for(var t=0,i=Array(e.length);t<e.length;t++)i[t]=e[t];return i}return Array.from(e)}(this.captions.languages)),!0);return this.captions.language=l.language,void ie.set.call(this,r.indexOf(l))}this.elements.buttons.captions.pressed=s,T(this.elements.container,a,s),this.captions.toggled=s,G.updateSetting.call(this,"captions"),o.call(this,this.media,s?"captionsenabled":"captionsdisabled")}}},set:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],n=ie.getTracks.call(this);if(-1!==e)if(i.number(e))if(e in n){if(this.captions.currentTrack!==e){this.captions.currentTrack=e;var a=n[e],s=(a||{}).language;this.captions.currentTrackNode=a,G.updateSetting.call(this,"captions"),t||(this.captions.language=s,this.storage.set({language:s})),this.isVimeo&&this.embed.enableTextTrack(s),o.call(this,this.media,"languagechange")}ie.toggle.call(this,!0,t),this.isHTML5&&this.isVideo&&ie.updateCues.call(this)}else this.debug.warn("Track not found",e);else this.debug.warn("Invalid caption argument",e);else ie.toggle.call(this,!1,t)},setLanguage:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(i.string(e)){var n=e.toLowerCase();this.captions.language=n;var a=ie.getTracks.call(this),s=ie.findTrack.call(this,[n]);ie.set.call(this,a.indexOf(s),t)}else this.debug.warn("Invalid language argument",e)},getTracks:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return Array.from((this.media||{}).textTracks||[]).filter(function(i){return!e.isHTML5||t||e.captions.meta.has(i)}).filter(function(e){return["captions","subtitles"].includes(e.kind)})},findTrack:function(e){var t=this,i=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=ie.getTracks.call(this),a=function(e){return Number((t.captions.meta.get(e)||{}).default)},s=Array.from(n).sort(function(e,t){return a(t)-a(e)}),r=void 0;return e.every(function(e){return!(r=s.find(function(t){return t.language===e}))}),r||(i?s[0]:void 0)},getCurrentTrack:function(){return ie.getTracks.call(this)[this.currentTrack]},getLabel:function(e){var t=e;return!i.track(t)&&O.textTracks&&this.captions.toggled&&(t=ie.getCurrentTrack.call(this)),i.track(t)?i.empty(t.label)?i.empty(t.language)?z("enabled",this.config):e.language.toUpperCase():t.label:z("disabled",this.config)},updateCues:function(e){if(this.supported.ui)if(i.element(this.elements.captions))if(i.nullOrUndefined(e)||Array.isArray(e)){var t=e;if(!t){var n=ie.getCurrentTrack.call(this);t=Array.from((n||{}).activeCues||[]).map(function(e){return e.getCueAsHTML()}).map(U)}var a=t.map(function(e){return e.trim()}).join("\n");if(a!==this.elements.captions.innerHTML){v(this.elements.captions);var s=f("span",k(this.config.selectors.caption));s.innerHTML=a,this.elements.captions.appendChild(s),o.call(this,this.media,"cuechange")}}else this.debug.warn("updateCues: Invalid input",e);else this.debug.warn("No captions element to render to")}},ne={enabled:!0,title:"",debug:!1,autoplay:!1,autopause:!0,playsinline:!0,seekTime:10,volume:1,muted:!1,duration:null,displayDuration:!0,invertTime:!0,toggleInvert:!0,ratio:"16:9",clickToPlay:!0,hideControls:!0,resetOnEnd:!1,disableContextMenu:!0,loadSprite:!0,iconPrefix:"plyr",iconUrl:"https://cdn.plyr.io/3.3.12/plyr.svg",blankVideo:"https://cdn.plyr.io/static/blank.mp4",quality:{default:576,options:[4320,2880,2160,1440,1080,720,576,480,360,240,"default"]},loop:{active:!1},speed:{selected:1,options:[.5,.75,1,1.25,1.5,1.75,2]},keyboard:{focused:!0,global:!1},tooltips:{controls:!1,seek:!0},captions:{active:!1,language:"auto",update:!1},fullscreen:{enabled:!0,fallback:!0,iosNative:!1},storage:{enabled:!0,key:"plyr"},controls:["play-large","play","progress","current-time","mute","volume","captions","settings","pip","airplay","fullscreen"],settings:["captions","quality","speed"],i18n:{restart:"Restart",rewind:"Rewind {seektime}s",play:"Play",pause:"Pause",fastForward:"Forward {seektime}s",seek:"Seek",seekLabel:"{currentTime} of {duration}",played:"Played",buffered:"Buffered",currentTime:"Current time",duration:"Duration",volume:"Volume",mute:"Mute",unmute:"Unmute",enableCaptions:"Enable captions",disableCaptions:"Disable captions",enterFullscreen:"Enter fullscreen",exitFullscreen:"Exit fullscreen",frameTitle:"Player for {title}",captions:"Captions",settings:"Settings",menuBack:"Go back to previous menu",speed:"Speed",normal:"Normal",quality:"Quality",loop:"Loop",start:"Start",end:"End",all:"All",reset:"Reset",disabled:"Disabled",enabled:"Enabled",advertisement:"Ad",qualityBadge:{2160:"4K",1440:"HD",1080:"HD",720:"HD",576:"SD",480:"SD"}},urls:{vimeo:{sdk:"https://player.vimeo.com/api/player.js",iframe:"https://player.vimeo.com/video/{0}?{1}",api:"https://vimeo.com/api/v2/video/{0}.json"},youtube:{sdk:"https://www.youtube.com/iframe_api",api:"https://www.googleapis.com/youtube/v3/videos?id={0}&key={1}&fields=items(snippet(title))&part=snippet"},googleIMA:{sdk:"https://imasdk.googleapis.com/js/sdkloader/ima3.js"}},listeners:{seek:null,play:null,pause:null,restart:null,rewind:null,fastForward:null,mute:null,volume:null,captions:null,fullscreen:null,pip:null,airplay:null,speed:null,quality:null,loop:null,language:null},events:["ended","progress","stalled","playing","waiting","canplay","canplaythrough","loadstart","loadeddata","loadedmetadata","timeupdate","volumechange","play","pause","error","seeking","seeked","emptied","ratechange","cuechange","enterfullscreen","exitfullscreen","captionsenabled","captionsdisabled","languagechange","controlshidden","controlsshown","ready","statechange","qualitychange","qualityrequested","adsloaded","adscontentpause","adscontentresume","adstarted","adsmidpoint","adscomplete","adsallcomplete","adsimpression","adsclick"],selectors:{editable:"input, textarea, select, [contenteditable]",container:".plyr",controls:{container:null,wrapper:".plyr__controls"},labels:"[data-plyr]",buttons:{play:'[data-plyr="play"]',pause:'[data-plyr="pause"]',restart:'[data-plyr="restart"]',rewind:'[data-plyr="rewind"]',fastForward:'[data-plyr="fast-forward"]',mute:'[data-plyr="mute"]',captions:'[data-plyr="captions"]',fullscreen:'[data-plyr="fullscreen"]',pip:'[data-plyr="pip"]',airplay:'[data-plyr="airplay"]',settings:'[data-plyr="settings"]',loop:'[data-plyr="loop"]'},inputs:{seek:'[data-plyr="seek"]',volume:'[data-plyr="volume"]',speed:'[data-plyr="speed"]',language:'[data-plyr="language"]',quality:'[data-plyr="quality"]'},display:{currentTime:".plyr__time--current",duration:".plyr__time--duration",buffer:".plyr__progress__buffer",loop:".plyr__progress__loop",volume:".plyr__volume--display"},progress:".plyr__progress",captions:".plyr__captions",caption:".plyr__caption",menu:{quality:".js-plyr__menu__list--quality"}},classNames:{type:"plyr--{0}",provider:"plyr--{0}",video:"plyr__video-wrapper",embed:"plyr__video-embed",embedContainer:"plyr__video-embed__container",poster:"plyr__poster",posterEnabled:"plyr__poster-enabled",ads:"plyr__ads",control:"plyr__control",controlPressed:"plyr__control--pressed",playing:"plyr--playing",paused:"plyr--paused",stopped:"plyr--stopped",loading:"plyr--loading",hover:"plyr--hover",tooltip:"plyr__tooltip",cues:"plyr__cues",hidden:"plyr__sr-only",hideControls:"plyr--hide-controls",isIos:"plyr--is-ios",isTouch:"plyr--is-touch",uiSupported:"plyr--full-ui",noTransition:"plyr--no-transition",menu:{value:"plyr__menu__value",badge:"plyr__badge",open:"plyr--menu-open"},captions:{enabled:"plyr--captions-enabled",active:"plyr--captions-active"},fullscreen:{enabled:"plyr--fullscreen-enabled",fallback:"plyr--fullscreen-fallback"},pip:{supported:"plyr--pip-supported",active:"plyr--pip-active"},airplay:{supported:"plyr--airplay-supported",active:"plyr--airplay-active"},tabFocus:"plyr__tab-focus"},attributes:{embed:{provider:"data-plyr-provider",id:"data-plyr-embed-id"}},keys:{google:null},ads:{enabled:!1,publisherId:""}},ae={html5:"html5",youtube:"youtube",vimeo:"vimeo"},se={audio:"audio",video:"video"};var re=function(){},le=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];c(this,e),this.enabled=window.console&&t,this.enabled&&this.log("Debugging enabled")}return u(e,[{key:"log",get:function(){return this.enabled?Function.prototype.bind.call(console.log,console):re}},{key:"warn",get:function(){return this.enabled?Function.prototype.bind.call(console.warn,console):re}},{key:"error",get:function(){return this.enabled?Function.prototype.bind.call(console.error,console):re}}]),e}();function oe(){if(this.enabled){var e=this.player.elements.buttons.fullscreen;i.element(e)&&(e.pressed=this.active),o.call(this.player,this.target,this.active?"enterfullscreen":"exitfullscreen",!0),q.isIos||function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(i.element(e)){var n=E.call(this,"button:not(:disabled), input:not(:disabled), [tabindex]"),s=n[0],r=n[n.length-1];a.call(this,this.elements.container,"keydown",function(e){if("Tab"===e.key&&9===e.keyCode){var t=P();t!==r||e.shiftKey?t===s&&e.shiftKey&&(r.focus(),e.preventDefault()):(s.focus(),e.preventDefault())}},t,!1)}}.call(this.player,this.target,this.active)}}function ce(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];e?this.scrollPosition={x:window.scrollX||0,y:window.scrollY||0}:window.scrollTo(this.scrollPosition.x,this.scrollPosition.y),document.body.style.overflow=e?"hidden":"",T(this.target,this.player.config.classNames.fullscreen.fallback,e),oe.call(this)}var ue=function(){function e(t){var n=this;c(this,e),this.player=t,this.prefix=e.prefix,this.property=e.property,this.scrollPosition={x:0,y:0},s.call(this.player,document,"ms"===this.prefix?"MSFullscreenChange":this.prefix+"fullscreenchange",function(){oe.call(n)}),s.call(this.player,this.player.elements.container,"dblclick",function(e){i.element(n.player.elements.controls)&&n.player.elements.controls.contains(e.target)||n.toggle()}),this.update()}return u(e,[{key:"update",value:function(){this.enabled?this.player.debug.log((e.native?"Native":"Fallback")+" fullscreen enabled"):this.player.debug.log("Fullscreen not supported and fallback disabled"),T(this.player.elements.container,this.player.config.classNames.fullscreen.enabled,this.enabled)}},{key:"enter",value:function(){this.enabled&&(q.isIos&&this.player.config.fullscreen.iosNative?this.player.playing&&this.target.webkitEnterFullscreen():e.native?this.prefix?i.empty(this.prefix)||this.target[this.prefix+"Request"+this.property]():this.target.requestFullscreen():ce.call(this,!0))}},{key:"exit",value:function(){if(this.enabled)if(q.isIos&&this.player.config.fullscreen.iosNative)this.target.webkitExitFullscreen(),this.player.play();else if(e.native)if(this.prefix){if(!i.empty(this.prefix)){var t="moz"===this.prefix?"Cancel":"Exit";document[""+this.prefix+t+this.property]()}}else(document.cancelFullScreen||document.exitFullscreen).call(document);else ce.call(this,!1)}},{key:"toggle",value:function(){this.active?this.exit():this.enter()}},{key:"enabled",get:function(){return(e.native||this.player.config.fullscreen.fallback)&&this.player.config.fullscreen.enabled&&this.player.supported.ui&&this.player.isVideo}},{key:"active",get:function(){return!!this.enabled&&(e.native?(this.prefix?document[""+this.prefix+this.property+"Element"]:document.fullscreenElement)===this.target:A(this.target,this.player.config.classNames.fullscreen.fallback))}},{key:"target",get:function(){return q.isIos&&this.player.config.fullscreen.iosNative?this.player.media:this.player.elements.container}}],[{key:"native",get:function(){return!!(document.fullscreenEnabled||document.webkitFullscreenEnabled||document.mozFullScreenEnabled||document.msFullscreenEnabled)}},{key:"prefix",get:function(){if(i.function(document.exitFullscreen))return"";var e="";return["webkit","moz","ms"].some(function(t){return!(!i.function(document[t+"ExitFullscreen"])&&!i.function(document[t+"CancelFullScreen"]))&&(e=t,!0)}),e}},{key:"property",get:function(){return"moz"===this.prefix?"FullScreen":"Fullscreen"}}]),e}();function de(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;return new Promise(function(i,n){var a=new Image,s=function(){delete a.onload,delete a.onerror,(a.naturalWidth>=t?i:n)(a)};Object.assign(a,{onload:s,onerror:s,src:e})})}var pe={addStyleHook:function(){T(this.elements.container,this.config.selectors.container.replace(".",""),!0),T(this.elements.container,this.config.classNames.uiSupported,this.supported.ui)},toggleNativeControls:function(){arguments.length>0&&void 0!==arguments[0]&&arguments[0]&&this.isHTML5?this.media.setAttribute("controls",""):this.media.removeAttribute("controls")},build:function(){var e=this;if(this.listeners.media(),!this.supported.ui)return this.debug.warn("Basic support only for "+this.provider+" "+this.type),void pe.toggleNativeControls.call(this,!0);i.element(this.elements.controls)||(G.inject.call(this),this.listeners.controls()),pe.toggleNativeControls.call(this),this.isHTML5&&ie.setup.call(this),this.volume=null,this.muted=null,this.speed=null,this.loop=null,this.quality=null,G.updateVolume.call(this),G.timeUpdate.call(this),pe.checkPlaying.call(this),T(this.elements.container,this.config.classNames.pip.supported,O.pip&&this.isHTML5&&this.isVideo),T(this.elements.container,this.config.classNames.airplay.supported,O.airplay&&this.isHTML5),T(this.elements.container,this.config.classNames.isIos,q.isIos),T(this.elements.container,this.config.classNames.isTouch,this.touch),this.ready=!0,setTimeout(function(){o.call(e,e.media,"ready")},0),pe.setTitle.call(this),this.poster&&pe.setPoster.call(this,this.poster,!1).catch(function(){}),this.config.duration&&G.durationUpdate.call(this)},setTitle:function(){var e=z("play",this.config);if(i.string(this.config.title)&&!i.empty(this.config.title)&&(e+=", "+this.config.title),i.nodeList(this.elements.buttons.play)&&Array.from(this.elements.buttons.play).forEach(function(t){t.setAttribute("aria-label",e)}),this.isEmbed){var t=S.call(this,"iframe");if(!i.element(t))return;var n=i.empty(this.config.title)?"video":this.config.title,a=z("frameTitle",this.config);t.setAttribute("title",a.replace("{title}",n))}},togglePoster:function(e){T(this.elements.container,this.config.classNames.posterEnabled,e)},setPoster:function(e){var t=this;return arguments.length>1&&void 0!==arguments[1]&&!arguments[1]||!this.poster?(this.media.setAttribute("poster",e),function(){var e=this;return new Promise(function(t){return e.ready?setTimeout(t,0):s.call(e,e.elements.container,"ready",t)}).then(function(){})}.call(this).then(function(){return de(e)}).catch(function(i){throw e===t.poster&&pe.togglePoster.call(t,!1),i}).then(function(){if(e!==t.poster)throw new Error("setPoster cancelled by later call to setPoster")}).then(function(){return Object.assign(t.elements.poster.style,{backgroundImage:"url('"+e+"')",backgroundSize:""}),pe.togglePoster.call(t,!0),e})):Promise.reject(new Error("Poster already set"))},checkPlaying:function(e){var t=this;T(this.elements.container,this.config.classNames.playing,this.playing),T(this.elements.container,this.config.classNames.paused,this.paused),T(this.elements.container,this.config.classNames.stopped,this.stopped),Array.from(this.elements.buttons.play).forEach(function(e){e.pressed=t.playing}),i.event(e)&&"timeupdate"===e.type||pe.toggleControls.call(this)},checkLoading:function(e){var t=this;this.loading=["stalled","waiting"].includes(e.type),clearTimeout(this.timers.loading),this.timers.loading=setTimeout(function(){T(t.elements.container,t.config.classNames.loading,t.loading),pe.toggleControls.call(t)},this.loading?250:0)},toggleControls:function(e){var t=this.elements.controls;t&&this.config.hideControls&&this.toggleControls(Boolean(e||this.loading||this.paused||t.pressed||t.hover))}},he=function(){function e(t){c(this,e),this.player=t,this.lastKey=null,this.handleKey=this.handleKey.bind(this),this.toggleMenu=this.toggleMenu.bind(this),this.firstTouch=this.firstTouch.bind(this)}return u(e,[{key:"handleKey",value:function(e){var t=this,n=e.keyCode?e.keyCode:e.which,a="keydown"===e.type,s=a&&n===this.lastKey;if(!(e.altKey||e.ctrlKey||e.metaKey||e.shiftKey)&&i.number(n)){if(a){var r=P();if(i.element(r)&&r!==this.player.elements.inputs.seek&&C(r,this.player.config.selectors.editable))return;switch([32,37,38,39,40,48,49,50,51,52,53,54,56,57,67,70,73,75,76,77,79].includes(n)&&(e.preventDefault(),e.stopPropagation()),n){case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:s||(t.player.currentTime=t.player.duration/10*(n-48));break;case 32:case 75:s||this.player.togglePlay();break;case 38:this.player.increaseVolume(.1);break;case 40:this.player.decreaseVolume(.1);break;case 77:s||(this.player.muted=!this.player.muted);break;case 39:this.player.forward();break;case 37:this.player.rewind();break;case 70:this.player.fullscreen.toggle();break;case 67:s||this.player.toggleCaptions();break;case 76:this.player.loop=!this.player.loop}!this.player.fullscreen.enabled&&this.player.fullscreen.active&&27===n&&this.player.fullscreen.toggle(),this.lastKey=n}else this.lastKey=null}}},{key:"toggleMenu",value:function(e){G.toggleMenu.call(this.player,e)}},{key:"firstTouch",value:function(){this.player.touch=!0,T(this.player.elements.container,this.player.config.classNames.isTouch,!0)}},{key:"global",value:function(){var e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.player.config.keyboard.global&&a.call(this.player,window,"keydown keyup",this.handleKey,e,!1),a.call(this.player,document.body,"click",this.toggleMenu,e),l.call(this.player,document.body,"touchstart",this.firstTouch)}},{key:"container",value:function(){var e=this;!this.player.config.keyboard.global&&this.player.config.keyboard.focused&&s.call(this.player,this.player.elements.container,"keydown keyup",this.handleKey,!1),s.call(this.player,this.player.elements.container,"focusout",function(t){T(t.target,e.player.config.classNames.tabFocus,!1)}),s.call(this.player,this.player.elements.container,"keydown",function(t){9===t.keyCode&&setTimeout(function(){T(P(),e.player.config.classNames.tabFocus,!0)},0)}),s.call(this.player,this.player.elements.container,"mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen",function(t){var i=e.player.elements.controls;"enterfullscreen"===t.type&&(i.pressed=!1,i.hover=!1);var n=0;["touchstart","touchmove","mousemove"].includes(t.type)&&(pe.toggleControls.call(e.player,!0),n=e.player.touch?3e3:2e3),clearTimeout(e.player.timers.controls),e.player.timers.controls=setTimeout(function(){return pe.toggleControls.call(e.player,!1)},n)})}},{key:"media",value:function(){var e=this;if(s.call(this.player,this.player.media,"timeupdate seeking seeked",function(t){return G.timeUpdate.call(e.player,t)}),s.call(this.player,this.player.media,"durationchange loadeddata loadedmetadata",function(t){return G.durationUpdate.call(e.player,t)}),s.call(this.player,this.player.media,"canplay",function(){w(e.player.elements.volume,!e.player.hasAudio),w(e.player.elements.buttons.mute,!e.player.hasAudio)}),s.call(this.player,this.player.media,"ended",function(){e.player.isHTML5&&e.player.isVideo&&e.player.config.resetOnEnd&&e.player.restart()}),s.call(this.player,this.player.media,"progress playing seeking seeked",function(t){return G.updateProgress.call(e.player,t)}),s.call(this.player,this.player.media,"volumechange",function(t){return G.updateVolume.call(e.player,t)}),s.call(this.player,this.player.media,"playing play pause ended emptied timeupdate",function(t){return pe.checkPlaying.call(e.player,t)}),s.call(this.player,this.player.media,"waiting canplay seeked playing",function(t){return pe.checkLoading.call(e.player,t)}),s.call(this.player,this.player.media,"playing",function(){e.player.ads&&e.player.ads.enabled&&!e.player.ads.initialized&&e.player.ads.managerPromise.then(function(){return e.player.ads.play()}).catch(function(){return e.player.play()})}),this.player.supported.ui&&this.player.config.clickToPlay&&!this.player.isAudio){var t=S.call(this.player,"."+this.player.config.classNames.video);if(!i.element(t))return;s.call(this.player,t,"click",function(){e.player.config.hideControls&&e.player.touch&&!e.player.paused||(e.player.paused?e.player.play():e.player.ended?(e.player.restart(),e.player.play()):e.player.pause())})}this.player.supported.ui&&this.player.config.disableContextMenu&&s.call(this.player,this.player.elements.wrapper,"contextmenu",function(e){e.preventDefault()},!1),s.call(this.player,this.player.media,"volumechange",function(){e.player.storage.set({volume:e.player.volume,muted:e.player.muted})}),s.call(this.player,this.player.media,"ratechange",function(){G.updateSetting.call(e.player,"speed"),e.player.storage.set({speed:e.player.speed})}),s.call(this.player,this.player.media,"qualityrequested",function(t){e.player.storage.set({quality:t.detail.quality})}),s.call(this.player,this.player.media,"qualitychange",function(t){G.updateSetting.call(e.player,"quality",null,t.detail.quality)});var n=this.player.config.events.concat(["keyup","keydown"]).join(" ");s.call(this.player,this.player.media,n,function(t){var i=t.detail,n=void 0===i?{}:i;"error"===t.type&&(n=e.player.media.error),o.call(e.player,e.player.elements.container,t.type,!0,n)})}},{key:"controls",value:function(){var e=this,t=q.isIE?"change":"input",n=function(t,n,a){var s=e.player.config.listeners[a],r=!0;i.function(s)&&(r=s.call(e.player,t)),r&&i.function(n)&&n.call(e.player,t)},a=function(t,a,r,l){var o=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],c=e.player.config.listeners[l],u=i.function(c);s.call(e.player,t,a,function(e){return n(e,r,l)},o&&!u)};Array.from(this.player.elements.buttons.play).forEach(function(t){a(t,"click",e.player.togglePlay,"play")}),a(this.player.elements.buttons.restart,"click",this.player.restart,"restart"),a(this.player.elements.buttons.rewind,"click",this.player.rewind,"rewind"),a(this.player.elements.buttons.fastForward,"click",this.player.forward,"fastForward"),a(this.player.elements.buttons.mute,"click",function(){e.player.muted=!e.player.muted},"mute"),a(this.player.elements.buttons.captions,"click",function(){return e.player.toggleCaptions()}),a(this.player.elements.buttons.fullscreen,"click",function(){e.player.fullscreen.toggle()},"fullscreen"),a(this.player.elements.buttons.pip,"click",function(){e.player.pip="toggle"},"pip"),a(this.player.elements.buttons.airplay,"click",this.player.airplay,"airplay"),a(this.player.elements.buttons.settings,"click",function(t){G.toggleMenu.call(e.player,t)}),a(this.player.elements.settings.form,"click",function(t){t.stopPropagation();var i=function(){var t="plyr-settings-"+e.player.id+"-home";G.showTab.call(e.player,t)};if(C(t.target,e.player.config.selectors.inputs.language))n(t,function(){e.player.currentTrack=Number(t.target.value),i()},"language");else if(C(t.target,e.player.config.selectors.inputs.quality))n(t,function(){e.player.quality=t.target.value,i()},"quality");else if(C(t.target,e.player.config.selectors.inputs.speed))n(t,function(){e.player.speed=parseFloat(t.target.value),i()},"speed");else{var a=t.target;G.showTab.call(e.player,a.getAttribute("aria-controls"))}}),a(this.player.elements.inputs.seek,"mousedown mousemove",function(t){var i=e.player.elements.progress.getBoundingClientRect(),n=100/i.width*(t.pageX-i.left);t.currentTarget.setAttribute("seek-value",n)}),a(this.player.elements.inputs.seek,"mousedown mouseup keydown keyup touchstart touchend",function(t){var i=t.currentTarget,n=t.keyCode?t.keyCode:t.which,a=t.type;if("keydown"!==a&&"keyup"!==a||39===n||37===n){var s=i.hasAttribute("play-on-seeked"),r=["mouseup","touchend","keyup"].includes(t.type);s&&r?(i.removeAttribute("play-on-seeked"),e.player.play()):!r&&e.player.playing&&(i.setAttribute("play-on-seeked",""),e.player.pause())}}),a(this.player.elements.inputs.seek,t,function(t){var n=t.currentTarget,a=n.getAttribute("seek-value");i.empty(a)&&(a=n.value),n.removeAttribute("seek-value"),e.player.currentTime=a/n.max*e.player.duration},"seek"),this.player.config.toggleInvert&&!i.element(this.player.elements.display.duration)&&a(this.player.elements.display.currentTime,"click",function(){0!==e.player.currentTime&&(e.player.config.invertTime=!e.player.config.invertTime,G.timeUpdate.call(e.player))}),a(this.player.elements.inputs.volume,t,function(t){e.player.volume=t.target.value},"volume"),q.isWebkit&&Array.from(E.call(this.player,'input[type="range"]')).forEach(function(t){a(t,"input",function(t){return G.updateRangeFill.call(e.player,t.target)})}),a(this.player.elements.progress,"mouseenter mouseleave mousemove",function(t){return G.updateSeekTooltip.call(e.player,t)}),a(this.player.elements.controls,"mouseenter mouseleave",function(t){e.player.elements.controls.hover=!e.player.touch&&"mouseenter"===t.type}),a(this.player.elements.controls,"mousedown mouseup touchstart touchend touchcancel",function(t){e.player.elements.controls.pressed=["mousedown","touchstart"].includes(t.type)}),a(this.player.elements.controls,"focusin focusout",function(t){var i=e.player,n=i.config,a=i.elements,s=i.timers;if(T(a.controls,n.classNames.noTransition,"focusin"===t.type),pe.toggleControls.call(e.player,"focusin"===t.type),"focusin"===t.type){setTimeout(function(){T(a.controls,n.classNames.noTransition,!1)},0);var r=e.touch?3e3:4e3;clearTimeout(s.controls),s.controls=setTimeout(function(){return pe.toggleControls.call(e.player,!1)},r)}}),a(this.player.elements.inputs.volume,"wheel",function(t){var i=t.webkitDirectionInvertedFromDevice,n=0;(t.deltaY<0||t.deltaX>0)&&(i?(e.player.decreaseVolume(.02),n=-1):(e.player.increaseVolume(.02),n=1)),(t.deltaY>0||t.deltaX<0)&&(i?(e.player.increaseVolume(.02),n=1):(e.player.decreaseVolume(.02),n=-1)),(1===n&&e.player.media.volume<1||-1===n&&e.player.media.volume>0)&&t.preventDefault()},"volume",!1)}}]),e}();"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self&&self;var me,fe=(function(e,t){var i;i=function(){var e=function(){},t={},i={},n={};function a(e,t){if(e){var a=n[e];if(i[e]=t,a)for(;a.length;)a[0](e,t),a.splice(0,1)}}function s(t,i){t.call&&(t={success:t}),i.length?(t.error||e)(i):(t.success||e)(t)}function r(t,i,n,a){var s,l,o=document,c=n.async,u=(n.numRetries||0)+1,d=n.before||e,p=t.replace(/^(css|img)!/,"");a=a||0,/(^css!|\.css$)/.test(t)?(s=!0,(l=o.createElement("link")).rel="stylesheet",l.href=p):/(^img!|\.(png|gif|jpg|svg)$)/.test(t)?(l=o.createElement("img")).src=p:((l=o.createElement("script")).src=t,l.async=void 0===c||c),l.onload=l.onerror=l.onbeforeload=function(e){var o=e.type[0];if(s&&"hideFocus"in l)try{l.sheet.cssText.length||(o="e")}catch(e){o="e"}if("e"==o&&(a+=1)<u)return r(t,i,n,a);i(t,o,e.defaultPrevented)},!1!==d(t,l)&&o.head.appendChild(l)}function l(e,i,n){var l,o;if(i&&i.trim&&(l=i),o=(l?n:i)||{},l){if(l in t)throw"LoadJS";t[l]=!0}!function(e,t,i){var n,a,s=(e=e.push?e:[e]).length,l=s,o=[];for(n=function(e,i,n){if("e"==i&&o.push(e),"b"==i){if(!n)return;o.push(e)}--s||t(o)},a=0;a<l;a++)r(e[a],n,i)}(e,function(e){s(o,e),a(l,e)},o)}return l.ready=function(e,t){return function(e,t){e=e.push?e:[e];var a,s,r,l=[],o=e.length,c=o;for(a=function(e,i){i.length&&l.push(e),--c||t(l)};o--;)s=e[o],(r=i[s])?a(s,r):(n[s]=n[s]||[]).push(a)}(e,function(e){s(t,e)}),l},l.done=function(e){a(e,[])},l.reset=function(){t={},i={},n={}},l.isDefined=function(e){return e in t},l},e.exports=i()}(me={exports:{}},me.exports),me.exports);function ge(e){return new Promise(function(t,i){fe(e,{success:t,error:i})})}function ye(e){e&&!this.embed.hasPlayed&&(this.embed.hasPlayed=!0),this.media.paused===e&&(this.media.paused=!e,o.call(this,this.media,e?"play":"pause"))}var ve={setup:function(){var e=this;T(this.elements.wrapper,this.config.classNames.embed,!0),ve.setAspectRatio.call(this),i.object(window.Vimeo)?ve.ready.call(this):ge(this.config.urls.vimeo.sdk).then(function(){ve.ready.call(e)}).catch(function(t){e.debug.warn("Vimeo API failed to load",t)})},setAspectRatio:function(e){var t=(i.string(e)?e:this.config.ratio).split(":"),n=p(t,2),a=100/n[0]*n[1];if(this.elements.wrapper.style.paddingBottom=a+"%",this.supported.ui){var s=(240-a)/4.8;this.media.style.transform="translateY(-"+s+"%)"}},ready:function(){var e=this,t=this,n=te({loop:t.config.loop.active,autoplay:t.autoplay,byline:!1,portrait:!1,title:!1,speed:!0,transparent:0,gesture:"media",playsinline:!this.config.fullscreen.iosNative}),a=t.media.getAttribute("src");i.empty(a)&&(a=t.media.getAttribute(t.config.attributes.embed.id));var s,r=(s=a,i.empty(s)?null:i.number(Number(s))?s:s.match(/^.*(vimeo.com\/|video\/)(\d+).*/)?RegExp.$2:s),l=f("iframe"),c=H(t.config.urls.vimeo.iframe,r,n);l.setAttribute("src",c),l.setAttribute("allowfullscreen",""),l.setAttribute("allowtransparency",""),l.setAttribute("allow","autoplay");var u=f("div",{poster:t.poster,class:t.config.classNames.embedContainer});u.appendChild(l),t.media=b(u,t.media),Z(H(t.config.urls.vimeo.api,r),"json").then(function(e){if(!i.empty(e)){var n=new URL(e[0].thumbnail_large);n.pathname=n.pathname.split("_")[0]+".jpg",pe.setPoster.call(t,n.href).catch(function(){})}}),t.embed=new window.Vimeo.Player(l,{autopause:t.config.autopause,muted:t.muted}),t.media.paused=!0,t.media.currentTime=0,t.supported.ui&&t.embed.disableTextTrack(),t.media.play=function(){return ye.call(t,!0),t.embed.play()},t.media.pause=function(){return ye.call(t,!1),t.embed.pause()},t.media.stop=function(){t.pause(),t.currentTime=0};var d=t.media.currentTime;Object.defineProperty(t.media,"currentTime",{get:function(){return d},set:function(e){var i=t.embed,n=t.media,a=t.paused,s=t.volume,r=a&&!i.hasPlayed;n.seeking=!0,o.call(t,n,"seeking"),Promise.resolve(r&&i.setVolume(0)).then(function(){return i.setCurrentTime(e)}).then(function(){return r&&i.pause()}).then(function(){return r&&i.setVolume(s)}).catch(function(){})}});var p=t.config.speed.selected;Object.defineProperty(t.media,"playbackRate",{get:function(){return p},set:function(e){t.embed.setPlaybackRate(e).then(function(){p=e,o.call(t,t.media,"ratechange")}).catch(function(e){"Error"===e.name&&G.setSpeedMenu.call(t,[])})}});var h=t.config.volume;Object.defineProperty(t.media,"volume",{get:function(){return h},set:function(e){t.embed.setVolume(e).then(function(){h=e,o.call(t,t.media,"volumechange")})}});var m=t.config.muted;Object.defineProperty(t.media,"muted",{get:function(){return m},set:function(e){var n=!!i.boolean(e)&&e;t.embed.setVolume(n?0:t.config.volume).then(function(){m=n,o.call(t,t.media,"volumechange")})}});var g=t.config.loop;Object.defineProperty(t.media,"loop",{get:function(){return g},set:function(e){var n=i.boolean(e)?e:t.config.loop.active;t.embed.setLoop(n).then(function(){g=n})}});var y=void 0;t.embed.getVideoUrl().then(function(e){y=e}).catch(function(t){e.debug.warn(t)}),Object.defineProperty(t.media,"currentSrc",{get:function(){return y}}),Object.defineProperty(t.media,"ended",{get:function(){return t.currentTime===t.duration}}),Promise.all([t.embed.getVideoWidth(),t.embed.getVideoHeight()]).then(function(t){var i=function(e,t){var i=function e(t,i){return 0===i?t:e(i,t%i)}(e,t);return e/i+":"+t/i}(t[0],t[1]);ve.setAspectRatio.call(e,i)}),t.embed.setAutopause(t.config.autopause).then(function(e){t.config.autopause=e}),t.embed.getVideoTitle().then(function(i){t.config.title=i,pe.setTitle.call(e)}),t.embed.getCurrentTime().then(function(e){d=e,o.call(t,t.media,"timeupdate")}),t.embed.getDuration().then(function(e){t.media.duration=e,o.call(t,t.media,"durationchange")}),t.embed.getTextTracks().then(function(e){t.media.textTracks=e,ie.setup.call(t)}),t.embed.on("cuechange",function(e){var i=e.cues,n=(void 0===i?[]:i).map(function(e){return t=e.text,i=document.createDocumentFragment(),n=document.createElement("div"),i.appendChild(n),n.innerHTML=t,i.firstChild.innerText;var t,i,n});ie.updateCues.call(t,n)}),t.embed.on("loaded",function(){(t.embed.getPaused().then(function(e){ye.call(t,!e),e||o.call(t,t.media,"playing")}),i.element(t.embed.element)&&t.supported.ui)&&t.embed.element.setAttribute("tabindex",-1)}),t.embed.on("play",function(){ye.call(t,!0),o.call(t,t.media,"playing")}),t.embed.on("pause",function(){ye.call(t,!1)}),t.embed.on("timeupdate",function(e){t.media.seeking=!1,d=e.seconds,o.call(t,t.media,"timeupdate")}),t.embed.on("progress",function(e){t.media.buffered=e.percent,o.call(t,t.media,"progress"),1===parseInt(e.percent,10)&&o.call(t,t.media,"canplaythrough"),t.embed.getDuration().then(function(e){e!==t.media.duration&&(t.media.duration=e,o.call(t,t.media,"durationchange"))})}),t.embed.on("seeked",function(){t.media.seeking=!1,o.call(t,t.media,"seeked")}),t.embed.on("ended",function(){t.media.paused=!0,o.call(t,t.media,"ended")}),t.embed.on("error",function(e){t.media.error=e,o.call(t,t.media,"error")}),setTimeout(function(){return pe.build.call(t)},0)}};function be(e){var t=Object.entries({hd2160:2160,hd1440:1440,hd1080:1080,hd720:720,large:480,medium:360,small:240,tiny:144}).find(function(t){return t.includes(e)});return t?t.find(function(t){return t!==e}):"default"}function ke(e){e&&!this.embed.hasPlayed&&(this.embed.hasPlayed=!0),this.media.paused===e&&(this.media.paused=!e,o.call(this,this.media,e?"play":"pause"))}var we,Te={setup:function(){var e=this;T(this.elements.wrapper,this.config.classNames.embed,!0),Te.setAspectRatio.call(this),i.object(window.YT)&&i.function(window.YT.Player)?Te.ready.call(this):(ge(this.config.urls.youtube.sdk).catch(function(t){e.debug.warn("YouTube API failed to load",t)}),window.onYouTubeReadyCallbacks=window.onYouTubeReadyCallbacks||[],window.onYouTubeReadyCallbacks.push(function(){Te.ready.call(e)}),window.onYouTubeIframeAPIReady=function(){window.onYouTubeReadyCallbacks.forEach(function(e){e()})})},getTitle:function(e){var t=this;if(i.function(this.embed.getVideoData)){var n=this.embed.getVideoData().title;if(i.empty(n))return this.config.title=n,void pe.setTitle.call(this)}var a=this.config.keys.google;i.string(a)&&!i.empty(a)&&Z(H(this.config.urls.youtube.api,e,a)).then(function(e){i.object(e)&&(t.config.title=e.items[0].snippet.title,pe.setTitle.call(t))}).catch(function(){})},setAspectRatio:function(){var e=this.config.ratio.split(":");this.elements.wrapper.style.paddingBottom=100/e[0]*e[1]+"%"},ready:function(){var e=this,t=e.media.getAttribute("id");if(i.empty(t)||!t.startsWith("youtube-")){var n=e.media.getAttribute("src");i.empty(n)&&(n=e.media.getAttribute(this.config.attributes.embed.id));var a,s=(a=n,i.empty(a)?null:a.match(/^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|&v=)([^#&?]*).*/)?RegExp.$2:a),r=e.provider+"-"+Math.floor(1e4*Math.random()),l=f("div",{id:r,poster:e.poster});e.media=b(l,e.media);var c=function(e){return"https://img.youtube.com/vi/"+s+"/"+e+"default.jpg"};de(c("maxres"),121).catch(function(){return de(c("sd"),121)}).catch(function(){return de(c("hq"))}).then(function(t){return pe.setPoster.call(e,t.src)}).then(function(t){t.includes("maxres")||(e.elements.poster.style.backgroundSize="cover")}).catch(function(){}),e.embed=new window.YT.Player(r,{videoId:s,playerVars:{autoplay:e.config.autoplay?1:0,controls:e.supported.ui?0:1,rel:0,showinfo:0,iv_load_policy:3,modestbranding:1,disablekb:1,playsinline:1,widget_referrer:window?window.location.href:null,cc_load_policy:e.captions.active?1:0,cc_lang_pref:e.config.captions.language},events:{onError:function(t){if(!e.media.error){var i=t.data,n={2:"The request contains an invalid parameter value. For example, this error occurs if you specify a video ID that does not have 11 characters, or if the video ID contains invalid characters, such as exclamation points or asterisks.",5:"The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.",100:"The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.",101:"The owner of the requested video does not allow it to be played in embedded players.",150:"The owner of the requested video does not allow it to be played in embedded players."}[i]||"An unknown error occured";e.media.error={code:i,message:n},o.call(e,e.media,"error")}},onPlaybackQualityChange:function(){o.call(e,e.media,"qualitychange",!1,{quality:e.media.quality})},onPlaybackRateChange:function(t){var i=t.target;e.media.playbackRate=i.getPlaybackRate(),o.call(e,e.media,"ratechange")},onReady:function(t){var n=t.target;Te.getTitle.call(e,s),e.media.play=function(){ke.call(e,!0),n.playVideo()},e.media.pause=function(){ke.call(e,!1),n.pauseVideo()},e.media.stop=function(){n.stopVideo()},e.media.duration=n.getDuration(),e.media.paused=!0,e.media.currentTime=0,Object.defineProperty(e.media,"currentTime",{get:function(){return Number(n.getCurrentTime())},set:function(t){e.paused&&e.embed.mute(),e.media.seeking=!0,o.call(e,e.media,"seeking"),n.seekTo(t)}}),Object.defineProperty(e.media,"playbackRate",{get:function(){return n.getPlaybackRate()},set:function(e){n.setPlaybackRate(e)}}),Object.defineProperty(e.media,"quality",{get:function(){return be(n.getPlaybackQuality())},set:function(e){n.setPlaybackQuality(be(e))}});var a=e.config.volume;Object.defineProperty(e.media,"volume",{get:function(){return a},set:function(t){a=t,n.setVolume(100*a),o.call(e,e.media,"volumechange")}});var r=e.config.muted;Object.defineProperty(e.media,"muted",{get:function(){return r},set:function(t){var a=i.boolean(t)?t:r;r=a,n[a?"mute":"unMute"](),o.call(e,e.media,"volumechange")}}),Object.defineProperty(e.media,"currentSrc",{get:function(){return n.getVideoUrl()}}),Object.defineProperty(e.media,"ended",{get:function(){return e.currentTime===e.duration}}),e.options.speed=n.getAvailablePlaybackRates(),e.supported.ui&&e.media.setAttribute("tabindex",-1),o.call(e,e.media,"timeupdate"),o.call(e,e.media,"durationchange"),clearInterval(e.timers.buffering),e.timers.buffering=setInterval(function(){e.media.buffered=n.getVideoLoadedFraction(),(null===e.media.lastBuffered||e.media.lastBuffered<e.media.buffered)&&o.call(e,e.media,"progress"),e.media.lastBuffered=e.media.buffered,1===e.media.buffered&&(clearInterval(e.timers.buffering),o.call(e,e.media,"canplaythrough"))},200),setTimeout(function(){return pe.build.call(e)},50)},onStateChange:function(t){var n,a=t.target;switch(clearInterval(e.timers.playing),e.media.seeking&&[1,2].includes(t.data)&&(e.media.seeking=!1,o.call(e,e.media,"seeked")),t.data){case-1:o.call(e,e.media,"timeupdate"),e.media.buffered=a.getVideoLoadedFraction(),o.call(e,e.media,"progress");break;case 0:ke.call(e,!1),e.media.loop?(a.stopVideo(),a.playVideo()):o.call(e,e.media,"ended");break;case 1:e.media.paused&&!e.embed.hasPlayed?e.media.pause():(ke.call(e,!0),o.call(e,e.media,"playing"),e.timers.playing=setInterval(function(){o.call(e,e.media,"timeupdate")},50),e.media.duration!==a.getDuration()&&(e.media.duration=a.getDuration(),o.call(e,e.media,"durationchange")),G.setQualityMenu.call(e,(n=a.getAvailableQualityLevels(),i.empty(n)?n:W(n.map(function(e){return be(e)})))));break;case 2:e.muted||e.embed.unMute(),ke.call(e,!1)}o.call(e,e.elements.container,"statechange",!1,{code:t.data})}}})}}},Ae={setup:function(){this.media?(T(this.elements.container,this.config.classNames.type.replace("{0}",this.type),!0),T(this.elements.container,this.config.classNames.provider.replace("{0}",this.provider),!0),this.isEmbed&&T(this.elements.container,this.config.classNames.type.replace("{0}","video"),!0),this.isVideo&&(this.elements.wrapper=f("div",{class:this.config.classNames.video}),h(this.media,this.elements.wrapper),this.elements.poster=f("div",{class:this.config.classNames.poster}),this.elements.wrapper.appendChild(this.elements.poster)),this.isHTML5?j.extend.call(this):this.isYouTube?Te.setup.call(this):this.isVimeo&&ve.setup.call(this)):this.debug.warn("No media element found!")}},Ce=function(){function e(t){var i=this;c(this,e),this.player=t,this.publisherId=t.config.ads.publisherId,this.playing=!1,this.initialized=!1,this.elements={container:null,displayContainer:null},this.manager=null,this.loader=null,this.cuePoints=null,this.events={},this.safetyTimer=null,this.countdownTimer=null,this.managerPromise=new Promise(function(e,t){i.on("loaded",e),i.on("error",t)}),this.load()}return u(e,[{key:"load",value:function(){var e=this;this.enabled&&(i.object(window.google)&&i.object(window.google.ima)?this.ready():ge(this.player.config.urls.googleIMA.sdk).then(function(){e.ready()}).catch(function(){e.trigger("error",new Error("Google IMA SDK failed to load"))}))}},{key:"ready",value:function(){var e=this;this.startSafetyTimer(12e3,"ready()"),this.managerPromise.then(function(){e.clearSafetyTimer("onAdsManagerLoaded()")}),this.listeners(),this.setupIMA()}},{key:"setupIMA",value:function(){this.elements.container=f("div",{class:this.player.config.classNames.ads}),this.player.elements.container.appendChild(this.elements.container),google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED),google.ima.settings.setLocale(this.player.config.ads.language),this.elements.displayContainer=new google.ima.AdDisplayContainer(this.elements.container),this.requestAds()}},{key:"requestAds",value:function(){var e=this,t=this.player.elements.container;try{this.loader=new google.ima.AdsLoader(this.elements.displayContainer),this.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED,function(t){return e.onAdsManagerLoaded(t)},!1),this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR,function(t){return e.onAdError(t)},!1);var i=new google.ima.AdsRequest;i.adTagUrl=this.tagUrl,i.linearAdSlotWidth=t.offsetWidth,i.linearAdSlotHeight=t.offsetHeight,i.nonLinearAdSlotWidth=t.offsetWidth,i.nonLinearAdSlotHeight=t.offsetHeight,i.forceNonLinearFullSlot=!1,i.setAdWillPlayMuted(!this.player.muted),this.loader.requestAds(i)}catch(e){this.onAdError(e)}}},{key:"pollCountdown",value:function(){var e=this;if(!(arguments.length>0&&void 0!==arguments[0]&&arguments[0]))return clearInterval(this.countdownTimer),void this.elements.container.removeAttribute("data-badge-text");this.countdownTimer=setInterval(function(){var t=X(Math.max(e.manager.getRemainingTime(),0)),i=z("advertisement",e.player.config)+" - "+t;e.elements.container.setAttribute("data-badge-text",i)},100)}},{key:"onAdsManagerLoaded",value:function(e){var t=this,n=new google.ima.AdsRenderingSettings;n.restoreCustomPlaybackStateOnAdBreakComplete=!0,n.enablePreloading=!0,this.manager=e.getAdsManager(this.player,n),this.cuePoints=this.manager.getCuePoints(),i.empty(this.cuePoints)||this.cuePoints.forEach(function(e){if(0!==e&&-1!==e&&e<t.player.duration){var n=t.player.elements.progress;if(i.element(n)){var a=100/t.player.duration*e,s=f("span",{class:t.player.config.classNames.cues});s.style.left=a.toString()+"%",n.appendChild(s)}}}),this.manager.setVolume(this.player.volume),this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR,function(e){return t.onAdError(e)}),Object.keys(google.ima.AdEvent.Type).forEach(function(e){t.manager.addEventListener(google.ima.AdEvent.Type[e],function(e){return t.onAdEvent(e)})}),this.trigger("loaded")}},{key:"onAdEvent",value:function(e){var t=this,i=this.player.elements.container,n=e.getAd(),a=function(e){var i="ads"+e.replace(/_/g,"").toLowerCase();o.call(t.player,t.player.media,i)};switch(e.type){case google.ima.AdEvent.Type.LOADED:this.trigger("loaded"),a(e.type),this.pollCountdown(!0),n.isLinear()||(n.width=i.offsetWidth,n.height=i.offsetHeight);break;case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:a(e.type),this.loadAds();break;case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:a(e.type),this.pauseContent();break;case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:a(e.type),this.pollCountdown(),this.resumeContent();break;case google.ima.AdEvent.Type.STARTED:case google.ima.AdEvent.Type.MIDPOINT:case google.ima.AdEvent.Type.COMPLETE:case google.ima.AdEvent.Type.IMPRESSION:case google.ima.AdEvent.Type.CLICK:a(e.type)}}},{key:"onAdError",value:function(e){this.cancel(),this.player.debug.warn("Ads error",e)}},{key:"listeners",value:function(){var e=this,t=this.player.elements.container,n=void 0;this.player.on("ended",function(){e.loader.contentComplete()}),this.player.on("seeking",function(){return n=e.player.currentTime}),this.player.on("seeked",function(){var t=e.player.currentTime;i.empty(e.cuePoints)||e.cuePoints.forEach(function(i,a){n<i&&i<t&&(e.manager.discardAdBreak(),e.cuePoints.splice(a,1))})}),window.addEventListener("resize",function(){e.manager&&e.manager.resize(t.offsetWidth,t.offsetHeight,google.ima.ViewMode.NORMAL)})}},{key:"play",value:function(){var e=this,t=this.player.elements.container;this.managerPromise||this.resumeContent(),this.managerPromise.then(function(){e.elements.displayContainer.initialize();try{e.initialized||(e.manager.init(t.offsetWidth,t.offsetHeight,google.ima.ViewMode.NORMAL),e.manager.start()),e.initialized=!0}catch(t){e.onAdError(t)}}).catch(function(){})}},{key:"resumeContent",value:function(){this.elements.container.style.zIndex="",this.playing=!1,this.player.currentTime<this.player.duration&&this.player.play()}},{key:"pauseContent",value:function(){this.elements.container.style.zIndex=3,this.playing=!0,this.player.pause()}},{key:"cancel",value:function(){this.initialized&&this.resumeContent(),this.trigger("error"),this.loadAds()}},{key:"loadAds",value:function(){var e=this;this.managerPromise.then(function(){e.manager&&e.manager.destroy(),e.managerPromise=new Promise(function(t){e.on("loaded",t),e.player.debug.log(e.manager)}),e.requestAds()}).catch(function(){})}},{key:"trigger",value:function(e){for(var t=this,n=arguments.length,a=Array(n>1?n-1:0),s=1;s<n;s++)a[s-1]=arguments[s];var r=this.events[e];i.array(r)&&r.forEach(function(e){i.function(e)&&e.apply(t,a)})}},{key:"on",value:function(e,t){return i.array(this.events[e])||(this.events[e]=[]),this.events[e].push(t),this}},{key:"startSafetyTimer",value:function(e,t){var i=this;this.player.debug.log("Safety timer invoked from: "+t),this.safetyTimer=setTimeout(function(){i.cancel(),i.clearSafetyTimer("startSafetyTimer()")},e)}},{key:"clearSafetyTimer",value:function(e){i.nullOrUndefined(this.safetyTimer)||(this.player.debug.log("Safety timer cleared from: "+e),clearTimeout(this.safetyTimer),this.safetyTimer=null)}},{key:"enabled",get:function(){return this.player.isVideo&&this.player.config.ads.enabled&&!i.empty(this.publisherId)}},{key:"tagUrl",get:function(){return"https://go.aniview.com/api/adserver6/vast/?"+te({AV_PUBLISHERID:"58c25bb0073ef448b1087ad6",AV_CHANNELID:"5a0458dc28a06145e4519d21",AV_URL:location.hostname,cb:Date.now(),AV_WIDTH:640,AV_HEIGHT:480,AV_CDIM2:this.publisherId})}}]),e}(),Ee={insertElements:function(e,t){var n=this;i.string(t)?g(e,this.media,{src:t}):i.array(t)&&t.forEach(function(t){g(e,n.media,t)})},change:function(e){var t=this;R(e,"sources.length")?(j.cancelRequests.call(this),this.destroy.call(this,function(){t.options.quality=[],y(t.media),t.media=null,i.element(t.elements.container)&&t.elements.container.removeAttribute("class");var n=e.sources,a=e.type,s=p(n,1)[0],r=s.provider,l=void 0===r?ae.html5:r,o=s.src,c="html5"===l?a:"div",u="html5"===l?{}:{src:o};Object.assign(t,{provider:l,type:a,supported:O.check(a,l,t.config.playsinline),media:f(c,u)}),t.elements.container.appendChild(t.media),i.boolean(e.autoplay)&&(t.config.autoplay=e.autoplay),t.isHTML5&&(t.config.crossorigin&&t.media.setAttribute("crossorigin",""),t.config.autoplay&&t.media.setAttribute("autoplay",""),i.empty(e.poster)||(t.poster=e.poster),t.config.loop.active&&t.media.setAttribute("loop",""),t.config.muted&&t.media.setAttribute("muted",""),t.config.playsinline&&t.media.setAttribute("playsinline","")),pe.addStyleHook.call(t),t.isHTML5&&Ee.insertElements.call(t,"source",n),t.config.title=e.title,Ae.setup.call(t),t.isHTML5&&("tracks"in e&&Ee.insertElements.call(t,"track",e.tracks),t.media.load()),(t.isHTML5||t.isEmbed&&!t.supported.ui)&&pe.build.call(t),t.fullscreen.update()},!0)):this.debug.warn("Invalid source format")}},Se=function(){function e(t,n){var a=this;if(c(this,e),this.timers={},this.ready=!1,this.loading=!1,this.failed=!1,this.touch=O.touch,this.media=t,i.string(this.media)&&(this.media=document.querySelectorAll(this.media)),(window.jQuery&&this.media instanceof jQuery||i.nodeList(this.media)||i.array(this.media))&&(this.media=this.media[0]),this.config=V({},ne,e.defaults,n||{},function(){try{return JSON.parse(a.media.getAttribute("data-plyr-config"))}catch(e){return{}}}()),this.elements={container:null,buttons:{},display:{},progress:{},inputs:{},settings:{menu:null,panes:{},tabs:{}},captions:null},this.captions={active:null,currentTrack:-1,meta:new WeakMap},this.fullscreen={active:!1},this.options={speed:[],quality:[]},this.debug=new le(this.config.debug),this.debug.log("Config",this.config),this.debug.log("Support",O),!i.nullOrUndefined(this.media)&&i.element(this.media))if(this.media.plyr)this.debug.warn("Target already setup");else if(this.config.enabled)if(O.check().api){var r=this.media.cloneNode(!0);r.autoplay=!1,this.elements.original=r;var l=this.media.tagName.toLowerCase(),o=null,u=null;switch(l){case"div":if(o=this.media.querySelector("iframe"),i.element(o)){if(u=ee(o.getAttribute("src")),this.provider=function(e){return/^(https?:\/\/)?(www\.)?(youtube\.com|youtu\.?be)\/.+$/.test(e)?ae.youtube:/^https?:\/\/player.vimeo.com\/video\/\d{0,9}(?=\b|\/)/.test(e)?ae.vimeo:null}(u.toString()),this.elements.container=this.media,this.media=o,this.elements.container.className="",u.searchParams.length){var d=["1","true"];d.includes(u.searchParams.get("autoplay"))&&(this.config.autoplay=!0),d.includes(u.searchParams.get("loop"))&&(this.config.loop.active=!0),this.isYouTube?this.config.playsinline=d.includes(u.searchParams.get("playsinline")):this.config.playsinline=!0}}else this.provider=this.media.getAttribute(this.config.attributes.embed.provider),this.media.removeAttribute(this.config.attributes.embed.provider);if(i.empty(this.provider)||!Object.keys(ae).includes(this.provider))return void this.debug.error("Setup failed: Invalid provider");this.type=se.video;break;case"video":case"audio":this.type=l,this.provider=ae.html5,this.media.hasAttribute("crossorigin")&&(this.config.crossorigin=!0),this.media.hasAttribute("autoplay")&&(this.config.autoplay=!0),this.media.hasAttribute("playsinline")&&(this.config.playsinline=!0),this.media.hasAttribute("muted")&&(this.config.muted=!0),this.media.hasAttribute("loop")&&(this.config.loop.active=!0);break;default:return void this.debug.error("Setup failed: unsupported type")}this.supported=O.check(this.type,this.provider,this.config.playsinline),this.supported.api?(this.eventListeners=[],this.listeners=new he(this),this.storage=new K(this),this.media.plyr=this,i.element(this.elements.container)||(this.elements.container=f("div"),h(this.media,this.elements.container)),pe.addStyleHook.call(this),Ae.setup.call(this),this.config.debug&&s.call(this,this.elements.container,this.config.events.join(" "),function(e){a.debug.log("event: "+e.type)}),(this.isHTML5||this.isEmbed&&!this.supported.ui)&&pe.build.call(this),this.listeners.container(),this.listeners.global(),this.fullscreen=new ue(this),this.ads=new Ce(this),this.config.autoplay&&this.play()):this.debug.error("Setup failed: no support")}else this.debug.error("Setup failed: no support");else this.debug.error("Setup failed: disabled by config");else this.debug.error("Setup failed: no suitable element passed")}return u(e,[{key:"play",value:function(){return i.function(this.media.play)?this.media.play():null}},{key:"pause",value:function(){this.playing&&i.function(this.media.pause)&&this.media.pause()}},{key:"togglePlay",value:function(e){(i.boolean(e)?e:!this.playing)?this.play():this.pause()}},{key:"stop",value:function(){this.isHTML5?(this.pause(),this.restart()):i.function(this.media.stop)&&this.media.stop()}},{key:"restart",value:function(){this.currentTime=0}},{key:"rewind",value:function(e){this.currentTime=this.currentTime-(i.number(e)?e:this.config.seekTime)}},{key:"forward",value:function(e){this.currentTime=this.currentTime+(i.number(e)?e:this.config.seekTime)}},{key:"increaseVolume",value:function(e){var t=this.media.muted?0:this.volume;this.volume=t+(i.number(e)?e:1)}},{key:"decreaseVolume",value:function(e){var t=this.media.muted?0:this.volume;this.volume=t-(i.number(e)?e:1)}},{key:"toggleCaptions",value:function(e){ie.toggle.call(this,e,!1)}},{key:"airplay",value:function(){O.airplay&&this.media.webkitShowPlaybackTargetPicker()}},{key:"toggleControls",value:function(e){if(this.supported.ui&&!this.isAudio){var t=A(this.elements.container,this.config.classNames.hideControls),n=void 0===e?void 0:!e,a=T(this.elements.container,this.config.classNames.hideControls,n);if(a&&this.config.controls.includes("settings")&&!i.empty(this.config.settings)&&G.toggleMenu.call(this,!1),a!==t){var s=a?"controlshidden":"controlsshown";o.call(this,this.media,s)}return!a}return!1}},{key:"on",value:function(e,t){s.call(this,this.elements.container,e,t)}},{key:"once",value:function(e,t){l.call(this,this.elements.container,e,t)}},{key:"off",value:function(e,t){r(this.elements.container,e,t)}},{key:"destroy",value:function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(this.ready){var a=function(){document.body.style.overflow="",t.embed=null,n?(Object.keys(t.elements).length&&(y(t.elements.buttons.play),y(t.elements.captions),y(t.elements.controls),y(t.elements.wrapper),t.elements.buttons.play=null,t.elements.captions=null,t.elements.controls=null,t.elements.wrapper=null),i.function(e)&&e()):(function(){this&&this.eventListeners&&(this.eventListeners.forEach(function(e){var t=e.element,i=e.type,n=e.callback,a=e.options;t.removeEventListener(i,n,a)}),this.eventListeners=[])}.call(t),b(t.elements.original,t.elements.container),o.call(t,t.elements.original,"destroyed",!0),i.function(e)&&e.call(t.elements.original),t.ready=!1,setTimeout(function(){t.elements=null,t.media=null},200))};this.stop(),this.isHTML5?(clearTimeout(this.timers.loading),pe.toggleNativeControls.call(this,!0),a()):this.isYouTube?(clearInterval(this.timers.buffering),clearInterval(this.timers.playing),null!==this.embed&&i.function(this.embed.destroy)&&this.embed.destroy(),a()):this.isVimeo&&(null!==this.embed&&this.embed.unload().then(a),setTimeout(a,200))}}},{key:"supports",value:function(e){return O.mime.call(this,e)}},{key:"isHTML5",get:function(){return Boolean(this.provider===ae.html5)}},{key:"isEmbed",get:function(){return Boolean(this.isYouTube||this.isVimeo)}},{key:"isYouTube",get:function(){return Boolean(this.provider===ae.youtube)}},{key:"isVimeo",get:function(){return Boolean(this.provider===ae.vimeo)}},{key:"isVideo",get:function(){return Boolean(this.type===se.video)}},{key:"isAudio",get:function(){return Boolean(this.type===se.audio)}},{key:"playing",get:function(){return Boolean(this.ready&&!this.paused&&!this.ended)}},{key:"paused",get:function(){return Boolean(this.media.paused)}},{key:"stopped",get:function(){return Boolean(this.paused&&0===this.currentTime)}},{key:"ended",get:function(){return Boolean(this.media.ended)}},{key:"currentTime",set:function(e){if(this.duration){var t=i.number(e)&&e>0;this.media.currentTime=t?Math.min(e,this.duration):0,this.debug.log("Seeking to "+this.currentTime+" seconds")}},get:function(){return Number(this.media.currentTime)}},{key:"buffered",get:function(){var e=this.media.buffered;return i.number(e)?e:e&&e.length&&this.duration>0?e.end(0)/this.duration:0}},{key:"seeking",get:function(){return Boolean(this.media.seeking)}},{key:"duration",get:function(){var e=parseFloat(this.config.duration),t=(this.media||{}).duration||0;return e||t}},{key:"volume",set:function(e){var t=e;i.string(t)&&(t=Number(t)),i.number(t)||(t=this.storage.get("volume")),i.number(t)||(t=this.config.volume),t>1&&(t=1),t<0&&(t=0),this.config.volume=t,this.media.volume=t,!i.empty(e)&&this.muted&&t>0&&(this.muted=!1)},get:function(){return Number(this.media.volume)}},{key:"muted",set:function(e){var t=e;i.boolean(t)||(t=this.storage.get("muted")),i.boolean(t)||(t=this.config.muted),this.config.muted=t,this.media.muted=t},get:function(){return Boolean(this.media.muted)}},{key:"hasAudio",get:function(){return!this.isHTML5||(!!this.isAudio||(Boolean(this.media.mozHasAudio)||Boolean(this.media.webkitAudioDecodedByteCount)||Boolean(this.media.audioTracks&&this.media.audioTracks.length)))}},{key:"speed",set:function(e){var t=null;i.number(e)&&(t=e),i.number(t)||(t=this.storage.get("speed")),i.number(t)||(t=this.config.speed.selected),t<.1&&(t=.1),t>2&&(t=2),this.config.speed.options.includes(t)?(this.config.speed.selected=t,this.media.playbackRate=t):this.debug.warn("Unsupported speed ("+t+")")},get:function(){return Number(this.media.playbackRate)}},{key:"quality",set:function(e){var t=this.config.quality,n=this.options.quality;if(n.length){var a=[!i.empty(e)&&Number(e),this.storage.get("quality"),t.selected,t.default].find(i.number);if(!n.includes(a)){var s=function(e,t){return i.array(e)&&e.length?e.reduce(function(e,i){return Math.abs(i-t)<Math.abs(e-t)?i:e}):null}(n,a);this.debug.warn("Unsupported quality option: "+a+", using "+s+" instead"),a=s}o.call(this,this.media,"qualityrequested",!1,{quality:a}),t.selected=a,this.media.quality=a}},get:function(){return this.media.quality}},{key:"loop",set:function(e){var t=i.boolean(e)?e:this.config.loop.active;this.config.loop.active=t,this.media.loop=t},get:function(){return Boolean(this.media.loop)}},{key:"source",set:function(e){Ee.change.call(this,e)},get:function(){return this.media.currentSrc}},{key:"poster",set:function(e){this.isVideo?pe.setPoster.call(this,e,!1).catch(function(){}):this.debug.warn("Poster can only be set for video")},get:function(){return this.isVideo?this.media.getAttribute("poster"):null}},{key:"autoplay",set:function(e){var t=i.boolean(e)?e:this.config.autoplay;this.config.autoplay=t},get:function(){return Boolean(this.config.autoplay)}},{key:"currentTrack",set:function(e){ie.set.call(this,e,!1)},get:function(){var e=this.captions,t=e.toggled,i=e.currentTrack;return t?i:-1}},{key:"language",set:function(e){ie.setLanguage.call(this,e,!1)},get:function(){return(ie.getCurrentTrack.call(this)||{}).language}},{key:"pip",set:function(e){var t="picture-in-picture",n="inline";if(O.pip){var a=i.boolean(e)?e:this.pip===n;this.media.webkitSetPresentationMode(a?t:n)}},get:function(){return O.pip?this.media.webkitPresentationMode:null}}],[{key:"supported",value:function(e,t,i){return O.check(e,t,i)}},{key:"loadSprite",value:function(e,t){return Y(e,t)}},{key:"setup",value:function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},a=null;return i.string(t)?a=Array.from(document.querySelectorAll(t)):i.nodeList(t)?a=Array.from(t):i.array(t)&&(a=t.filter(i.element)),i.empty(a)?null:a.map(function(t){return new e(t,n)})}}]),e}();return Se.defaults=(we=ne,JSON.parse(JSON.stringify(we))),Se});
//# sourceMappingURL=plyr.min.js.map
diff --git a/dist/plyr.min.js.map b/dist/plyr.min.js.map
index 0ec354b4..110a9a72 100644
--- a/dist/plyr.min.js.map
+++ b/dist/plyr.min.js.map
@@ -1 +1 @@
-{"version":3,"sources":["support.js","../../node_modules/loadjs/dist/loadjs.umd.js","storage.js","types.js","utils.js","html5.js","i18n.js","controls.js","captions.js","console.js","defaults.js","fullscreen.js","ui.js","listeners.js","plugins/vimeo.js","plugins/youtube.js","media.js","plugins/ads.js","source.js","plyr.js"],"names":["range","factory","devnull","bundleIdCache","bundleResultCache","bundleCallbackQueue","publish","bundleId","pathsNotFound","q","length","splice","executeCallbacks","args","depsNotFound","call","success","error","loadFile","path","callbackFn","numTries","isCss","e","doc","document","async","maxTries","numRetries","beforeCallbackFn","before","pathStripped","replace","test","createElement","rel","href","src","undefined","onload","onerror","onbeforeload","ev","result","type","sheet","cssText","x","defaultPrevented","head","appendChild","loadjs","paths","arg1","arg2","trim","fn","i","numWaiting","push","loadFiles","ready","deps","bundleIds","r","subscribe","done","reset","isDefined","module","exports","Storage","player","enabled","config","storage","key","supported","this","store","window","localStorage","getItem","utils","is","empty","json","JSON","parse","string","object","get","extend","setItem","stringify","removeItem","providers","types","input","getConstructor","Object","Number","isNaN","String","Boolean","Function","nullOrUndefined","Array","isArray","instanceof","WeakMap","NodeList","Element","Text","Event","TextTrackCue","VTTCue","TextTrack","kind","array","nodeList","keys","constructor","documentMode","documentElement","style","navigator","userAgent","platform","url","responseType","arguments","Promise","resolve","reject","request","XMLHttpRequest","addEventListener","responseText","response","Error","statusText","open","send","minWidth","image","Image","handler","naturalWidth","assign","id","hasId","exists","getElementById","update","container","data","innerHTML","body","insertAdjacentElement","useStorage","toggleHidden","setAttribute","cached","prefix","content","fetch","then","catch","Math","floor","random","elements","wrapper","targets","from","reverse","forEach","element","index","child","cloneNode","parent","parentNode","sibling","nextSibling","insertBefore","attributes","text","setAttributes","innerText","target","removeElement","removeChild","childNodes","lastChild","newChild","oldChild","replaceChild","entries","_ref","_ref2","value","sel","existingAttributes","existing","split","s","selector","className","parts","charAt","class","hidden","hide","boolean","hasAttribute","removeAttribute","force","method","classList","contains","prototype","matches","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","querySelectorAll","includes","querySelector","focused","activeElement","toggle","focusable","getElements","first","last","trap","event","keyCode","getFocusElement","shiftKey","focus","preventDefault","on","off","callback","passive","capture","function","Node","toggleListener","events","options","support","passiveListeners","bubbles","detail","CustomEvent","dispatchEvent","_len","_key","toString","match","current","max","toFixed","parseInt","time","displayHours","inverted","number","formatTime","format","slice","hours","getHours","mins","getMinutes","secs","getSeconds","find","RegExp","toUpperCase","substr","toLowerCase","replaceAll","toTitleCase","toPascalCase","sources","_len2","_key2","source","shift","defineProperty","apply","concat","toConsumableArray","filter","item","indexOf","reduce","obj","prev","curr","abs","youtube","vimeo","$2","parser","search","startsWith","parseUrl","params","hash","_hash$split2","val","decodeURIComponent","map","encodeURIComponent","join","fragment","createDocumentFragment","firstChild","width","height","ratio","getRatio","w","h","offsetHeight","provider","playsinline","api","ui","browser","getBrowser","canPlayInline","isIPhone","video","rangeInput","audio","webkitSetPresentationMode","WebKitPlaybackTargetAvailabilityEvent","media","isHTML5","canPlayType","isVideo","isAudio","removeEventListener","transitionEndEvent","matchMedia","html5","getSources","sizes","getAttribute","dedupe","mime","currentTime","playing","onLoadedMetaData","load","play","blankVideo","debug","log","i18n","getDeep","seekTime","title","controls","cors","URL","iconUrl","location","host","isIE","svg4everybody","getElement","selectors","buttons","pause","restart","rewind","fastForward","mute","pip","airplay","settings","captions","fullscreen","progress","inputs","seek","volume","display","buffer","duration","seekTooltip","classNames","tooltip","warn","toggleNativeControls","getIconUrl","iconPath","iconPrefix","icon","createElementNS","use","setAttributeNS","attr","badge","menu","buttonType","button","toCamelCase","label","labelPressed","iconPressed","control","createIcon","createLabel","getAttributesFromSelector","controlPressed","hasClass","pressed","toggleClass","updateRangeFill","suffix","list","_ref$badge","checked","_ref$checked","radio","faux","insertAdjacentHTML","forceHours","setRange","muted","getPercentage","_this","getElementsByTagName","nodeValue","buffered","percent","isWebkit","setProperty","tooltips","clientRect","getBoundingClientRect","visible","_toggle","_this2","touch","pageX","left","parseFloat","updateTimeDisplay","invert","invertTime","seeking","updateProgress","hasDuration","displayDuration","paused","updateSeekTooltip","setting","tabs","panes","quality","_this3","toggleTab","checkMenu","emptyElement","sort","a","b","sorting","createMenuItem","getLabel","createBadge","getBadge","updateSetting","pane","currentTrack","default","tracks","getTracks","track","_this4","active","language","unshift","bind","speed","isVimeo","_this5","values","some","tab","form","show","isMenuItem","isButton","stopPropagation","clone","position","opacity","name","scrollWidth","scrollHeight","transitions","reducedMotion","size","getTabSize","restore","propertyName","createButton","createRange","createProgress","createTime","inner","home","_this6","back","setQualityMenu","getQualityOptions","setSpeedMenu","loadSprite","props","create","_ref3","findElements","repaint","labels","_this7","isYouTube","textTracks","setCaptionsMenu","insertAfter","hostname","protocol","blob","createObjectURL","userLanguage","setLanguage","trackEvents","_captions","meta","set","mode","updateCues","trackRemoved","currentTrackNode","firstMatch","getCurrentTrack","embed","enableTextTrack","toggleCaptions","has","fromLanguage","sortIsDefault","sorted","cues","activeCues","cue","getCueAsHTML","getHTML","cueText","caption","noop","Console","console","defaults","onChange","isIos","trapFocus","toggleFallback","scrollPosition","scrollX","scrollY","scrollTo","y","overflow","fallback","Fullscreen","property","native","iosNative","webkitEnterFullscreen","requestFullscreen","webkitExitFullscreen","action","cancelFullScreen","exitFullscreen","exit","enter","fullscreenElement","fullscreenEnabled","webkitFullscreenEnabled","mozFullScreenEnabled","msFullscreenEnabled","pre","uiSupported","listeners","inject","setup","loop","updateVolume","timeUpdate","checkPlaying","isTouch","setTitle","poster","backgroundImage","setPoster","durationUpdate","isEmbed","iframe","enable","posterEnabled","loadPromise","loadImage","togglePoster","stopped","toggleControls","loading","timers","setTimeout","hideControls","hover","Listeners","lastKey","handleKey","toggleMenu","firstTouch","code","which","repeat","altKey","ctrlKey","metaKey","editable","togglePlay","increaseVolume","decreaseVolume","forward","keyboard","global","tabFocus","delay","hasAudio","resetOnEnd","checkLoading","ads","initialized","managerPromise","clickToPlay","ended","disableContextMenu","_event$detail","inputEvent","proxy","defaultHandler","customHandlerKey","customHandler","returned","hasCustomHandler","showHomeTab","showTab","currentTarget","eventType","seekTo","toggleInvert","_player","noTransition","webkitDirectionInvertedFromDevice","direction","deltaY","deltaX","assurePlaybackState","hasPlayed","setAspectRatio","Vimeo","loadScript","urls","sdk","padding","paddingBottom","offset","transform","autoplay","buildUrlParams","parseVimeoId","embedContainer","replaceElement","thumbnail_large","pathname","Player","autopause","disableTextTrack","stop","restorePause","setVolume","setCurrentTime","selected","setPlaybackRate","setLoop","currentSrc","getVideoUrl","all","getVideoWidth","getVideoHeight","dimensions","getAspectRatio","setAutopause","state","getVideoTitle","getCurrentTime","getDuration","getTextTracks","strippedCues","_ref$cues","stripHTML","getPaused","seconds","build","mapQualityUnit","YT","onYouTubeReadyCallbacks","onYouTubeIframeAPIReady","videoId","getVideoData","google","items","snippet","currentId","parseYouTubeId","generateId","posterSrc","backgroundSize","message","instance","playbackRate","getPlaybackRate","getTitle","playVideo","pauseVideo","stopVideo","getPlaybackQuality","setPlaybackQuality","getAvailablePlaybackRates","buffering","setInterval","getVideoLoadedFraction","lastBuffered","levels","getAvailableQualityLevels","level","unMute","wrap","Ads","publisherId","manager","loader","cuePoints","safetyTimer","countdownTimer","ima","googleIMA","trigger","startSafetyTimer","clearSafetyTimer","setupIMA","setVpaidMode","ImaSdkSettings","VpaidMode","ENABLED","setLocale","displayContainer","AdDisplayContainer","requestAds","AdsLoader","AdsManagerLoadedEvent","Type","ADS_MANAGER_LOADED","onAdsManagerLoaded","AdErrorEvent","AD_ERROR","onAdError","AdsRequest","adTagUrl","tagUrl","linearAdSlotWidth","offsetWidth","linearAdSlotHeight","nonLinearAdSlotWidth","nonLinearAdSlotHeight","forceNonLinearFullSlot","setAdWillPlayMuted","getRemainingTime","AdsRenderingSettings","restoreCustomPlaybackStateOnAdBreakComplete","enablePreloading","getAdsManager","getCuePoints","cuePoint","seekElement","cuePercentage","AdEvent","onAdEvent","ad","getAd","LOADED","pollCountdown","isLinear","ALL_ADS_COMPLETED","loadAds","CONTENT_PAUSE_REQUESTED","pauseContent","CONTENT_RESUME_REQUESTED","resumeContent","STARTED","MIDPOINT","COMPLETE","IMPRESSION","CLICK","cancel","contentComplete","_this8","seekedTime","discardAdBreak","resize","ViewMode","NORMAL","initialize","_this9","init","start","adError","zIndex","_this10","destroy","handlers","_this11","Date","now","base","insertElement","attribute","cancelRequests","check","crossorigin","addStyleHook","insertElements","Plyr","failed","jQuery","plyr","original","tagName","getProviderByUrl","getUrlParams","truthy","step","webkitShowPlaybackTargetPicker","isHidden","hiding","eventName","soft","clear","unload","inputIsValid","min","end","fauxDuration","mozHasAudio","webkitAudioDecodedByteCount","audioTracks","closest","change","states","webkitPresentationMode","inline","t","cloneDeep"],"mappings":"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AKL,+BAMA,eACA,OACA,SACA,WACA,WACA,MACA,UACA,wBAGA,WACA,UACA,uBAKS,iBACD,0BACF,aACC,oBACM,2BACP,iBACK,qCACH,kBACE,uBACG,wBACH,kBACF,cACF,cACE,wBACQ,kCACC,mCACA,kCACD,6BACJ,8BACF,oBACA,oBACA,iCACH,eACC,iBACC,eACH,aACC,YACF,UACA,YACE,iBACG,mBACD,wBACM,wBAEL,UACA,UACA,SACD,SACA,SACA,wBAOA,gDACG,6CACH,wDAGA,yCACA,wHAGA,uEAMH,UACA,WACC,aACE,YACD,iBACK,UACP,YACE,cACE,gBACE,SACP,aACI,WACF,aACE,UACH,cACI,sBAQV,WACA,UACA,UACA,UACA,UACA,iBACA,YACA,aACA,iBACA,aACA,eACA,OACA,QACA,QACA,UACA,SACA,UACA,aACA,8BAIA,iBACA,kBACA,mBACA,iBACA,iBACA,gBACA,sBAIA,gBACA,+BAIA,kBACA,mBACA,YACA,cACA,cACA,iBACA,gBACA,gCAMU,uDACC,4BAEI,aACF,0BAEL,4BAEE,2BACC,8BACE,+BACD,mCACK,kCACP,8BACI,oCACE,+BACP,4BACI,iCACC,8BACJ,mCAGA,4BACE,6BACD,+BACG,iCACD,8CAGI,gCACH,+BACF,+BACF,+BACE,mCAEF,2BACA,0BACD,+BAEI,mDAMP,qBACI,kBACH,4BACA,mCACS,sCACR,6BACO,2BACV,oBACI,+BACO,iCACP,uBACD,uBACC,wBACA,sBACF,sBACE,qBACH,oBACE,6BACM,4BACP,uBACE,6BACI,6BACC,kCAEH,0BACA,mBACD,qCAGG,gCACD,6CAGC,oCACC,4CAGC,6BACH,uCAGG,iCACH,iCAEF,+CAMI,wBACN,oCAMA,oBAMC,cACI,KCjZf9O,EAAU5P,EAAM6P,aAEtB,SAAS8O,OACAhf,KAAKL,aAKJqV,EAAShV,KAAKN,OAAOoG,SAASgN,QAAQU,WACxCnT,EAAMC,GAAG8F,QAAQ4O,OACVW,QAAU3V,KAAK4Z,UAIpBvO,cAAcpP,KAAK+D,KAAKN,OAAQM,KAAKiH,OA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","file":"plyr.min.js","sourcesContent":["// ==========================================================================\n// Plyr support checks\n// ==========================================================================\n\nimport utils from './utils';\n\n// Check for feature support\nconst support = {\n // Basic support\n audio: 'canPlayType' in document.createElement('audio'),\n video: 'canPlayType' in document.createElement('video'),\n\n // Check for support\n // Basic functionality vs full UI\n check(type, provider, playsinline) {\n let api = false;\n let ui = false;\n const browser = utils.getBrowser();\n const canPlayInline = browser.isIPhone && playsinline && support.playsinline;\n\n switch (`${provider}:${type}`) {\n case 'html5:video':\n api = support.video;\n ui = api && support.rangeInput && (!browser.isIPhone || canPlayInline);\n break;\n\n case 'html5:audio':\n api = support.audio;\n ui = api && support.rangeInput;\n break;\n\n case 'youtube:video':\n case 'vimeo:video':\n api = true;\n ui = support.rangeInput && (!browser.isIPhone || canPlayInline);\n break;\n\n default:\n api = support.audio && support.video;\n ui = api && support.rangeInput;\n }\n\n return {\n api,\n ui,\n };\n },\n\n // Picture-in-picture support\n // Safari only currently\n pip: (() => {\n const browser = utils.getBrowser();\n return !browser.isIPhone && utils.is.function(utils.createElement('video').webkitSetPresentationMode);\n })(),\n\n // Airplay support\n // Safari only currently\n airplay: utils.is.function(window.WebKitPlaybackTargetAvailabilityEvent),\n\n // Inline playback support\n // https://webkit.org/blog/6784/new-video-policies-for-ios/\n playsinline: 'playsInline' in document.createElement('video'),\n\n // Check for mime type support against a player instance\n // Credits: http://diveintohtml5.info/everything.html\n // Related: http://www.leanbackplayer.com/test/h5mt.html\n mime(type) {\n const { media } = this;\n\n try {\n // Bail if no checking function\n if (!this.isHTML5 || !utils.is.function(media.canPlayType)) {\n return false;\n }\n\n // Check directly if codecs specified\n if (type.includes('codecs=')) {\n return media.canPlayType(type).replace(/no/, '');\n }\n\n // Type specific checks\n if (this.isVideo) {\n switch (type) {\n case 'video/webm':\n return media.canPlayType('video/webm; codecs=\"vp8, vorbis\"').replace(/no/, '');\n\n case 'video/mp4':\n return media.canPlayType('video/mp4; codecs=\"avc1.42E01E, mp4a.40.2\"').replace(/no/, '');\n\n case 'video/ogg':\n return media.canPlayType('video/ogg; codecs=\"theora\"').replace(/no/, '');\n\n default:\n return false;\n }\n } else if (this.isAudio) {\n switch (type) {\n case 'audio/mpeg':\n return media.canPlayType('audio/mpeg;').replace(/no/, '');\n\n case 'audio/ogg':\n return media.canPlayType('audio/ogg; codecs=\"vorbis\"').replace(/no/, '');\n\n case 'audio/wav':\n return media.canPlayType('audio/wav; codecs=\"1\"').replace(/no/, '');\n\n default:\n return false;\n }\n }\n } catch (e) {\n return false;\n }\n\n // If we got this far, we're stuffed\n return false;\n },\n\n // Check for textTracks support\n textTracks: 'textTracks' in document.createElement('video'),\n\n // Check for passive event listener support\n // https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md\n // https://www.youtube.com/watch?v=NPM6172J22g\n passiveListeners: (() => {\n // Test via a getter in the options object to see if the passive property is accessed\n let supported = false;\n try {\n const options = Object.defineProperty({}, 'passive', {\n get() {\n supported = true;\n return null;\n },\n });\n window.addEventListener('test', null, options);\n window.removeEventListener('test', null, options);\n } catch (e) {\n // Do nothing\n }\n\n return supported;\n })(),\n\n // <input type=\"range\"> Sliders\n rangeInput: (() => {\n const range = document.createElement('input');\n range.type = 'range';\n return range.type === 'range';\n })(),\n\n // Touch\n // NOTE: Remember a device can be mouse + touch enabled so we check on first touch event\n touch: 'ontouchstart' in document.documentElement,\n\n // Detect transitions support\n transitions: utils.transitionEndEvent !== false,\n\n // Reduced motion iOS & MacOS setting\n // https://webkit.org/blog/7551/responsive-design-for-motion/\n reducedMotion: 'matchMedia' in window && window.matchMedia('(prefers-reduced-motion)').matches,\n};\n\nexport default support;\n","(function(root, factory) {\n if (typeof define === 'function' && define.amd) {\n define([], factory);\n } else if (typeof exports === 'object') {\n module.exports = factory();\n } else {\n root.loadjs = factory();\n }\n}(this, function() {\n/**\n * Global dependencies.\n * @global {Object} document - DOM\n */\n\nvar devnull = function() {},\n bundleIdCache = {},\n bundleResultCache = {},\n bundleCallbackQueue = {};\n\n\n/**\n * Subscribe to bundle load event.\n * @param {string[]} bundleIds - Bundle ids\n * @param {Function} callbackFn - The callback function\n */\nfunction subscribe(bundleIds, callbackFn) {\n // listify\n bundleIds = bundleIds.push ? bundleIds : [bundleIds];\n\n var depsNotFound = [],\n i = bundleIds.length,\n numWaiting = i,\n fn,\n bundleId,\n r,\n q;\n\n // define callback function\n fn = function (bundleId, pathsNotFound) {\n if (pathsNotFound.length) depsNotFound.push(bundleId);\n\n numWaiting--;\n if (!numWaiting) callbackFn(depsNotFound);\n };\n\n // register callback\n while (i--) {\n bundleId = bundleIds[i];\n\n // execute callback if in result cache\n r = bundleResultCache[bundleId];\n if (r) {\n fn(bundleId, r);\n continue;\n }\n\n // add to callback queue\n q = bundleCallbackQueue[bundleId] = bundleCallbackQueue[bundleId] || [];\n q.push(fn);\n }\n}\n\n\n/**\n * Publish bundle load event.\n * @param {string} bundleId - Bundle id\n * @param {string[]} pathsNotFound - List of files not found\n */\nfunction publish(bundleId, pathsNotFound) {\n // exit if id isn't defined\n if (!bundleId) return;\n\n var q = bundleCallbackQueue[bundleId];\n\n // cache result\n bundleResultCache[bundleId] = pathsNotFound;\n\n // exit if queue is empty\n if (!q) return;\n\n // empty callback queue\n while (q.length) {\n q[0](bundleId, pathsNotFound);\n q.splice(0, 1);\n }\n}\n\n\n/**\n * Execute callbacks.\n * @param {Object or Function} args - The callback args\n * @param {string[]} depsNotFound - List of dependencies not found\n */\nfunction executeCallbacks(args, depsNotFound) {\n // accept function as argument\n if (args.call) args = {success: args};\n\n // success and error callbacks\n if (depsNotFound.length) (args.error || devnull)(depsNotFound);\n else (args.success || devnull)(args);\n}\n\n\n/**\n * Load individual file.\n * @param {string} path - The file path\n * @param {Function} callbackFn - The callback function\n */\nfunction loadFile(path, callbackFn, args, numTries) {\n var doc = document,\n async = args.async,\n maxTries = (args.numRetries || 0) + 1,\n beforeCallbackFn = args.before || devnull,\n pathStripped = path.replace(/^(css|img)!/, ''),\n isCss,\n e;\n\n numTries = numTries || 0;\n\n if (/(^css!|\\.css$)/.test(path)) {\n isCss = true;\n\n // css\n e = doc.createElement('link');\n e.rel = 'stylesheet';\n e.href = pathStripped; //.replace(/^css!/, ''); // remove \"css!\" prefix\n } else if (/(^img!|\\.(png|gif|jpg|svg)$)/.test(path)) {\n // image\n e = doc.createElement('img');\n e.src = pathStripped; \n } else {\n // javascript\n e = doc.createElement('script');\n e.src = path;\n e.async = async === undefined ? true : async;\n }\n\n e.onload = e.onerror = e.onbeforeload = function (ev) {\n var result = ev.type[0];\n\n // Note: The following code isolates IE using `hideFocus` and treats empty\n // stylesheets as failures to get around lack of onerror support\n if (isCss && 'hideFocus' in e) {\n try {\n if (!e.sheet.cssText.length) result = 'e';\n } catch (x) {\n // sheets objects created from load errors don't allow access to\n // `cssText`\n result = 'e';\n }\n }\n\n // handle retries in case of load failure\n if (result == 'e') {\n // increment counter\n numTries += 1;\n\n // exit function and try again\n if (numTries < maxTries) {\n return loadFile(path, callbackFn, args, numTries);\n }\n }\n\n // execute callback\n callbackFn(path, result, ev.defaultPrevented);\n };\n\n // add to document (unless callback returns `false`)\n if (beforeCallbackFn(path, e) !== false) doc.head.appendChild(e);\n}\n\n\n/**\n * Load multiple files.\n * @param {string[]} paths - The file paths\n * @param {Function} callbackFn - The callback function\n */\nfunction loadFiles(paths, callbackFn, args) {\n // listify paths\n paths = paths.push ? paths : [paths];\n\n var numWaiting = paths.length,\n x = numWaiting,\n pathsNotFound = [],\n fn,\n i;\n\n // define callback function\n fn = function(path, result, defaultPrevented) {\n // handle error\n if (result == 'e') pathsNotFound.push(path);\n\n // handle beforeload event. If defaultPrevented then that means the load\n // will be blocked (ex. Ghostery/ABP on Safari)\n if (result == 'b') {\n if (defaultPrevented) pathsNotFound.push(path);\n else return;\n }\n\n numWaiting--;\n if (!numWaiting) callbackFn(pathsNotFound);\n };\n\n // load scripts\n for (i=0; i < x; i++) loadFile(paths[i], fn, args);\n}\n\n\n/**\n * Initiate script load and register bundle.\n * @param {(string|string[])} paths - The file paths\n * @param {(string|Function)} [arg1] - The bundleId or success callback\n * @param {Function} [arg2] - The success or error callback\n * @param {Function} [arg3] - The error callback\n */\nfunction loadjs(paths, arg1, arg2) {\n var bundleId,\n args;\n\n // bundleId (if string)\n if (arg1 && arg1.trim) bundleId = arg1;\n\n // args (default is {})\n args = (bundleId ? arg2 : arg1) || {};\n\n // throw error if bundle is already defined\n if (bundleId) {\n if (bundleId in bundleIdCache) {\n throw \"LoadJS\";\n } else {\n bundleIdCache[bundleId] = true;\n }\n }\n\n // load scripts\n loadFiles(paths, function (pathsNotFound) {\n // execute callbacks\n executeCallbacks(args, pathsNotFound);\n\n // publish bundle load event\n publish(bundleId, pathsNotFound);\n }, args);\n}\n\n\n/**\n * Execute callbacks when dependencies have been satisfied.\n * @param {(string|string[])} deps - List of bundle ids\n * @param {Object} args - success/error arguments\n */\nloadjs.ready = function ready(deps, args) {\n // subscribe to bundle load event\n subscribe(deps, function (depsNotFound) {\n // execute callbacks\n executeCallbacks(args, depsNotFound);\n });\n\n return loadjs;\n};\n\n\n/**\n * Manually satisfy bundle dependencies.\n * @param {string} bundleId - The bundle id\n */\nloadjs.done = function done(bundleId) {\n publish(bundleId, []);\n};\n\n\n/**\n * Reset loadjs dependencies statuses\n */\nloadjs.reset = function reset() {\n bundleIdCache = {};\n bundleResultCache = {};\n bundleCallbackQueue = {};\n};\n\n\n/**\n * Determine if bundle has already been defined\n * @param String} bundleId - The bundle id\n */\nloadjs.isDefined = function isDefined(bundleId) {\n return bundleId in bundleIdCache;\n};\n\n\n// export\nreturn loadjs;\n\n}));\n","// ==========================================================================\n// Plyr storage\n// ==========================================================================\n\nimport utils from './utils';\n\nclass Storage {\n constructor(player) {\n this.enabled = player.config.storage.enabled;\n this.key = player.config.storage.key;\n }\n\n // Check for actual support (see if we can use it)\n static get supported() {\n try {\n if (!('localStorage' in window)) {\n return false;\n }\n\n const test = '___test';\n\n // Try to use it (it might be disabled, e.g. user is in private mode)\n // see: https://github.com/sampotts/plyr/issues/131\n window.localStorage.setItem(test, test);\n window.localStorage.removeItem(test);\n\n return true;\n } catch (e) {\n return false;\n }\n }\n\n get(key) {\n if (!Storage.supported || !this.enabled) {\n return null;\n }\n\n const store = window.localStorage.getItem(this.key);\n\n if (utils.is.empty(store)) {\n return null;\n }\n\n const json = JSON.parse(store);\n\n return utils.is.string(key) && key.length ? json[key] : json;\n }\n\n set(object) {\n // Bail if we don't have localStorage support or it's disabled\n if (!Storage.supported || !this.enabled) {\n return;\n }\n\n // Can only store objectst\n if (!utils.is.object(object)) {\n return;\n }\n\n // Get current storage\n let storage = this.get();\n\n // Default to empty object\n if (utils.is.empty(storage)) {\n storage = {};\n }\n\n // Update the working copy of the values\n utils.extend(storage, object);\n\n // Update storage\n window.localStorage.setItem(this.key, JSON.stringify(storage));\n }\n}\n\nexport default Storage;\n","// ==========================================================================\n// Plyr supported types and providers\n// ==========================================================================\n\nexport const providers = {\n html5: 'html5',\n youtube: 'youtube',\n vimeo: 'vimeo',\n};\n\nexport const types = {\n audio: 'audio',\n video: 'video',\n};\n\nexport default { providers, types };\n","// ==========================================================================\n// Plyr utils\n// ==========================================================================\n\nimport loadjs from 'loadjs';\nimport Storage from './storage';\nimport support from './support';\nimport { providers } from './types';\n\nconst utils = {\n // Check variable types\n is: {\n object(input) {\n return utils.getConstructor(input) === Object;\n },\n number(input) {\n return utils.getConstructor(input) === Number && !Number.isNaN(input);\n },\n string(input) {\n return utils.getConstructor(input) === String;\n },\n boolean(input) {\n return utils.getConstructor(input) === Boolean;\n },\n function(input) {\n return utils.getConstructor(input) === Function;\n },\n array(input) {\n return !utils.is.nullOrUndefined(input) && Array.isArray(input);\n },\n weakMap(input) {\n return utils.is.instanceof(input, WeakMap);\n },\n nodeList(input) {\n return utils.is.instanceof(input, NodeList);\n },\n element(input) {\n return utils.is.instanceof(input, Element);\n },\n textNode(input) {\n return utils.getConstructor(input) === Text;\n },\n event(input) {\n return utils.is.instanceof(input, Event);\n },\n cue(input) {\n return utils.is.instanceof(input, window.TextTrackCue) || utils.is.instanceof(input, window.VTTCue);\n },\n track(input) {\n return utils.is.instanceof(input, TextTrack) || (!utils.is.nullOrUndefined(input) && utils.is.string(input.kind));\n },\n url(input) {\n return !utils.is.nullOrUndefined(input) && /(ftp|http|https):\\/\\/(\\w+:{0,1}\\w*@)?(\\S+)(:[0-9]+)?(\\/|\\/([\\w#!:.?+=&%@!\\-/]))?/.test(input);\n },\n nullOrUndefined(input) {\n return input === null || typeof input === 'undefined';\n },\n empty(input) {\n return (\n utils.is.nullOrUndefined(input) ||\n ((utils.is.string(input) || utils.is.array(input) || utils.is.nodeList(input)) && !input.length) ||\n (utils.is.object(input) && !Object.keys(input).length)\n );\n },\n instanceof(input, constructor) {\n return Boolean(input && constructor && input instanceof constructor);\n },\n },\n\n getConstructor(input) {\n return !utils.is.nullOrUndefined(input) ? input.constructor : null;\n },\n\n // Unfortunately, due to mixed support, UA sniffing is required\n getBrowser() {\n return {\n isIE: /* @cc_on!@ */ false || !!document.documentMode,\n isWebkit: 'WebkitAppearance' in document.documentElement.style && !/Edge/.test(navigator.userAgent),\n isIPhone: /(iPhone|iPod)/gi.test(navigator.platform),\n isIos: /(iPad|iPhone|iPod)/gi.test(navigator.platform),\n };\n },\n\n // Fetch wrapper\n // Using XHR to avoid issues with older browsers\n fetch(url, responseType = 'text') {\n return new Promise((resolve, reject) => {\n try {\n const request = new XMLHttpRequest();\n\n // Check for CORS support\n if (!('withCredentials' in request)) {\n return;\n }\n\n request.addEventListener('load', () => {\n if (responseType === 'text') {\n try {\n resolve(JSON.parse(request.responseText));\n } catch (e) {\n resolve(request.responseText);\n }\n } else {\n resolve(request.response);\n }\n });\n\n request.addEventListener('error', () => {\n throw new Error(request.statusText);\n });\n\n request.open('GET', url, true);\n\n // Set the required response type\n request.responseType = responseType;\n\n request.send();\n } catch (e) {\n reject(e);\n }\n });\n },\n\n // Load image avoiding xhr/fetch CORS issues\n // Server status can't be obtained this way unfortunately, so this uses \"naturalWidth\" to determine if the image has loaded.\n // By default it checks if it is at least 1px, but you can add a second argument to change this.\n loadImage(src, minWidth = 1) {\n return new Promise((resolve, reject) => {\n const image = new Image();\n const handler = () => {\n delete image.onload;\n delete image.onerror;\n (image.naturalWidth >= minWidth ? resolve : reject)(image);\n };\n Object.assign(image, {onload: handler, onerror: handler, src});\n });\n },\n\n // Load an external script\n loadScript(url) {\n return new Promise((resolve, reject) => {\n loadjs(url, {\n success: resolve,\n error: reject,\n });\n });\n },\n\n // Load an external SVG sprite\n loadSprite(url, id) {\n if (!utils.is.string(url)) {\n return;\n }\n\n const prefix = 'cache';\n const hasId = utils.is.string(id);\n let isCached = false;\n\n const exists = () => document.getElementById(id) !== null;\n\n const update = (container, data) => {\n container.innerHTML = data;\n\n // Check again incase of race condition\n if (hasId && exists()) {\n return;\n }\n\n // Inject the SVG to the body\n document.body.insertAdjacentElement('afterbegin', container);\n };\n\n // Only load once if ID set\n if (!hasId || !exists()) {\n const useStorage = Storage.supported;\n\n // Create container\n const container = document.createElement('div');\n utils.toggleHidden(container, true);\n\n if (hasId) {\n container.setAttribute('id', id);\n }\n\n // Check in cache\n if (useStorage) {\n const cached = window.localStorage.getItem(`${prefix}-${id}`);\n isCached = cached !== null;\n\n if (isCached) {\n const data = JSON.parse(cached);\n update(container, data.content);\n }\n }\n\n // Get the sprite\n utils\n .fetch(url)\n .then(result => {\n if (utils.is.empty(result)) {\n return;\n }\n\n if (useStorage) {\n window.localStorage.setItem(\n `${prefix}-${id}`,\n JSON.stringify({\n content: result,\n }),\n );\n }\n\n update(container, result);\n })\n .catch(() => {});\n }\n },\n\n // Generate a random ID\n generateId(prefix) {\n return `${prefix}-${Math.floor(Math.random() * 10000)}`;\n },\n\n // Wrap an element\n wrap(elements, wrapper) {\n // Convert `elements` to an array, if necessary.\n const targets = elements.length ? elements : [elements];\n\n // Loops backwards to prevent having to clone the wrapper on the\n // first element (see `child` below).\n Array.from(targets)\n .reverse()\n .forEach((element, index) => {\n const child = index > 0 ? wrapper.cloneNode(true) : wrapper;\n\n // Cache the current parent and sibling.\n const parent = element.parentNode;\n const sibling = element.nextSibling;\n\n // Wrap the element (is automatically removed from its current\n // parent).\n child.appendChild(element);\n\n // If the element had a sibling, insert the wrapper before\n // the sibling to maintain the HTML structure; otherwise, just\n // append it to the parent.\n if (sibling) {\n parent.insertBefore(child, sibling);\n } else {\n parent.appendChild(child);\n }\n });\n },\n\n // Create a DocumentFragment\n createElement(type, attributes, text) {\n // Create a new <element>\n const element = document.createElement(type);\n\n // Set all passed attributes\n if (utils.is.object(attributes)) {\n utils.setAttributes(element, attributes);\n }\n\n // Add text node\n if (utils.is.string(text)) {\n element.innerText = text;\n }\n\n // Return built element\n return element;\n },\n\n // Inaert an element after another\n insertAfter(element, target) {\n target.parentNode.insertBefore(element, target.nextSibling);\n },\n\n // Insert a DocumentFragment\n insertElement(type, parent, attributes, text) {\n // Inject the new <element>\n parent.appendChild(utils.createElement(type, attributes, text));\n },\n\n // Remove element(s)\n removeElement(element) {\n if (utils.is.nodeList(element) || utils.is.array(element)) {\n Array.from(element).forEach(utils.removeElement);\n return;\n }\n\n if (!utils.is.element(element) || !utils.is.element(element.parentNode)) {\n return;\n }\n\n element.parentNode.removeChild(element);\n },\n\n // Remove all child elements\n emptyElement(element) {\n let { length } = element.childNodes;\n\n while (length > 0) {\n element.removeChild(element.lastChild);\n length -= 1;\n }\n },\n\n // Replace element\n replaceElement(newChild, oldChild) {\n if (!utils.is.element(oldChild) || !utils.is.element(oldChild.parentNode) || !utils.is.element(newChild)) {\n return null;\n }\n\n oldChild.parentNode.replaceChild(newChild, oldChild);\n\n return newChild;\n },\n\n // Set attributes\n setAttributes(element, attributes) {\n if (!utils.is.element(element) || utils.is.empty(attributes)) {\n return;\n }\n\n Object.entries(attributes).forEach(([\n key,\n value,\n ]) => {\n element.setAttribute(key, value);\n });\n },\n\n // Get an attribute object from a string selector\n getAttributesFromSelector(sel, existingAttributes) {\n // For example:\n // '.test' to { class: 'test' }\n // '#test' to { id: 'test' }\n // '[data-test=\"test\"]' to { 'data-test': 'test' }\n\n if (!utils.is.string(sel) || utils.is.empty(sel)) {\n return {};\n }\n\n const attributes = {};\n const existing = existingAttributes;\n\n sel.split(',').forEach(s => {\n // Remove whitespace\n const selector = s.trim();\n const className = selector.replace('.', '');\n const stripped = selector.replace(/[[\\]]/g, '');\n\n // Get the parts and value\n const parts = stripped.split('=');\n const key = parts[0];\n const value = parts.length > 1 ? parts[1].replace(/[\"']/g, '') : '';\n\n // Get the first character\n const start = selector.charAt(0);\n\n switch (start) {\n case '.':\n // Add to existing classname\n if (utils.is.object(existing) && utils.is.string(existing.class)) {\n existing.class += ` ${className}`;\n }\n\n attributes.class = className;\n break;\n\n case '#':\n // ID selector\n attributes.id = selector.replace('#', '');\n break;\n\n case '[':\n // Attribute selector\n attributes[key] = value;\n\n break;\n\n default:\n break;\n }\n });\n\n return attributes;\n },\n\n // Toggle hidden\n toggleHidden(element, hidden) {\n if (!utils.is.element(element)) {\n return;\n }\n\n let hide = hidden;\n\n if (!utils.is.boolean(hide)) {\n hide = !element.hasAttribute('hidden');\n }\n\n if (hide) {\n element.setAttribute('hidden', '');\n } else {\n element.removeAttribute('hidden');\n }\n },\n\n // Mirror Element.classList.toggle, with IE compatibility for \"force\" argument\n toggleClass(element, className, force) {\n if (utils.is.element(element)) {\n let method = 'toggle';\n if (typeof force !== 'undefined') {\n method = force ? 'add' : 'remove';\n }\n\n element.classList[method](className);\n return element.classList.contains(className);\n }\n\n return null;\n },\n\n // Has class name\n hasClass(element, className) {\n return utils.is.element(element) && element.classList.contains(className);\n },\n\n // Element matches selector\n matches(element, selector) {\n const prototype = { Element };\n\n function match() {\n return Array.from(document.querySelectorAll(selector)).includes(this);\n }\n\n const matches = prototype.matches || prototype.webkitMatchesSelector || prototype.mozMatchesSelector || prototype.msMatchesSelector || match;\n\n return matches.call(element, selector);\n },\n\n // Find all elements\n getElements(selector) {\n return this.elements.container.querySelectorAll(selector);\n },\n\n // Find a single element\n getElement(selector) {\n return this.elements.container.querySelector(selector);\n },\n\n // Get the focused element\n getFocusElement() {\n let focused = document.activeElement;\n\n if (!focused || focused === document.body) {\n focused = null;\n } else {\n focused = document.querySelector(':focus');\n }\n\n return focused;\n },\n\n // Trap focus inside container\n trapFocus(element = null, toggle = false) {\n if (!utils.is.element(element)) {\n return;\n }\n\n const focusable = utils.getElements.call(this, 'button:not(:disabled), input:not(:disabled), [tabindex]');\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n\n const trap = event => {\n // Bail if not tab key or not fullscreen\n if (event.key !== 'Tab' || event.keyCode !== 9) {\n return;\n }\n\n // Get the current focused element\n const focused = utils.getFocusElement();\n\n if (focused === last && !event.shiftKey) {\n // Move focus to first element that can be tabbed if Shift isn't used\n first.focus();\n event.preventDefault();\n } else if (focused === first && event.shiftKey) {\n // Move focus to last element that can be tabbed if Shift is used\n last.focus();\n event.preventDefault();\n }\n };\n\n if (toggle) {\n utils.on(this.elements.container, 'keydown', trap, false);\n } else {\n utils.off(this.elements.container, 'keydown', trap, false);\n }\n },\n\n // Toggle event listener\n toggleListener(elements, event, callback, toggle = false, passive = true, capture = false) {\n // Bail if no elemetns, event, or callback\n if (utils.is.empty(elements) || utils.is.empty(event) || !utils.is.function(callback)) {\n return;\n }\n\n // If a nodelist is passed, call itself on each node\n if (utils.is.nodeList(elements) || utils.is.array(elements)) {\n // Create listener for each node\n Array.from(elements).forEach(element => {\n if (element instanceof Node) {\n utils.toggleListener.call(null, element, event, callback, toggle, passive, capture);\n }\n });\n\n return;\n }\n\n // Allow multiple events\n const events = event.split(' ');\n\n // Build options\n // Default to just the capture boolean for browsers with no passive listener support\n let options = capture;\n\n // If passive events listeners are supported\n if (support.passiveListeners) {\n options = {\n // Whether the listener can be passive (i.e. default never prevented)\n passive,\n // Whether the listener is a capturing listener or not\n capture,\n };\n }\n\n // If a single node is passed, bind the event listener\n events.forEach(type => {\n elements[toggle ? 'addEventListener' : 'removeEventListener'](type, callback, options);\n });\n },\n\n // Bind event handler\n on(element, events = '', callback, passive = true, capture = false) {\n utils.toggleListener(element, events, callback, true, passive, capture);\n },\n\n // Unbind event handler\n off(element, events = '', callback, passive = true, capture = false) {\n utils.toggleListener(element, events, callback, false, passive, capture);\n },\n\n // Trigger event\n dispatchEvent(element, type = '', bubbles = false, detail = {}) {\n // Bail if no element\n if (!utils.is.element(element) || utils.is.empty(type)) {\n return;\n }\n\n // Create and dispatch the event\n const event = new CustomEvent(type, {\n bubbles,\n detail: Object.assign({}, detail, {\n plyr: this,\n }),\n });\n\n // Dispatch the event\n element.dispatchEvent(event);\n },\n\n // Format string\n format(input, ...args) {\n if (utils.is.empty(input)) {\n return input;\n }\n\n return input.toString().replace(/{(\\d+)}/g, (match, i) => (utils.is.string(args[i]) ? args[i] : ''));\n },\n\n // Get percentage\n getPercentage(current, max) {\n if (current === 0 || max === 0 || Number.isNaN(current) || Number.isNaN(max)) {\n return 0;\n }\n\n return (current / max * 100).toFixed(2);\n },\n\n // Time helpers\n getHours(value) {\n return parseInt((value / 60 / 60) % 60, 10);\n },\n getMinutes(value) {\n return parseInt((value / 60) % 60, 10);\n },\n getSeconds(value) {\n return parseInt(value % 60, 10);\n },\n\n // Format time to UI friendly string\n formatTime(time = 0, displayHours = false, inverted = false) {\n // Bail if the value isn't a number\n if (!utils.is.number(time)) {\n return utils.formatTime(null, displayHours, inverted);\n }\n\n // Format time component to add leading zero\n const format = value => `0${value}`.slice(-2);\n\n // Breakdown to hours, mins, secs\n let hours = utils.getHours(time);\n const mins = utils.getMinutes(time);\n const secs = utils.getSeconds(time);\n\n // Do we need to display hours?\n if (displayHours || hours > 0) {\n hours = `${hours}:`;\n } else {\n hours = '';\n }\n\n // Render\n return `${inverted ? '-' : ''}${hours}${format(mins)}:${format(secs)}`;\n },\n\n // Replace all occurances of a string in a string\n replaceAll(input = '', find = '', replace = '') {\n return input.replace(new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\\]/\\\\])/g, '\\\\$1'), 'g'), replace.toString());\n },\n\n // Convert to title case\n toTitleCase(input = '') {\n return input.toString().replace(/\\w\\S*/g, text => text.charAt(0).toUpperCase() + text.substr(1).toLowerCase());\n },\n\n // Convert string to pascalCase\n toPascalCase(input = '') {\n let string = input.toString();\n\n // Convert kebab case\n string = utils.replaceAll(string, '-', ' ');\n\n // Convert snake case\n string = utils.replaceAll(string, '_', ' ');\n\n // Convert to title case\n string = utils.toTitleCase(string);\n\n // Convert to pascal case\n return utils.replaceAll(string, ' ', '');\n },\n\n // Convert string to pascalCase\n toCamelCase(input = '') {\n let string = input.toString();\n\n // Convert to pascal case\n string = utils.toPascalCase(string);\n\n // Convert first character to lowercase\n return string.charAt(0).toLowerCase() + string.slice(1);\n },\n\n // Deep extend destination object with N more objects\n extend(target = {}, ...sources) {\n if (!sources.length) {\n return target;\n }\n\n const source = sources.shift();\n\n if (!utils.is.object(source)) {\n return target;\n }\n\n Object.keys(source).forEach(key => {\n if (utils.is.object(source[key])) {\n if (!Object.keys(target).includes(key)) {\n Object.assign(target, { [key]: {} });\n }\n\n utils.extend(target[key], source[key]);\n } else {\n Object.assign(target, { [key]: source[key] });\n }\n });\n\n return utils.extend(target, ...sources);\n },\n\n // Remove duplicates in an array\n dedupe(array) {\n if (!utils.is.array(array)) {\n return array;\n }\n\n return array.filter((item, index) => array.indexOf(item) === index);\n },\n\n // Clone nested objects\n cloneDeep(object) {\n return JSON.parse(JSON.stringify(object));\n },\n\n // Get a nested value in an object\n getDeep(object, path) {\n return path.split('.').reduce((obj, key) => obj && obj[key], object);\n },\n\n // Get the closest value in an array\n closest(array, value) {\n if (!utils.is.array(array) || !array.length) {\n return null;\n }\n\n return array.reduce((prev, curr) => (Math.abs(curr - value) < Math.abs(prev - value) ? curr : prev));\n },\n\n // Get the provider for a given URL\n getProviderByUrl(url) {\n // YouTube\n if (/^(https?:\\/\\/)?(www\\.)?(youtube\\.com|youtu\\.?be)\\/.+$/.test(url)) {\n return providers.youtube;\n }\n\n // Vimeo\n if (/^https?:\\/\\/player.vimeo.com\\/video\\/\\d{0,9}(?=\\b|\\/)/.test(url)) {\n return providers.vimeo;\n }\n\n return null;\n },\n\n // Parse YouTube ID from URL\n parseYouTubeId(url) {\n if (utils.is.empty(url)) {\n return null;\n }\n\n const regex = /^.*(youtu.be\\/|v\\/|u\\/\\w\\/|embed\\/|watch\\?v=|&v=)([^#&?]*).*/;\n return url.match(regex) ? RegExp.$2 : url;\n },\n\n // Parse Vimeo ID from URL\n parseVimeoId(url) {\n if (utils.is.empty(url)) {\n return null;\n }\n\n if (utils.is.number(Number(url))) {\n return url;\n }\n\n const regex = /^.*(vimeo.com\\/|video\\/)(\\d+).*/;\n return url.match(regex) ? RegExp.$2 : url;\n },\n\n // Convert a URL to a location object\n parseUrl(url) {\n const parser = document.createElement('a');\n parser.href = url;\n return parser;\n },\n\n // Get URL query parameters\n getUrlParams(input) {\n let search = input;\n\n // Parse URL if needed\n if (input.startsWith('http://') || input.startsWith('https://')) {\n ({ search } = utils.parseUrl(input));\n }\n\n if (utils.is.empty(search)) {\n return null;\n }\n\n const hashes = search.slice(search.indexOf('?') + 1).split('&');\n\n return hashes.reduce((params, hash) => {\n const [\n key,\n val,\n ] = hash.split('=');\n\n return Object.assign(params, { [key]: decodeURIComponent(val) });\n }, {});\n },\n\n // Convert object to URL parameters\n buildUrlParams(input) {\n if (!utils.is.object(input)) {\n return '';\n }\n\n return Object.keys(input)\n .map(key => `${encodeURIComponent(key)}=${encodeURIComponent(input[key])}`)\n .join('&');\n },\n\n // Remove HTML from a string\n stripHTML(source) {\n const fragment = document.createDocumentFragment();\n const element = document.createElement('div');\n fragment.appendChild(element);\n element.innerHTML = source;\n return fragment.firstChild.innerText;\n },\n\n // Like outerHTML, but also works for DocumentFragment\n getHTML(element) {\n const wrapper = document.createElement('div');\n wrapper.appendChild(element);\n return wrapper.innerHTML;\n },\n\n // Get aspect ratio for dimensions\n getAspectRatio(width, height) {\n const getRatio = (w, h) => (h === 0 ? w : getRatio(h, w % h));\n const ratio = getRatio(width, height);\n return `${width / ratio}:${height / ratio}`;\n },\n\n // Get the transition end event\n get transitionEndEvent() {\n const element = document.createElement('span');\n\n const events = {\n WebkitTransition: 'webkitTransitionEnd',\n MozTransition: 'transitionend',\n OTransition: 'oTransitionEnd otransitionend',\n transition: 'transitionend',\n };\n\n const type = Object.keys(events).find(event => element.style[event] !== undefined);\n\n return utils.is.string(type) ? events[type] : false;\n },\n\n // Force repaint of element\n repaint(element) {\n setTimeout(() => {\n utils.toggleHidden(element, true);\n element.offsetHeight; // eslint-disable-line\n utils.toggleHidden(element, false);\n }, 0);\n },\n};\n\nexport default utils;\n","// ==========================================================================\n// Plyr HTML5 helpers\n// ==========================================================================\n\nimport support from './support';\nimport utils from './utils';\n\nconst html5 = {\n getSources() {\n if (!this.isHTML5) {\n return null;\n }\n\n return this.media.querySelectorAll('source');\n },\n\n // Get quality levels\n getQualityOptions() {\n if (!this.isHTML5) {\n return null;\n }\n\n // Get sources\n const sources = html5.getSources.call(this);\n\n if (utils.is.empty(sources)) {\n return null;\n }\n\n // Get <source> with size attribute\n const sizes = Array.from(sources).filter(source => !utils.is.empty(source.getAttribute('size')));\n\n // If none, bail\n if (utils.is.empty(sizes)) {\n return null;\n }\n\n // Reduce to unique list\n return utils.dedupe(sizes.map(source => Number(source.getAttribute('size'))));\n },\n\n extend() {\n if (!this.isHTML5) {\n return;\n }\n\n const player = this;\n\n // Quality\n Object.defineProperty(player.media, 'quality', {\n get() {\n // Get sources\n const sources = html5.getSources.call(player);\n\n if (utils.is.empty(sources)) {\n return null;\n }\n\n const matches = Array.from(sources).filter(source => source.getAttribute('src') === player.source);\n\n if (utils.is.empty(matches)) {\n return null;\n }\n\n return Number(matches[0].getAttribute('size'));\n },\n set(input) {\n // Get sources\n const sources = html5.getSources.call(player);\n\n if (utils.is.empty(sources)) {\n return;\n }\n\n // Get matches for requested size\n const matches = Array.from(sources).filter(source => Number(source.getAttribute('size')) === input);\n\n // No matches for requested size\n if (utils.is.empty(matches)) {\n return;\n }\n\n // Get supported sources\n const supported = matches.filter(source => support.mime.call(player, source.getAttribute('type')));\n\n // No supported sources\n if (utils.is.empty(supported)) {\n return;\n }\n\n // Trigger change event\n utils.dispatchEvent.call(player, player.media, 'qualityrequested', false, {\n quality: input,\n });\n\n // Get current state\n const { currentTime, playing } = player;\n\n // Set new source\n player.media.src = supported[0].getAttribute('src');\n\n // Restore time\n const onLoadedMetaData = () => {\n player.currentTime = currentTime;\n player.off('loadedmetadata', onLoadedMetaData);\n };\n player.on('loadedmetadata', onLoadedMetaData);\n\n // Load new source\n player.media.load();\n\n // Resume playing\n if (playing) {\n player.play();\n }\n\n // Trigger change event\n utils.dispatchEvent.call(player, player.media, 'qualitychange', false, {\n quality: input,\n });\n },\n });\n },\n\n // Cancel current network requests\n // See https://github.com/sampotts/plyr/issues/174\n cancelRequests() {\n if (!this.isHTML5) {\n return;\n }\n\n // Remove child sources\n utils.removeElement(html5.getSources());\n\n // Set blank video src attribute\n // This is to prevent a MEDIA_ERR_SRC_NOT_SUPPORTED error\n // Info: http://stackoverflow.com/questions/32231579/how-to-properly-dispose-of-an-html5-video-and-close-socket-or-connection\n this.media.setAttribute('src', this.config.blankVideo);\n\n // Load the new empty source\n // This will cancel existing requests\n // See https://github.com/sampotts/plyr/issues/174\n this.media.load();\n\n // Debugging\n this.debug.log('Cancelled network requests');\n },\n};\n\nexport default html5;\n","// ==========================================================================\n// Plyr internationalization\n// ==========================================================================\n\nimport utils from './utils';\n\nconst i18n = {\n get(key = '', config = {}) {\n if (utils.is.empty(key) || utils.is.empty(config)) {\n return '';\n }\n\n let string = utils.getDeep(config.i18n, key);\n\n if (utils.is.empty(string)) {\n return '';\n }\n\n const replace = {\n '{seektime}': config.seekTime,\n '{title}': config.title,\n };\n\n Object.entries(replace).forEach(([\n key,\n value,\n ]) => {\n string = utils.replaceAll(string, key, value);\n });\n\n return string;\n },\n};\n\nexport default i18n;\n","// ==========================================================================\n// Plyr controls\n// ==========================================================================\n\nimport captions from './captions';\nimport html5 from './html5';\nimport i18n from './i18n';\nimport support from './support';\nimport utils from './utils';\n\n// Sniff out the browser\nconst browser = utils.getBrowser();\n\nconst controls = {\n // Get icon URL\n getIconUrl() {\n const url = new URL(this.config.iconUrl, window.location);\n const cors = url.host !== window.location.host || (browser.isIE && !window.svg4everybody);\n\n return {\n url: this.config.iconUrl,\n cors,\n };\n },\n\n // Find the UI controls and store references in custom controls\n // TODO: Allow settings menus with custom controls\n findElements() {\n try {\n this.elements.controls = utils.getElement.call(this, this.config.selectors.controls.wrapper);\n\n // Buttons\n this.elements.buttons = {\n play: utils.getElements.call(this, this.config.selectors.buttons.play),\n pause: utils.getElement.call(this, this.config.selectors.buttons.pause),\n restart: utils.getElement.call(this, this.config.selectors.buttons.restart),\n rewind: utils.getElement.call(this, this.config.selectors.buttons.rewind),\n fastForward: utils.getElement.call(this, this.config.selectors.buttons.fastForward),\n mute: utils.getElement.call(this, this.config.selectors.buttons.mute),\n pip: utils.getElement.call(this, this.config.selectors.buttons.pip),\n airplay: utils.getElement.call(this, this.config.selectors.buttons.airplay),\n settings: utils.getElement.call(this, this.config.selectors.buttons.settings),\n captions: utils.getElement.call(this, this.config.selectors.buttons.captions),\n fullscreen: utils.getElement.call(this, this.config.selectors.buttons.fullscreen),\n };\n\n // Progress\n this.elements.progress = utils.getElement.call(this, this.config.selectors.progress);\n\n // Inputs\n this.elements.inputs = {\n seek: utils.getElement.call(this, this.config.selectors.inputs.seek),\n volume: utils.getElement.call(this, this.config.selectors.inputs.volume),\n };\n\n // Display\n this.elements.display = {\n buffer: utils.getElement.call(this, this.config.selectors.display.buffer),\n currentTime: utils.getElement.call(this, this.config.selectors.display.currentTime),\n duration: utils.getElement.call(this, this.config.selectors.display.duration),\n };\n\n // Seek tooltip\n if (utils.is.element(this.elements.progress)) {\n this.elements.display.seekTooltip = this.elements.progress.querySelector(`.${this.config.classNames.tooltip}`);\n }\n\n return true;\n } catch (error) {\n // Log it\n this.debug.warn('It looks like there is a problem with your custom controls HTML', error);\n\n // Restore native video controls\n this.toggleNativeControls(true);\n\n return false;\n }\n },\n\n // Create <svg> icon\n createIcon(type, attributes) {\n const namespace = 'http://www.w3.org/2000/svg';\n const iconUrl = controls.getIconUrl.call(this);\n const iconPath = `${!iconUrl.cors ? iconUrl.url : ''}#${this.config.iconPrefix}`;\n\n // Create <svg>\n const icon = document.createElementNS(namespace, 'svg');\n utils.setAttributes(\n icon,\n utils.extend(attributes, {\n role: 'presentation',\n focusable: 'false',\n }),\n );\n\n // Create the <use> to reference sprite\n const use = document.createElementNS(namespace, 'use');\n const path = `${iconPath}-${type}`;\n\n // Set `href` attributes\n // https://github.com/sampotts/plyr/issues/460\n // https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/xlink:href\n if ('href' in use) {\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'href', path);\n } else {\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path);\n }\n\n // Add <use> to <svg>\n icon.appendChild(use);\n\n return icon;\n },\n\n // Create hidden text label\n createLabel(type, attr) {\n let text = i18n.get(type, this.config);\n const attributes = Object.assign({}, attr);\n\n switch (type) {\n case 'pip':\n text = 'PIP';\n break;\n\n case 'airplay':\n text = 'AirPlay';\n break;\n\n default:\n break;\n }\n\n if ('class' in attributes) {\n attributes.class += ` ${this.config.classNames.hidden}`;\n } else {\n attributes.class = this.config.classNames.hidden;\n }\n\n return utils.createElement('span', attributes, text);\n },\n\n // Create a badge\n createBadge(text) {\n if (utils.is.empty(text)) {\n return null;\n }\n\n const badge = utils.createElement('span', {\n class: this.config.classNames.menu.value,\n });\n\n badge.appendChild(\n utils.createElement(\n 'span',\n {\n class: this.config.classNames.menu.badge,\n },\n text,\n ),\n );\n\n return badge;\n },\n\n // Create a <button>\n createButton(buttonType, attr) {\n const button = utils.createElement('button');\n const attributes = Object.assign({}, attr);\n let type = utils.toCamelCase(buttonType);\n\n let toggle = false;\n let label;\n let icon;\n let labelPressed;\n let iconPressed;\n\n if (!('type' in attributes)) {\n attributes.type = 'button';\n }\n\n if ('class' in attributes) {\n if (attributes.class.includes(this.config.classNames.control)) {\n attributes.class += ` ${this.config.classNames.control}`;\n }\n } else {\n attributes.class = this.config.classNames.control;\n }\n\n // Large play button\n switch (buttonType) {\n case 'play':\n toggle = true;\n label = 'play';\n labelPressed = 'pause';\n icon = 'play';\n iconPressed = 'pause';\n break;\n\n case 'mute':\n toggle = true;\n label = 'mute';\n labelPressed = 'unmute';\n icon = 'volume';\n iconPressed = 'muted';\n break;\n\n case 'captions':\n toggle = true;\n label = 'enableCaptions';\n labelPressed = 'disableCaptions';\n icon = 'captions-off';\n iconPressed = 'captions-on';\n break;\n\n case 'fullscreen':\n toggle = true;\n label = 'enterFullscreen';\n labelPressed = 'exitFullscreen';\n icon = 'enter-fullscreen';\n iconPressed = 'exit-fullscreen';\n break;\n\n case 'play-large':\n attributes.class += ` ${this.config.classNames.control}--overlaid`;\n type = 'play';\n label = 'play';\n icon = 'play';\n break;\n\n default:\n label = type;\n icon = buttonType;\n }\n\n // Setup toggle icon and labels\n if (toggle) {\n // Icon\n button.appendChild(controls.createIcon.call(this, iconPressed, { class: 'icon--pressed' }));\n button.appendChild(controls.createIcon.call(this, icon, { class: 'icon--not-pressed' }));\n\n // Label/Tooltip\n button.appendChild(controls.createLabel.call(this, labelPressed, { class: 'label--pressed' }));\n button.appendChild(controls.createLabel.call(this, label, { class: 'label--not-pressed' }));\n } else {\n button.appendChild(controls.createIcon.call(this, icon));\n button.appendChild(controls.createLabel.call(this, label));\n }\n\n // Merge attributes\n utils.extend(attributes, utils.getAttributesFromSelector(this.config.selectors.buttons[type], attributes));\n\n utils.setAttributes(button, attributes);\n\n // We have multiple play buttons\n if (type === 'play') {\n if (!utils.is.array(this.elements.buttons[type])) {\n this.elements.buttons[type] = [];\n }\n\n this.elements.buttons[type].push(button);\n } else {\n this.elements.buttons[type] = button;\n }\n\n // Toggle classname when pressed property is set\n const className = this.config.classNames.controlPressed;\n Object.defineProperty(button, 'pressed', {\n enumerable: true,\n get() {\n return utils.hasClass(button, className);\n },\n set(pressed = false) {\n utils.toggleClass(button, className, pressed);\n },\n });\n\n return button;\n },\n\n // Create an <input type='range'>\n createRange(type, attributes) {\n // Seek input\n const input = utils.createElement(\n 'input',\n utils.extend(\n utils.getAttributesFromSelector(this.config.selectors.inputs[type]),\n {\n type: 'range',\n min: 0,\n max: 100,\n step: 0.01,\n value: 0,\n autocomplete: 'off',\n // A11y fixes for https://github.com/sampotts/plyr/issues/905\n role: 'slider',\n 'aria-label': i18n.get(type, this.config),\n 'aria-valuemin': 0,\n 'aria-valuemax': 100,\n 'aria-valuenow': 0,\n },\n attributes,\n ),\n );\n\n this.elements.inputs[type] = input;\n\n // Set the fill for webkit now\n controls.updateRangeFill.call(this, input);\n\n return input;\n },\n\n // Create a <progress>\n createProgress(type, attributes) {\n const progress = utils.createElement(\n 'progress',\n utils.extend(\n utils.getAttributesFromSelector(this.config.selectors.display[type]),\n {\n min: 0,\n max: 100,\n value: 0,\n role: 'presentation',\n 'aria-hidden': true,\n },\n attributes,\n ),\n );\n\n // Create the label inside\n if (type !== 'volume') {\n progress.appendChild(utils.createElement('span', null, '0'));\n\n let suffix = '';\n switch (type) {\n case 'played':\n suffix = i18n.get('played', this.config);\n break;\n\n case 'buffer':\n suffix = i18n.get('buffered', this.config);\n break;\n\n default:\n break;\n }\n\n progress.innerText = `% ${suffix.toLowerCase()}`;\n }\n\n this.elements.display[type] = progress;\n\n return progress;\n },\n\n // Create time display\n createTime(type) {\n const attributes = utils.getAttributesFromSelector(this.config.selectors.display[type]);\n\n const container = utils.createElement(\n 'div',\n utils.extend(attributes, {\n class: `plyr__time ${attributes.class}`,\n 'aria-label': i18n.get(type, this.config),\n }),\n '00:00',\n );\n\n // Reference for updates\n this.elements.display[type] = container;\n\n return container;\n },\n\n // Create a settings menu item\n createMenuItem({value, list, type, title, badge = null, checked = false}) {\n const item = utils.createElement('li');\n\n const label = utils.createElement('label', {\n class: this.config.classNames.control,\n });\n\n const radio = utils.createElement(\n 'input',\n utils.extend(utils.getAttributesFromSelector(this.config.selectors.inputs[type]), {\n type: 'radio',\n name: `plyr-${type}`,\n value,\n checked,\n class: 'plyr__sr-only',\n }),\n );\n\n const faux = utils.createElement('span', { hidden: '' });\n\n label.appendChild(radio);\n label.appendChild(faux);\n label.insertAdjacentHTML('beforeend', title);\n\n if (utils.is.element(badge)) {\n label.appendChild(badge);\n }\n\n item.appendChild(label);\n list.appendChild(item);\n },\n\n // Format a time for display\n formatTime(time = 0, inverted = false) {\n // Bail if the value isn't a number\n if (!utils.is.number(time)) {\n return time;\n }\n\n // Always display hours if duration is over an hour\n const forceHours = utils.getHours(this.duration) > 0;\n\n return utils.formatTime(time, forceHours, inverted);\n },\n\n // Update the displayed time\n updateTimeDisplay(target = null, time = 0, inverted = false) {\n // Bail if there's no element to display or the value isn't a number\n if (!utils.is.element(target) || !utils.is.number(time)) {\n return;\n }\n\n // eslint-disable-next-line no-param-reassign\n target.innerText = controls.formatTime(time, inverted);\n },\n\n // Update volume UI and storage\n updateVolume() {\n if (!this.supported.ui) {\n return;\n }\n\n // Update range\n if (utils.is.element(this.elements.inputs.volume)) {\n controls.setRange.call(this, this.elements.inputs.volume, this.muted ? 0 : this.volume);\n }\n\n // Update mute state\n if (utils.is.element(this.elements.buttons.mute)) {\n this.elements.buttons.mute.pressed = this.muted || this.volume === 0;\n }\n },\n\n // Update seek value and lower fill\n setRange(target, value = 0) {\n if (!utils.is.element(target)) {\n return;\n }\n\n // eslint-disable-next-line\n target.value = value;\n\n // Webkit range fill\n controls.updateRangeFill.call(this, target);\n },\n\n // Update <progress> elements\n updateProgress(event) {\n if (!this.supported.ui || !utils.is.event(event)) {\n return;\n }\n\n let value = 0;\n\n const setProgress = (target, input) => {\n const value = utils.is.number(input) ? input : 0;\n const progress = utils.is.element(target) ? target : this.elements.display.buffer;\n\n // Update value and label\n if (utils.is.element(progress)) {\n progress.value = value;\n\n // Update text label inside\n const label = progress.getElementsByTagName('span')[0];\n if (utils.is.element(label)) {\n label.childNodes[0].nodeValue = value;\n }\n }\n };\n\n if (event) {\n switch (event.type) {\n // Video playing\n case 'timeupdate':\n case 'seeking':\n case 'seeked':\n value = utils.getPercentage(this.currentTime, this.duration);\n\n // Set seek range value only if it's a 'natural' time event\n if (event.type === 'timeupdate') {\n controls.setRange.call(this, this.elements.inputs.seek, value);\n }\n\n break;\n\n // Check buffer status\n case 'playing':\n case 'progress':\n setProgress(this.elements.display.buffer, this.buffered * 100);\n\n break;\n\n default:\n break;\n }\n }\n },\n\n // Webkit polyfill for lower fill range\n updateRangeFill(target) {\n // Get range from event if event passed\n const range = utils.is.event(target) ? target.target : target;\n\n // Needs to be a valid <input type='range'>\n if (!utils.is.element(range) || range.getAttribute('type') !== 'range') {\n return;\n }\n\n // Set aria values for https://github.com/sampotts/plyr/issues/905\n if (utils.matches(range, this.config.selectors.inputs.seek)) {\n range.setAttribute('aria-valuenow', this.currentTime);\n const currentTime = controls.formatTime(this.currentTime);\n const duration = controls.formatTime(this.duration);\n const format = i18n.get('seekLabel', this.config);\n range.setAttribute('aria-valuetext', format.replace('{currentTime}', currentTime).replace('{duration}', duration));\n } else if (utils.matches(range, this.config.selectors.inputs.volume)) {\n const percent = range.value * 100;\n range.setAttribute('aria-valuenow', percent);\n range.setAttribute('aria-valuetext', `${percent}%`);\n } else {\n range.setAttribute('aria-valuenow', range.value);\n }\n\n // WebKit only\n if (!browser.isWebkit) {\n return;\n }\n\n // Set CSS custom property\n range.style.setProperty('--value', `${range.value / range.max * 100}%`);\n },\n\n // Update hover tooltip for seeking\n updateSeekTooltip(event) {\n // Bail if setting not true\n if (\n !this.config.tooltips.seek ||\n !utils.is.element(this.elements.inputs.seek) ||\n !utils.is.element(this.elements.display.seekTooltip) ||\n this.duration === 0\n ) {\n return;\n }\n\n // Calculate percentage\n let percent = 0;\n const clientRect = this.elements.progress.getBoundingClientRect();\n const visible = `${this.config.classNames.tooltip}--visible`;\n\n const toggle = toggle => {\n utils.toggleClass(this.elements.display.seekTooltip, visible, toggle);\n };\n\n // Hide on touch\n if (this.touch) {\n toggle(false);\n return;\n }\n\n // Determine percentage, if already visible\n if (utils.is.event(event)) {\n percent = 100 / clientRect.width * (event.pageX - clientRect.left);\n } else if (utils.hasClass(this.elements.display.seekTooltip, visible)) {\n percent = parseFloat(this.elements.display.seekTooltip.style.left, 10);\n } else {\n return;\n }\n\n // Set bounds\n if (percent < 0) {\n percent = 0;\n } else if (percent > 100) {\n percent = 100;\n }\n\n // Display the time a click would seek to\n controls.updateTimeDisplay.call(this, this.elements.display.seekTooltip, this.duration / 100 * percent);\n\n // Set position\n this.elements.display.seekTooltip.style.left = `${percent}%`;\n\n // Show/hide the tooltip\n // If the event is a moues in/out and percentage is inside bounds\n if (utils.is.event(event) && [\n 'mouseenter',\n 'mouseleave',\n ].includes(event.type)) {\n toggle(event.type === 'mouseenter');\n }\n },\n\n // Handle time change event\n timeUpdate(event) {\n // Only invert if only one time element is displayed and used for both duration and currentTime\n const invert = !utils.is.element(this.elements.display.duration) && this.config.invertTime;\n\n // Duration\n controls.updateTimeDisplay.call(this, this.elements.display.currentTime, invert ? this.duration - this.currentTime : this.currentTime, invert);\n\n // Ignore updates while seeking\n if (event && event.type === 'timeupdate' && this.media.seeking) {\n return;\n }\n\n // Playing progress\n controls.updateProgress.call(this, event);\n },\n\n // Show the duration on metadataloaded or durationchange events\n durationUpdate() {\n // Bail if no UI or durationchange event triggered after playing/seek when invertTime is false\n if (!this.supported.ui || (!this.config.invertTime && this.currentTime)) {\n return;\n }\n\n // Update ARIA values\n if (utils.is.element(this.elements.inputs.seek)) {\n this.elements.inputs.seek.setAttribute('aria-valuemax', this.duration);\n }\n\n // If there's a spot to display duration\n const hasDuration = utils.is.element(this.elements.display.duration);\n\n // If there's only one time display, display duration there\n if (!hasDuration && this.config.displayDuration && this.paused) {\n controls.updateTimeDisplay.call(this, this.elements.display.currentTime, this.duration);\n }\n\n // If there's a duration element, update content\n if (hasDuration) {\n controls.updateTimeDisplay.call(this, this.elements.display.duration, this.duration);\n }\n\n // Update the tooltip (if visible)\n controls.updateSeekTooltip.call(this);\n },\n\n // Hide/show a tab\n toggleTab(setting, toggle) {\n utils.toggleHidden(this.elements.settings.tabs[setting], !toggle);\n },\n\n // Set the quality menu\n // TODO: Vimeo support\n setQualityMenu(options) {\n // Menu required\n if (!utils.is.element(this.elements.settings.panes.quality)) {\n return;\n }\n\n const type = 'quality';\n const list = this.elements.settings.panes.quality.querySelector('ul');\n\n // Set options if passed and filter based on config\n if (utils.is.array(options)) {\n this.options.quality = options.filter(quality => this.config.quality.options.includes(quality));\n }\n\n // Toggle the pane and tab\n const toggle = !utils.is.empty(this.options.quality) && this.options.quality.length > 1;\n controls.toggleTab.call(this, type, toggle);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If we're hiding, nothing more to do\n if (!toggle) {\n return;\n }\n\n // Empty the menu\n utils.emptyElement(list);\n\n // Get the badge HTML for HD, 4K etc\n const getBadge = quality => {\n const label = i18n.get(`qualityBadge.${quality}`, this.config);\n\n if (!label.length) {\n return null;\n }\n\n return controls.createBadge.call(this, label);\n };\n\n // Sort options by the config and then render options\n this.options.quality\n .sort((a, b) => {\n const sorting = this.config.quality.options;\n return sorting.indexOf(a) > sorting.indexOf(b) ? 1 : -1;\n })\n .forEach(quality => {\n controls.createMenuItem.call(this, {\n value: quality,\n list,\n type,\n title: controls.getLabel.call(this, 'quality', quality),\n badge: getBadge(quality),\n });\n });\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Translate a value into a nice label\n getLabel(setting, value) {\n switch (setting) {\n case 'speed':\n return value === 1 ? i18n.get('normal', this.config) : `${value}&times;`;\n\n case 'quality':\n if (utils.is.number(value)) {\n const label = i18n.get(`qualityLabel.${value}`, this.config);\n\n if (!label.length) {\n return `${value}p`;\n }\n\n return label;\n }\n\n return utils.toTitleCase(value);\n\n case 'captions':\n return captions.getLabel.call(this);\n\n default:\n return null;\n }\n },\n\n // Update the selected setting\n updateSetting(setting, container, input) {\n const pane = this.elements.settings.panes[setting];\n let value = null;\n let list = container;\n\n switch (setting) {\n case 'captions':\n value = this.currentTrack;\n break;\n\n default:\n value = !utils.is.empty(input) ? input : this[setting];\n\n // Get default\n if (utils.is.empty(value)) {\n value = this.config[setting].default;\n }\n\n // Unsupported value\n if (!utils.is.empty(this.options[setting]) && !this.options[setting].includes(value)) {\n this.debug.warn(`Unsupported value of '${value}' for ${setting}`);\n return;\n }\n\n // Disabled value\n if (!this.config[setting].options.includes(value)) {\n this.debug.warn(`Disabled value of '${value}' for ${setting}`);\n return;\n }\n\n break;\n }\n\n // Get the list if we need to\n if (!utils.is.element(list)) {\n list = pane && pane.querySelector('ul');\n }\n\n // If there's no list it means it's not been rendered...\n if (!utils.is.element(list)) {\n return;\n }\n\n // Update the label\n const label = this.elements.settings.tabs[setting].querySelector(`.${this.config.classNames.menu.value}`);\n label.innerHTML = controls.getLabel.call(this, setting, value);\n\n // Find the radio option and check it\n const target = list && list.querySelector(`input[value=\"${value}\"]`);\n\n if (utils.is.element(target)) {\n target.checked = true;\n }\n },\n\n // Set the looping options\n /* setLoopMenu() {\n // Menu required\n if (!utils.is.element(this.elements.settings.panes.loop)) {\n return;\n }\n\n const options = ['start', 'end', 'all', 'reset'];\n const list = this.elements.settings.panes.loop.querySelector('ul');\n\n // Show the pane and tab\n utils.toggleHidden(this.elements.settings.tabs.loop, false);\n utils.toggleHidden(this.elements.settings.panes.loop, false);\n\n // Toggle the pane and tab\n const toggle = !utils.is.empty(this.loop.options);\n controls.toggleTab.call(this, 'loop', toggle);\n\n // Empty the menu\n utils.emptyElement(list);\n\n options.forEach(option => {\n const item = utils.createElement('li');\n\n const button = utils.createElement(\n 'button',\n utils.extend(utils.getAttributesFromSelector(this.config.selectors.buttons.loop), {\n type: 'button',\n class: this.config.classNames.control,\n 'data-plyr-loop-action': option,\n }),\n i18n.get(option, this.config)\n );\n\n if (['start', 'end'].includes(option)) {\n const badge = controls.createBadge.call(this, '00:00');\n button.appendChild(badge);\n }\n\n item.appendChild(button);\n list.appendChild(item);\n });\n }, */\n\n // Get current selected caption language\n // TODO: rework this to user the getter in the API?\n\n // Set a list of available captions languages\n setCaptionsMenu() {\n // TODO: Captions or language? Currently it's mixed\n const type = 'captions';\n const list = this.elements.settings.panes.captions.querySelector('ul');\n const tracks = captions.getTracks.call(this);\n\n // Toggle the pane and tab\n controls.toggleTab.call(this, type, tracks.length);\n\n // Empty the menu\n utils.emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If there's no captions, bail\n if (!tracks.length) {\n return;\n }\n\n // Generate options data\n const options = tracks.map((track, value) => ({\n value,\n checked: this.captions.active && this.currentTrack === value,\n title: captions.getLabel.call(this, track),\n badge: track.language && controls.createBadge.call(this, track.language.toUpperCase()),\n list,\n type: 'language',\n }));\n\n // Add the \"Disabled\" option to turn off captions\n options.unshift({\n value: -1,\n checked: !this.captions.active,\n title: i18n.get('disabled', this.config),\n list,\n type: 'language',\n });\n\n // Generate options\n options.forEach(controls.createMenuItem.bind(this));\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Set a list of available captions languages\n setSpeedMenu(options) {\n // Do nothing if not selected\n if (!this.config.controls.includes('settings') || !this.config.settings.includes('speed')) {\n return;\n }\n\n // Menu required\n if (!utils.is.element(this.elements.settings.panes.speed)) {\n return;\n }\n\n const type = 'speed';\n\n // Set the speed options\n if (utils.is.array(options)) {\n this.options.speed = options;\n } else if (this.isHTML5 || this.isVimeo) {\n this.options.speed = [\n 0.5,\n 0.75,\n 1,\n 1.25,\n 1.5,\n 1.75,\n 2,\n ];\n }\n\n // Set options if passed and filter based on config\n this.options.speed = this.options.speed.filter(speed => this.config.speed.options.includes(speed));\n\n // Toggle the pane and tab\n const toggle = !utils.is.empty(this.options.speed) && this.options.speed.length > 1;\n controls.toggleTab.call(this, type, toggle);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If we're hiding, nothing more to do\n if (!toggle) {\n return;\n }\n\n // Get the list to populate\n const list = this.elements.settings.panes.speed.querySelector('ul');\n\n // Empty the menu\n utils.emptyElement(list);\n\n // Create items\n this.options.speed.forEach(speed => {\n controls.createMenuItem.call(this, {\n value: speed,\n list,\n type,\n title: controls.getLabel.call(this, 'speed', speed),\n });\n });\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Check if we need to hide/show the settings menu\n checkMenu() {\n const { tabs } = this.elements.settings;\n const visible = !utils.is.empty(tabs) && Object.values(tabs).some(tab => !tab.hidden);\n\n utils.toggleHidden(this.elements.settings.menu, !visible);\n },\n\n // Show/hide menu\n toggleMenu(event) {\n const { form } = this.elements.settings;\n const button = this.elements.buttons.settings;\n\n // Menu and button are required\n if (!utils.is.element(form) || !utils.is.element(button)) {\n return;\n }\n\n const show = utils.is.boolean(event) ? event : utils.is.element(form) && form.hasAttribute('hidden');\n\n if (utils.is.event(event)) {\n const isMenuItem = utils.is.element(form) && form.contains(event.target);\n const isButton = event.target === this.elements.buttons.settings;\n\n // If the click was inside the form or if the click\n // wasn't the button or menu item and we're trying to\n // show the menu (a doc click shouldn't show the menu)\n if (isMenuItem || (!isMenuItem && !isButton && show)) {\n return;\n }\n\n // Prevent the toggle being caught by the doc listener\n if (isButton) {\n event.stopPropagation();\n }\n }\n\n // Set form and button attributes\n if (utils.is.element(button)) {\n button.setAttribute('aria-expanded', show);\n }\n\n if (utils.is.element(form)) {\n utils.toggleHidden(form, !show);\n utils.toggleClass(this.elements.container, this.config.classNames.menu.open, show);\n\n if (show) {\n form.removeAttribute('tabindex');\n } else {\n form.setAttribute('tabindex', -1);\n }\n }\n },\n\n // Get the natural size of a tab\n getTabSize(tab) {\n const clone = tab.cloneNode(true);\n clone.style.position = 'absolute';\n clone.style.opacity = 0;\n clone.removeAttribute('hidden');\n\n // Prevent input's being unchecked due to the name being identical\n Array.from(clone.querySelectorAll('input[name]')).forEach(input => {\n const name = input.getAttribute('name');\n input.setAttribute('name', `${name}-clone`);\n });\n\n // Append to parent so we get the \"real\" size\n tab.parentNode.appendChild(clone);\n\n // Get the sizes before we remove\n const width = clone.scrollWidth;\n const height = clone.scrollHeight;\n\n // Remove from the DOM\n utils.removeElement(clone);\n\n return {\n width,\n height,\n };\n },\n\n // Toggle Menu\n showTab(target = '') {\n const { menu } = this.elements.settings;\n const pane = document.getElementById(target);\n\n // Nothing to show, bail\n if (!utils.is.element(pane)) {\n return;\n }\n\n // Are we targetting a tab? If not, bail\n const isTab = pane.getAttribute('role') === 'tabpanel';\n if (!isTab) {\n return;\n }\n\n // Hide all other tabs\n // Get other tabs\n const current = menu.querySelector('[role=\"tabpanel\"]:not([hidden])');\n const container = current.parentNode;\n\n // Set other toggles to be expanded false\n Array.from(menu.querySelectorAll(`[aria-controls=\"${current.getAttribute('id')}\"]`)).forEach(toggle => {\n toggle.setAttribute('aria-expanded', false);\n });\n\n // If we can do fancy animations, we'll animate the height/width\n if (support.transitions && !support.reducedMotion) {\n // Set the current width as a base\n container.style.width = `${current.scrollWidth}px`;\n container.style.height = `${current.scrollHeight}px`;\n\n // Get potential sizes\n const size = controls.getTabSize.call(this, pane);\n\n // Restore auto height/width\n const restore = e => {\n // We're only bothered about height and width on the container\n if (e.target !== container || ![\n 'width',\n 'height',\n ].includes(e.propertyName)) {\n return;\n }\n\n // Revert back to auto\n container.style.width = '';\n container.style.height = '';\n\n // Only listen once\n utils.off(container, utils.transitionEndEvent, restore);\n };\n\n // Listen for the transition finishing and restore auto height/width\n utils.on(container, utils.transitionEndEvent, restore);\n\n // Set dimensions to target\n container.style.width = `${size.width}px`;\n container.style.height = `${size.height}px`;\n }\n\n // Set attributes on current tab\n utils.toggleHidden(current, true);\n current.setAttribute('tabindex', -1);\n\n // Set attributes on target\n utils.toggleHidden(pane, false);\n\n const tabs = utils.getElements.call(this, `[aria-controls=\"${target}\"]`);\n Array.from(tabs).forEach(tab => {\n tab.setAttribute('aria-expanded', true);\n });\n pane.removeAttribute('tabindex');\n\n // Focus the first item\n pane.querySelectorAll('button:not(:disabled), input:not(:disabled), [tabindex]')[0].focus();\n },\n\n // Build the default HTML\n // TODO: Set order based on order in the config.controls array?\n create(data) {\n // Do nothing if we want no controls\n if (utils.is.empty(this.config.controls)) {\n return null;\n }\n\n // Create the container\n const container = utils.createElement('div', utils.getAttributesFromSelector(this.config.selectors.controls.wrapper));\n\n // Restart button\n if (this.config.controls.includes('restart')) {\n container.appendChild(controls.createButton.call(this, 'restart'));\n }\n\n // Rewind button\n if (this.config.controls.includes('rewind')) {\n container.appendChild(controls.createButton.call(this, 'rewind'));\n }\n\n // Play/Pause button\n if (this.config.controls.includes('play')) {\n container.appendChild(controls.createButton.call(this, 'play'));\n }\n\n // Fast forward button\n if (this.config.controls.includes('fast-forward')) {\n container.appendChild(controls.createButton.call(this, 'fast-forward'));\n }\n\n // Progress\n if (this.config.controls.includes('progress')) {\n const progress = utils.createElement('div', utils.getAttributesFromSelector(this.config.selectors.progress));\n\n // Seek range slider\n progress.appendChild(\n controls.createRange.call(this, 'seek', {\n id: `plyr-seek-${data.id}`,\n }),\n );\n\n // Buffer progress\n progress.appendChild(controls.createProgress.call(this, 'buffer'));\n\n // TODO: Add loop display indicator\n\n // Seek tooltip\n if (this.config.tooltips.seek) {\n const tooltip = utils.createElement(\n 'span',\n {\n class: this.config.classNames.tooltip,\n },\n '00:00',\n );\n\n progress.appendChild(tooltip);\n this.elements.display.seekTooltip = tooltip;\n }\n\n this.elements.progress = progress;\n container.appendChild(this.elements.progress);\n }\n\n // Media current time display\n if (this.config.controls.includes('current-time')) {\n container.appendChild(controls.createTime.call(this, 'currentTime'));\n }\n\n // Media duration display\n if (this.config.controls.includes('duration')) {\n container.appendChild(controls.createTime.call(this, 'duration'));\n }\n\n // Toggle mute button\n if (this.config.controls.includes('mute')) {\n container.appendChild(controls.createButton.call(this, 'mute'));\n }\n\n // Volume range control\n if (this.config.controls.includes('volume')) {\n const volume = utils.createElement('div', {\n class: 'plyr__volume',\n });\n\n // Set the attributes\n const attributes = {\n max: 1,\n step: 0.05,\n value: this.config.volume,\n };\n\n // Create the volume range slider\n volume.appendChild(\n controls.createRange.call(\n this,\n 'volume',\n utils.extend(attributes, {\n id: `plyr-volume-${data.id}`,\n }),\n ),\n );\n\n this.elements.volume = volume;\n\n container.appendChild(volume);\n }\n\n // Toggle captions button\n if (this.config.controls.includes('captions')) {\n container.appendChild(controls.createButton.call(this, 'captions'));\n }\n\n // Settings button / menu\n if (this.config.controls.includes('settings') && !utils.is.empty(this.config.settings)) {\n const menu = utils.createElement('div', {\n class: 'plyr__menu',\n hidden: '',\n });\n\n menu.appendChild(\n controls.createButton.call(this, 'settings', {\n id: `plyr-settings-toggle-${data.id}`,\n 'aria-haspopup': true,\n 'aria-controls': `plyr-settings-${data.id}`,\n 'aria-expanded': false,\n }),\n );\n\n const form = utils.createElement('form', {\n class: 'plyr__menu__container',\n id: `plyr-settings-${data.id}`,\n hidden: '',\n 'aria-labelled-by': `plyr-settings-toggle-${data.id}`,\n role: 'tablist',\n tabindex: -1,\n });\n\n const inner = utils.createElement('div');\n\n const home = utils.createElement('div', {\n id: `plyr-settings-${data.id}-home`,\n 'aria-labelled-by': `plyr-settings-toggle-${data.id}`,\n role: 'tabpanel',\n });\n\n // Create the tab list\n const tabs = utils.createElement('ul', {\n role: 'tablist',\n });\n\n // Build the tabs\n this.config.settings.forEach(type => {\n const tab = utils.createElement('li', {\n role: 'tab',\n hidden: '',\n });\n\n const button = utils.createElement(\n 'button',\n utils.extend(utils.getAttributesFromSelector(this.config.selectors.buttons.settings), {\n type: 'button',\n class: `${this.config.classNames.control} ${this.config.classNames.control}--forward`,\n id: `plyr-settings-${data.id}-${type}-tab`,\n 'aria-haspopup': true,\n 'aria-controls': `plyr-settings-${data.id}-${type}`,\n 'aria-expanded': false,\n }),\n i18n.get(type, this.config),\n );\n\n const value = utils.createElement('span', {\n class: this.config.classNames.menu.value,\n });\n\n // Speed contains HTML entities\n value.innerHTML = data[type];\n\n button.appendChild(value);\n tab.appendChild(button);\n tabs.appendChild(tab);\n\n this.elements.settings.tabs[type] = tab;\n });\n\n home.appendChild(tabs);\n inner.appendChild(home);\n\n // Build the panes\n this.config.settings.forEach(type => {\n const pane = utils.createElement('div', {\n id: `plyr-settings-${data.id}-${type}`,\n hidden: '',\n 'aria-labelled-by': `plyr-settings-${data.id}-${type}-tab`,\n role: 'tabpanel',\n tabindex: -1,\n });\n\n const back = utils.createElement(\n 'button',\n {\n type: 'button',\n class: `${this.config.classNames.control} ${this.config.classNames.control}--back`,\n 'aria-haspopup': true,\n 'aria-controls': `plyr-settings-${data.id}-home`,\n 'aria-expanded': false,\n },\n i18n.get(type, this.config),\n );\n\n pane.appendChild(back);\n\n const options = utils.createElement('ul');\n\n pane.appendChild(options);\n inner.appendChild(pane);\n\n this.elements.settings.panes[type] = pane;\n });\n\n form.appendChild(inner);\n menu.appendChild(form);\n container.appendChild(menu);\n\n this.elements.settings.form = form;\n this.elements.settings.menu = menu;\n }\n\n // Picture in picture button\n if (this.config.controls.includes('pip') && support.pip) {\n container.appendChild(controls.createButton.call(this, 'pip'));\n }\n\n // Airplay button\n if (this.config.controls.includes('airplay') && support.airplay) {\n container.appendChild(controls.createButton.call(this, 'airplay'));\n }\n\n // Toggle fullscreen button\n if (this.config.controls.includes('fullscreen')) {\n container.appendChild(controls.createButton.call(this, 'fullscreen'));\n }\n\n // Larger overlaid play button\n if (this.config.controls.includes('play-large')) {\n this.elements.container.appendChild(controls.createButton.call(this, 'play-large'));\n }\n\n this.elements.controls = container;\n\n if (this.isHTML5) {\n controls.setQualityMenu.call(this, html5.getQualityOptions.call(this));\n }\n\n controls.setSpeedMenu.call(this);\n\n return container;\n },\n\n // Insert controls\n inject() {\n // Sprite\n if (this.config.loadSprite) {\n const icon = controls.getIconUrl.call(this);\n\n // Only load external sprite using AJAX\n if (icon.cors) {\n utils.loadSprite(icon.url, 'sprite-plyr');\n }\n }\n\n // Create a unique ID\n this.id = Math.floor(Math.random() * 10000);\n\n // Null by default\n let container = null;\n this.elements.controls = null;\n\n // Set template properties\n const props = {\n id: this.id,\n seektime: this.config.seekTime,\n title: this.config.title,\n };\n let update = true;\n\n if (utils.is.string(this.config.controls) || utils.is.element(this.config.controls)) {\n // String or HTMLElement passed as the option\n container = this.config.controls;\n } else if (utils.is.function(this.config.controls)) {\n // A custom function to build controls\n // The function can return a HTMLElement or String\n container = this.config.controls.call(this, props);\n } else {\n // Create controls\n container = controls.create.call(this, {\n id: this.id,\n seektime: this.config.seekTime,\n speed: this.speed,\n quality: this.quality,\n captions: captions.getLabel.call(this),\n // TODO: Looping\n // loop: 'None',\n });\n update = false;\n }\n\n // Replace props with their value\n const replace = input => {\n let result = input;\n\n Object.entries(props).forEach(([\n key,\n value,\n ]) => {\n result = utils.replaceAll(result, `{${key}}`, value);\n });\n\n return result;\n };\n\n // Update markup\n if (update) {\n if (utils.is.string(this.config.controls)) {\n container = replace(container);\n } else if (utils.is.element(container)) {\n container.innerHTML = replace(container.innerHTML);\n }\n }\n\n // Controls container\n let target;\n\n // Inject to custom location\n if (utils.is.string(this.config.selectors.controls.container)) {\n target = document.querySelector(this.config.selectors.controls.container);\n }\n\n // Inject into the container by default\n if (!utils.is.element(target)) {\n target = this.elements.container;\n }\n\n // Inject controls HTML\n if (utils.is.element(container)) {\n target.appendChild(container);\n } else if (container) {\n target.insertAdjacentHTML('beforeend', container);\n }\n\n // Find the elements if need be\n if (!utils.is.element(this.elements.controls)) {\n controls.findElements.call(this);\n }\n\n // Edge sometimes doesn't finish the paint so force a redraw\n if (window.navigator.userAgent.includes('Edge')) {\n utils.repaint(target);\n }\n\n // Setup tooltips\n if (this.config.tooltips.controls) {\n const labels = utils.getElements.call(\n this,\n [\n this.config.selectors.controls.wrapper,\n ' ',\n this.config.selectors.labels,\n ' .',\n this.config.classNames.hidden,\n ].join(''),\n );\n\n Array.from(labels).forEach(label => {\n utils.toggleClass(label, this.config.classNames.hidden, false);\n utils.toggleClass(label, this.config.classNames.tooltip, true);\n });\n }\n },\n};\n\nexport default controls;\n","// ==========================================================================\n// Plyr Captions\n// TODO: Create as class\n// ==========================================================================\n\nimport controls from './controls';\nimport i18n from './i18n';\nimport support from './support';\nimport utils from './utils';\n\nconst captions = {\n // Setup captions\n setup() {\n // Requires UI support\n if (!this.supported.ui) {\n return;\n }\n\n // Only Vimeo and HTML5 video supported at this point\n if (!this.isVideo || this.isYouTube || (this.isHTML5 && !support.textTracks)) {\n // Clear menu and hide\n if (utils.is.array(this.config.controls) && this.config.controls.includes('settings') && this.config.settings.includes('captions')) {\n controls.setCaptionsMenu.call(this);\n }\n\n return;\n }\n\n // Inject the container\n if (!utils.is.element(this.elements.captions)) {\n this.elements.captions = utils.createElement('div', utils.getAttributesFromSelector(this.config.selectors.captions));\n\n utils.insertAfter(this.elements.captions, this.elements.wrapper);\n }\n\n // Get browser info\n const browser = utils.getBrowser();\n\n // Fix IE captions if CORS is used\n // Fetch captions and inject as blobs instead (data URIs not supported!)\n if (browser.isIE && window.URL) {\n const elements = this.media.querySelectorAll('track');\n\n Array.from(elements).forEach(track => {\n const src = track.getAttribute('src');\n const href = utils.parseUrl(src);\n\n if (href.hostname !== window.location.href.hostname && [\n 'http:',\n 'https:',\n ].includes(href.protocol)) {\n utils\n .fetch(src, 'blob')\n .then(blob => {\n track.setAttribute('src', window.URL.createObjectURL(blob));\n })\n .catch(() => {\n utils.removeElement(track);\n });\n }\n });\n }\n\n // Try to load the value from storage\n let active = this.storage.get('captions');\n\n // Otherwise fall back to the default config\n if (!utils.is.boolean(active)) {\n ({ active } = this.config.captions);\n }\n\n // Get language from storage, fallback to config\n let language = this.storage.get('language') || this.config.captions.language;\n if (language === 'auto') {\n [ language ] = (navigator.language || navigator.userLanguage).split('-');\n }\n // Set language and show if active\n captions.setLanguage.call(this, language, active);\n\n // Watch changes to textTracks and update captions menu\n if (this.isHTML5) {\n const trackEvents = this.config.captions.update ? 'addtrack removetrack' : 'removetrack';\n utils.on(this.media.textTracks, trackEvents, captions.update.bind(this));\n }\n\n // Update available languages in list next tick (the event must not be triggered before the listeners)\n setTimeout(captions.update.bind(this), 0);\n },\n\n update() {\n const tracks = captions.getTracks.call(this, true);\n // Get the wanted language\n const { language, meta } = this.captions;\n\n // Handle tracks (add event listener and \"pseudo\"-default)\n if (this.isHTML5 && this.isVideo) {\n tracks\n .filter(track => !meta.get(track))\n .forEach(track => {\n this.debug.log('Track added', track);\n // Attempt to store if the original dom element was \"default\"\n meta.set(track, {\n default: track.mode === 'showing',\n });\n\n // Turn off native caption rendering to avoid double captions\n track.mode = 'hidden';\n\n // Add event listener for cue changes\n utils.on(track, 'cuechange', () => captions.updateCues.call(this));\n });\n }\n\n const trackRemoved = !tracks.find(track => track === this.captions.currentTrackNode);\n const firstMatch = this.language !== language && tracks.find(track => track.language === language);\n\n // Update language if removed or first matching track added\n if (trackRemoved || firstMatch) {\n captions.setLanguage.call(this, language, this.config.captions.active);\n }\n\n // Enable or disable captions based on track length\n utils.toggleClass(this.elements.container, this.config.classNames.captions.enabled, !utils.is.empty(tracks));\n\n // Update available languages in list\n if ((this.config.controls || []).includes('settings') && this.config.settings.includes('captions')) {\n controls.setCaptionsMenu.call(this);\n }\n },\n\n set(index, setLanguage = true, show = true) {\n const tracks = captions.getTracks.call(this);\n\n // Disable captions if setting to -1\n if (index === -1) {\n this.toggleCaptions(false);\n return;\n }\n\n if (!utils.is.number(index)) {\n this.debug.warn('Invalid caption argument', index);\n return;\n }\n\n if (!(index in tracks)) {\n this.debug.warn('Track not found', index);\n return;\n }\n\n if (this.captions.currentTrack !== index) {\n this.captions.currentTrack = index;\n const track = captions.getCurrentTrack.call(this);\n const { language } = track || {};\n\n // Store reference to node for invalidation on remove\n this.captions.currentTrackNode = track;\n\n // Prevent setting language in some cases, since it can violate user's intentions\n if (setLanguage) {\n this.captions.language = language;\n }\n\n // Handle Vimeo captions\n if (this.isVimeo) {\n this.embed.enableTextTrack(language);\n }\n\n // Trigger event\n utils.dispatchEvent.call(this, this.media, 'languagechange');\n }\n\n if (this.isHTML5 && this.isVideo) {\n // If we change the active track while a cue is already displayed we need to update it\n captions.updateCues.call(this);\n }\n\n // Show captions\n if (show) {\n this.toggleCaptions(true);\n }\n },\n\n setLanguage(language, show = true) {\n if (!utils.is.string(language)) {\n this.debug.warn('Invalid language argument', language);\n return;\n }\n // Normalize\n this.captions.language = language.toLowerCase();\n\n // Set currentTrack\n const tracks = captions.getTracks.call(this);\n const track = captions.getCurrentTrack.call(this, true);\n captions.set.call(this, tracks.indexOf(track), false, show);\n },\n\n // Get current valid caption tracks\n // If update is false it will also ignore tracks without metadata\n // This is used to \"freeze\" the language options when captions.update is false\n getTracks(update = false) {\n // Handle media or textTracks missing or null\n const tracks = Array.from((this.media || {}).textTracks || []);\n // For HTML5, use cache instead of current tracks when it exists (if captions.update is false)\n // Filter out removed tracks and tracks that aren't captions/subtitles (for example metadata)\n return tracks\n .filter(track => !this.isHTML5 || update || this.captions.meta.has(track))\n .filter(track => [\n 'captions',\n 'subtitles',\n ].includes(track.kind));\n },\n\n // Get the current track for the current language\n getCurrentTrack(fromLanguage = false) {\n const tracks = captions.getTracks.call(this);\n const sortIsDefault = track => Number((this.captions.meta.get(track) || {}).default);\n const sorted = Array.from(tracks).sort((a, b) => sortIsDefault(b) - sortIsDefault(a));\n return (!fromLanguage && tracks[this.currentTrack]) || sorted.find(track => track.language === this.captions.language) || sorted[0];\n },\n\n // Get UI label for track\n getLabel(track) {\n let currentTrack = track;\n\n if (!utils.is.track(currentTrack) && support.textTracks && this.captions.active) {\n currentTrack = captions.getCurrentTrack.call(this);\n }\n\n if (utils.is.track(currentTrack)) {\n if (!utils.is.empty(currentTrack.label)) {\n return currentTrack.label;\n }\n\n if (!utils.is.empty(currentTrack.language)) {\n return track.language.toUpperCase();\n }\n\n return i18n.get('enabled', this.config);\n }\n\n return i18n.get('disabled', this.config);\n },\n\n // Update captions using current track's active cues\n // Also optional array argument in case there isn't any track (ex: vimeo)\n updateCues(input) {\n // Requires UI\n if (!this.supported.ui) {\n return;\n }\n\n if (!utils.is.element(this.elements.captions)) {\n this.debug.warn('No captions element to render to');\n return;\n }\n\n // Only accept array or empty input\n if (!utils.is.nullOrUndefined(input) && !Array.isArray(input)) {\n this.debug.warn('updateCues: Invalid input', input);\n return;\n }\n\n let cues = input;\n\n // Get cues from track\n if (!cues) {\n const track = captions.getCurrentTrack.call(this);\n cues = Array.from((track || {}).activeCues || [])\n .map(cue => cue.getCueAsHTML())\n .map(utils.getHTML);\n }\n\n // Set new caption text\n const content = cues.map(cueText => cueText.trim()).join('\\n');\n const changed = content !== this.elements.captions.innerHTML;\n\n if (changed) {\n // Empty the container and create a new child element\n utils.emptyElement(this.elements.captions);\n const caption = utils.createElement('span', utils.getAttributesFromSelector(this.config.selectors.caption));\n caption.innerHTML = content;\n this.elements.captions.appendChild(caption);\n\n // Trigger event\n utils.dispatchEvent.call(this, this.media, 'cuechange');\n }\n },\n};\n\nexport default captions;\n","// ==========================================================================\n// Console wrapper\n// ==========================================================================\n\nconst noop = () => {};\n\nexport default class Console {\n constructor(enabled = false) {\n this.enabled = window.console && enabled;\n\n if (this.enabled) {\n this.log('Debugging enabled');\n }\n }\n\n get log() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.log, console) : noop;\n }\n get warn() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.warn, console) : noop;\n }\n get error() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.error, console) : noop;\n }\n}\n","// ==========================================================================\n// Plyr default config\n// ==========================================================================\n\nconst defaults = {\n // Disable\n enabled: true,\n\n // Custom media title\n title: '',\n\n // Logging to console\n debug: false,\n\n // Auto play (if supported)\n autoplay: false,\n\n // Only allow one media playing at once (vimeo only)\n autopause: true,\n\n // Allow inline playback on iOS (this effects YouTube/Vimeo - HTML5 requires the attribute present)\n // TODO: Remove iosNative fullscreen option in favour of this (logic needs work)\n playsinline: true,\n\n // Default time to skip when rewind/fast forward\n seekTime: 10,\n\n // Default volume\n volume: 1,\n muted: false,\n\n // Pass a custom duration\n duration: null,\n\n // Display the media duration on load in the current time position\n // If you have opted to display both duration and currentTime, this is ignored\n displayDuration: true,\n\n // Invert the current time to be a countdown\n invertTime: true,\n\n // Clicking the currentTime inverts it's value to show time left rather than elapsed\n toggleInvert: true,\n\n // Aspect ratio (for embeds)\n ratio: '16:9',\n\n // Click video container to play/pause\n clickToPlay: true,\n\n // Auto hide the controls\n hideControls: true,\n\n // Reset to start when playback ended\n resetOnEnd: false,\n\n // Disable the standard context menu\n disableContextMenu: true,\n\n // Sprite (for icons)\n loadSprite: true,\n iconPrefix: 'plyr',\n iconUrl: 'https://cdn.plyr.io/3.3.12/plyr.svg',\n\n // Blank video (used to prevent errors on source change)\n blankVideo: 'https://cdn.plyr.io/static/blank.mp4',\n\n // Quality default\n quality: {\n default: 576,\n options: [\n 4320,\n 2880,\n 2160,\n 1440,\n 1080,\n 720,\n 576,\n 480,\n 360,\n 240,\n 'default', // YouTube's \"auto\"\n ],\n },\n\n // Set loops\n loop: {\n active: false,\n // start: null,\n // end: null,\n },\n\n // Speed default and options to display\n speed: {\n selected: 1,\n options: [\n 0.5,\n 0.75,\n 1,\n 1.25,\n 1.5,\n 1.75,\n 2,\n ],\n },\n\n // Keyboard shortcut settings\n keyboard: {\n focused: true,\n global: false,\n },\n\n // Display tooltips\n tooltips: {\n controls: false,\n seek: true,\n },\n\n // Captions settings\n captions: {\n active: false,\n language: 'auto',\n // Listen to new tracks added after Plyr is initialized.\n // This is needed for streaming captions, but may result in unselectable options\n update: false,\n },\n\n // Fullscreen settings\n fullscreen: {\n enabled: true, // Allow fullscreen?\n fallback: true, // Fallback for vintage browsers\n iosNative: false, // Use the native fullscreen in iOS (disables custom controls)\n },\n\n // Local storage\n storage: {\n enabled: true,\n key: 'plyr',\n },\n\n // Default controls\n controls: [\n 'play-large',\n // 'restart',\n // 'rewind',\n 'play',\n // 'fast-forward',\n 'progress',\n 'current-time',\n 'mute',\n 'volume',\n 'captions',\n 'settings',\n 'pip',\n 'airplay',\n 'fullscreen',\n ],\n settings: [\n 'captions',\n 'quality',\n 'speed',\n ],\n\n // Localisation\n i18n: {\n restart: 'Restart',\n rewind: 'Rewind {seektime}s',\n play: 'Play',\n pause: 'Pause',\n fastForward: 'Forward {seektime}s',\n seek: 'Seek',\n seekLabel: '{currentTime} of {duration}',\n played: 'Played',\n buffered: 'Buffered',\n currentTime: 'Current time',\n duration: 'Duration',\n volume: 'Volume',\n mute: 'Mute',\n unmute: 'Unmute',\n enableCaptions: 'Enable captions',\n disableCaptions: 'Disable captions',\n enterFullscreen: 'Enter fullscreen',\n exitFullscreen: 'Exit fullscreen',\n frameTitle: 'Player for {title}',\n captions: 'Captions',\n settings: 'Settings',\n menuBack: 'Go back to previous menu',\n speed: 'Speed',\n normal: 'Normal',\n quality: 'Quality',\n loop: 'Loop',\n start: 'Start',\n end: 'End',\n all: 'All',\n reset: 'Reset',\n disabled: 'Disabled',\n enabled: 'Enabled',\n advertisement: 'Ad',\n qualityBadge: {\n 2160: '4K',\n 1440: 'HD',\n 1080: 'HD',\n 720: 'HD',\n 576: 'SD',\n 480: 'SD',\n },\n },\n\n // URLs\n urls: {\n vimeo: {\n sdk: 'https://player.vimeo.com/api/player.js',\n iframe: 'https://player.vimeo.com/video/{0}?{1}',\n api: 'https://vimeo.com/api/v2/video/{0}.json',\n },\n youtube: {\n sdk: 'https://www.youtube.com/iframe_api',\n api: 'https://www.googleapis.com/youtube/v3/videos?id={0}&key={1}&fields=items(snippet(title))&part=snippet',\n },\n googleIMA: {\n sdk: 'https://imasdk.googleapis.com/js/sdkloader/ima3.js',\n },\n },\n\n // Custom control listeners\n listeners: {\n seek: null,\n play: null,\n pause: null,\n restart: null,\n rewind: null,\n fastForward: null,\n mute: null,\n volume: null,\n captions: null,\n fullscreen: null,\n pip: null,\n airplay: null,\n speed: null,\n quality: null,\n loop: null,\n language: null,\n },\n\n // Events to watch and bubble\n events: [\n // Events to watch on HTML5 media elements and bubble\n // https://developer.mozilla.org/en/docs/Web/Guide/Events/Media_events\n 'ended',\n 'progress',\n 'stalled',\n 'playing',\n 'waiting',\n 'canplay',\n 'canplaythrough',\n 'loadstart',\n 'loadeddata',\n 'loadedmetadata',\n 'timeupdate',\n 'volumechange',\n 'play',\n 'pause',\n 'error',\n 'seeking',\n 'seeked',\n 'emptied',\n 'ratechange',\n 'cuechange',\n\n // Custom events\n 'enterfullscreen',\n 'exitfullscreen',\n 'captionsenabled',\n 'captionsdisabled',\n 'languagechange',\n 'controlshidden',\n 'controlsshown',\n 'ready',\n\n // YouTube\n 'statechange',\n 'qualitychange',\n 'qualityrequested',\n\n // Ads\n 'adsloaded',\n 'adscontentpause',\n 'adscontentresume',\n 'adstarted',\n 'adsmidpoint',\n 'adscomplete',\n 'adsallcomplete',\n 'adsimpression',\n 'adsclick',\n ],\n\n // Selectors\n // Change these to match your template if using custom HTML\n selectors: {\n editable: 'input, textarea, select, [contenteditable]',\n container: '.plyr',\n controls: {\n container: null,\n wrapper: '.plyr__controls',\n },\n labels: '[data-plyr]',\n buttons: {\n play: '[data-plyr=\"play\"]',\n pause: '[data-plyr=\"pause\"]',\n restart: '[data-plyr=\"restart\"]',\n rewind: '[data-plyr=\"rewind\"]',\n fastForward: '[data-plyr=\"fast-forward\"]',\n mute: '[data-plyr=\"mute\"]',\n captions: '[data-plyr=\"captions\"]',\n fullscreen: '[data-plyr=\"fullscreen\"]',\n pip: '[data-plyr=\"pip\"]',\n airplay: '[data-plyr=\"airplay\"]',\n settings: '[data-plyr=\"settings\"]',\n loop: '[data-plyr=\"loop\"]',\n },\n inputs: {\n seek: '[data-plyr=\"seek\"]',\n volume: '[data-plyr=\"volume\"]',\n speed: '[data-plyr=\"speed\"]',\n language: '[data-plyr=\"language\"]',\n quality: '[data-plyr=\"quality\"]',\n },\n display: {\n currentTime: '.plyr__time--current',\n duration: '.plyr__time--duration',\n buffer: '.plyr__progress__buffer',\n loop: '.plyr__progress__loop', // Used later\n volume: '.plyr__volume--display',\n },\n progress: '.plyr__progress',\n captions: '.plyr__captions',\n caption: '.plyr__caption',\n menu: {\n quality: '.js-plyr__menu__list--quality',\n },\n },\n\n // Class hooks added to the player in different states\n classNames: {\n type: 'plyr--{0}',\n provider: 'plyr--{0}',\n video: 'plyr__video-wrapper',\n embed: 'plyr__video-embed',\n embedContainer: 'plyr__video-embed__container',\n poster: 'plyr__poster',\n posterEnabled: 'plyr__poster-enabled',\n ads: 'plyr__ads',\n control: 'plyr__control',\n controlPressed: 'plyr__control--pressed',\n playing: 'plyr--playing',\n paused: 'plyr--paused',\n stopped: 'plyr--stopped',\n loading: 'plyr--loading',\n hover: 'plyr--hover',\n tooltip: 'plyr__tooltip',\n cues: 'plyr__cues',\n hidden: 'plyr__sr-only',\n hideControls: 'plyr--hide-controls',\n isIos: 'plyr--is-ios',\n isTouch: 'plyr--is-touch',\n uiSupported: 'plyr--full-ui',\n noTransition: 'plyr--no-transition',\n menu: {\n value: 'plyr__menu__value',\n badge: 'plyr__badge',\n open: 'plyr--menu-open',\n },\n captions: {\n enabled: 'plyr--captions-enabled',\n active: 'plyr--captions-active',\n },\n fullscreen: {\n enabled: 'plyr--fullscreen-enabled',\n fallback: 'plyr--fullscreen-fallback',\n },\n pip: {\n supported: 'plyr--pip-supported',\n active: 'plyr--pip-active',\n },\n airplay: {\n supported: 'plyr--airplay-supported',\n active: 'plyr--airplay-active',\n },\n tabFocus: 'plyr__tab-focus',\n },\n\n // Embed attributes\n attributes: {\n embed: {\n provider: 'data-plyr-provider',\n id: 'data-plyr-embed-id',\n },\n },\n\n // API keys\n keys: {\n google: null,\n },\n\n // Advertisements plugin\n // Register for an account here: http://vi.ai/publisher-video-monetization/?aid=plyrio\n ads: {\n enabled: false,\n publisherId: '',\n },\n};\n\nexport default defaults;\n","// ==========================================================================\n// Fullscreen wrapper\n// https://developer.mozilla.org/en-US/docs/Web/API/Fullscreen_API#prefixing\n// ==========================================================================\n\nimport utils from './utils';\n\nconst browser = utils.getBrowser();\n\nfunction onChange() {\n if (!this.enabled) {\n return;\n }\n\n // Update toggle button\n const button = this.player.elements.buttons.fullscreen;\n if (utils.is.element(button)) {\n button.pressed = this.active;\n }\n\n // Trigger an event\n utils.dispatchEvent.call(this.player, this.target, this.active ? 'enterfullscreen' : 'exitfullscreen', true);\n\n // Trap focus in container\n if (!browser.isIos) {\n utils.trapFocus.call(this.player, this.target, this.active);\n }\n}\n\nfunction toggleFallback(toggle = false) {\n // Store or restore scroll position\n if (toggle) {\n this.scrollPosition = {\n x: window.scrollX || 0,\n y: window.scrollY || 0,\n };\n } else {\n window.scrollTo(this.scrollPosition.x, this.scrollPosition.y);\n }\n\n // Toggle scroll\n document.body.style.overflow = toggle ? 'hidden' : '';\n\n // Toggle class hook\n utils.toggleClass(this.target, this.player.config.classNames.fullscreen.fallback, toggle);\n\n // Toggle button and fire events\n onChange.call(this);\n}\n\nclass Fullscreen {\n constructor(player) {\n // Keep reference to parent\n this.player = player;\n\n // Get prefix\n this.prefix = Fullscreen.prefix;\n this.property = Fullscreen.property;\n\n // Scroll position\n this.scrollPosition = { x: 0, y: 0 };\n\n // Register event listeners\n // Handle event (incase user presses escape etc)\n utils.on(document, this.prefix === 'ms' ? 'MSFullscreenChange' : `${this.prefix}fullscreenchange`, () => {\n // TODO: Filter for target??\n onChange.call(this);\n });\n\n // Fullscreen toggle on double click\n utils.on(this.player.elements.container, 'dblclick', event => {\n // Ignore double click in controls\n if (utils.is.element(this.player.elements.controls) && this.player.elements.controls.contains(event.target)) {\n return;\n }\n\n this.toggle();\n });\n\n // Update the UI\n this.update();\n }\n\n // Determine if native supported\n static get native() {\n return !!(document.fullscreenEnabled || document.webkitFullscreenEnabled || document.mozFullScreenEnabled || document.msFullscreenEnabled);\n }\n\n // Get the prefix for handlers\n static get prefix() {\n // No prefix\n if (utils.is.function(document.exitFullscreen)) {\n return '';\n }\n\n // Check for fullscreen support by vendor prefix\n let value = '';\n const prefixes = [\n 'webkit',\n 'moz',\n 'ms',\n ];\n\n prefixes.some(pre => {\n if (utils.is.function(document[`${pre}ExitFullscreen`]) || utils.is.function(document[`${pre}CancelFullScreen`])) {\n value = pre;\n return true;\n }\n\n return false;\n });\n\n return value;\n }\n\n static get property() {\n return this.prefix === 'moz' ? 'FullScreen' : 'Fullscreen';\n }\n\n // Determine if fullscreen is enabled\n get enabled() {\n return (\n (Fullscreen.native || this.player.config.fullscreen.fallback) &&\n this.player.config.fullscreen.enabled &&\n this.player.supported.ui &&\n this.player.isVideo\n );\n }\n\n // Get active state\n get active() {\n if (!this.enabled) {\n return false;\n }\n\n // Fallback using classname\n if (!Fullscreen.native) {\n return utils.hasClass(this.target, this.player.config.classNames.fullscreen.fallback);\n }\n\n const element = !this.prefix ? document.fullscreenElement : document[`${this.prefix}${this.property}Element`];\n\n return element === this.target;\n }\n\n // Get target element\n get target() {\n return browser.isIos && this.player.config.fullscreen.iosNative ? this.player.media : this.player.elements.container;\n }\n\n // Update UI\n update() {\n if (this.enabled) {\n this.player.debug.log(`${Fullscreen.native ? 'Native' : 'Fallback'} fullscreen enabled`);\n } else {\n this.player.debug.log('Fullscreen not supported and fallback disabled');\n }\n\n // Add styling hook to show button\n utils.toggleClass(this.player.elements.container, this.player.config.classNames.fullscreen.enabled, this.enabled);\n }\n\n // Make an element fullscreen\n enter() {\n if (!this.enabled) {\n return;\n }\n\n // iOS native fullscreen doesn't need the request step\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n if (this.player.playing) {\n this.target.webkitEnterFullscreen();\n }\n } else if (!Fullscreen.native) {\n toggleFallback.call(this, true);\n } else if (!this.prefix) {\n this.target.requestFullscreen();\n } else if (!utils.is.empty(this.prefix)) {\n this.target[`${this.prefix}Request${this.property}`]();\n }\n }\n\n // Bail from fullscreen\n exit() {\n if (!this.enabled) {\n return;\n }\n\n // iOS native fullscreen\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n this.target.webkitExitFullscreen();\n this.player.play();\n } else if (!Fullscreen.native) {\n toggleFallback.call(this, false);\n } else if (!this.prefix) {\n (document.cancelFullScreen || document.exitFullscreen).call(document);\n } else if (!utils.is.empty(this.prefix)) {\n const action = this.prefix === 'moz' ? 'Cancel' : 'Exit';\n document[`${this.prefix}${action}${this.property}`]();\n }\n }\n\n // Toggle state\n toggle() {\n if (!this.active) {\n this.enter();\n } else {\n this.exit();\n }\n }\n}\n\nexport default Fullscreen;\n","// ==========================================================================\n// Plyr UI\n// ==========================================================================\n\nimport captions from './captions';\nimport controls from './controls';\nimport i18n from './i18n';\nimport support from './support';\nimport utils from './utils';\n\n// Sniff out the browser\nconst browser = utils.getBrowser();\n\nconst ui = {\n addStyleHook() {\n utils.toggleClass(this.elements.container, this.config.selectors.container.replace('.', ''), true);\n utils.toggleClass(this.elements.container, this.config.classNames.uiSupported, this.supported.ui);\n },\n\n // Toggle native HTML5 media controls\n toggleNativeControls(toggle = false) {\n if (toggle && this.isHTML5) {\n this.media.setAttribute('controls', '');\n } else {\n this.media.removeAttribute('controls');\n }\n },\n\n // Setup the UI\n build() {\n // Re-attach media element listeners\n // TODO: Use event bubbling?\n this.listeners.media();\n\n // Don't setup interface if no support\n if (!this.supported.ui) {\n this.debug.warn(`Basic support only for ${this.provider} ${this.type}`);\n\n // Restore native controls\n ui.toggleNativeControls.call(this, true);\n\n // Bail\n return;\n }\n\n // Inject custom controls if not present\n if (!utils.is.element(this.elements.controls)) {\n // Inject custom controls\n controls.inject.call(this);\n\n // Re-attach control listeners\n this.listeners.controls();\n }\n\n // Remove native controls\n ui.toggleNativeControls.call(this);\n\n // Setup captions for HTML5\n if (this.isHTML5) {\n captions.setup.call(this);\n }\n\n // Reset volume\n this.volume = null;\n\n // Reset mute state\n this.muted = null;\n\n // Reset speed\n this.speed = null;\n\n // Reset loop state\n this.loop = null;\n\n // Reset quality setting\n this.quality = null;\n\n // Reset volume display\n controls.updateVolume.call(this);\n\n // Reset time display\n controls.timeUpdate.call(this);\n\n // Update the UI\n ui.checkPlaying.call(this);\n\n // Check for picture-in-picture support\n utils.toggleClass(this.elements.container, this.config.classNames.pip.supported, support.pip && this.isHTML5 && this.isVideo);\n\n // Check for airplay support\n utils.toggleClass(this.elements.container, this.config.classNames.airplay.supported, support.airplay && this.isHTML5);\n\n // Add iOS class\n utils.toggleClass(this.elements.container, this.config.classNames.isIos, browser.isIos);\n\n // Add touch class\n utils.toggleClass(this.elements.container, this.config.classNames.isTouch, this.touch);\n\n // Ready for API calls\n this.ready = true;\n\n // Ready event at end of execution stack\n setTimeout(() => {\n utils.dispatchEvent.call(this, this.media, 'ready');\n }, 0);\n\n // Set the title\n ui.setTitle.call(this);\n\n // Assure the poster image is set, if the property was added before the element was created\n if (this.poster && this.elements.poster && !this.elements.poster.style.backgroundImage) {\n ui.setPoster.call(this, this.poster);\n }\n\n // Manually set the duration if user has overridden it.\n // The event listeners for it doesn't get called if preload is disabled (#701)\n if (this.config.duration) {\n controls.durationUpdate.call(this);\n }\n },\n\n // Setup aria attribute for play and iframe title\n setTitle() {\n // Find the current text\n let label = i18n.get('play', this.config);\n\n // If there's a media title set, use that for the label\n if (utils.is.string(this.config.title) && !utils.is.empty(this.config.title)) {\n label += `, ${this.config.title}`;\n }\n\n // If there's a play button, set label\n if (utils.is.nodeList(this.elements.buttons.play)) {\n Array.from(this.elements.buttons.play).forEach(button => {\n button.setAttribute('aria-label', label);\n });\n }\n\n // Set iframe title\n // https://github.com/sampotts/plyr/issues/124\n if (this.isEmbed) {\n const iframe = utils.getElement.call(this, 'iframe');\n\n if (!utils.is.element(iframe)) {\n return;\n }\n\n // Default to media type\n const title = !utils.is.empty(this.config.title) ? this.config.title : 'video';\n const format = i18n.get('frameTitle', this.config);\n\n iframe.setAttribute('title', format.replace('{title}', title));\n }\n },\n\n // Toggle poster\n togglePoster(enable) {\n utils.toggleClass(this.elements.container, this.config.classNames.posterEnabled, enable);\n },\n\n // Set the poster image (async)\n setPoster(poster) {\n // Set property regardless of validity\n this.media.setAttribute('poster', poster);\n\n // Bail if element is missing\n if (!utils.is.element(this.elements.poster)) {\n return Promise.reject();\n }\n\n // Load the image, and set poster if successful\n const loadPromise = utils.loadImage(poster).then(() => {\n this.elements.poster.style.backgroundImage = `url('${poster}')`;\n Object.assign(this.elements.poster.style, {\n backgroundImage: `url('${poster}')`,\n // Reset backgroundSize as well (since it can be set to \"cover\" for padded thumbnails for youtube)\n backgroundSize: '',\n });\n ui.togglePoster.call(this, true);\n return poster;\n });\n\n // Hide the element if the poster can't be loaded (otherwise it will just be a black element covering the video)\n loadPromise.catch(() => ui.togglePoster.call(this, false));\n\n // Return the promise so the caller can use it as well\n return loadPromise;\n },\n\n // Check playing state\n checkPlaying(event) {\n // Class hooks\n utils.toggleClass(this.elements.container, this.config.classNames.playing, this.playing);\n utils.toggleClass(this.elements.container, this.config.classNames.paused, this.paused);\n utils.toggleClass(this.elements.container, this.config.classNames.stopped, this.stopped);\n\n // Set state\n Array.from(this.elements.buttons.play).forEach(target => {\n target.pressed = this.playing;\n });\n\n // Only update controls on non timeupdate events\n if (utils.is.event(event) && event.type === 'timeupdate') {\n return;\n }\n\n // Toggle controls\n ui.toggleControls.call(this);\n },\n\n // Check if media is loading\n checkLoading(event) {\n this.loading = [\n 'stalled',\n 'waiting',\n ].includes(event.type);\n\n // Clear timer\n clearTimeout(this.timers.loading);\n\n // Timer to prevent flicker when seeking\n this.timers.loading = setTimeout(() => {\n // Update progress bar loading class state\n utils.toggleClass(this.elements.container, this.config.classNames.loading, this.loading);\n\n // Update controls visibility\n ui.toggleControls.call(this);\n }, this.loading ? 250 : 0);\n },\n\n // Toggle controls based on state and `force` argument\n toggleControls(force) {\n const { controls } = this.elements;\n\n if (controls && this.config.hideControls) {\n // Show controls if force, loading, paused, or button interaction, otherwise hide\n this.toggleControls(Boolean(force || this.loading || this.paused || controls.pressed || controls.hover));\n }\n },\n};\n\nexport default ui;\n","// ==========================================================================\n// Plyr Event Listeners\n// ==========================================================================\n\nimport controls from './controls';\nimport ui from './ui';\nimport utils from './utils';\n\n// Sniff out the browser\nconst browser = utils.getBrowser();\n\nclass Listeners {\n constructor(player) {\n this.player = player;\n this.lastKey = null;\n\n this.handleKey = this.handleKey.bind(this);\n this.toggleMenu = this.toggleMenu.bind(this);\n this.firstTouch = this.firstTouch.bind(this);\n }\n\n // Handle key presses\n handleKey(event) {\n const code = event.keyCode ? event.keyCode : event.which;\n const pressed = event.type === 'keydown';\n const repeat = pressed && code === this.lastKey;\n\n // Bail if a modifier key is set\n if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) {\n return;\n }\n\n // If the event is bubbled from the media element\n // Firefox doesn't get the keycode for whatever reason\n if (!utils.is.number(code)) {\n return;\n }\n\n // Seek by the number keys\n const seekByKey = () => {\n // Divide the max duration into 10th's and times by the number value\n this.player.currentTime = this.player.duration / 10 * (code - 48);\n };\n\n // Handle the key on keydown\n // Reset on keyup\n if (pressed) {\n // Which keycodes should we prevent default\n const preventDefault = [\n 48,\n 49,\n 50,\n 51,\n 52,\n 53,\n 54,\n 56,\n 57,\n 32,\n 75,\n 38,\n 40,\n 77,\n 39,\n 37,\n 70,\n 67,\n 73,\n 76,\n 79,\n ];\n\n // Check focused element\n // and if the focused element is not editable (e.g. text input)\n // and any that accept key input http://webaim.org/techniques/keyboard/\n const focused = utils.getFocusElement();\n if (utils.is.element(focused) && (\n focused !== this.player.elements.inputs.seek &&\n utils.matches(focused, this.player.config.selectors.editable))\n ) {\n return;\n }\n\n // If the code is found prevent default (e.g. prevent scrolling for arrows)\n if (preventDefault.includes(code)) {\n event.preventDefault();\n event.stopPropagation();\n }\n\n switch (code) {\n case 48:\n case 49:\n case 50:\n case 51:\n case 52:\n case 53:\n case 54:\n case 55:\n case 56:\n case 57:\n // 0-9\n if (!repeat) {\n seekByKey();\n }\n break;\n\n case 32:\n case 75:\n // Space and K key\n if (!repeat) {\n this.player.togglePlay();\n }\n break;\n\n case 38:\n // Arrow up\n this.player.increaseVolume(0.1);\n break;\n\n case 40:\n // Arrow down\n this.player.decreaseVolume(0.1);\n break;\n\n case 77:\n // M key\n if (!repeat) {\n this.player.muted = !this.player.muted;\n }\n break;\n\n case 39:\n // Arrow forward\n this.player.forward();\n break;\n\n case 37:\n // Arrow back\n this.player.rewind();\n break;\n\n case 70:\n // F key\n this.player.fullscreen.toggle();\n break;\n\n case 67:\n // C key\n if (!repeat) {\n this.player.toggleCaptions();\n }\n break;\n\n case 76:\n // L key\n this.player.loop = !this.player.loop;\n break;\n\n /* case 73:\n this.setLoop('start');\n break;\n\n case 76:\n this.setLoop();\n break;\n\n case 79:\n this.setLoop('end');\n break; */\n\n default:\n break;\n }\n\n // Escape is handle natively when in full screen\n // So we only need to worry about non native\n if (!this.player.fullscreen.enabled && this.player.fullscreen.active && code === 27) {\n this.player.fullscreen.toggle();\n }\n\n // Store last code for next cycle\n this.lastKey = code;\n } else {\n this.lastKey = null;\n }\n }\n\n // Toggle menu\n toggleMenu(event) {\n controls.toggleMenu.call(this.player, event);\n }\n\n // Device is touch enabled\n firstTouch() {\n this.player.touch = true;\n\n // Add touch class\n utils.toggleClass(this.player.elements.container, this.player.config.classNames.isTouch, true);\n\n // Clean up\n utils.off(document.body, 'touchstart', this.firstTouch);\n }\n\n // Global window & document listeners\n global(toggle = true) {\n // Keyboard shortcuts\n if (this.player.config.keyboard.global) {\n utils.toggleListener(window, 'keydown keyup', this.handleKey, toggle, false);\n }\n\n // Click anywhere closes menu\n utils.toggleListener(document.body, 'click', this.toggleMenu, toggle);\n\n // Detect touch by events\n utils.on(document.body, 'touchstart', this.firstTouch);\n }\n\n // Container listeners\n container() {\n // Keyboard shortcuts\n if (!this.player.config.keyboard.global && this.player.config.keyboard.focused) {\n utils.on(this.player.elements.container, 'keydown keyup', this.handleKey, false);\n }\n\n // Detect tab focus\n // Remove class on blur/focusout\n utils.on(this.player.elements.container, 'focusout', event => {\n utils.toggleClass(event.target, this.player.config.classNames.tabFocus, false);\n });\n\n // Add classname to tabbed elements\n utils.on(this.player.elements.container, 'keydown', event => {\n if (event.keyCode !== 9) {\n return;\n }\n\n // Delay the adding of classname until the focus has changed\n // This event fires before the focusin event\n setTimeout(() => {\n utils.toggleClass(utils.getFocusElement(), this.player.config.classNames.tabFocus, true);\n }, 0);\n });\n\n // Toggle controls on mouse events and entering fullscreen\n utils.on(this.player.elements.container, 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen', event => {\n const { controls } = this.player.elements;\n\n // Remove button states for fullscreen\n if (event.type === 'enterfullscreen') {\n controls.pressed = false;\n controls.hover = false;\n }\n\n // Show, then hide after a timeout unless another control event occurs\n const show = [\n 'touchstart',\n 'touchmove',\n 'mousemove',\n ].includes(event.type);\n\n let delay = 0;\n\n if (show) {\n ui.toggleControls.call(this.player, true);\n // Use longer timeout for touch devices\n delay = this.player.touch ? 3000 : 2000;\n }\n\n // Clear timer\n clearTimeout(this.player.timers.controls);\n // Timer to prevent flicker when seeking\n this.player.timers.controls = setTimeout(() => ui.toggleControls.call(this.player, false), delay);\n });\n }\n\n // Listen for media events\n media() {\n // Time change on media\n utils.on(this.player.media, 'timeupdate seeking seeked', event => controls.timeUpdate.call(this.player, event));\n\n // Display duration\n utils.on(this.player.media, 'durationchange loadeddata loadedmetadata', event => controls.durationUpdate.call(this.player, event));\n\n // Check for audio tracks on load\n // We can't use `loadedmetadata` as it doesn't seem to have audio tracks at that point\n utils.on(this.player.media, 'loadeddata', () => {\n utils.toggleHidden(this.player.elements.volume, !this.player.hasAudio);\n utils.toggleHidden(this.player.elements.buttons.mute, !this.player.hasAudio);\n });\n\n // Handle the media finishing\n utils.on(this.player.media, 'ended', () => {\n // Show poster on end\n if (this.player.isHTML5 && this.player.isVideo && this.player.config.resetOnEnd) {\n // Restart\n this.player.restart();\n }\n });\n\n // Check for buffer progress\n utils.on(this.player.media, 'progress playing seeking seeked', event => controls.updateProgress.call(this.player, event));\n\n // Handle volume changes\n utils.on(this.player.media, 'volumechange', event => controls.updateVolume.call(this.player, event));\n\n // Handle play/pause\n utils.on(this.player.media, 'playing play pause ended emptied timeupdate', event => ui.checkPlaying.call(this.player, event));\n\n // Loading state\n utils.on(this.player.media, 'waiting canplay seeked playing', event => ui.checkLoading.call(this.player, event));\n\n // If autoplay, then load advertisement if required\n // TODO: Show some sort of loading state while the ad manager loads else there's a delay before ad shows\n utils.on(this.player.media, 'playing', () => {\n if (!this.player.ads) {\n return;\n }\n\n // If ads are enabled, wait for them first\n if (this.player.ads.enabled && !this.player.ads.initialized) {\n // Wait for manager response\n this.player.ads.managerPromise.then(() => this.player.ads.play()).catch(() => this.player.play());\n }\n });\n\n // Click video\n if (this.player.supported.ui && this.player.config.clickToPlay && !this.player.isAudio) {\n // Re-fetch the wrapper\n const wrapper = utils.getElement.call(this.player, `.${this.player.config.classNames.video}`);\n\n // Bail if there's no wrapper (this should never happen)\n if (!utils.is.element(wrapper)) {\n return;\n }\n\n // On click play, pause ore restart\n utils.on(wrapper, 'click', () => {\n // Touch devices will just show controls (if we're hiding controls)\n if (this.player.config.hideControls && this.player.touch && !this.player.paused) {\n return;\n }\n\n if (this.player.paused) {\n this.player.play();\n } else if (this.player.ended) {\n this.player.restart();\n this.player.play();\n } else {\n this.player.pause();\n }\n });\n }\n\n // Disable right click\n if (this.player.supported.ui && this.player.config.disableContextMenu) {\n utils.on(\n this.player.elements.wrapper,\n 'contextmenu',\n event => {\n event.preventDefault();\n },\n false,\n );\n }\n\n // Volume change\n utils.on(this.player.media, 'volumechange', () => {\n // Save to storage\n this.player.storage.set({ volume: this.player.volume, muted: this.player.muted });\n });\n\n // Speed change\n utils.on(this.player.media, 'ratechange', () => {\n // Update UI\n controls.updateSetting.call(this.player, 'speed');\n\n // Save to storage\n this.player.storage.set({ speed: this.player.speed });\n });\n\n // Quality request\n utils.on(this.player.media, 'qualityrequested', event => {\n // Save to storage\n this.player.storage.set({ quality: event.detail.quality });\n });\n\n // Quality change\n utils.on(this.player.media, 'qualitychange', event => {\n // Update UI\n controls.updateSetting.call(this.player, 'quality', null, event.detail.quality);\n });\n\n // Caption language change\n utils.on(this.player.media, 'languagechange', () => {\n // Update UI\n controls.updateSetting.call(this.player, 'captions');\n\n // Save to storage\n this.player.storage.set({ language: this.player.language });\n });\n\n // Captions toggle\n utils.on(this.player.media, 'captionsenabled captionsdisabled', () => {\n // Update UI\n controls.updateSetting.call(this.player, 'captions');\n\n // Save to storage\n this.player.storage.set({ captions: this.player.captions.active });\n });\n\n // Proxy events to container\n // Bubble up key events for Edge\n utils.on(this.player.media, this.player.config.events.concat([\n 'keyup',\n 'keydown',\n ]).join(' '), event => {\n let {detail = {}} = event;\n\n // Get error details from media\n if (event.type === 'error') {\n detail = this.player.media.error;\n }\n\n utils.dispatchEvent.call(this.player, this.player.elements.container, event.type, true, detail);\n });\n }\n\n // Listen for control events\n controls() {\n // IE doesn't support input event, so we fallback to change\n const inputEvent = browser.isIE ? 'change' : 'input';\n\n // Run default and custom handlers\n const proxy = (event, defaultHandler, customHandlerKey) => {\n const customHandler = this.player.config.listeners[customHandlerKey];\n const hasCustomHandler = utils.is.function(customHandler);\n let returned = true;\n\n // Execute custom handler\n if (hasCustomHandler) {\n returned = customHandler.call(this.player, event);\n }\n\n // Only call default handler if not prevented in custom handler\n if (returned && utils.is.function(defaultHandler)) {\n defaultHandler.call(this.player, event);\n }\n };\n\n // Trigger custom and default handlers\n const on = (element, type, defaultHandler, customHandlerKey, passive = true) => {\n const customHandler = this.player.config.listeners[customHandlerKey];\n const hasCustomHandler = utils.is.function(customHandler);\n\n utils.on(element, type, event => proxy(event, defaultHandler, customHandlerKey), passive && !hasCustomHandler);\n };\n\n // Play/pause toggle\n on(this.player.elements.buttons.play, 'click', this.player.togglePlay, 'play');\n\n // Pause\n on(this.player.elements.buttons.restart, 'click', this.player.restart, 'restart');\n\n // Rewind\n on(this.player.elements.buttons.rewind, 'click', this.player.rewind, 'rewind');\n\n // Rewind\n on(this.player.elements.buttons.fastForward, 'click', this.player.forward, 'fastForward');\n\n // Mute toggle\n on(\n this.player.elements.buttons.mute,\n 'click',\n () => {\n this.player.muted = !this.player.muted;\n },\n 'mute',\n );\n\n // Captions toggle\n on(this.player.elements.buttons.captions, 'click', this.player.toggleCaptions);\n\n // Fullscreen toggle\n on(\n this.player.elements.buttons.fullscreen,\n 'click',\n () => {\n this.player.fullscreen.toggle();\n },\n 'fullscreen',\n );\n\n // Picture-in-Picture\n on(\n this.player.elements.buttons.pip,\n 'click',\n () => {\n this.player.pip = 'toggle';\n },\n 'pip',\n );\n\n // Airplay\n on(this.player.elements.buttons.airplay, 'click', this.player.airplay, 'airplay');\n\n // Settings menu\n on(this.player.elements.buttons.settings, 'click', event => {\n controls.toggleMenu.call(this.player, event);\n });\n\n // Settings menu\n on(this.player.elements.settings.form, 'click', event => {\n event.stopPropagation();\n\n // Go back to home tab on click\n const showHomeTab = () => {\n const id = `plyr-settings-${this.player.id}-home`;\n controls.showTab.call(this.player, id);\n };\n\n // Settings menu items - use event delegation as items are added/removed\n if (utils.matches(event.target, this.player.config.selectors.inputs.language)) {\n proxy(\n event,\n () => {\n this.player.currentTrack = Number(event.target.value);\n showHomeTab();\n },\n 'language',\n );\n } else if (utils.matches(event.target, this.player.config.selectors.inputs.quality)) {\n proxy(\n event,\n () => {\n this.player.quality = event.target.value;\n showHomeTab();\n },\n 'quality',\n );\n } else if (utils.matches(event.target, this.player.config.selectors.inputs.speed)) {\n proxy(\n event,\n () => {\n this.player.speed = parseFloat(event.target.value);\n showHomeTab();\n },\n 'speed',\n );\n } else {\n const tab = event.target;\n controls.showTab.call(this.player, tab.getAttribute('aria-controls'));\n }\n });\n\n // Set range input alternative \"value\", which matches the tooltip time (#954)\n on(this.player.elements.inputs.seek, 'mousedown mousemove', event => {\n const clientRect = this.player.elements.progress.getBoundingClientRect();\n const percent = 100 / clientRect.width * (event.pageX - clientRect.left);\n event.currentTarget.setAttribute('seek-value', percent);\n });\n\n // Pause while seeking\n on(this.player.elements.inputs.seek, 'mousedown mouseup keydown keyup touchstart touchend', event => {\n const seek = event.currentTarget;\n\n const code = event.keyCode ? event.keyCode : event.which;\n const eventType = event.type;\n\n if ((eventType === 'keydown' || eventType === 'keyup') && (code !== 39 && code !== 37)) {\n return;\n }\n // Was playing before?\n const play = seek.hasAttribute('play-on-seeked');\n\n // Done seeking\n const done = [\n 'mouseup',\n 'touchend',\n 'keyup',\n ].includes(event.type);\n\n // If we're done seeking and it was playing, resume playback\n if (play && done) {\n seek.removeAttribute('play-on-seeked');\n this.player.play();\n } else if (!done && this.player.playing) {\n seek.setAttribute('play-on-seeked', '');\n this.player.pause();\n }\n });\n\n // Seek\n on(\n this.player.elements.inputs.seek,\n inputEvent,\n event => {\n const seek = event.currentTarget;\n\n // If it exists, use seek-value instead of \"value\" for consistency with tooltip time (#954)\n let seekTo = seek.getAttribute('seek-value');\n\n if (utils.is.empty(seekTo)) {\n seekTo = seek.value;\n }\n\n seek.removeAttribute('seek-value');\n\n this.player.currentTime = seekTo / seek.max * this.player.duration;\n },\n 'seek',\n );\n\n // Current time invert\n // Only if one time element is used for both currentTime and duration\n if (this.player.config.toggleInvert && !utils.is.element(this.player.elements.display.duration)) {\n on(this.player.elements.display.currentTime, 'click', () => {\n // Do nothing if we're at the start\n if (this.player.currentTime === 0) {\n return;\n }\n\n this.player.config.invertTime = !this.player.config.invertTime;\n\n controls.timeUpdate.call(this.player);\n });\n }\n\n // Volume\n on(\n this.player.elements.inputs.volume,\n inputEvent,\n event => {\n this.player.volume = event.target.value;\n },\n 'volume',\n );\n\n // Polyfill for lower fill in <input type=\"range\"> for webkit\n if (browser.isWebkit) {\n on(utils.getElements.call(this.player, 'input[type=\"range\"]'), 'input', event => {\n controls.updateRangeFill.call(this.player, event.target);\n });\n }\n\n // Seek tooltip\n on(this.player.elements.progress, 'mouseenter mouseleave mousemove', event => controls.updateSeekTooltip.call(this.player, event));\n\n // Update controls.hover state (used for ui.toggleControls to avoid hiding when interacting)\n on(this.player.elements.controls, 'mouseenter mouseleave', event => {\n this.player.elements.controls.hover = !this.player.touch && event.type === 'mouseenter';\n });\n\n // Update controls.pressed state (used for ui.toggleControls to avoid hiding when interacting)\n on(this.player.elements.controls, 'mousedown mouseup touchstart touchend touchcancel', event => {\n this.player.elements.controls.pressed = [\n 'mousedown',\n 'touchstart',\n ].includes(event.type);\n });\n\n // Focus in/out on controls\n on(this.player.elements.controls, 'focusin focusout', event => {\n const { config, elements, timers } = this.player;\n\n // Skip transition to prevent focus from scrolling the parent element\n utils.toggleClass(elements.controls, config.classNames.noTransition, event.type === 'focusin');\n\n // Toggle\n ui.toggleControls.call(this.player, event.type === 'focusin');\n\n // If focusin, hide again after delay\n if (event.type === 'focusin') {\n // Restore transition\n setTimeout(() => {\n utils.toggleClass(elements.controls, config.classNames.noTransition, false);\n }, 0);\n\n // Delay a little more for keyboard users\n const delay = this.touch ? 3000 : 4000;\n\n // Clear timer\n clearTimeout(timers.controls);\n // Hide\n timers.controls = setTimeout(() => ui.toggleControls.call(this.player, false), delay);\n }\n });\n\n // Mouse wheel for volume\n on(\n this.player.elements.inputs.volume,\n 'wheel',\n event => {\n // Detect \"natural\" scroll - suppored on OS X Safari only\n // Other browsers on OS X will be inverted until support improves\n const inverted = event.webkitDirectionInvertedFromDevice;\n const step = 1 / 50;\n let direction = 0;\n\n // Scroll down (or up on natural) to decrease\n if (event.deltaY < 0 || event.deltaX > 0) {\n if (inverted) {\n this.player.decreaseVolume(step);\n direction = -1;\n } else {\n this.player.increaseVolume(step);\n direction = 1;\n }\n }\n\n // Scroll up (or down on natural) to increase\n if (event.deltaY > 0 || event.deltaX < 0) {\n if (inverted) {\n this.player.increaseVolume(step);\n direction = 1;\n } else {\n this.player.decreaseVolume(step);\n direction = -1;\n }\n }\n\n // Don't break page scrolling at max and min\n if ((direction === 1 && this.player.media.volume < 1) || (direction === -1 && this.player.media.volume > 0)) {\n event.preventDefault();\n }\n },\n 'volume',\n false,\n );\n }\n\n // Reset on destroy\n clear() {\n this.global(false);\n }\n}\n\nexport default Listeners;\n","// ==========================================================================\n// Vimeo plugin\n// ==========================================================================\n\nimport captions from './../captions';\nimport controls from './../controls';\nimport ui from './../ui';\nimport utils from './../utils';\n\n// Set playback state and trigger change (only on actual change)\nfunction assurePlaybackState(play) {\n if (play && !this.embed.hasPlayed) {\n this.embed.hasPlayed = true;\n }\n if (this.media.paused === play) {\n this.media.paused = !play;\n utils.dispatchEvent.call(this, this.media, play ? 'play' : 'pause');\n }\n}\n\nconst vimeo = {\n setup() {\n // Add embed class for responsive\n utils.toggleClass(this.elements.wrapper, this.config.classNames.embed, true);\n\n // Set intial ratio\n vimeo.setAspectRatio.call(this);\n\n // Load the API if not already\n if (!utils.is.object(window.Vimeo)) {\n utils\n .loadScript(this.config.urls.vimeo.sdk)\n .then(() => {\n vimeo.ready.call(this);\n })\n .catch(error => {\n this.debug.warn('Vimeo API failed to load', error);\n });\n } else {\n vimeo.ready.call(this);\n }\n },\n\n // Set aspect ratio\n // For Vimeo we have an extra 300% height <div> to hide the standard controls and UI\n setAspectRatio(input) {\n const ratio = utils.is.string(input) ? input.split(':') : this.config.ratio.split(':');\n const padding = 100 / ratio[0] * ratio[1];\n this.elements.wrapper.style.paddingBottom = `${padding}%`;\n\n if (this.supported.ui) {\n const height = 240;\n const offset = (height - padding) / (height / 50);\n\n this.media.style.transform = `translateY(-${offset}%)`;\n }\n },\n\n // API Ready\n ready() {\n const player = this;\n\n // Get Vimeo params for the iframe\n const options = {\n loop: player.config.loop.active,\n autoplay: player.autoplay,\n // muted: player.muted,\n byline: false,\n portrait: false,\n title: false,\n speed: true,\n transparent: 0,\n gesture: 'media',\n playsinline: !this.config.fullscreen.iosNative,\n };\n const params = utils.buildUrlParams(options);\n\n // Get the source URL or ID\n let source = player.media.getAttribute('src');\n\n // Get from <div> if needed\n if (utils.is.empty(source)) {\n source = player.media.getAttribute(player.config.attributes.embed.id);\n }\n\n const id = utils.parseVimeoId(source);\n\n // Build an iframe\n const iframe = utils.createElement('iframe');\n const src = utils.format(player.config.urls.vimeo.iframe, id, params);\n iframe.setAttribute('src', src);\n iframe.setAttribute('allowfullscreen', '');\n iframe.setAttribute('allowtransparency', '');\n iframe.setAttribute('allow', 'autoplay');\n\n // Inject the package\n const wrapper = utils.createElement('div', { class: player.config.classNames.embedContainer });\n wrapper.appendChild(iframe);\n player.media = utils.replaceElement(wrapper, player.media);\n\n // Get poster image\n utils.fetch(utils.format(player.config.urls.vimeo.api, id), 'json').then(response => {\n if (utils.is.empty(response)) {\n return;\n }\n\n // Get the URL for thumbnail\n const url = new URL(response[0].thumbnail_large);\n\n // Get original image\n url.pathname = `${url.pathname.split('_')[0]}.jpg`;\n\n // Set and show poster\n ui.setPoster.call(player, url.href);\n });\n\n // Setup instance\n // https://github.com/vimeo/player.js\n player.embed = new window.Vimeo.Player(iframe, {\n autopause: player.config.autopause,\n muted: player.muted,\n });\n\n player.media.paused = true;\n player.media.currentTime = 0;\n\n // Disable native text track rendering\n if (player.supported.ui) {\n player.embed.disableTextTrack();\n }\n\n // Create a faux HTML5 API using the Vimeo API\n player.media.play = () => {\n assurePlaybackState.call(player, true);\n return player.embed.play();\n };\n\n player.media.pause = () => {\n assurePlaybackState.call(player, false);\n return player.embed.pause();\n };\n\n player.media.stop = () => {\n player.pause();\n player.currentTime = 0;\n };\n\n // Seeking\n let { currentTime } = player.media;\n Object.defineProperty(player.media, 'currentTime', {\n get() {\n return currentTime;\n },\n set(time) {\n // Vimeo will automatically play on seek if the video hasn't been played before\n\n // Get current paused state and volume etc\n const { embed, media, paused, volume } = player;\n const restorePause = paused && !embed.hasPlayed;\n\n // Set seeking state and trigger event\n media.seeking = true;\n utils.dispatchEvent.call(player, media, 'seeking');\n\n // If paused, mute until seek is complete\n Promise.resolve(restorePause && embed.setVolume(0))\n // Seek\n .then(() => embed.setCurrentTime(time))\n // Restore paused\n .then(() => restorePause && embed.pause())\n // Restore volume\n .then(() => restorePause && embed.setVolume(volume))\n .catch(() => {\n // Do nothing\n });\n },\n });\n\n // Playback speed\n let speed = player.config.speed.selected;\n Object.defineProperty(player.media, 'playbackRate', {\n get() {\n return speed;\n },\n set(input) {\n player.embed\n .setPlaybackRate(input)\n .then(() => {\n speed = input;\n utils.dispatchEvent.call(player, player.media, 'ratechange');\n })\n .catch(error => {\n // Hide menu item (and menu if empty)\n if (error.name === 'Error') {\n controls.setSpeedMenu.call(player, []);\n }\n });\n },\n });\n\n // Volume\n let { volume } = player.config;\n Object.defineProperty(player.media, 'volume', {\n get() {\n return volume;\n },\n set(input) {\n player.embed.setVolume(input).then(() => {\n volume = input;\n utils.dispatchEvent.call(player, player.media, 'volumechange');\n });\n },\n });\n\n // Muted\n let { muted } = player.config;\n Object.defineProperty(player.media, 'muted', {\n get() {\n return muted;\n },\n set(input) {\n const toggle = utils.is.boolean(input) ? input : false;\n\n player.embed.setVolume(toggle ? 0 : player.config.volume).then(() => {\n muted = toggle;\n utils.dispatchEvent.call(player, player.media, 'volumechange');\n });\n },\n });\n\n // Loop\n let { loop } = player.config;\n Object.defineProperty(player.media, 'loop', {\n get() {\n return loop;\n },\n set(input) {\n const toggle = utils.is.boolean(input) ? input : player.config.loop.active;\n\n player.embed.setLoop(toggle).then(() => {\n loop = toggle;\n });\n },\n });\n\n // Source\n let currentSrc;\n player.embed\n .getVideoUrl()\n .then(value => {\n currentSrc = value;\n })\n .catch(error => {\n this.debug.warn(error);\n });\n\n Object.defineProperty(player.media, 'currentSrc', {\n get() {\n return currentSrc;\n },\n });\n\n // Ended\n Object.defineProperty(player.media, 'ended', {\n get() {\n return player.currentTime === player.duration;\n },\n });\n\n // Set aspect ratio based on video size\n Promise.all([\n player.embed.getVideoWidth(),\n player.embed.getVideoHeight(),\n ]).then(dimensions => {\n const ratio = utils.getAspectRatio(dimensions[0], dimensions[1]);\n vimeo.setAspectRatio.call(this, ratio);\n });\n\n // Set autopause\n player.embed.setAutopause(player.config.autopause).then(state => {\n player.config.autopause = state;\n });\n\n // Get title\n player.embed.getVideoTitle().then(title => {\n player.config.title = title;\n ui.setTitle.call(this);\n });\n\n // Get current time\n player.embed.getCurrentTime().then(value => {\n currentTime = value;\n utils.dispatchEvent.call(player, player.media, 'timeupdate');\n });\n\n // Get duration\n player.embed.getDuration().then(value => {\n player.media.duration = value;\n utils.dispatchEvent.call(player, player.media, 'durationchange');\n });\n\n // Get captions\n player.embed.getTextTracks().then(tracks => {\n player.media.textTracks = tracks;\n captions.setup.call(player);\n });\n\n player.embed.on('cuechange', ({ cues = [] }) => {\n const strippedCues = cues.map(cue => utils.stripHTML(cue.text));\n captions.updateCues.call(player, strippedCues);\n });\n\n player.embed.on('loaded', () => {\n // Assure state and events are updated on autoplay\n player.embed.getPaused().then(paused => {\n assurePlaybackState.call(player, !paused);\n if (!paused) {\n utils.dispatchEvent.call(player, player.media, 'playing');\n }\n });\n\n if (utils.is.element(player.embed.element) && player.supported.ui) {\n const frame = player.embed.element;\n\n // Fix keyboard focus issues\n // https://github.com/sampotts/plyr/issues/317\n frame.setAttribute('tabindex', -1);\n }\n });\n\n player.embed.on('play', () => {\n assurePlaybackState.call(player, true);\n utils.dispatchEvent.call(player, player.media, 'playing');\n });\n\n player.embed.on('pause', () => {\n assurePlaybackState.call(player, false);\n });\n\n player.embed.on('timeupdate', data => {\n player.media.seeking = false;\n currentTime = data.seconds;\n utils.dispatchEvent.call(player, player.media, 'timeupdate');\n });\n\n player.embed.on('progress', data => {\n player.media.buffered = data.percent;\n utils.dispatchEvent.call(player, player.media, 'progress');\n\n // Check all loaded\n if (parseInt(data.percent, 10) === 1) {\n utils.dispatchEvent.call(player, player.media, 'canplaythrough');\n }\n\n // Get duration as if we do it before load, it gives an incorrect value\n // https://github.com/sampotts/plyr/issues/891\n player.embed.getDuration().then(value => {\n if (value !== player.media.duration) {\n player.media.duration = value;\n utils.dispatchEvent.call(player, player.media, 'durationchange');\n }\n });\n });\n\n player.embed.on('seeked', () => {\n player.media.seeking = false;\n utils.dispatchEvent.call(player, player.media, 'seeked');\n });\n\n player.embed.on('ended', () => {\n player.media.paused = true;\n utils.dispatchEvent.call(player, player.media, 'ended');\n });\n\n player.embed.on('error', detail => {\n player.media.error = detail;\n utils.dispatchEvent.call(player, player.media, 'error');\n });\n\n // Rebuild UI\n setTimeout(() => ui.build.call(player), 0);\n },\n};\n\nexport default vimeo;\n","// ==========================================================================\n// YouTube plugin\n// ==========================================================================\n\nimport controls from './../controls';\nimport ui from './../ui';\nimport utils from './../utils';\n\n// Standardise YouTube quality unit\nfunction mapQualityUnit(input) {\n switch (input) {\n case 'hd2160':\n return 2160;\n\n case 2160:\n return 'hd2160';\n\n case 'hd1440':\n return 1440;\n\n case 1440:\n return 'hd1440';\n\n case 'hd1080':\n return 1080;\n\n case 1080:\n return 'hd1080';\n\n case 'hd720':\n return 720;\n\n case 720:\n return 'hd720';\n\n case 'large':\n return 480;\n\n case 480:\n return 'large';\n\n case 'medium':\n return 360;\n\n case 360:\n return 'medium';\n\n case 'small':\n return 240;\n\n case 240:\n return 'small';\n\n default:\n return 'default';\n }\n}\n\nfunction mapQualityUnits(levels) {\n if (utils.is.empty(levels)) {\n return levels;\n }\n\n return utils.dedupe(levels.map(level => mapQualityUnit(level)));\n}\n\n// Set playback state and trigger change (only on actual change)\nfunction assurePlaybackState(play) {\n if (play && !this.embed.hasPlayed) {\n this.embed.hasPlayed = true;\n }\n if (this.media.paused === play) {\n this.media.paused = !play;\n utils.dispatchEvent.call(this, this.media, play ? 'play' : 'pause');\n }\n}\n\nconst youtube = {\n setup() {\n // Add embed class for responsive\n utils.toggleClass(this.elements.wrapper, this.config.classNames.embed, true);\n\n // Set aspect ratio\n youtube.setAspectRatio.call(this);\n\n // Setup API\n if (utils.is.object(window.YT) && utils.is.function(window.YT.Player)) {\n youtube.ready.call(this);\n } else {\n // Load the API\n utils.loadScript(this.config.urls.youtube.sdk).catch(error => {\n this.debug.warn('YouTube API failed to load', error);\n });\n\n // Setup callback for the API\n // YouTube has it's own system of course...\n window.onYouTubeReadyCallbacks = window.onYouTubeReadyCallbacks || [];\n\n // Add to queue\n window.onYouTubeReadyCallbacks.push(() => {\n youtube.ready.call(this);\n });\n\n // Set callback to process queue\n window.onYouTubeIframeAPIReady = () => {\n window.onYouTubeReadyCallbacks.forEach(callback => {\n callback();\n });\n };\n }\n },\n\n // Get the media title\n getTitle(videoId) {\n // Try via undocumented API method first\n // This method disappears now and then though...\n // https://github.com/sampotts/plyr/issues/709\n if (utils.is.function(this.embed.getVideoData)) {\n const { title } = this.embed.getVideoData();\n\n if (utils.is.empty(title)) {\n this.config.title = title;\n ui.setTitle.call(this);\n return;\n }\n }\n\n // Or via Google API\n const key = this.config.keys.google;\n if (utils.is.string(key) && !utils.is.empty(key)) {\n const url = utils.format(this.config.urls.youtube.api, videoId, key);\n\n utils\n .fetch(url)\n .then(result => {\n if (utils.is.object(result)) {\n this.config.title = result.items[0].snippet.title;\n ui.setTitle.call(this);\n }\n })\n .catch(() => {});\n }\n },\n\n // Set aspect ratio\n setAspectRatio() {\n const ratio = this.config.ratio.split(':');\n this.elements.wrapper.style.paddingBottom = `${100 / ratio[0] * ratio[1]}%`;\n },\n\n // API ready\n ready() {\n const player = this;\n\n // Ignore already setup (race condition)\n const currentId = player.media.getAttribute('id');\n if (!utils.is.empty(currentId) && currentId.startsWith('youtube-')) {\n return;\n }\n\n // Get the source URL or ID\n let source = player.media.getAttribute('src');\n\n // Get from <div> if needed\n if (utils.is.empty(source)) {\n source = player.media.getAttribute(this.config.attributes.embed.id);\n }\n\n // Replace the <iframe> with a <div> due to YouTube API issues\n const videoId = utils.parseYouTubeId(source);\n const id = utils.generateId(player.provider);\n const container = utils.createElement('div', { id });\n player.media = utils.replaceElement(container, player.media);\n\n // Set poster image\n const posterSrc = format => `https://img.youtube.com/vi/${videoId}/${format}default.jpg`;\n\n // Check thumbnail images in order of quality, but reject fallback thumbnails (120px wide)\n utils.loadImage(posterSrc('maxres'), 121) // Higest quality and unpadded\n .catch(() => utils.loadImage(posterSrc('sd'), 121)) // 480p padded 4:3\n .catch(() => utils.loadImage(posterSrc('hq'))) // 360p padded 4:3. Always exists\n .then(image => ui.setPoster.call(player, image.src))\n .then(posterSrc => {\n // If the image is padded, use background-size \"cover\" instead (like youtube does too with their posters)\n if (!posterSrc.includes('maxres')) {\n player.elements.poster.style.backgroundSize = 'cover';\n }\n });\n\n // Setup instance\n // https://developers.google.com/youtube/iframe_api_reference\n player.embed = new window.YT.Player(id, {\n videoId,\n playerVars: {\n autoplay: player.config.autoplay ? 1 : 0, // Autoplay\n controls: player.supported.ui ? 0 : 1, // Only show controls if not fully supported\n rel: 0, // No related vids\n showinfo: 0, // Hide info\n iv_load_policy: 3, // Hide annotations\n modestbranding: 1, // Hide logos as much as possible (they still show one in the corner when paused)\n disablekb: 1, // Disable keyboard as we handle it\n playsinline: 1, // Allow iOS inline playback\n\n // Tracking for stats\n // origin: window ? `${window.location.protocol}//${window.location.host}` : null,\n widget_referrer: window ? window.location.href : null,\n\n // Captions are flaky on YouTube\n cc_load_policy: player.captions.active ? 1 : 0,\n cc_lang_pref: player.config.captions.language,\n },\n events: {\n onError(event) {\n // If we've already fired an error, don't do it again\n // YouTube fires onError twice\n if (utils.is.object(player.media.error)) {\n return;\n }\n\n const detail = {\n code: event.data,\n };\n\n // Messages copied from https://developers.google.com/youtube/iframe_api_reference#onError\n switch (event.data) {\n case 2:\n detail.message =\n 'The request contains an invalid parameter value. For example, this error occurs if you specify a video ID that does not have 11 characters, or if the video ID contains invalid characters, such as exclamation points or asterisks.';\n break;\n\n case 5:\n detail.message =\n 'The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.';\n break;\n\n case 100:\n detail.message =\n 'The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.';\n break;\n\n case 101:\n case 150:\n detail.message = 'The owner of the requested video does not allow it to be played in embedded players.';\n break;\n\n default:\n detail.message = 'An unknown error occured';\n break;\n }\n\n player.media.error = detail;\n\n utils.dispatchEvent.call(player, player.media, 'error');\n },\n onPlaybackQualityChange() {\n utils.dispatchEvent.call(player, player.media, 'qualitychange', false, {\n quality: player.media.quality,\n });\n },\n onPlaybackRateChange(event) {\n // Get the instance\n const instance = event.target;\n\n // Get current speed\n player.media.playbackRate = instance.getPlaybackRate();\n\n utils.dispatchEvent.call(player, player.media, 'ratechange');\n },\n onReady(event) {\n // Get the instance\n const instance = event.target;\n\n // Get the title\n youtube.getTitle.call(player, videoId);\n\n // Create a faux HTML5 API using the YouTube API\n player.media.play = () => {\n assurePlaybackState.call(player, true);\n instance.playVideo();\n };\n\n player.media.pause = () => {\n assurePlaybackState.call(player, false);\n instance.pauseVideo();\n };\n\n player.media.stop = () => {\n instance.stopVideo();\n };\n\n player.media.duration = instance.getDuration();\n player.media.paused = true;\n\n // Seeking\n player.media.currentTime = 0;\n Object.defineProperty(player.media, 'currentTime', {\n get() {\n return Number(instance.getCurrentTime());\n },\n set(time) {\n // If paused, mute audio preventively (YouTube starts playing on seek if the video hasn't been played yet).\n if (player.paused) {\n player.embed.mute();\n }\n\n // Set seeking state and trigger event\n player.media.seeking = true;\n utils.dispatchEvent.call(player, player.media, 'seeking');\n\n // Seek after events sent\n instance.seekTo(time);\n },\n });\n\n // Playback speed\n Object.defineProperty(player.media, 'playbackRate', {\n get() {\n return instance.getPlaybackRate();\n },\n set(input) {\n instance.setPlaybackRate(input);\n },\n });\n\n // Quality\n Object.defineProperty(player.media, 'quality', {\n get() {\n return mapQualityUnit(instance.getPlaybackQuality());\n },\n set(input) {\n const quality = input;\n\n // Set via API\n instance.setPlaybackQuality(mapQualityUnit(quality));\n\n // Trigger request event\n utils.dispatchEvent.call(player, player.media, 'qualityrequested', false, {\n quality,\n });\n },\n });\n\n // Volume\n let { volume } = player.config;\n Object.defineProperty(player.media, 'volume', {\n get() {\n return volume;\n },\n set(input) {\n volume = input;\n instance.setVolume(volume * 100);\n utils.dispatchEvent.call(player, player.media, 'volumechange');\n },\n });\n\n // Muted\n let { muted } = player.config;\n Object.defineProperty(player.media, 'muted', {\n get() {\n return muted;\n },\n set(input) {\n const toggle = utils.is.boolean(input) ? input : muted;\n muted = toggle;\n instance[toggle ? 'mute' : 'unMute']();\n utils.dispatchEvent.call(player, player.media, 'volumechange');\n },\n });\n\n // Source\n Object.defineProperty(player.media, 'currentSrc', {\n get() {\n return instance.getVideoUrl();\n },\n });\n\n // Ended\n Object.defineProperty(player.media, 'ended', {\n get() {\n return player.currentTime === player.duration;\n },\n });\n\n // Get available speeds\n player.options.speed = instance.getAvailablePlaybackRates();\n\n // Set the tabindex to avoid focus entering iframe\n if (player.supported.ui) {\n player.media.setAttribute('tabindex', -1);\n }\n\n utils.dispatchEvent.call(player, player.media, 'timeupdate');\n utils.dispatchEvent.call(player, player.media, 'durationchange');\n\n // Reset timer\n clearInterval(player.timers.buffering);\n\n // Setup buffering\n player.timers.buffering = setInterval(() => {\n // Get loaded % from YouTube\n player.media.buffered = instance.getVideoLoadedFraction();\n\n // Trigger progress only when we actually buffer something\n if (player.media.lastBuffered === null || player.media.lastBuffered < player.media.buffered) {\n utils.dispatchEvent.call(player, player.media, 'progress');\n }\n\n // Set last buffer point\n player.media.lastBuffered = player.media.buffered;\n\n // Bail if we're at 100%\n if (player.media.buffered === 1) {\n clearInterval(player.timers.buffering);\n\n // Trigger event\n utils.dispatchEvent.call(player, player.media, 'canplaythrough');\n }\n }, 200);\n\n // Rebuild UI\n setTimeout(() => ui.build.call(player), 50);\n },\n onStateChange(event) {\n // Get the instance\n const instance = event.target;\n\n // Reset timer\n clearInterval(player.timers.playing);\n\n const seeked = player.media.seeking && [\n 1,\n 2,\n ].includes(event.data);\n\n if (seeked) {\n // Unset seeking and fire seeked event\n player.media.seeking = false;\n utils.dispatchEvent.call(player, player.media, 'seeked');\n }\n\n // Handle events\n // -1 Unstarted\n // 0 Ended\n // 1 Playing\n // 2 Paused\n // 3 Buffering\n // 5 Video cued\n switch (event.data) {\n case -1:\n // Update scrubber\n utils.dispatchEvent.call(player, player.media, 'timeupdate');\n\n // Get loaded % from YouTube\n player.media.buffered = instance.getVideoLoadedFraction();\n utils.dispatchEvent.call(player, player.media, 'progress');\n\n break;\n\n case 0:\n assurePlaybackState.call(player, false);\n\n // YouTube doesn't support loop for a single video, so mimick it.\n if (player.media.loop) {\n // YouTube needs a call to `stopVideo` before playing again\n instance.stopVideo();\n instance.playVideo();\n } else {\n utils.dispatchEvent.call(player, player.media, 'ended');\n }\n\n break;\n\n case 1:\n // Restore paused state (YouTube starts playing on seek if the video hasn't been played yet)\n if (player.media.paused && !player.embed.hasPlayed) {\n player.media.pause();\n } else {\n assurePlaybackState.call(player, true);\n\n utils.dispatchEvent.call(player, player.media, 'playing');\n\n // Poll to get playback progress\n player.timers.playing = setInterval(() => {\n utils.dispatchEvent.call(player, player.media, 'timeupdate');\n }, 50);\n\n // Check duration again due to YouTube bug\n // https://github.com/sampotts/plyr/issues/374\n // https://code.google.com/p/gdata-issues/issues/detail?id=8690\n if (player.media.duration !== instance.getDuration()) {\n player.media.duration = instance.getDuration();\n utils.dispatchEvent.call(player, player.media, 'durationchange');\n }\n\n // Get quality\n controls.setQualityMenu.call(player, mapQualityUnits(instance.getAvailableQualityLevels()));\n }\n\n break;\n\n case 2:\n // Restore audio (YouTube starts playing on seek if the video hasn't been played yet)\n if (!player.muted) {\n player.embed.unMute();\n }\n assurePlaybackState.call(player, false);\n\n break;\n\n default:\n break;\n }\n\n utils.dispatchEvent.call(player, player.elements.container, 'statechange', false, {\n code: event.data,\n });\n },\n },\n });\n },\n};\n\nexport default youtube;\n","// ==========================================================================\n// Plyr Media\n// ==========================================================================\n\nimport html5 from './html5';\nimport vimeo from './plugins/vimeo';\nimport youtube from './plugins/youtube';\nimport utils from './utils';\n\nconst media = {\n // Setup media\n setup() {\n // If there's no media, bail\n if (!this.media) {\n this.debug.warn('No media element found!');\n return;\n }\n\n // Add type class\n utils.toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', this.type), true);\n\n // Add provider class\n utils.toggleClass(this.elements.container, this.config.classNames.provider.replace('{0}', this.provider), true);\n\n // Add video class for embeds\n // This will require changes if audio embeds are added\n if (this.isEmbed) {\n utils.toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', 'video'), true);\n }\n\n // Inject the player wrapper\n if (this.isVideo) {\n // Create the wrapper div\n this.elements.wrapper = utils.createElement('div', {\n class: this.config.classNames.video,\n });\n\n // Wrap the video in a container\n utils.wrap(this.media, this.elements.wrapper);\n\n // Faux poster container\n this.elements.poster = utils.createElement('div', {\n class: this.config.classNames.poster,\n });\n\n this.elements.wrapper.appendChild(this.elements.poster);\n }\n\n if (this.isEmbed) {\n switch (this.provider) {\n case 'youtube':\n youtube.setup.call(this);\n break;\n\n case 'vimeo':\n vimeo.setup.call(this);\n break;\n\n default:\n break;\n }\n } else if (this.isHTML5) {\n html5.extend.call(this);\n }\n },\n};\n\nexport default media;\n","// ==========================================================================\n// Advertisement plugin using Google IMA HTML5 SDK\n// Create an account with our ad partner, vi here:\n// https://www.vi.ai/publisher-video-monetization/\n// ==========================================================================\n\n/* global google */\n\nimport i18n from '../i18n';\nimport utils from '../utils';\n\nclass Ads {\n /**\n * Ads constructor.\n * @param {object} player\n * @return {Ads}\n */\n constructor(player) {\n this.player = player;\n this.publisherId = player.config.ads.publisherId;\n this.playing = false;\n this.initialized = false;\n this.elements = {\n container: null,\n displayContainer: null,\n };\n this.manager = null;\n this.loader = null;\n this.cuePoints = null;\n this.events = {};\n this.safetyTimer = null;\n this.countdownTimer = null;\n\n // Setup a promise to resolve when the IMA manager is ready\n this.managerPromise = new Promise((resolve, reject) => {\n // The ad is loaded and ready\n this.on('loaded', resolve);\n\n // Ads failed\n this.on('error', reject);\n });\n\n this.load();\n }\n\n get enabled() {\n return this.player.isVideo && this.player.config.ads.enabled && !utils.is.empty(this.publisherId);\n }\n\n /**\n * Load the IMA SDK\n */\n load() {\n if (this.enabled) {\n // Check if the Google IMA3 SDK is loaded or load it ourselves\n if (!utils.is.object(window.google) || !utils.is.object(window.google.ima)) {\n utils\n .loadScript(this.player.config.urls.googleIMA.sdk)\n .then(() => {\n this.ready();\n })\n .catch(() => {\n // Script failed to load or is blocked\n this.trigger('error', new Error('Google IMA SDK failed to load'));\n });\n } else {\n this.ready();\n }\n }\n }\n\n /**\n * Get the ads instance ready\n */\n ready() {\n // Start ticking our safety timer. If the whole advertisement\n // thing doesn't resolve within our set time; we bail\n this.startSafetyTimer(12000, 'ready()');\n\n // Clear the safety timer\n this.managerPromise.then(() => {\n this.clearSafetyTimer('onAdsManagerLoaded()');\n });\n\n // Set listeners on the Plyr instance\n this.listeners();\n\n // Setup the IMA SDK\n this.setupIMA();\n }\n\n // Build the default tag URL\n get tagUrl() {\n const params = {\n AV_PUBLISHERID: '58c25bb0073ef448b1087ad6',\n AV_CHANNELID: '5a0458dc28a06145e4519d21',\n AV_URL: location.hostname,\n cb: Date.now(),\n AV_WIDTH: 640,\n AV_HEIGHT: 480,\n AV_CDIM2: this.publisherId,\n };\n\n const base = 'https://go.aniview.com/api/adserver6/vast/';\n\n return `${base}?${utils.buildUrlParams(params)}`;\n }\n\n /**\n * In order for the SDK to display ads for our video, we need to tell it where to put them,\n * so here we define our ad container. This div is set up to render on top of the video player.\n * Using the code below, we tell the SDK to render ads within that div. We also provide a\n * handle to the content video player - the SDK will poll the current time of our player to\n * properly place mid-rolls. After we create the ad display container, we initialize it. On\n * mobile devices, this initialization is done as the result of a user action.\n */\n setupIMA() {\n // Create the container for our advertisements\n this.elements.container = utils.createElement('div', {\n class: this.player.config.classNames.ads,\n });\n this.player.elements.container.appendChild(this.elements.container);\n\n // So we can run VPAID2\n google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED);\n\n // Set language\n google.ima.settings.setLocale(this.player.config.ads.language);\n\n // We assume the adContainer is the video container of the plyr element\n // that will house the ads\n this.elements.displayContainer = new google.ima.AdDisplayContainer(this.elements.container);\n\n // Request video ads to be pre-loaded\n this.requestAds();\n }\n\n /**\n * Request advertisements\n */\n requestAds() {\n const { container } = this.player.elements;\n\n try {\n // Create ads loader\n this.loader = new google.ima.AdsLoader(this.elements.displayContainer);\n\n // Listen and respond to ads loaded and error events\n this.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, event => this.onAdsManagerLoaded(event), false);\n this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, error => this.onAdError(error), false);\n\n // Request video ads\n const request = new google.ima.AdsRequest();\n request.adTagUrl = this.tagUrl;\n\n // Specify the linear and nonlinear slot sizes. This helps the SDK\n // to select the correct creative if multiple are returned\n request.linearAdSlotWidth = container.offsetWidth;\n request.linearAdSlotHeight = container.offsetHeight;\n request.nonLinearAdSlotWidth = container.offsetWidth;\n request.nonLinearAdSlotHeight = container.offsetHeight;\n\n // We only overlay ads as we only support video.\n request.forceNonLinearFullSlot = false;\n\n // Mute based on current state\n request.setAdWillPlayMuted(!this.player.muted);\n\n this.loader.requestAds(request);\n } catch (e) {\n this.onAdError(e);\n }\n }\n\n /**\n * Update the ad countdown\n * @param {boolean} start\n */\n pollCountdown(start = false) {\n if (!start) {\n clearInterval(this.countdownTimer);\n this.elements.container.removeAttribute('data-badge-text');\n return;\n }\n\n const update = () => {\n const time = utils.formatTime(Math.max(this.manager.getRemainingTime(), 0));\n const label = `${i18n.get('advertisement', this.player.config)} - ${time}`;\n this.elements.container.setAttribute('data-badge-text', label);\n };\n\n this.countdownTimer = setInterval(update, 100);\n }\n\n /**\n * This method is called whenever the ads are ready inside the AdDisplayContainer\n * @param {Event} adsManagerLoadedEvent\n */\n onAdsManagerLoaded(event) {\n // Get the ads manager\n const settings = new google.ima.AdsRenderingSettings();\n\n // Tell the SDK to save and restore content video state on our behalf\n settings.restoreCustomPlaybackStateOnAdBreakComplete = true;\n settings.enablePreloading = true;\n\n // The SDK is polling currentTime on the contentPlayback. And needs a duration\n // so it can determine when to start the mid- and post-roll\n this.manager = event.getAdsManager(this.player, settings);\n\n // Get the cue points for any mid-rolls by filtering out the pre- and post-roll\n this.cuePoints = this.manager.getCuePoints();\n\n // Add advertisement cue's within the time line if available\n if (!utils.is.empty(this.cuePoints)) {\n this.cuePoints.forEach(cuePoint => {\n if (cuePoint !== 0 && cuePoint !== -1 && cuePoint < this.player.duration) {\n const seekElement = this.player.elements.progress;\n\n if (utils.is.element(seekElement)) {\n const cuePercentage = 100 / this.player.duration * cuePoint;\n const cue = utils.createElement('span', {\n class: this.player.config.classNames.cues,\n });\n\n cue.style.left = `${cuePercentage.toString()}%`;\n seekElement.appendChild(cue);\n }\n }\n });\n }\n\n // Get skippable state\n // TODO: Skip button\n // this.player.debug.warn(this.manager.getAdSkippableState());\n\n // Set volume to match player\n this.manager.setVolume(this.player.volume);\n\n // Add listeners to the required events\n // Advertisement error events\n this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, error => this.onAdError(error));\n\n // Advertisement regular events\n Object.keys(google.ima.AdEvent.Type).forEach(type => {\n this.manager.addEventListener(google.ima.AdEvent.Type[type], event => this.onAdEvent(event));\n });\n\n // Resolve our adsManager\n this.trigger('loaded');\n }\n\n /**\n * This is where all the event handling takes place. Retrieve the ad from the event. Some\n * events (e.g. ALL_ADS_COMPLETED) don't have the ad object associated\n * https://developers.google.com/interactive-media-ads/docs/sdks/html5/v3/apis#ima.AdEvent.Type\n * @param {Event} event\n */\n onAdEvent(event) {\n const { container } = this.player.elements;\n\n // Retrieve the ad from the event. Some events (e.g. ALL_ADS_COMPLETED)\n // don't have ad object associated\n const ad = event.getAd();\n\n // Proxy event\n const dispatchEvent = type => {\n const event = `ads${type.replace(/_/g, '').toLowerCase()}`;\n utils.dispatchEvent.call(this.player, this.player.media, event);\n };\n\n switch (event.type) {\n case google.ima.AdEvent.Type.LOADED:\n // This is the first event sent for an ad - it is possible to determine whether the\n // ad is a video ad or an overlay\n this.trigger('loaded');\n\n // Bubble event\n dispatchEvent(event.type);\n\n // Start countdown\n this.pollCountdown(true);\n\n if (!ad.isLinear()) {\n // Position AdDisplayContainer correctly for overlay\n ad.width = container.offsetWidth;\n ad.height = container.offsetHeight;\n }\n\n // console.info('Ad type: ' + event.getAd().getAdPodInfo().getPodIndex());\n // console.info('Ad time: ' + event.getAd().getAdPodInfo().getTimeOffset());\n break;\n\n case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:\n // All ads for the current videos are done. We can now request new advertisements\n // in case the video is re-played\n\n // Fire event\n dispatchEvent(event.type);\n\n // TODO: Example for what happens when a next video in a playlist would be loaded.\n // So here we load a new video when all ads are done.\n // Then we load new ads within a new adsManager. When the video\n // Is started - after - the ads are loaded, then we get ads.\n // You can also easily test cancelling and reloading by running\n // player.ads.cancel() and player.ads.play from the console I guess.\n // this.player.source = {\n // type: 'video',\n // title: 'View From A Blue Moon',\n // sources: [{\n // src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.mp4', type:\n // 'video/mp4', }], poster:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg', tracks:\n // [ { kind: 'captions', label: 'English', srclang: 'en', src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt',\n // default: true, }, { kind: 'captions', label: 'French', srclang: 'fr', src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt', }, ],\n // };\n\n // TODO: So there is still this thing where a video should only be allowed to start\n // playing when the IMA SDK is ready or has failed\n\n this.loadAds();\n break;\n\n case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:\n // This event indicates the ad has started - the video player can adjust the UI,\n // for example display a pause button and remaining time. Fired when content should\n // be paused. This usually happens right before an ad is about to cover the content\n\n dispatchEvent(event.type);\n\n this.pauseContent();\n\n break;\n\n case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:\n // This event indicates the ad has finished - the video player can perform\n // appropriate UI actions, such as removing the timer for remaining time detection.\n // Fired when content should be resumed. This usually happens when an ad finishes\n // or collapses\n\n dispatchEvent(event.type);\n\n this.pollCountdown();\n\n this.resumeContent();\n\n break;\n\n case google.ima.AdEvent.Type.STARTED:\n case google.ima.AdEvent.Type.MIDPOINT:\n case google.ima.AdEvent.Type.COMPLETE:\n case google.ima.AdEvent.Type.IMPRESSION:\n case google.ima.AdEvent.Type.CLICK:\n dispatchEvent(event.type);\n break;\n\n default:\n break;\n }\n }\n\n /**\n * Any ad error handling comes through here\n * @param {Event} event\n */\n onAdError(event) {\n this.cancel();\n this.player.debug.warn('Ads error', event);\n }\n\n /**\n * Setup hooks for Plyr and window events. This ensures\n * the mid- and post-roll launch at the correct time. And\n * resize the advertisement when the player resizes\n */\n listeners() {\n const { container } = this.player.elements;\n let time;\n\n // Add listeners to the required events\n this.player.on('ended', () => {\n this.loader.contentComplete();\n });\n\n this.player.on('seeking', () => {\n time = this.player.currentTime;\n return time;\n });\n\n this.player.on('seeked', () => {\n const seekedTime = this.player.currentTime;\n\n if (utils.is.empty(this.cuePoints)) {\n return;\n }\n\n this.cuePoints.forEach((cuePoint, index) => {\n if (time < cuePoint && cuePoint < seekedTime) {\n this.manager.discardAdBreak();\n this.cuePoints.splice(index, 1);\n }\n });\n });\n\n // Listen to the resizing of the window. And resize ad accordingly\n // TODO: eventually implement ResizeObserver\n window.addEventListener('resize', () => {\n if (this.manager) {\n this.manager.resize(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);\n }\n });\n }\n\n /**\n * Initialize the adsManager and start playing advertisements\n */\n play() {\n const { container } = this.player.elements;\n\n if (!this.managerPromise) {\n this.resumeContent();\n }\n\n // Play the requested advertisement whenever the adsManager is ready\n this.managerPromise\n .then(() => {\n // Initialize the container. Must be done via a user action on mobile devices\n this.elements.displayContainer.initialize();\n\n try {\n if (!this.initialized) {\n // Initialize the ads manager. Ad rules playlist will start at this time\n this.manager.init(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);\n\n // Call play to start showing the ad. Single video and overlay ads will\n // start at this time; the call will be ignored for ad rules\n this.manager.start();\n }\n\n this.initialized = true;\n } catch (adError) {\n // An error may be thrown if there was a problem with the\n // VAST response\n this.onAdError(adError);\n }\n })\n .catch(() => {});\n }\n\n /**\n * Resume our video\n */\n resumeContent() {\n // Hide the advertisement container\n this.elements.container.style.zIndex = '';\n\n // Ad is stopped\n this.playing = false;\n\n // Play our video\n if (this.player.currentTime < this.player.duration) {\n this.player.play();\n }\n }\n\n /**\n * Pause our video\n */\n pauseContent() {\n // Show the advertisement container\n this.elements.container.style.zIndex = 3;\n\n // Ad is playing.\n this.playing = true;\n\n // Pause our video.\n this.player.pause();\n }\n\n /**\n * Destroy the adsManager so we can grab new ads after this. If we don't then we're not\n * allowed to call new ads based on google policies, as they interpret this as an accidental\n * video requests. https://developers.google.com/interactive-\n * media-ads/docs/sdks/android/faq#8\n */\n cancel() {\n // Pause our video\n if (this.initialized) {\n this.resumeContent();\n }\n\n // Tell our instance that we're done for now\n this.trigger('error');\n\n // Re-create our adsManager\n this.loadAds();\n }\n\n /**\n * Re-create our adsManager\n */\n loadAds() {\n // Tell our adsManager to go bye bye\n this.managerPromise\n .then(() => {\n // Destroy our adsManager\n if (this.manager) {\n this.manager.destroy();\n }\n\n // Re-set our adsManager promises\n this.managerPromise = new Promise(resolve => {\n this.on('loaded', resolve);\n this.player.debug.log(this.manager);\n });\n\n // Now request some new advertisements\n this.requestAds();\n })\n .catch(() => {});\n }\n\n /**\n * Handles callbacks after an ad event was invoked\n * @param {string} event - Event type\n */\n trigger(event, ...args) {\n const handlers = this.events[event];\n\n if (utils.is.array(handlers)) {\n handlers.forEach(handler => {\n if (utils.is.function(handler)) {\n handler.apply(this, args);\n }\n });\n }\n }\n\n /**\n * Add event listeners\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n * @return {Ads}\n */\n on(event, callback) {\n if (!utils.is.array(this.events[event])) {\n this.events[event] = [];\n }\n\n this.events[event].push(callback);\n\n return this;\n }\n\n /**\n * Setup a safety timer for when the ad network doesn't respond for whatever reason.\n * The advertisement has 12 seconds to get its things together. We stop this timer when the\n * advertisement is playing, or when a user action is required to start, then we clear the\n * timer on ad ready\n * @param {number} time\n * @param {string} from\n */\n startSafetyTimer(time, from) {\n this.player.debug.log(`Safety timer invoked from: ${from}`);\n\n this.safetyTimer = setTimeout(() => {\n this.cancel();\n this.clearSafetyTimer('startSafetyTimer()');\n }, time);\n }\n\n /**\n * Clear our safety timer(s)\n * @param {string} from\n */\n clearSafetyTimer(from) {\n if (!utils.is.nullOrUndefined(this.safetyTimer)) {\n this.player.debug.log(`Safety timer cleared from: ${from}`);\n\n clearTimeout(this.safetyTimer);\n this.safetyTimer = null;\n }\n }\n}\n\nexport default Ads;\n","// ==========================================================================\n// Plyr source update\n// ==========================================================================\n\nimport html5 from './html5';\nimport media from './media';\nimport support from './support';\nimport { providers } from './types';\nimport ui from './ui';\nimport utils from './utils';\n\nconst source = {\n // Add elements to HTML5 media (source, tracks, etc)\n insertElements(type, attributes) {\n if (utils.is.string(attributes)) {\n utils.insertElement(type, this.media, {\n src: attributes,\n });\n } else if (utils.is.array(attributes)) {\n attributes.forEach(attribute => {\n utils.insertElement(type, this.media, attribute);\n });\n }\n },\n\n // Update source\n // Sources are not checked for support so be careful\n change(input) {\n if (!utils.is.object(input) || !('sources' in input) || !input.sources.length) {\n this.debug.warn('Invalid source format');\n return;\n }\n\n // Cancel current network requests\n html5.cancelRequests.call(this);\n\n // Destroy instance and re-setup\n this.destroy.call(\n this,\n () => {\n // Reset quality options\n this.options.quality = [];\n\n // Remove elements\n utils.removeElement(this.media);\n this.media = null;\n\n // Reset class name\n if (utils.is.element(this.elements.container)) {\n this.elements.container.removeAttribute('class');\n }\n\n // Set the type and provider\n this.type = input.type;\n this.provider = !utils.is.empty(input.sources[0].provider) ? input.sources[0].provider : providers.html5;\n\n // Check for support\n this.supported = support.check(this.type, this.provider, this.config.playsinline);\n\n // Create new markup\n switch (`${this.provider}:${this.type}`) {\n case 'html5:video':\n this.media = utils.createElement('video');\n break;\n\n case 'html5:audio':\n this.media = utils.createElement('audio');\n break;\n\n case 'youtube:video':\n case 'vimeo:video':\n this.media = utils.createElement('div', {\n src: input.sources[0].src,\n });\n break;\n\n default:\n break;\n }\n\n // Inject the new element\n this.elements.container.appendChild(this.media);\n\n // Autoplay the new source?\n if (utils.is.boolean(input.autoplay)) {\n this.config.autoplay = input.autoplay;\n }\n\n // Set attributes for audio and video\n if (this.isHTML5) {\n if (this.config.crossorigin) {\n this.media.setAttribute('crossorigin', '');\n }\n if (this.config.autoplay) {\n this.media.setAttribute('autoplay', '');\n }\n if (!utils.is.empty(input.poster)) {\n this.poster = input.poster;\n }\n if (this.config.loop.active) {\n this.media.setAttribute('loop', '');\n }\n if (this.config.muted) {\n this.media.setAttribute('muted', '');\n }\n if (this.config.playsinline) {\n this.media.setAttribute('playsinline', '');\n }\n }\n\n // Restore class hook\n ui.addStyleHook.call(this);\n\n // Set new sources for html5\n if (this.isHTML5) {\n source.insertElements.call(this, 'source', input.sources);\n }\n\n // Set video title\n this.config.title = input.title;\n\n // Set up from scratch\n media.setup.call(this);\n\n // HTML5 stuff\n if (this.isHTML5) {\n // Setup captions\n if ('tracks' in input) {\n source.insertElements.call(this, 'track', input.tracks);\n }\n\n // Load HTML5 sources\n this.media.load();\n }\n\n // If HTML5 or embed but not fully supported, setupInterface and call ready now\n if (this.isHTML5 || (this.isEmbed && !this.supported.ui)) {\n // Setup interface\n ui.build.call(this);\n }\n\n // Update the fullscreen support\n this.fullscreen.update();\n },\n true,\n );\n },\n};\n\nexport default source;\n","// ==========================================================================\n// Plyr\n// plyr.js v3.3.12\n// https://github.com/sampotts/plyr\n// License: The MIT License (MIT)\n// ==========================================================================\n\nimport captions from './captions';\nimport Console from './console';\nimport controls from './controls';\nimport defaults from './defaults';\nimport Fullscreen from './fullscreen';\nimport Listeners from './listeners';\nimport media from './media';\nimport Ads from './plugins/ads';\nimport source from './source';\nimport Storage from './storage';\nimport support from './support';\nimport { providers, types } from './types';\nimport ui from './ui';\nimport utils from './utils';\n\n// Private properties\n// TODO: Use a WeakMap for private globals\n// const globals = new WeakMap();\n\n// Plyr instance\nclass Plyr {\n constructor(target, options) {\n this.timers = {};\n\n // State\n this.ready = false;\n this.loading = false;\n this.failed = false;\n\n // Touch device\n this.touch = support.touch;\n\n // Set the media element\n this.media = target;\n\n // String selector passed\n if (utils.is.string(this.media)) {\n this.media = document.querySelectorAll(this.media);\n }\n\n // jQuery, NodeList or Array passed, use first element\n if ((window.jQuery && this.media instanceof jQuery) || utils.is.nodeList(this.media) || utils.is.array(this.media)) {\n // eslint-disable-next-line\n this.media = this.media[0];\n }\n\n // Set config\n this.config = utils.extend(\n {},\n defaults,\n Plyr.defaults,\n options || {},\n (() => {\n try {\n return JSON.parse(this.media.getAttribute('data-plyr-config'));\n } catch (e) {\n return {};\n }\n })(),\n );\n\n // Elements cache\n this.elements = {\n container: null,\n buttons: {},\n display: {},\n progress: {},\n inputs: {},\n settings: {\n menu: null,\n panes: {},\n tabs: {},\n },\n captions: null,\n };\n\n // Captions\n this.captions = {\n active: null,\n currentTrack: -1,\n meta: new WeakMap(),\n };\n\n // Fullscreen\n this.fullscreen = {\n active: false,\n };\n\n // Options\n this.options = {\n speed: [],\n quality: [],\n };\n\n // Debugging\n // TODO: move to globals\n this.debug = new Console(this.config.debug);\n\n // Log config options and support\n this.debug.log('Config', this.config);\n this.debug.log('Support', support);\n\n // We need an element to setup\n if (utils.is.nullOrUndefined(this.media) || !utils.is.element(this.media)) {\n this.debug.error('Setup failed: no suitable element passed');\n return;\n }\n\n // Bail if the element is initialized\n if (this.media.plyr) {\n this.debug.warn('Target already setup');\n return;\n }\n\n // Bail if not enabled\n if (!this.config.enabled) {\n this.debug.error('Setup failed: disabled by config');\n return;\n }\n\n // Bail if disabled or no basic support\n // You may want to disable certain UAs etc\n if (!support.check().api) {\n this.debug.error('Setup failed: no support');\n return;\n }\n\n // Cache original element state for .destroy()\n const clone = this.media.cloneNode(true);\n clone.autoplay = false;\n this.elements.original = clone;\n\n // Set media type based on tag or data attribute\n // Supported: video, audio, vimeo, youtube\n const type = this.media.tagName.toLowerCase();\n\n // Embed properties\n let iframe = null;\n let url = null;\n let params = null;\n\n // Different setup based on type\n switch (type) {\n case 'div':\n // Find the frame\n iframe = this.media.querySelector('iframe');\n\n // <iframe> type\n if (utils.is.element(iframe)) {\n // Detect provider\n url = iframe.getAttribute('src');\n this.provider = utils.getProviderByUrl(url);\n\n // Rework elements\n this.elements.container = this.media;\n this.media = iframe;\n\n // Reset classname\n this.elements.container.className = '';\n\n // Get attributes from URL and set config\n params = utils.getUrlParams(url);\n if (!utils.is.empty(params)) {\n const truthy = [\n '1',\n 'true',\n ];\n\n if (truthy.includes(params.autoplay)) {\n this.config.autoplay = true;\n }\n if (truthy.includes(params.loop)) {\n this.config.loop.active = true;\n }\n\n // TODO: replace fullscreen.iosNative with this playsinline config option\n // YouTube requires the playsinline in the URL\n if (this.isYouTube) {\n this.config.playsinline = truthy.includes(params.playsinline);\n } else {\n this.config.playsinline = true;\n }\n }\n } else {\n // <div> with attributes\n this.provider = this.media.getAttribute(this.config.attributes.embed.provider);\n\n // Remove attribute\n this.media.removeAttribute(this.config.attributes.embed.provider);\n }\n\n // Unsupported or missing provider\n if (utils.is.empty(this.provider) || !Object.keys(providers).includes(this.provider)) {\n this.debug.error('Setup failed: Invalid provider');\n return;\n }\n\n // Audio will come later for external providers\n this.type = types.video;\n\n break;\n\n case 'video':\n case 'audio':\n this.type = type;\n this.provider = providers.html5;\n\n // Get config from attributes\n if (this.media.hasAttribute('crossorigin')) {\n this.config.crossorigin = true;\n }\n if (this.media.hasAttribute('autoplay')) {\n this.config.autoplay = true;\n }\n if (this.media.hasAttribute('playsinline')) {\n this.config.playsinline = true;\n }\n if (this.media.hasAttribute('muted')) {\n this.config.muted = true;\n }\n if (this.media.hasAttribute('loop')) {\n this.config.loop.active = true;\n }\n\n break;\n\n default:\n this.debug.error('Setup failed: unsupported type');\n return;\n }\n\n // Check for support again but with type\n this.supported = support.check(this.type, this.provider, this.config.playsinline);\n\n // If no support for even API, bail\n if (!this.supported.api) {\n this.debug.error('Setup failed: no support');\n return;\n }\n\n // Create listeners\n this.listeners = new Listeners(this);\n\n // Setup local storage for user settings\n this.storage = new Storage(this);\n\n // Store reference\n this.media.plyr = this;\n\n // Wrap media\n if (!utils.is.element(this.elements.container)) {\n this.elements.container = utils.createElement('div');\n utils.wrap(this.media, this.elements.container);\n }\n\n // Add style hook\n ui.addStyleHook.call(this);\n\n // Setup media\n media.setup.call(this);\n\n // Listen for events if debugging\n if (this.config.debug) {\n utils.on(this.elements.container, this.config.events.join(' '), event => {\n this.debug.log(`event: ${event.type}`);\n });\n }\n\n // Setup interface\n // If embed but not fully supported, build interface now to avoid flash of controls\n if (this.isHTML5 || (this.isEmbed && !this.supported.ui)) {\n ui.build.call(this);\n }\n\n // Container listeners\n this.listeners.container();\n\n // Global listeners\n this.listeners.global();\n\n // Setup fullscreen\n this.fullscreen = new Fullscreen(this);\n\n // Setup ads if provided\n this.ads = new Ads(this);\n\n // Autoplay if required\n if (this.config.autoplay) {\n this.play();\n }\n }\n\n // ---------------------------------------\n // API\n // ---------------------------------------\n\n /**\n * Types and provider helpers\n */\n get isHTML5() {\n return Boolean(this.provider === providers.html5);\n }\n get isEmbed() {\n return Boolean(this.isYouTube || this.isVimeo);\n }\n get isYouTube() {\n return Boolean(this.provider === providers.youtube);\n }\n get isVimeo() {\n return Boolean(this.provider === providers.vimeo);\n }\n get isVideo() {\n return Boolean(this.type === types.video);\n }\n get isAudio() {\n return Boolean(this.type === types.audio);\n }\n\n /**\n * Play the media, or play the advertisement (if they are not blocked)\n */\n play() {\n if (!utils.is.function(this.media.play)) {\n return null;\n }\n\n // Return the promise (for HTML5)\n return this.media.play();\n }\n\n /**\n * Pause the media\n */\n pause() {\n if (!this.playing || !utils.is.function(this.media.pause)) {\n return;\n }\n\n this.media.pause();\n }\n\n /**\n * Get playing state\n */\n get playing() {\n return Boolean(this.ready && !this.paused && !this.ended);\n }\n\n /**\n * Get paused state\n */\n get paused() {\n return Boolean(this.media.paused);\n }\n\n /**\n * Get stopped state\n */\n get stopped() {\n return Boolean(this.paused && this.currentTime === 0);\n }\n\n /**\n * Get ended state\n */\n get ended() {\n return Boolean(this.media.ended);\n }\n\n /**\n * Toggle playback based on current status\n * @param {boolean} input\n */\n togglePlay(input) {\n // Toggle based on current state if nothing passed\n const toggle = utils.is.boolean(input) ? input : !this.playing;\n\n if (toggle) {\n this.play();\n } else {\n this.pause();\n }\n }\n\n /**\n * Stop playback\n */\n stop() {\n if (this.isHTML5) {\n this.pause();\n this.restart();\n } else if (utils.is.function(this.media.stop)) {\n this.media.stop();\n }\n }\n\n /**\n * Restart playback\n */\n restart() {\n this.currentTime = 0;\n }\n\n /**\n * Rewind\n * @param {number} seekTime - how far to rewind in seconds. Defaults to the config.seekTime\n */\n rewind(seekTime) {\n this.currentTime = this.currentTime - (utils.is.number(seekTime) ? seekTime : this.config.seekTime);\n }\n\n /**\n * Fast forward\n * @param {number} seekTime - how far to fast forward in seconds. Defaults to the config.seekTime\n */\n forward(seekTime) {\n this.currentTime = this.currentTime + (utils.is.number(seekTime) ? seekTime : this.config.seekTime);\n }\n\n /**\n * Seek to a time\n * @param {number} input - where to seek to in seconds. Defaults to 0 (the start)\n */\n set currentTime(input) {\n // Bail if media duration isn't available yet\n if (!this.duration) {\n return;\n }\n\n // Validate input\n const inputIsValid = utils.is.number(input) && input > 0;\n\n // Set\n this.media.currentTime = inputIsValid ? Math.min(input, this.duration) : 0;\n\n // Logging\n this.debug.log(`Seeking to ${this.currentTime} seconds`);\n }\n\n /**\n * Get current time\n */\n get currentTime() {\n return Number(this.media.currentTime);\n }\n\n /**\n * Get buffered\n */\n get buffered() {\n const { buffered } = this.media;\n\n // YouTube / Vimeo return a float between 0-1\n if (utils.is.number(buffered)) {\n return buffered;\n }\n\n // HTML5\n // TODO: Handle buffered chunks of the media\n // (i.e. seek to another section buffers only that section)\n if (buffered && buffered.length && this.duration > 0) {\n return buffered.end(0) / this.duration;\n }\n\n return 0;\n }\n\n /**\n * Get seeking status\n */\n get seeking() {\n return Boolean(this.media.seeking);\n }\n\n /**\n * Get the duration of the current media\n */\n get duration() {\n // Faux duration set via config\n const fauxDuration = parseFloat(this.config.duration);\n\n // Media duration can be NaN before the media has loaded\n const duration = (this.media || {}).duration || 0;\n\n // If config duration is funky, use regular duration\n return fauxDuration || duration;\n }\n\n /**\n * Set the player volume\n * @param {number} value - must be between 0 and 1. Defaults to the value from local storage and config.volume if not set in storage\n */\n set volume(value) {\n let volume = value;\n const max = 1;\n const min = 0;\n\n if (utils.is.string(volume)) {\n volume = Number(volume);\n }\n\n // Load volume from storage if no value specified\n if (!utils.is.number(volume)) {\n volume = this.storage.get('volume');\n }\n\n // Use config if all else fails\n if (!utils.is.number(volume)) {\n ({ volume } = this.config);\n }\n\n // Maximum is volumeMax\n if (volume > max) {\n volume = max;\n }\n // Minimum is volumeMin\n if (volume < min) {\n volume = min;\n }\n\n // Update config\n this.config.volume = volume;\n\n // Set the player volume\n this.media.volume = volume;\n\n // If muted, and we're increasing volume manually, reset muted state\n if (!utils.is.empty(value) && this.muted && volume > 0) {\n this.muted = false;\n }\n }\n\n /**\n * Get the current player volume\n */\n get volume() {\n return Number(this.media.volume);\n }\n\n /**\n * Increase volume\n * @param {boolean} step - How much to decrease by (between 0 and 1)\n */\n increaseVolume(step) {\n const volume = this.media.muted ? 0 : this.volume;\n this.volume = volume + (utils.is.number(step) ? step : 1);\n }\n\n /**\n * Decrease volume\n * @param {boolean} step - How much to decrease by (between 0 and 1)\n */\n decreaseVolume(step) {\n const volume = this.media.muted ? 0 : this.volume;\n this.volume = volume - (utils.is.number(step) ? step : 1);\n }\n\n /**\n * Set muted state\n * @param {boolean} mute\n */\n set muted(mute) {\n let toggle = mute;\n\n // Load muted state from storage\n if (!utils.is.boolean(toggle)) {\n toggle = this.storage.get('muted');\n }\n\n // Use config if all else fails\n if (!utils.is.boolean(toggle)) {\n toggle = this.config.muted;\n }\n\n // Update config\n this.config.muted = toggle;\n\n // Set mute on the player\n this.media.muted = toggle;\n }\n\n /**\n * Get current muted state\n */\n get muted() {\n return Boolean(this.media.muted);\n }\n\n /**\n * Check if the media has audio\n */\n get hasAudio() {\n // Assume yes for all non HTML5 (as we can't tell...)\n if (!this.isHTML5) {\n return true;\n }\n\n if (this.isAudio) {\n return true;\n }\n\n // Get audio tracks\n return (\n Boolean(this.media.mozHasAudio) ||\n Boolean(this.media.webkitAudioDecodedByteCount) ||\n Boolean(this.media.audioTracks && this.media.audioTracks.length)\n );\n }\n\n /**\n * Set playback speed\n * @param {number} speed - the speed of playback (0.5-2.0)\n */\n set speed(input) {\n let speed = null;\n\n if (utils.is.number(input)) {\n speed = input;\n }\n\n if (!utils.is.number(speed)) {\n speed = this.storage.get('speed');\n }\n\n if (!utils.is.number(speed)) {\n speed = this.config.speed.selected;\n }\n\n // Set min/max\n if (speed < 0.1) {\n speed = 0.1;\n }\n if (speed > 2.0) {\n speed = 2.0;\n }\n\n if (!this.config.speed.options.includes(speed)) {\n this.debug.warn(`Unsupported speed (${speed})`);\n return;\n }\n\n // Update config\n this.config.speed.selected = speed;\n\n // Set media speed\n this.media.playbackRate = speed;\n }\n\n /**\n * Get current playback speed\n */\n get speed() {\n return Number(this.media.playbackRate);\n }\n\n /**\n * Set playback quality\n * Currently HTML5 & YouTube only\n * @param {number} input - Quality level\n */\n set quality(input) {\n let quality = null;\n\n if (!utils.is.empty(input)) {\n quality = Number(input);\n }\n\n if (!utils.is.number(quality)) {\n quality = this.storage.get('quality');\n }\n\n if (!utils.is.number(quality)) {\n quality = this.config.quality.selected;\n }\n\n if (!utils.is.number(quality)) {\n quality = this.config.quality.default;\n }\n\n if (!this.options.quality.length) {\n return;\n }\n\n if (!this.options.quality.includes(quality)) {\n const closest = utils.closest(this.options.quality, quality);\n this.debug.warn(`Unsupported quality option: ${quality}, using ${closest} instead`);\n quality = closest;\n }\n\n // Update config\n this.config.quality.selected = quality;\n\n // Set quality\n this.media.quality = quality;\n }\n\n /**\n * Get current quality level\n */\n get quality() {\n return this.media.quality;\n }\n\n /**\n * Toggle loop\n * TODO: Finish fancy new logic. Set the indicator on load as user may pass loop as config\n * @param {boolean} input - Whether to loop or not\n */\n set loop(input) {\n const toggle = utils.is.boolean(input) ? input : this.config.loop.active;\n this.config.loop.active = toggle;\n this.media.loop = toggle;\n\n // Set default to be a true toggle\n /* const type = ['start', 'end', 'all', 'none', 'toggle'].includes(input) ? input : 'toggle';\n\n switch (type) {\n case 'start':\n if (this.config.loop.end && this.config.loop.end <= this.currentTime) {\n this.config.loop.end = null;\n }\n this.config.loop.start = this.currentTime;\n // this.config.loop.indicator.start = this.elements.display.played.value;\n break;\n\n case 'end':\n if (this.config.loop.start >= this.currentTime) {\n return this;\n }\n this.config.loop.end = this.currentTime;\n // this.config.loop.indicator.end = this.elements.display.played.value;\n break;\n\n case 'all':\n this.config.loop.start = 0;\n this.config.loop.end = this.duration - 2;\n this.config.loop.indicator.start = 0;\n this.config.loop.indicator.end = 100;\n break;\n\n case 'toggle':\n if (this.config.loop.active) {\n this.config.loop.start = 0;\n this.config.loop.end = null;\n } else {\n this.config.loop.start = 0;\n this.config.loop.end = this.duration - 2;\n }\n break;\n\n default:\n this.config.loop.start = 0;\n this.config.loop.end = null;\n break;\n } */\n }\n\n /**\n * Get current loop state\n */\n get loop() {\n return Boolean(this.media.loop);\n }\n\n /**\n * Set new media source\n * @param {object} input - The new source object (see docs)\n */\n set source(input) {\n source.change.call(this, input);\n }\n\n /**\n * Get current source\n */\n get source() {\n return this.media.currentSrc;\n }\n\n /**\n * Set the poster image for a video\n * @param {input} - the URL for the new poster image\n */\n set poster(input) {\n if (!this.isVideo) {\n this.debug.warn('Poster can only be set for video');\n return;\n }\n\n ui.setPoster.call(this, input);\n }\n\n /**\n * Get the current poster image\n */\n get poster() {\n if (!this.isVideo) {\n return null;\n }\n\n return this.media.getAttribute('poster');\n }\n\n /**\n * Set the autoplay state\n * @param {boolean} input - Whether to autoplay or not\n */\n set autoplay(input) {\n const toggle = utils.is.boolean(input) ? input : this.config.autoplay;\n this.config.autoplay = toggle;\n }\n\n /**\n * Get the current autoplay state\n */\n get autoplay() {\n return Boolean(this.config.autoplay);\n }\n\n /**\n * Toggle captions\n * @param {boolean} input - Whether to enable captions\n */\n toggleCaptions(input) {\n // If there's no full support\n if (!this.supported.ui) {\n return;\n }\n\n // If the method is called without parameter, toggle based on current value\n const active = utils.is.boolean(input) ? input : !this.elements.container.classList.contains(this.config.classNames.captions.active);\n\n // Toggle state\n this.elements.buttons.captions.pressed = active;\n\n // Add class hook\n utils.toggleClass(this.elements.container, this.config.classNames.captions.active, active);\n\n // Update state and trigger event\n if (active !== this.captions.active) {\n this.captions.active = active;\n utils.dispatchEvent.call(this, this.media, this.captions.active ? 'captionsenabled' : 'captionsdisabled');\n }\n }\n\n /**\n * Set the caption track by index\n * @param {number} - Caption index\n */\n set currentTrack(input) {\n captions.set.call(this, input);\n }\n\n /**\n * Get the current caption track index (-1 if disabled)\n */\n get currentTrack() {\n const { active, currentTrack } = this.captions;\n return active ? currentTrack : -1;\n }\n\n /**\n * Set the wanted language for captions\n * Since tracks can be added later it won't update the actual caption track until there is a matching track\n * @param {string} - Two character ISO language code (e.g. EN, FR, PT, etc)\n */\n set language(input) {\n captions.setLanguage.call(this, input);\n }\n\n /**\n * Get the current track's language\n */\n get language() {\n return (captions.getCurrentTrack.call(this) || {}).language;\n }\n\n /**\n * Toggle picture-in-picture playback on WebKit/MacOS\n * TODO: update player with state, support, enabled\n * TODO: detect outside changes\n */\n set pip(input) {\n const states = {\n pip: 'picture-in-picture',\n inline: 'inline',\n };\n\n // Bail if no support\n if (!support.pip) {\n return;\n }\n\n // Toggle based on current state if not passed\n const toggle = utils.is.boolean(input) ? input : this.pip === states.inline;\n\n // Toggle based on current state\n this.media.webkitSetPresentationMode(toggle ? states.pip : states.inline);\n }\n\n /**\n * Get the current picture-in-picture state\n */\n get pip() {\n if (!support.pip) {\n return null;\n }\n\n return this.media.webkitPresentationMode;\n }\n\n /**\n * Trigger the airplay dialog\n * TODO: update player with state, support, enabled\n */\n airplay() {\n // Show dialog if supported\n if (support.airplay) {\n this.media.webkitShowPlaybackTargetPicker();\n }\n }\n\n /**\n * Toggle the player controls\n * @param {boolean} [toggle] - Whether to show the controls\n */\n toggleControls(toggle) {\n // Don't toggle if missing UI support or if it's audio\n if (this.supported.ui && !this.isAudio) {\n // Get state before change\n const isHidden = utils.hasClass(this.elements.container, this.config.classNames.hideControls);\n\n // Negate the argument if not undefined since adding the class to hides the controls\n const force = typeof toggle === 'undefined' ? undefined : !toggle;\n\n // Apply and get updated state\n const hiding = utils.toggleClass(this.elements.container, this.config.classNames.hideControls, force);\n\n // Close menu\n if (hiding && this.config.controls.includes('settings') && !utils.is.empty(this.config.settings)) {\n controls.toggleMenu.call(this, false);\n }\n // Trigger event on change\n if (hiding !== isHidden) {\n const eventName = hiding ? 'controlshidden' : 'controlsshown';\n utils.dispatchEvent.call(this, this.media, eventName);\n }\n return !hiding;\n }\n return false;\n }\n\n /**\n * Add event listeners\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n */\n on(event, callback) {\n utils.on(this.elements.container, event, callback);\n }\n\n /**\n * Remove event listeners\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n */\n off(event, callback) {\n utils.off(this.elements.container, event, callback);\n }\n\n /**\n * Destroy an instance\n * Event listeners are removed when elements are removed\n * http://stackoverflow.com/questions/12528049/if-a-dom-element-is-removed-are-its-listeners-also-removed-from-memory\n * @param {function} callback - Callback for when destroy is complete\n * @param {boolean} soft - Whether it's a soft destroy (for source changes etc)\n */\n destroy(callback, soft = false) {\n if (!this.ready) {\n return;\n }\n\n const done = () => {\n // Reset overflow (incase destroyed while in fullscreen)\n document.body.style.overflow = '';\n\n // GC for embed\n this.embed = null;\n\n // If it's a soft destroy, make minimal changes\n if (soft) {\n if (Object.keys(this.elements).length) {\n // Remove elements\n utils.removeElement(this.elements.buttons.play);\n utils.removeElement(this.elements.captions);\n utils.removeElement(this.elements.controls);\n utils.removeElement(this.elements.wrapper);\n\n // Clear for GC\n this.elements.buttons.play = null;\n this.elements.captions = null;\n this.elements.controls = null;\n this.elements.wrapper = null;\n }\n\n // Callback\n if (utils.is.function(callback)) {\n callback();\n }\n } else {\n // Unbind listeners\n this.listeners.clear();\n\n // Replace the container with the original element provided\n utils.replaceElement(this.elements.original, this.elements.container);\n\n // Event\n utils.dispatchEvent.call(this, this.elements.original, 'destroyed', true);\n\n // Callback\n if (utils.is.function(callback)) {\n callback.call(this.elements.original);\n }\n\n // Reset state\n this.ready = false;\n\n // Clear for garbage collection\n setTimeout(() => {\n this.elements = null;\n this.media = null;\n }, 200);\n }\n };\n\n // Stop playback\n this.stop();\n\n // Type specific stuff\n switch (`${this.provider}:${this.type}`) {\n case 'html5:video':\n case 'html5:audio':\n // Clear timeout\n clearTimeout(this.timers.loading);\n\n // Restore native video controls\n ui.toggleNativeControls.call(this, true);\n\n // Clean up\n done();\n\n break;\n\n case 'youtube:video':\n // Clear timers\n clearInterval(this.timers.buffering);\n clearInterval(this.timers.playing);\n\n // Destroy YouTube API\n if (this.embed !== null && utils.is.function(this.embed.destroy)) {\n this.embed.destroy();\n }\n\n // Clean up\n done();\n\n break;\n\n case 'vimeo:video':\n // Destroy Vimeo API\n // then clean up (wait, to prevent postmessage errors)\n if (this.embed !== null) {\n this.embed.unload().then(done);\n }\n\n // Vimeo does not always return\n setTimeout(done, 200);\n\n break;\n\n default:\n break;\n }\n }\n\n /**\n * Check for support for a mime type (HTML5 only)\n * @param {string} type - Mime type\n */\n supports(type) {\n return support.mime.call(this, type);\n }\n\n /**\n * Check for support\n * @param {string} type - Player type (audio/video)\n * @param {string} provider - Provider (html5/youtube/vimeo)\n * @param {bool} inline - Where player has `playsinline` sttribute\n */\n static supported(type, provider, inline) {\n return support.check(type, provider, inline);\n }\n\n /**\n * Load an SVG sprite into the page\n * @param {string} url - URL for the SVG sprite\n * @param {string} [id] - Unique ID\n */\n static loadSprite(url, id) {\n return utils.loadSprite(url, id);\n }\n\n /**\n * Setup multiple instances\n * @param {*} selector\n * @param {object} options\n */\n static setup(selector, options = {}) {\n let targets = null;\n\n if (utils.is.string(selector)) {\n targets = Array.from(document.querySelectorAll(selector));\n } else if (utils.is.nodeList(selector)) {\n targets = Array.from(selector);\n } else if (utils.is.array(selector)) {\n targets = selector.filter(utils.is.element);\n }\n\n if (utils.is.empty(targets)) {\n return null;\n }\n\n return targets.map(t => new Plyr(t, options));\n }\n}\n\nPlyr.defaults = utils.cloneDeep(defaults);\n\nexport default Plyr;\n"]} \ No newline at end of file
+{"version":3,"sources":["src/js/utils/is.js","src/js/utils/events.js","src/js/utils/elements.js","src/js/utils/animation.js","src/js/utils/browser.js","src/js/support.js","src/js/html5.js","src/js/utils/objects.js","src/js/utils/strings.js","src/js/i18n.js","src/js/utils/arrays.js","src/js/storage.js","src/js/utils/loadSprite.js","src/js/utils/time.js","src/js/controls.js","src/js/utils/fetch.js","src/js/utils/urls.js","src/js/captions.js","src/js/config/defaults.js","src/js/config/types.js","src/js/console.js","src/js/fullscreen.js","src/js/utils/loadImage.js","src/js/ui.js","src/js/listeners.js","node_modules/loadjs/dist/loadjs.umd.js","src/js/utils/loadScript.js","src/js/plugins/vimeo.js","src/js/plugins/youtube.js","src/js/media.js","src/js/plugins/ads.js","src/js/source.js","src/js/plyr.js"],"names":["getConstructor","input","constructor","instanceOf","Boolean","is","object","Object","number","Number","isNaN","string","String","boolean","function","Function","array","nullOrUndefined","Array","isArray","weakMap","WeakMap","nodeList","NodeList","element","Element","textNode","Text","event","Event","cue","window","TextTrackCue","VTTCue","track","TextTrack","kind","url","test","empty","length","keys","supportsPassiveListeners","supported","options","defineProperty","get","addEventListener","removeEventListener","e","toggleListener","callback","toggle","arguments","undefined","_this","this","passive","capture","events","split","forEach","type","eventListeners","push","on","call","off","once","onceCallback","_len","args","_key","apply","triggerEvent","bubbles","detail","CustomEvent","assign","plyr","dispatchEvent","wrap","elements","wrapper","targets","from","reverse","index","child","cloneNode","parent","parentNode","sibling","nextSibling","appendChild","insertBefore","setAttributes","attributes","entries","filter","_ref","value","slicedToArray","_ref3","_ref4","key","setAttribute","createElement","text","document","innerText","insertElement","removeElement","removeChild","emptyElement","childNodes","lastChild","replaceElement","newChild","oldChild","replaceChild","getAttributesFromSelector","sel","existingAttributes","existing","s","selector","trim","className","replace","parts","charAt","class","id","toggleHidden","hidden","hide","hasAttribute","removeAttribute","toggleClass","force","method","classList","contains","hasClass","matches","prototype","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","querySelectorAll","includes","getElements","container","getElement","querySelector","getFocusElement","focused","activeElement","body","transitionEndEvent","WebkitTransition","MozTransition","OTransition","transition","find","style","range","browser","isIE","documentMode","isWebkit","documentElement","navigator","userAgent","isIPhone","platform","isIos","defaultCodecs","audio/ogg","audio/wav","video/webm","video/mp4","video/ogg","support","audio","video","check","provider","playsinline","canPlayInline","api","ui","rangeInput","pip","webkitSetPresentationMode","airplay","WebKitPlaybackTargetAvailabilityEvent","mime","inputType","_inputType$split","mediaType","isHTML5","media","canPlayType","err","textTracks","touch","transitions","reducedMotion","matchMedia","html5","getSources","source","getAttribute","getQualityOptions","map","extend","player","_sources$filter","set","currentTime","playing","src","load","play","quality","cancelRequests","config","blankVideo","debug","log","getDeep","path","reduce","obj","target","sources","shift","concat","format","toString","match","i","replaceAll","RegExp","toTitleCase","toUpperCase","substr","toLowerCase","toCamelCase","toPascalCase","slice","getHTML","innerHTML","i18n","{seektime}","seekTime","{title}","title","_ref2","dedupe","item","indexOf","Storage","classCallCheck","enabled","storage","store","localStorage","getItem","json","JSON","parse","setItem","stringify","removeItem","loadSprite","hasId","exists","getElementById","update","data","insertAdjacentElement","useStorage","cached","prefix","content","fetch","then","result","catch","getHours","parseInt","getMinutes","getSeconds","formatTime","time","displayHours","inverted","hours","mins","secs","controls","getIconUrl","cors","URL","iconUrl","location","host","svg4everybody","findElements","selectors","buttons","pause","restart","rewind","fastForward","mute","settings","captions","fullscreen","progress","inputs","seek","volume","display","buffer","duration","seekTooltip","classNames","tooltip","error","warn","toggleNativeControls","createIcon","iconPath","iconPrefix","icon","createElementNS","role","focusable","use","setAttributeNS","createLabel","attr","join","createBadge","badge","menu","createButton","buttonType","button","label","labelPressed","iconPressed","control","controlPressed","enumerable","pressed","createRange","min","max","step","autocomplete","aria-label","aria-valuemin","aria-valuemax","aria-valuenow","updateRangeFill","createProgress","aria-hidden","suffixKey","played","suffix","createTime","createMenuItem","list","_ref$badge","_ref$checked","checked","radio","name","faux","insertAdjacentHTML","updateTimeDisplay","updateVolume","setRange","muted","updateProgress","current","toFixed","getElementsByTagName","nodeValue","setProgress","buffered","percent","setProperty","updateSeekTooltip","_this2","tooltips","clientRect","getBoundingClientRect","visible","_toggle","width","pageX","left","parseFloat","timeUpdate","invert","invertTime","seeking","durationUpdate","hasDuration","displayDuration","paused","toggleTab","setting","tabs","setQualityMenu","_this3","panes","checkMenu","sort","a","b","sorting","getLabel","getBadge","updateSetting","pane","currentTrack","default","setCaptionsMenu","_this4","tracks","getTracks","toggled","language","unshift","bind","setSpeedMenu","_this5","speed","isVimeo","values","some","tab","toggleMenu","form","show","isMenuItem","isButton","stopPropagation","open","getTabSize","clone","position","opacity","scrollWidth","height","scrollHeight","showTab","_this6","size","restore","propertyName","focus","create","_this7","aria-haspopup","aria-controls","aria-expanded","aria-labelled-by","tabindex","inner","home","back","inject","_this8","Math","floor","random","props","seektime","setTimeout","offsetHeight","_config","labels","responseType","Promise","resolve","reject","request","XMLHttpRequest","responseText","response","Error","statusText","send","parseUrl","parser","href","buildUrlParams","params","URLSearchParams","setup","isVideo","isYouTube","hostname","protocol","blob","createObjectURL","languages","userLanguage","active","trackEvents","_captions","meta","currentTrackNode","languageExists","mode","updateCues","setLanguage","activeClass","findTrack","toConsumableArray","embed","enableTextTrack","has","sortIsDefault","sorted","every","getCurrentTrack","cues","activeCues","getCueAsHTML","cueText","caption","defaults","autoplay","autopause","toggleInvert","ratio","clickToPlay","hideControls","resetOnEnd","disableContextMenu","loop","selected","keyboard","global","fallback","iosNative","seekLabel","unmute","enableCaptions","disableCaptions","enterFullscreen","exitFullscreen","frameTitle","menuBack","normal","start","end","all","reset","disabled","advertisement","qualityBadge","2160","1440","1080","720","576","480","urls","vimeo","sdk","iframe","youtube","googleIMA","listeners","editable","embedContainer","poster","posterEnabled","ads","stopped","loading","hover","isTouch","uiSupported","noTransition","tabFocus","google","publisherId","providers","types","noop","Console","console","onChange","first","last","keyCode","shiftKey","preventDefault","toggleFallback","scrollPosition","x","scrollX","y","scrollY","scrollTo","overflow","Fullscreen","property","native","webkitEnterFullscreen","requestFullscreen","webkitExitFullscreen","action","cancelFullScreen","exit","enter","fullscreenElement","fullscreenEnabled","webkitFullscreenEnabled","mozFullScreenEnabled","msFullscreenEnabled","pre","loadImage","minWidth","image","Image","handler","onload","onerror","naturalWidth","addStyleHook","build","checkPlaying","ready","setTitle","setPoster","isEmbed","togglePoster","enable","backgroundImage","backgroundSize","toggleControls","checkLoading","clearTimeout","timers","Listeners","lastKey","handleKey","firstTouch","code","which","repeat","altKey","ctrlKey","metaKey","togglePlay","increaseVolume","decreaseVolume","forward","toggleCaptions","delay","hasAudio","initialized","managerPromise","isAudio","ended","proxyEvents","_event$detail","inputEvent","proxy","defaultHandler","customHandlerKey","customHandler","returned","hasCustomHandler","showHomeTab","currentTarget","eventType","done","seekTo","_player","webkitDirectionInvertedFromDevice","direction","deltaY","deltaX","factory","devnull","bundleIdCache","bundleResultCache","bundleCallbackQueue","publish","bundleId","pathsNotFound","q","splice","executeCallbacks","depsNotFound","success","loadFile","callbackFn","numTries","isCss","doc","async","maxTries","numRetries","beforeCallbackFn","before","pathStripped","rel","onbeforeload","ev","sheet","cssText","defaultPrevented","head","loadjs","paths","arg1","arg2","fn","numWaiting","loadFiles","deps","bundleIds","r","subscribe","isDefined","module","exports","loadScript","assurePlaybackState","hasPlayed","setAspectRatio","Vimeo","_split","_split2","padding","paddingBottom","offset","transform","byline","portrait","transparent","gesture","$2","thumbnail_large","pathname","Player","disableTextTrack","stop","restorePause","setVolume","setCurrentTime","setPlaybackRate","setLoop","currentSrc","getVideoUrl","getVideoWidth","getVideoHeight","dimensions","getRatio","w","h","getAspectRatio","setAutopause","state","getVideoTitle","getCurrentTime","getDuration","getTextTracks","_ref$cues","strippedCues","fragment","createDocumentFragment","firstChild","getPaused","seconds","mapQualityUnit","entry","hd2160","hd1440","hd1080","hd720","large","medium","small","tiny","YT","onYouTubeReadyCallbacks","onYouTubeIframeAPIReady","getTitle","videoId","getVideoData","items","snippet","currentId","startsWith","posterSrc","format$$1","playerVars","showinfo","iv_load_policy","modestbranding","disablekb","widget_referrer","cc_load_policy","cc_lang_pref","onError","message","2","5","100","101","150","onPlaybackQualityChange","onPlaybackRateChange","instance","playbackRate","getPlaybackRate","onReady","playVideo","pauseVideo","stopVideo","getPlaybackQuality","setPlaybackQuality","getAvailablePlaybackRates","clearInterval","buffering","setInterval","getVideoLoadedFraction","lastBuffered","onStateChange","levels","getAvailableQualityLevels","level","unMute","Ads","displayContainer","manager","loader","cuePoints","safetyTimer","countdownTimer","ima","trigger","startSafetyTimer","clearSafetyTimer","setupIMA","setVpaidMode","ImaSdkSettings","VpaidMode","ENABLED","setLocale","AdDisplayContainer","requestAds","AdsLoader","AdsManagerLoadedEvent","Type","ADS_MANAGER_LOADED","onAdsManagerLoaded","AdErrorEvent","AD_ERROR","onAdError","AdsRequest","adTagUrl","tagUrl","linearAdSlotWidth","offsetWidth","linearAdSlotHeight","nonLinearAdSlotWidth","nonLinearAdSlotHeight","forceNonLinearFullSlot","setAdWillPlayMuted","getRemainingTime","AdsRenderingSettings","restoreCustomPlaybackStateOnAdBreakComplete","enablePreloading","getAdsManager","getCuePoints","cuePoint","seekElement","cuePercentage","AdEvent","onAdEvent","ad","getAd","LOADED","pollCountdown","isLinear","ALL_ADS_COMPLETED","loadAds","CONTENT_PAUSE_REQUESTED","pauseContent","CONTENT_RESUME_REQUESTED","resumeContent","STARTED","MIDPOINT","COMPLETE","IMPRESSION","CLICK","cancel","contentComplete","seekedTime","discardAdBreak","resize","ViewMode","NORMAL","_this9","initialize","init","adError","zIndex","_this10","destroy","_this11","handlers","_this12","base","AV_PUBLISHERID","AV_CHANNELID","AV_URL","cb","Date","now","AV_WIDTH","AV_HEIGHT","AV_CDIM2","insertElements","attribute","change","_sources$","_sources$$provider","tagName","crossorigin","Plyr","failed","jQuery","original","getProviderByUrl","searchParams","truthy","webkitShowPlaybackTargetPicker","isHidden","hiding","eventName","soft","unload","inputIsValid","fauxDuration","mozHasAudio","webkitAudioDecodedByteCount","audioTracks","prev","curr","abs","closest","states","webkitPresentationMode","inline","t"],"mappings":"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","file":"plyr.min.js","sourcesContent":["// ==========================================================================\n// Type checking utils\n// ==========================================================================\n\nconst getConstructor = input => (input !== null && typeof input !== 'undefined' ? input.constructor : null);\n\nconst instanceOf = (input, constructor) => Boolean(input && constructor && input instanceof constructor);\n\nconst is = {\n object(input) {\n return getConstructor(input) === Object;\n },\n number(input) {\n return getConstructor(input) === Number && !Number.isNaN(input);\n },\n string(input) {\n return getConstructor(input) === String;\n },\n boolean(input) {\n return getConstructor(input) === Boolean;\n },\n function(input) {\n return getConstructor(input) === Function;\n },\n array(input) {\n return !is.nullOrUndefined(input) && Array.isArray(input);\n },\n weakMap(input) {\n return instanceOf(input, WeakMap);\n },\n nodeList(input) {\n return instanceOf(input, NodeList);\n },\n element(input) {\n return instanceOf(input, Element);\n },\n textNode(input) {\n return getConstructor(input) === Text;\n },\n event(input) {\n return instanceOf(input, Event);\n },\n cue(input) {\n return instanceOf(input, window.TextTrackCue) || instanceOf(input, window.VTTCue);\n },\n track(input) {\n return instanceOf(input, TextTrack) || (!is.nullOrUndefined(input) && is.string(input.kind));\n },\n url(input) {\n return (\n !is.nullOrUndefined(input) &&\n /(ftp|http|https):\\/\\/(\\w+:{0,1}\\w*@)?(\\S+)(:[0-9]+)?(\\/|\\/([\\w#!:.?+=&%@!\\-/]))?/.test(input)\n );\n },\n nullOrUndefined(input) {\n return input === null || typeof input === 'undefined';\n },\n empty(input) {\n return (\n is.nullOrUndefined(input) ||\n ((is.string(input) || is.array(input) || is.nodeList(input)) && !input.length) ||\n (is.object(input) && !Object.keys(input).length)\n );\n },\n};\n\nexport default is;\n","// ==========================================================================\n// Event utils\n// ==========================================================================\n\nimport is from './is';\n\n// Check for passive event listener support\n// https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md\n// https://www.youtube.com/watch?v=NPM6172J22g\nconst supportsPassiveListeners = (() => {\n // Test via a getter in the options object to see if the passive property is accessed\n let supported = false;\n try {\n const options = Object.defineProperty({}, 'passive', {\n get() {\n supported = true;\n return null;\n },\n });\n window.addEventListener('test', null, options);\n window.removeEventListener('test', null, options);\n } catch (e) {\n // Do nothing\n }\n\n return supported;\n})();\n\n// Toggle event listener\nexport function toggleListener(element, event, callback, toggle = false, passive = true, capture = false) {\n // Bail if no element, event, or callback\n if (!element || !('addEventListener' in element) || is.empty(event) || !is.function(callback)) {\n return;\n }\n\n // Allow multiple events\n const events = event.split(' ');\n\n // Build options\n // Default to just the capture boolean for browsers with no passive listener support\n let options = capture;\n\n // If passive events listeners are supported\n if (supportsPassiveListeners) {\n options = {\n // Whether the listener can be passive (i.e. default never prevented)\n passive,\n // Whether the listener is a capturing listener or not\n capture,\n };\n }\n\n // If a single node is passed, bind the event listener\n events.forEach(type => {\n if (this && this.eventListeners && toggle) {\n // Cache event listener\n this.eventListeners.push({ element, type, callback, options });\n }\n\n element[toggle ? 'addEventListener' : 'removeEventListener'](type, callback, options);\n });\n}\n\n// Bind event handler\nexport function on(element, events = '', callback, passive = true, capture = false) {\n toggleListener.call(this, element, events, callback, true, passive, capture);\n}\n\n// Unbind event handler\nexport function off(element, events = '', callback, passive = true, capture = false) {\n toggleListener.call(this, element, events, callback, false, passive, capture);\n}\n\n// Bind once-only event handler\nexport function once(element, events = '', callback, passive = true, capture = false) {\n function onceCallback(...args) {\n off(element, events, onceCallback, passive, capture);\n callback.apply(this, args);\n }\n\n toggleListener.call(this, element, events, onceCallback, true, passive, capture);\n}\n\n// Trigger event\nexport function triggerEvent(element, type = '', bubbles = false, detail = {}) {\n // Bail if no element\n if (!is.element(element) || is.empty(type)) {\n return;\n }\n\n // Create and dispatch the event\n const event = new CustomEvent(type, {\n bubbles,\n detail: Object.assign({}, detail, {\n plyr: this,\n }),\n });\n\n // Dispatch the event\n element.dispatchEvent(event);\n}\n\n// Unbind all cached event listeners\nexport function unbindListeners() {\n if (this && this.eventListeners) {\n this.eventListeners.forEach(item => {\n const { element, type, callback, options } = item;\n element.removeEventListener(type, callback, options);\n });\n\n this.eventListeners = [];\n }\n}\n\n// Run method when / if player is ready\nexport function ready() {\n return new Promise(\n resolve => (this.ready ? setTimeout(resolve, 0) : on.call(this, this.elements.container, 'ready', resolve)),\n ).then(() => {});\n}\n","// ==========================================================================\n// Element utils\n// ==========================================================================\n\nimport { toggleListener } from './events';\nimport is from './is';\n\n// Wrap an element\nexport function wrap(elements, wrapper) {\n // Convert `elements` to an array, if necessary.\n const targets = elements.length ? elements : [elements];\n\n // Loops backwards to prevent having to clone the wrapper on the\n // first element (see `child` below).\n Array.from(targets)\n .reverse()\n .forEach((element, index) => {\n const child = index > 0 ? wrapper.cloneNode(true) : wrapper;\n\n // Cache the current parent and sibling.\n const parent = element.parentNode;\n const sibling = element.nextSibling;\n\n // Wrap the element (is automatically removed from its current\n // parent).\n child.appendChild(element);\n\n // If the element had a sibling, insert the wrapper before\n // the sibling to maintain the HTML structure; otherwise, just\n // append it to the parent.\n if (sibling) {\n parent.insertBefore(child, sibling);\n } else {\n parent.appendChild(child);\n }\n });\n}\n\n// Set attributes\nexport function setAttributes(element, attributes) {\n if (!is.element(element) || is.empty(attributes)) {\n return;\n }\n\n // Assume null and undefined attributes should be left out,\n // Setting them would otherwise convert them to \"null\" and \"undefined\"\n Object.entries(attributes)\n .filter(([, value]) => !is.nullOrUndefined(value))\n .forEach(([key, value]) => element.setAttribute(key, value));\n}\n\n// Create a DocumentFragment\nexport function createElement(type, attributes, text) {\n // Create a new <element>\n const element = document.createElement(type);\n\n // Set all passed attributes\n if (is.object(attributes)) {\n setAttributes(element, attributes);\n }\n\n // Add text node\n if (is.string(text)) {\n element.innerText = text;\n }\n\n // Return built element\n return element;\n}\n\n// Inaert an element after another\nexport function insertAfter(element, target) {\n target.parentNode.insertBefore(element, target.nextSibling);\n}\n\n// Insert a DocumentFragment\nexport function insertElement(type, parent, attributes, text) {\n // Inject the new <element>\n parent.appendChild(createElement(type, attributes, text));\n}\n\n// Remove element(s)\nexport function removeElement(element) {\n if (is.nodeList(element) || is.array(element)) {\n Array.from(element).forEach(removeElement);\n return;\n }\n\n if (!is.element(element) || !is.element(element.parentNode)) {\n return;\n }\n\n element.parentNode.removeChild(element);\n}\n\n// Remove all child elements\nexport function emptyElement(element) {\n let { length } = element.childNodes;\n\n while (length > 0) {\n element.removeChild(element.lastChild);\n length -= 1;\n }\n}\n\n// Replace element\nexport function replaceElement(newChild, oldChild) {\n if (!is.element(oldChild) || !is.element(oldChild.parentNode) || !is.element(newChild)) {\n return null;\n }\n\n oldChild.parentNode.replaceChild(newChild, oldChild);\n\n return newChild;\n}\n\n// Get an attribute object from a string selector\nexport function getAttributesFromSelector(sel, existingAttributes) {\n // For example:\n // '.test' to { class: 'test' }\n // '#test' to { id: 'test' }\n // '[data-test=\"test\"]' to { 'data-test': 'test' }\n\n if (!is.string(sel) || is.empty(sel)) {\n return {};\n }\n\n const attributes = {};\n const existing = existingAttributes;\n\n sel.split(',').forEach(s => {\n // Remove whitespace\n const selector = s.trim();\n const className = selector.replace('.', '');\n const stripped = selector.replace(/[[\\]]/g, '');\n\n // Get the parts and value\n const parts = stripped.split('=');\n const key = parts[0];\n const value = parts.length > 1 ? parts[1].replace(/[\"']/g, '') : '';\n\n // Get the first character\n const start = selector.charAt(0);\n\n switch (start) {\n case '.':\n // Add to existing classname\n if (is.object(existing) && is.string(existing.class)) {\n existing.class += ` ${className}`;\n }\n\n attributes.class = className;\n break;\n\n case '#':\n // ID selector\n attributes.id = selector.replace('#', '');\n break;\n\n case '[':\n // Attribute selector\n attributes[key] = value;\n\n break;\n\n default:\n break;\n }\n });\n\n return attributes;\n}\n\n// Toggle hidden\nexport function toggleHidden(element, hidden) {\n if (!is.element(element)) {\n return;\n }\n\n let hide = hidden;\n\n if (!is.boolean(hide)) {\n hide = !element.hasAttribute('hidden');\n }\n\n if (hide) {\n element.setAttribute('hidden', '');\n } else {\n element.removeAttribute('hidden');\n }\n}\n\n// Mirror Element.classList.toggle, with IE compatibility for \"force\" argument\nexport function toggleClass(element, className, force) {\n if (is.element(element)) {\n let method = 'toggle';\n if (typeof force !== 'undefined') {\n method = force ? 'add' : 'remove';\n }\n\n element.classList[method](className);\n return element.classList.contains(className);\n }\n\n return null;\n}\n\n// Has class name\nexport function hasClass(element, className) {\n return is.element(element) && element.classList.contains(className);\n}\n\n// Element matches selector\nexport function matches(element, selector) {\n const prototype = { Element };\n\n function match() {\n return Array.from(document.querySelectorAll(selector)).includes(this);\n }\n\n const matches =\n prototype.matches ||\n prototype.webkitMatchesSelector ||\n prototype.mozMatchesSelector ||\n prototype.msMatchesSelector ||\n match;\n\n return matches.call(element, selector);\n}\n\n// Find all elements\nexport function getElements(selector) {\n return this.elements.container.querySelectorAll(selector);\n}\n\n// Find a single element\nexport function getElement(selector) {\n return this.elements.container.querySelector(selector);\n}\n\n// Get the focused element\nexport function getFocusElement() {\n let focused = document.activeElement;\n\n if (!focused || focused === document.body) {\n focused = null;\n } else {\n focused = document.querySelector(':focus');\n }\n\n return focused;\n}\n\n// Trap focus inside container\nexport function trapFocus(element = null, toggle = false) {\n if (!is.element(element)) {\n return;\n }\n\n const focusable = getElements.call(this, 'button:not(:disabled), input:not(:disabled), [tabindex]');\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n\n const trap = event => {\n // Bail if not tab key or not fullscreen\n if (event.key !== 'Tab' || event.keyCode !== 9) {\n return;\n }\n\n // Get the current focused element\n const focused = getFocusElement();\n\n if (focused === last && !event.shiftKey) {\n // Move focus to first element that can be tabbed if Shift isn't used\n first.focus();\n event.preventDefault();\n } else if (focused === first && event.shiftKey) {\n // Move focus to last element that can be tabbed if Shift is used\n last.focus();\n event.preventDefault();\n }\n };\n\n toggleListener.call(this, this.elements.container, 'keydown', trap, toggle, false);\n}\n","// ==========================================================================\n// Animation utils\n// ==========================================================================\n\nimport { toggleHidden } from './elements';\nimport is from './is';\n\nexport const transitionEndEvent = (() => {\n const element = document.createElement('span');\n\n const events = {\n WebkitTransition: 'webkitTransitionEnd',\n MozTransition: 'transitionend',\n OTransition: 'oTransitionEnd otransitionend',\n transition: 'transitionend',\n };\n\n const type = Object.keys(events).find(event => element.style[event] !== undefined);\n\n return is.string(type) ? events[type] : false;\n})();\n\n// Force repaint of element\nexport function repaint(element) {\n setTimeout(() => {\n toggleHidden(element, true);\n element.offsetHeight; // eslint-disable-line\n toggleHidden(element, false);\n }, 0);\n}\n","// ==========================================================================\n// Browser sniffing\n// Unfortunately, due to mixed support, UA sniffing is required\n// ==========================================================================\n\nconst browser = {\n isIE: /* @cc_on!@ */ false || !!document.documentMode,\n isWebkit: 'WebkitAppearance' in document.documentElement.style && !/Edge/.test(navigator.userAgent),\n isIPhone: /(iPhone|iPod)/gi.test(navigator.platform),\n isIos: /(iPad|iPhone|iPod)/gi.test(navigator.platform),\n};\n\nexport default browser;\n","// ==========================================================================\n// Plyr support checks\n// ==========================================================================\n\nimport { transitionEndEvent } from './utils/animation';\nimport browser from './utils/browser';\nimport { createElement } from './utils/elements';\nimport is from './utils/is';\n\n// Default codecs for checking mimetype support\nconst defaultCodecs = {\n 'audio/ogg': 'vorbis',\n 'audio/wav': '1',\n 'video/webm': 'vp8, vorbis',\n 'video/mp4': 'avc1.42E01E, mp4a.40.2',\n 'video/ogg': 'theora',\n};\n\n// Check for feature support\nconst support = {\n // Basic support\n audio: 'canPlayType' in document.createElement('audio'),\n video: 'canPlayType' in document.createElement('video'),\n\n // Check for support\n // Basic functionality vs full UI\n check(type, provider, playsinline) {\n const canPlayInline = browser.isIPhone && playsinline && support.playsinline;\n const api = support[type] || provider !== 'html5';\n const ui = api && support.rangeInput && (type !== 'video' || !browser.isIPhone || canPlayInline);\n\n return {\n api,\n ui,\n };\n },\n\n // Picture-in-picture support\n // Safari only currently\n pip: (() => !browser.isIPhone && is.function(createElement('video').webkitSetPresentationMode))(),\n\n // Airplay support\n // Safari only currently\n airplay: is.function(window.WebKitPlaybackTargetAvailabilityEvent),\n\n // Inline playback support\n // https://webkit.org/blog/6784/new-video-policies-for-ios/\n playsinline: 'playsInline' in document.createElement('video'),\n\n // Check for mime type support against a player instance\n // Credits: http://diveintohtml5.info/everything.html\n // Related: http://www.leanbackplayer.com/test/h5mt.html\n mime(inputType) {\n const [mediaType] = inputType.split('/');\n if (!this.isHTML5 || mediaType !== this.type) {\n return false;\n }\n\n let type;\n if (inputType && inputType.includes('codecs=')) {\n // Use input directly\n type = inputType;\n } else if (inputType === 'audio/mpeg') {\n // Skip codec\n type = 'audio/mpeg;';\n } else if (inputType in defaultCodecs) {\n // Use codec\n type = `${inputType}; codecs=\"${defaultCodecs[inputType]}\"`;\n }\n\n try {\n return Boolean(type && this.media.canPlayType(type).replace(/no/, ''));\n } catch (err) {\n return false;\n }\n },\n\n // Check for textTracks support\n textTracks: 'textTracks' in document.createElement('video'),\n\n // <input type=\"range\"> Sliders\n rangeInput: (() => {\n const range = document.createElement('input');\n range.type = 'range';\n return range.type === 'range';\n })(),\n\n // Touch\n // NOTE: Remember a device can be mouse + touch enabled so we check on first touch event\n touch: 'ontouchstart' in document.documentElement,\n\n // Detect transitions support\n transitions: transitionEndEvent !== false,\n\n // Reduced motion iOS & MacOS setting\n // https://webkit.org/blog/7551/responsive-design-for-motion/\n reducedMotion: 'matchMedia' in window && window.matchMedia('(prefers-reduced-motion)').matches,\n};\n\nexport default support;\n","// ==========================================================================\n// Plyr HTML5 helpers\n// ==========================================================================\n\nimport support from './support';\nimport { removeElement } from './utils/elements';\nimport { triggerEvent } from './utils/events';\n\nconst html5 = {\n getSources() {\n if (!this.isHTML5) {\n return [];\n }\n\n const sources = Array.from(this.media.querySelectorAll('source'));\n\n // Filter out unsupported sources\n return sources.filter(source => support.mime.call(this, source.getAttribute('type')));\n },\n\n // Get quality levels\n getQualityOptions() {\n // Get sizes from <source> elements\n return html5.getSources\n .call(this)\n .map(source => Number(source.getAttribute('size')))\n .filter(Boolean);\n },\n\n extend() {\n if (!this.isHTML5) {\n return;\n }\n\n const player = this;\n\n // Quality\n Object.defineProperty(player.media, 'quality', {\n get() {\n // Get sources\n const sources = html5.getSources.call(player);\n const [source] = sources.filter(source => source.getAttribute('src') === player.source);\n\n // Return size, if match is found\n return source && Number(source.getAttribute('size'));\n },\n set(input) {\n // Get sources\n const sources = html5.getSources.call(player);\n\n // Get first match for requested size\n const source = sources.find(source => Number(source.getAttribute('size')) === input);\n\n // No matching source found\n if (!source) {\n return;\n }\n\n // Get current state\n const { currentTime, playing } = player;\n\n // Set new source\n player.media.src = source.getAttribute('src');\n\n // Restore time\n const onLoadedMetaData = () => {\n player.currentTime = currentTime;\n };\n player.once('loadedmetadata', onLoadedMetaData);\n\n // Load new source\n player.media.load();\n\n // Resume playing\n if (playing) {\n player.play();\n }\n\n // Trigger change event\n triggerEvent.call(player, player.media, 'qualitychange', false, {\n quality: input,\n });\n },\n });\n },\n\n // Cancel current network requests\n // See https://github.com/sampotts/plyr/issues/174\n cancelRequests() {\n if (!this.isHTML5) {\n return;\n }\n\n // Remove child sources\n removeElement(html5.getSources.call(this));\n\n // Set blank video src attribute\n // This is to prevent a MEDIA_ERR_SRC_NOT_SUPPORTED error\n // Info: http://stackoverflow.com/questions/32231579/how-to-properly-dispose-of-an-html5-video-and-close-socket-or-connection\n this.media.setAttribute('src', this.config.blankVideo);\n\n // Load the new empty source\n // This will cancel existing requests\n // See https://github.com/sampotts/plyr/issues/174\n this.media.load();\n\n // Debugging\n this.debug.log('Cancelled network requests');\n },\n};\n\nexport default html5;\n","// ==========================================================================\n// Object utils\n// ==========================================================================\n\nimport is from './is';\n\n// Clone nested objects\nexport function cloneDeep(object) {\n return JSON.parse(JSON.stringify(object));\n}\n\n// Get a nested value in an object\nexport function getDeep(object, path) {\n return path.split('.').reduce((obj, key) => obj && obj[key], object);\n}\n\n// Deep extend destination object with N more objects\nexport function extend(target = {}, ...sources) {\n if (!sources.length) {\n return target;\n }\n\n const source = sources.shift();\n\n if (!is.object(source)) {\n return target;\n }\n\n Object.keys(source).forEach(key => {\n if (is.object(source[key])) {\n if (!Object.keys(target).includes(key)) {\n Object.assign(target, { [key]: {} });\n }\n\n extend(target[key], source[key]);\n } else {\n Object.assign(target, { [key]: source[key] });\n }\n });\n\n return extend(target, ...sources);\n}\n","// ==========================================================================\n// String utils\n// ==========================================================================\n\nimport is from './is';\n\n// Generate a random ID\nexport function generateId(prefix) {\n return `${prefix}-${Math.floor(Math.random() * 10000)}`;\n}\n\n// Format string\nexport function format(input, ...args) {\n if (is.empty(input)) {\n return input;\n }\n\n return input.toString().replace(/{(\\d+)}/g, (match, i) => args[i].toString());\n}\n\n// Get percentage\nexport function getPercentage(current, max) {\n if (current === 0 || max === 0 || Number.isNaN(current) || Number.isNaN(max)) {\n return 0;\n }\n\n return (current / max * 100).toFixed(2);\n}\n\n// Replace all occurances of a string in a string\nexport function replaceAll(input = '', find = '', replace = '') {\n return input.replace(\n new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\\]/\\\\])/g, '\\\\$1'), 'g'),\n replace.toString(),\n );\n}\n\n// Convert to title case\nexport function toTitleCase(input = '') {\n return input.toString().replace(/\\w\\S*/g, text => text.charAt(0).toUpperCase() + text.substr(1).toLowerCase());\n}\n\n// Convert string to pascalCase\nexport function toPascalCase(input = '') {\n let string = input.toString();\n\n // Convert kebab case\n string = replaceAll(string, '-', ' ');\n\n // Convert snake case\n string = replaceAll(string, '_', ' ');\n\n // Convert to title case\n string = toTitleCase(string);\n\n // Convert to pascal case\n return replaceAll(string, ' ', '');\n}\n\n// Convert string to pascalCase\nexport function toCamelCase(input = '') {\n let string = input.toString();\n\n // Convert to pascal case\n string = toPascalCase(string);\n\n // Convert first character to lowercase\n return string.charAt(0).toLowerCase() + string.slice(1);\n}\n\n// Remove HTML from a string\nexport function stripHTML(source) {\n const fragment = document.createDocumentFragment();\n const element = document.createElement('div');\n fragment.appendChild(element);\n element.innerHTML = source;\n return fragment.firstChild.innerText;\n}\n\n// Like outerHTML, but also works for DocumentFragment\nexport function getHTML(element) {\n const wrapper = document.createElement('div');\n wrapper.appendChild(element);\n return wrapper.innerHTML;\n}\n","// ==========================================================================\n// Plyr internationalization\n// ==========================================================================\n\nimport is from './utils/is';\nimport { getDeep } from './utils/objects';\nimport { replaceAll } from './utils/strings';\n\nconst i18n = {\n get(key = '', config = {}) {\n if (is.empty(key) || is.empty(config)) {\n return '';\n }\n\n let string = getDeep(config.i18n, key);\n\n if (is.empty(string)) {\n return '';\n }\n\n const replace = {\n '{seektime}': config.seekTime,\n '{title}': config.title,\n };\n\n Object.entries(replace).forEach(([key, value]) => {\n string = replaceAll(string, key, value);\n });\n\n return string;\n },\n};\n\nexport default i18n;\n","// ==========================================================================\n// Array utils\n// ==========================================================================\n\nimport is from './is';\n\n// Remove duplicates in an array\nexport function dedupe(array) {\n if (!is.array(array)) {\n return array;\n }\n\n return array.filter((item, index) => array.indexOf(item) === index);\n}\n\n// Get the closest value in an array\nexport function closest(array, value) {\n if (!is.array(array) || !array.length) {\n return null;\n }\n\n return array.reduce((prev, curr) => (Math.abs(curr - value) < Math.abs(prev - value) ? curr : prev));\n}\n","// ==========================================================================\n// Plyr storage\n// ==========================================================================\n\nimport is from './utils/is';\nimport { extend } from './utils/objects';\n\nclass Storage {\n constructor(player) {\n this.enabled = player.config.storage.enabled;\n this.key = player.config.storage.key;\n }\n\n // Check for actual support (see if we can use it)\n static get supported() {\n try {\n if (!('localStorage' in window)) {\n return false;\n }\n\n const test = '___test';\n\n // Try to use it (it might be disabled, e.g. user is in private mode)\n // see: https://github.com/sampotts/plyr/issues/131\n window.localStorage.setItem(test, test);\n window.localStorage.removeItem(test);\n\n return true;\n } catch (e) {\n return false;\n }\n }\n\n get(key) {\n if (!Storage.supported || !this.enabled) {\n return null;\n }\n\n const store = window.localStorage.getItem(this.key);\n\n if (is.empty(store)) {\n return null;\n }\n\n const json = JSON.parse(store);\n\n return is.string(key) && key.length ? json[key] : json;\n }\n\n set(object) {\n // Bail if we don't have localStorage support or it's disabled\n if (!Storage.supported || !this.enabled) {\n return;\n }\n\n // Can only store objectst\n if (!is.object(object)) {\n return;\n }\n\n // Get current storage\n let storage = this.get();\n\n // Default to empty object\n if (is.empty(storage)) {\n storage = {};\n }\n\n // Update the working copy of the values\n extend(storage, object);\n\n // Update storage\n window.localStorage.setItem(this.key, JSON.stringify(storage));\n }\n}\n\nexport default Storage;\n","// ==========================================================================\n// Sprite loader\n// ==========================================================================\n\nimport Storage from './../storage';\nimport is from './is';\n\n// Load an external SVG sprite\nexport default function loadSprite(url, id) {\n if (!is.string(url)) {\n return;\n }\n\n const prefix = 'cache';\n const hasId = is.string(id);\n let isCached = false;\n\n const exists = () => document.getElementById(id) !== null;\n\n const update = (container, data) => {\n container.innerHTML = data;\n\n // Check again incase of race condition\n if (hasId && exists()) {\n return;\n }\n\n // Inject the SVG to the body\n document.body.insertAdjacentElement('afterbegin', container);\n };\n\n // Only load once if ID set\n if (!hasId || !exists()) {\n const useStorage = Storage.supported;\n\n // Create container\n const container = document.createElement('div');\n container.setAttribute('hidden', '');\n\n if (hasId) {\n container.setAttribute('id', id);\n }\n\n // Check in cache\n if (useStorage) {\n const cached = window.localStorage.getItem(`${prefix}-${id}`);\n isCached = cached !== null;\n\n if (isCached) {\n const data = JSON.parse(cached);\n update(container, data.content);\n }\n }\n\n // Get the sprite\n fetch(url)\n .then(result => {\n if (is.empty(result)) {\n return;\n }\n\n if (useStorage) {\n window.localStorage.setItem(\n `${prefix}-${id}`,\n JSON.stringify({\n content: result,\n }),\n );\n }\n\n update(container, result);\n })\n .catch(() => {});\n }\n}\n","// ==========================================================================\n// Time utils\n// ==========================================================================\n\nimport is from './is';\n\n// Time helpers\nexport const getHours = value => parseInt((value / 60 / 60) % 60, 10);\nexport const getMinutes = value => parseInt((value / 60) % 60, 10);\nexport const getSeconds = value => parseInt(value % 60, 10);\n\n// Format time to UI friendly string\nexport function formatTime(time = 0, displayHours = false, inverted = false) {\n // Bail if the value isn't a number\n if (!is.number(time)) {\n return formatTime(null, displayHours, inverted);\n }\n\n // Format time component to add leading zero\n const format = value => `0${value}`.slice(-2);\n\n // Breakdown to hours, mins, secs\n let hours = getHours(time);\n const mins = getMinutes(time);\n const secs = getSeconds(time);\n\n // Do we need to display hours?\n if (displayHours || hours > 0) {\n hours = `${hours}:`;\n } else {\n hours = '';\n }\n\n // Render\n return `${inverted && time > 0 ? '-' : ''}${hours}${format(mins)}:${format(secs)}`;\n}\n","// ==========================================================================\n// Plyr controls\n// ==========================================================================\n\nimport captions from './captions';\nimport html5 from './html5';\nimport i18n from './i18n';\nimport support from './support';\nimport { repaint, transitionEndEvent } from './utils/animation';\nimport { dedupe } from './utils/arrays';\nimport browser from './utils/browser';\nimport {\n createElement,\n emptyElement,\n getAttributesFromSelector,\n getElement,\n getElements,\n hasClass,\n removeElement,\n setAttributes,\n toggleClass,\n toggleHidden,\n matches,\n} from './utils/elements';\nimport { off, on } from './utils/events';\nimport is from './utils/is';\nimport loadSprite from './utils/loadSprite';\nimport { extend } from './utils/objects';\nimport { getPercentage, replaceAll, toCamelCase, toTitleCase } from './utils/strings';\nimport { formatTime, getHours } from './utils/time';\n\n// TODO: Don't export a massive object - break down and create class\nconst controls = {\n // Get icon URL\n getIconUrl() {\n const url = new URL(this.config.iconUrl, window.location);\n const cors = url.host !== window.location.host || (browser.isIE && !window.svg4everybody);\n\n return {\n url: this.config.iconUrl,\n cors,\n };\n },\n\n // Find the UI controls\n findElements() {\n try {\n this.elements.controls = getElement.call(this, this.config.selectors.controls.wrapper);\n\n // Buttons\n this.elements.buttons = {\n play: getElements.call(this, this.config.selectors.buttons.play),\n pause: getElement.call(this, this.config.selectors.buttons.pause),\n restart: getElement.call(this, this.config.selectors.buttons.restart),\n rewind: getElement.call(this, this.config.selectors.buttons.rewind),\n fastForward: getElement.call(this, this.config.selectors.buttons.fastForward),\n mute: getElement.call(this, this.config.selectors.buttons.mute),\n pip: getElement.call(this, this.config.selectors.buttons.pip),\n airplay: getElement.call(this, this.config.selectors.buttons.airplay),\n settings: getElement.call(this, this.config.selectors.buttons.settings),\n captions: getElement.call(this, this.config.selectors.buttons.captions),\n fullscreen: getElement.call(this, this.config.selectors.buttons.fullscreen),\n };\n\n // Progress\n this.elements.progress = getElement.call(this, this.config.selectors.progress);\n\n // Inputs\n this.elements.inputs = {\n seek: getElement.call(this, this.config.selectors.inputs.seek),\n volume: getElement.call(this, this.config.selectors.inputs.volume),\n };\n\n // Display\n this.elements.display = {\n buffer: getElement.call(this, this.config.selectors.display.buffer),\n currentTime: getElement.call(this, this.config.selectors.display.currentTime),\n duration: getElement.call(this, this.config.selectors.display.duration),\n };\n\n // Seek tooltip\n if (is.element(this.elements.progress)) {\n this.elements.display.seekTooltip = this.elements.progress.querySelector(\n `.${this.config.classNames.tooltip}`,\n );\n }\n\n return true;\n } catch (error) {\n // Log it\n this.debug.warn('It looks like there is a problem with your custom controls HTML', error);\n\n // Restore native video controls\n this.toggleNativeControls(true);\n\n return false;\n }\n },\n\n // Create <svg> icon\n createIcon(type, attributes) {\n const namespace = 'http://www.w3.org/2000/svg';\n const iconUrl = controls.getIconUrl.call(this);\n const iconPath = `${!iconUrl.cors ? iconUrl.url : ''}#${this.config.iconPrefix}`;\n\n // Create <svg>\n const icon = document.createElementNS(namespace, 'svg');\n setAttributes(\n icon,\n extend(attributes, {\n role: 'presentation',\n focusable: 'false',\n }),\n );\n\n // Create the <use> to reference sprite\n const use = document.createElementNS(namespace, 'use');\n const path = `${iconPath}-${type}`;\n\n // Set `href` attributes\n // https://github.com/sampotts/plyr/issues/460\n // https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/xlink:href\n if ('href' in use) {\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'href', path);\n } else {\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path);\n }\n\n // Add <use> to <svg>\n icon.appendChild(use);\n\n return icon;\n },\n\n // Create hidden text label\n createLabel(type, attr = {}) {\n // Skip i18n for abbreviations and brand names\n const universals = {\n pip: 'PIP',\n airplay: 'AirPlay',\n };\n const text = universals[type] || i18n.get(type, this.config);\n\n const attributes = Object.assign({}, attr, {\n class: [attr.class, this.config.classNames.hidden].filter(Boolean).join(' '),\n });\n return createElement('span', attributes, text);\n },\n\n // Create a badge\n createBadge(text) {\n if (is.empty(text)) {\n return null;\n }\n\n const badge = createElement('span', {\n class: this.config.classNames.menu.value,\n });\n\n badge.appendChild(\n createElement(\n 'span',\n {\n class: this.config.classNames.menu.badge,\n },\n text,\n ),\n );\n\n return badge;\n },\n\n // Create a <button>\n createButton(buttonType, attr) {\n const button = createElement('button');\n const attributes = Object.assign({}, attr);\n let type = toCamelCase(buttonType);\n\n let toggle = false;\n let label;\n let icon;\n let labelPressed;\n let iconPressed;\n\n if (!('type' in attributes)) {\n attributes.type = 'button';\n }\n\n if ('class' in attributes) {\n if (attributes.class.includes(this.config.classNames.control)) {\n attributes.class += ` ${this.config.classNames.control}`;\n }\n } else {\n attributes.class = this.config.classNames.control;\n }\n\n // Large play button\n switch (buttonType) {\n case 'play':\n toggle = true;\n label = 'play';\n labelPressed = 'pause';\n icon = 'play';\n iconPressed = 'pause';\n break;\n\n case 'mute':\n toggle = true;\n label = 'mute';\n labelPressed = 'unmute';\n icon = 'volume';\n iconPressed = 'muted';\n break;\n\n case 'captions':\n toggle = true;\n label = 'enableCaptions';\n labelPressed = 'disableCaptions';\n icon = 'captions-off';\n iconPressed = 'captions-on';\n break;\n\n case 'fullscreen':\n toggle = true;\n label = 'enterFullscreen';\n labelPressed = 'exitFullscreen';\n icon = 'enter-fullscreen';\n iconPressed = 'exit-fullscreen';\n break;\n\n case 'play-large':\n attributes.class += ` ${this.config.classNames.control}--overlaid`;\n type = 'play';\n label = 'play';\n icon = 'play';\n break;\n\n default:\n label = type;\n icon = buttonType;\n }\n\n // Setup toggle icon and labels\n if (toggle) {\n // Icon\n button.appendChild(controls.createIcon.call(this, iconPressed, { class: 'icon--pressed' }));\n button.appendChild(controls.createIcon.call(this, icon, { class: 'icon--not-pressed' }));\n\n // Label/Tooltip\n button.appendChild(controls.createLabel.call(this, labelPressed, { class: 'label--pressed' }));\n button.appendChild(controls.createLabel.call(this, label, { class: 'label--not-pressed' }));\n } else {\n button.appendChild(controls.createIcon.call(this, icon));\n button.appendChild(controls.createLabel.call(this, label));\n }\n\n // Merge attributes\n extend(attributes, getAttributesFromSelector(this.config.selectors.buttons[type], attributes));\n\n setAttributes(button, attributes);\n\n // We have multiple play buttons\n if (type === 'play') {\n if (!is.array(this.elements.buttons[type])) {\n this.elements.buttons[type] = [];\n }\n\n this.elements.buttons[type].push(button);\n } else {\n this.elements.buttons[type] = button;\n }\n\n // Toggle classname when pressed property is set\n const className = this.config.classNames.controlPressed;\n Object.defineProperty(button, 'pressed', {\n enumerable: true,\n get() {\n return hasClass(button, className);\n },\n set(pressed = false) {\n toggleClass(button, className, pressed);\n },\n });\n\n return button;\n },\n\n // Create an <input type='range'>\n createRange(type, attributes) {\n // Seek input\n const input = createElement(\n 'input',\n extend(\n getAttributesFromSelector(this.config.selectors.inputs[type]),\n {\n type: 'range',\n min: 0,\n max: 100,\n step: 0.01,\n value: 0,\n autocomplete: 'off',\n // A11y fixes for https://github.com/sampotts/plyr/issues/905\n role: 'slider',\n 'aria-label': i18n.get(type, this.config),\n 'aria-valuemin': 0,\n 'aria-valuemax': 100,\n 'aria-valuenow': 0,\n },\n attributes,\n ),\n );\n\n this.elements.inputs[type] = input;\n\n // Set the fill for webkit now\n controls.updateRangeFill.call(this, input);\n\n return input;\n },\n\n // Create a <progress>\n createProgress(type, attributes) {\n const progress = createElement(\n 'progress',\n extend(\n getAttributesFromSelector(this.config.selectors.display[type]),\n {\n min: 0,\n max: 100,\n value: 0,\n role: 'presentation',\n 'aria-hidden': true,\n },\n attributes,\n ),\n );\n\n // Create the label inside\n if (type !== 'volume') {\n progress.appendChild(createElement('span', null, '0'));\n\n const suffixKey = {\n played: 'played',\n buffer: 'buffered',\n }[type];\n const suffix = suffixKey ? i18n.get(suffixKey, this.config) : '';\n\n progress.innerText = `% ${suffix.toLowerCase()}`;\n }\n\n this.elements.display[type] = progress;\n\n return progress;\n },\n\n // Create time display\n createTime(type) {\n const attributes = getAttributesFromSelector(this.config.selectors.display[type]);\n\n const container = createElement(\n 'div',\n extend(attributes, {\n class: `plyr__time ${attributes.class}`,\n 'aria-label': i18n.get(type, this.config),\n }),\n '00:00',\n );\n\n // Reference for updates\n this.elements.display[type] = container;\n\n return container;\n },\n\n // Create a settings menu item\n createMenuItem({ value, list, type, title, badge = null, checked = false }) {\n const item = createElement('li');\n\n const label = createElement('label', {\n class: this.config.classNames.control,\n });\n\n const radio = createElement(\n 'input',\n extend(getAttributesFromSelector(this.config.selectors.inputs[type]), {\n type: 'radio',\n name: `plyr-${type}`,\n value,\n checked,\n class: 'plyr__sr-only',\n }),\n );\n\n const faux = createElement('span', { hidden: '' });\n\n label.appendChild(radio);\n label.appendChild(faux);\n label.insertAdjacentHTML('beforeend', title);\n\n if (is.element(badge)) {\n label.appendChild(badge);\n }\n\n item.appendChild(label);\n list.appendChild(item);\n },\n\n // Format a time for display\n formatTime(time = 0, inverted = false) {\n // Bail if the value isn't a number\n if (!is.number(time)) {\n return time;\n }\n\n // Always display hours if duration is over an hour\n const forceHours = getHours(this.duration) > 0;\n\n return formatTime(time, forceHours, inverted);\n },\n\n // Update the displayed time\n updateTimeDisplay(target = null, time = 0, inverted = false) {\n // Bail if there's no element to display or the value isn't a number\n if (!is.element(target) || !is.number(time)) {\n return;\n }\n\n // eslint-disable-next-line no-param-reassign\n target.innerText = controls.formatTime(time, inverted);\n },\n\n // Update volume UI and storage\n updateVolume() {\n if (!this.supported.ui) {\n return;\n }\n\n // Update range\n if (is.element(this.elements.inputs.volume)) {\n controls.setRange.call(this, this.elements.inputs.volume, this.muted ? 0 : this.volume);\n }\n\n // Update mute state\n if (is.element(this.elements.buttons.mute)) {\n this.elements.buttons.mute.pressed = this.muted || this.volume === 0;\n }\n },\n\n // Update seek value and lower fill\n setRange(target, value = 0) {\n if (!is.element(target)) {\n return;\n }\n\n // eslint-disable-next-line\n target.value = value;\n\n // Webkit range fill\n controls.updateRangeFill.call(this, target);\n },\n\n // Update <progress> elements\n updateProgress(event) {\n if (!this.supported.ui || !is.event(event)) {\n return;\n }\n\n let value = 0;\n\n const setProgress = (target, input) => {\n const value = is.number(input) ? input : 0;\n const progress = is.element(target) ? target : this.elements.display.buffer;\n\n // Update value and label\n if (is.element(progress)) {\n progress.value = value;\n\n // Update text label inside\n const label = progress.getElementsByTagName('span')[0];\n if (is.element(label)) {\n label.childNodes[0].nodeValue = value;\n }\n }\n };\n\n if (event) {\n switch (event.type) {\n // Video playing\n case 'timeupdate':\n case 'seeking':\n case 'seeked':\n value = getPercentage(this.currentTime, this.duration);\n\n // Set seek range value only if it's a 'natural' time event\n if (event.type === 'timeupdate') {\n controls.setRange.call(this, this.elements.inputs.seek, value);\n }\n\n break;\n\n // Check buffer status\n case 'playing':\n case 'progress':\n setProgress(this.elements.display.buffer, this.buffered * 100);\n\n break;\n\n default:\n break;\n }\n }\n },\n\n // Webkit polyfill for lower fill range\n updateRangeFill(target) {\n // Get range from event if event passed\n const range = is.event(target) ? target.target : target;\n\n // Needs to be a valid <input type='range'>\n if (!is.element(range) || range.getAttribute('type') !== 'range') {\n return;\n }\n\n // Set aria values for https://github.com/sampotts/plyr/issues/905\n if (matches(range, this.config.selectors.inputs.seek)) {\n range.setAttribute('aria-valuenow', this.currentTime);\n const currentTime = controls.formatTime(this.currentTime);\n const duration = controls.formatTime(this.duration);\n const format = i18n.get('seekLabel', this.config);\n range.setAttribute(\n 'aria-valuetext',\n format.replace('{currentTime}', currentTime).replace('{duration}', duration),\n );\n } else if (matches(range, this.config.selectors.inputs.volume)) {\n const percent = range.value * 100;\n range.setAttribute('aria-valuenow', percent);\n range.setAttribute('aria-valuetext', `${percent}%`);\n } else {\n range.setAttribute('aria-valuenow', range.value);\n }\n\n // WebKit only\n if (!browser.isWebkit) {\n return;\n }\n\n // Set CSS custom property\n range.style.setProperty('--value', `${range.value / range.max * 100}%`);\n },\n\n // Update hover tooltip for seeking\n updateSeekTooltip(event) {\n // Bail if setting not true\n if (\n !this.config.tooltips.seek ||\n !is.element(this.elements.inputs.seek) ||\n !is.element(this.elements.display.seekTooltip) ||\n this.duration === 0\n ) {\n return;\n }\n\n // Calculate percentage\n let percent = 0;\n const clientRect = this.elements.progress.getBoundingClientRect();\n const visible = `${this.config.classNames.tooltip}--visible`;\n\n const toggle = toggle => {\n toggleClass(this.elements.display.seekTooltip, visible, toggle);\n };\n\n // Hide on touch\n if (this.touch) {\n toggle(false);\n return;\n }\n\n // Determine percentage, if already visible\n if (is.event(event)) {\n percent = 100 / clientRect.width * (event.pageX - clientRect.left);\n } else if (hasClass(this.elements.display.seekTooltip, visible)) {\n percent = parseFloat(this.elements.display.seekTooltip.style.left, 10);\n } else {\n return;\n }\n\n // Set bounds\n if (percent < 0) {\n percent = 0;\n } else if (percent > 100) {\n percent = 100;\n }\n\n // Display the time a click would seek to\n controls.updateTimeDisplay.call(this, this.elements.display.seekTooltip, this.duration / 100 * percent);\n\n // Set position\n this.elements.display.seekTooltip.style.left = `${percent}%`;\n\n // Show/hide the tooltip\n // If the event is a moues in/out and percentage is inside bounds\n if (is.event(event) && ['mouseenter', 'mouseleave'].includes(event.type)) {\n toggle(event.type === 'mouseenter');\n }\n },\n\n // Handle time change event\n timeUpdate(event) {\n // Only invert if only one time element is displayed and used for both duration and currentTime\n const invert = !is.element(this.elements.display.duration) && this.config.invertTime;\n\n // Duration\n controls.updateTimeDisplay.call(\n this,\n this.elements.display.currentTime,\n invert ? this.duration - this.currentTime : this.currentTime,\n invert,\n );\n\n // Ignore updates while seeking\n if (event && event.type === 'timeupdate' && this.media.seeking) {\n return;\n }\n\n // Playing progress\n controls.updateProgress.call(this, event);\n },\n\n // Show the duration on metadataloaded or durationchange events\n durationUpdate() {\n // Bail if no UI or durationchange event triggered after playing/seek when invertTime is false\n if (!this.supported.ui || (!this.config.invertTime && this.currentTime)) {\n return;\n }\n\n // Update ARIA values\n if (is.element(this.elements.inputs.seek)) {\n this.elements.inputs.seek.setAttribute('aria-valuemax', this.duration);\n }\n\n // If there's a spot to display duration\n const hasDuration = is.element(this.elements.display.duration);\n\n // If there's only one time display, display duration there\n if (!hasDuration && this.config.displayDuration && this.paused) {\n controls.updateTimeDisplay.call(this, this.elements.display.currentTime, this.duration);\n }\n\n // If there's a duration element, update content\n if (hasDuration) {\n controls.updateTimeDisplay.call(this, this.elements.display.duration, this.duration);\n }\n\n // Update the tooltip (if visible)\n controls.updateSeekTooltip.call(this);\n },\n\n // Hide/show a tab\n toggleTab(setting, toggle) {\n toggleHidden(this.elements.settings.tabs[setting], !toggle);\n },\n\n // Set the quality menu\n setQualityMenu(options) {\n // Menu required\n if (!is.element(this.elements.settings.panes.quality)) {\n return;\n }\n\n const type = 'quality';\n const list = this.elements.settings.panes.quality.querySelector('ul');\n\n // Set options if passed and filter based on uniqueness and config\n if (is.array(options)) {\n this.options.quality = dedupe(options).filter(quality => this.config.quality.options.includes(quality));\n }\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.options.quality) && this.options.quality.length > 1;\n controls.toggleTab.call(this, type, toggle);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If we're hiding, nothing more to do\n if (!toggle) {\n return;\n }\n\n // Empty the menu\n emptyElement(list);\n\n // Get the badge HTML for HD, 4K etc\n const getBadge = quality => {\n const label = i18n.get(`qualityBadge.${quality}`, this.config);\n\n if (!label.length) {\n return null;\n }\n\n return controls.createBadge.call(this, label);\n };\n\n // Sort options by the config and then render options\n this.options.quality\n .sort((a, b) => {\n const sorting = this.config.quality.options;\n return sorting.indexOf(a) > sorting.indexOf(b) ? 1 : -1;\n })\n .forEach(quality => {\n controls.createMenuItem.call(this, {\n value: quality,\n list,\n type,\n title: controls.getLabel.call(this, 'quality', quality),\n badge: getBadge(quality),\n });\n });\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Translate a value into a nice label\n getLabel(setting, value) {\n switch (setting) {\n case 'speed':\n return value === 1 ? i18n.get('normal', this.config) : `${value}&times;`;\n\n case 'quality':\n if (is.number(value)) {\n const label = i18n.get(`qualityLabel.${value}`, this.config);\n\n if (!label.length) {\n return `${value}p`;\n }\n\n return label;\n }\n\n return toTitleCase(value);\n\n case 'captions':\n return captions.getLabel.call(this);\n\n default:\n return null;\n }\n },\n\n // Update the selected setting\n updateSetting(setting, container, input) {\n const pane = this.elements.settings.panes[setting];\n let value = null;\n let list = container;\n\n if (setting === 'captions') {\n value = this.currentTrack;\n } else {\n value = !is.empty(input) ? input : this[setting];\n\n // Get default\n if (is.empty(value)) {\n value = this.config[setting].default;\n }\n\n // Unsupported value\n if (!is.empty(this.options[setting]) && !this.options[setting].includes(value)) {\n this.debug.warn(`Unsupported value of '${value}' for ${setting}`);\n return;\n }\n\n // Disabled value\n if (!this.config[setting].options.includes(value)) {\n this.debug.warn(`Disabled value of '${value}' for ${setting}`);\n return;\n }\n }\n\n // Get the list if we need to\n if (!is.element(list)) {\n list = pane && pane.querySelector('ul');\n }\n\n // If there's no list it means it's not been rendered...\n if (!is.element(list)) {\n return;\n }\n\n // Update the label\n const label = this.elements.settings.tabs[setting].querySelector(`.${this.config.classNames.menu.value}`);\n label.innerHTML = controls.getLabel.call(this, setting, value);\n\n // Find the radio option and check it\n const target = list && list.querySelector(`input[value=\"${value}\"]`);\n\n if (is.element(target)) {\n target.checked = true;\n }\n },\n\n // Set the looping options\n /* setLoopMenu() {\n // Menu required\n if (!is.element(this.elements.settings.panes.loop)) {\n return;\n }\n\n const options = ['start', 'end', 'all', 'reset'];\n const list = this.elements.settings.panes.loop.querySelector('ul');\n\n // Show the pane and tab\n toggleHidden(this.elements.settings.tabs.loop, false);\n toggleHidden(this.elements.settings.panes.loop, false);\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.loop.options);\n controls.toggleTab.call(this, 'loop', toggle);\n\n // Empty the menu\n emptyElement(list);\n\n options.forEach(option => {\n const item = createElement('li');\n\n const button = createElement(\n 'button',\n extend(getAttributesFromSelector(this.config.selectors.buttons.loop), {\n type: 'button',\n class: this.config.classNames.control,\n 'data-plyr-loop-action': option,\n }),\n i18n.get(option, this.config)\n );\n\n if (['start', 'end'].includes(option)) {\n const badge = controls.createBadge.call(this, '00:00');\n button.appendChild(badge);\n }\n\n item.appendChild(button);\n list.appendChild(item);\n });\n }, */\n\n // Get current selected caption language\n // TODO: rework this to user the getter in the API?\n\n // Set a list of available captions languages\n setCaptionsMenu() {\n // TODO: Captions or language? Currently it's mixed\n const type = 'captions';\n const list = this.elements.settings.panes.captions.querySelector('ul');\n const tracks = captions.getTracks.call(this);\n\n // Toggle the pane and tab\n controls.toggleTab.call(this, type, tracks.length);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If there's no captions, bail\n if (!tracks.length) {\n return;\n }\n\n // Generate options data\n const options = tracks.map((track, value) => ({\n value,\n checked: this.captions.toggled && this.currentTrack === value,\n title: captions.getLabel.call(this, track),\n badge: track.language && controls.createBadge.call(this, track.language.toUpperCase()),\n list,\n type: 'language',\n }));\n\n // Add the \"Disabled\" option to turn off captions\n options.unshift({\n value: -1,\n checked: !this.captions.toggled,\n title: i18n.get('disabled', this.config),\n list,\n type: 'language',\n });\n\n // Generate options\n options.forEach(controls.createMenuItem.bind(this));\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Set a list of available captions languages\n setSpeedMenu(options) {\n // Do nothing if not selected\n if (!this.config.controls.includes('settings') || !this.config.settings.includes('speed')) {\n return;\n }\n\n // Menu required\n if (!is.element(this.elements.settings.panes.speed)) {\n return;\n }\n\n const type = 'speed';\n\n // Set the speed options\n if (is.array(options)) {\n this.options.speed = options;\n } else if (this.isHTML5 || this.isVimeo) {\n this.options.speed = [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2];\n }\n\n // Set options if passed and filter based on config\n this.options.speed = this.options.speed.filter(speed => this.config.speed.options.includes(speed));\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.options.speed) && this.options.speed.length > 1;\n controls.toggleTab.call(this, type, toggle);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If we're hiding, nothing more to do\n if (!toggle) {\n return;\n }\n\n // Get the list to populate\n const list = this.elements.settings.panes.speed.querySelector('ul');\n\n // Empty the menu\n emptyElement(list);\n\n // Create items\n this.options.speed.forEach(speed => {\n controls.createMenuItem.call(this, {\n value: speed,\n list,\n type,\n title: controls.getLabel.call(this, 'speed', speed),\n });\n });\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Check if we need to hide/show the settings menu\n checkMenu() {\n const { tabs } = this.elements.settings;\n const visible = !is.empty(tabs) && Object.values(tabs).some(tab => !tab.hidden);\n\n toggleHidden(this.elements.settings.menu, !visible);\n },\n\n // Show/hide menu\n toggleMenu(event) {\n const { form } = this.elements.settings;\n const button = this.elements.buttons.settings;\n\n // Menu and button are required\n if (!is.element(form) || !is.element(button)) {\n return;\n }\n\n const show = is.boolean(event) ? event : is.element(form) && form.hasAttribute('hidden');\n\n if (is.event(event)) {\n const isMenuItem = is.element(form) && form.contains(event.target);\n const isButton = event.target === this.elements.buttons.settings;\n\n // If the click was inside the form or if the click\n // wasn't the button or menu item and we're trying to\n // show the menu (a doc click shouldn't show the menu)\n if (isMenuItem || (!isMenuItem && !isButton && show)) {\n return;\n }\n\n // Prevent the toggle being caught by the doc listener\n if (isButton) {\n event.stopPropagation();\n }\n }\n\n // Set form and button attributes\n if (is.element(button)) {\n button.setAttribute('aria-expanded', show);\n }\n\n if (is.element(form)) {\n toggleHidden(form, !show);\n toggleClass(this.elements.container, this.config.classNames.menu.open, show);\n\n if (show) {\n form.removeAttribute('tabindex');\n } else {\n form.setAttribute('tabindex', -1);\n }\n }\n },\n\n // Get the natural size of a tab\n getTabSize(tab) {\n const clone = tab.cloneNode(true);\n clone.style.position = 'absolute';\n clone.style.opacity = 0;\n clone.removeAttribute('hidden');\n\n // Prevent input's being unchecked due to the name being identical\n Array.from(clone.querySelectorAll('input[name]')).forEach(input => {\n const name = input.getAttribute('name');\n input.setAttribute('name', `${name}-clone`);\n });\n\n // Append to parent so we get the \"real\" size\n tab.parentNode.appendChild(clone);\n\n // Get the sizes before we remove\n const width = clone.scrollWidth;\n const height = clone.scrollHeight;\n\n // Remove from the DOM\n removeElement(clone);\n\n return {\n width,\n height,\n };\n },\n\n // Toggle Menu\n showTab(target = '') {\n const { menu } = this.elements.settings;\n const pane = document.getElementById(target);\n\n // Nothing to show, bail\n if (!is.element(pane)) {\n return;\n }\n\n // Are we targeting a tab? If not, bail\n const isTab = pane.getAttribute('role') === 'tabpanel';\n if (!isTab) {\n return;\n }\n\n // Hide all other tabs\n // Get other tabs\n const current = menu.querySelector('[role=\"tabpanel\"]:not([hidden])');\n const container = current.parentNode;\n\n // Set other toggles to be expanded false\n Array.from(menu.querySelectorAll(`[aria-controls=\"${current.getAttribute('id')}\"]`)).forEach(toggle => {\n toggle.setAttribute('aria-expanded', false);\n });\n\n // If we can do fancy animations, we'll animate the height/width\n if (support.transitions && !support.reducedMotion) {\n // Set the current width as a base\n container.style.width = `${current.scrollWidth}px`;\n container.style.height = `${current.scrollHeight}px`;\n\n // Get potential sizes\n const size = controls.getTabSize.call(this, pane);\n\n // Restore auto height/width\n const restore = e => {\n // We're only bothered about height and width on the container\n if (e.target !== container || !['width', 'height'].includes(e.propertyName)) {\n return;\n }\n\n // Revert back to auto\n container.style.width = '';\n container.style.height = '';\n\n // Only listen once\n off.call(this, container, transitionEndEvent, restore);\n };\n\n // Listen for the transition finishing and restore auto height/width\n on.call(this, container, transitionEndEvent, restore);\n\n // Set dimensions to target\n container.style.width = `${size.width}px`;\n container.style.height = `${size.height}px`;\n }\n\n // Set attributes on current tab\n toggleHidden(current, true);\n current.setAttribute('tabindex', -1);\n\n // Set attributes on target\n toggleHidden(pane, false);\n\n const tabs = getElements.call(this, `[aria-controls=\"${target}\"]`);\n Array.from(tabs).forEach(tab => {\n tab.setAttribute('aria-expanded', true);\n });\n pane.removeAttribute('tabindex');\n\n // Focus the first item\n pane.querySelectorAll('button:not(:disabled), input:not(:disabled), [tabindex]')[0].focus();\n },\n\n // Build the default HTML\n // TODO: Set order based on order in the config.controls array?\n create(data) {\n // Do nothing if we want no controls\n if (is.empty(this.config.controls)) {\n return null;\n }\n\n // Create the container\n const container = createElement('div', getAttributesFromSelector(this.config.selectors.controls.wrapper));\n\n // Restart button\n if (this.config.controls.includes('restart')) {\n container.appendChild(controls.createButton.call(this, 'restart'));\n }\n\n // Rewind button\n if (this.config.controls.includes('rewind')) {\n container.appendChild(controls.createButton.call(this, 'rewind'));\n }\n\n // Play/Pause button\n if (this.config.controls.includes('play')) {\n container.appendChild(controls.createButton.call(this, 'play'));\n }\n\n // Fast forward button\n if (this.config.controls.includes('fast-forward')) {\n container.appendChild(controls.createButton.call(this, 'fast-forward'));\n }\n\n // Progress\n if (this.config.controls.includes('progress')) {\n const progress = createElement('div', getAttributesFromSelector(this.config.selectors.progress));\n\n // Seek range slider\n progress.appendChild(\n controls.createRange.call(this, 'seek', {\n id: `plyr-seek-${data.id}`,\n }),\n );\n\n // Buffer progress\n progress.appendChild(controls.createProgress.call(this, 'buffer'));\n\n // TODO: Add loop display indicator\n\n // Seek tooltip\n if (this.config.tooltips.seek) {\n const tooltip = createElement(\n 'span',\n {\n class: this.config.classNames.tooltip,\n },\n '00:00',\n );\n\n progress.appendChild(tooltip);\n this.elements.display.seekTooltip = tooltip;\n }\n\n this.elements.progress = progress;\n container.appendChild(this.elements.progress);\n }\n\n // Media current time display\n if (this.config.controls.includes('current-time')) {\n container.appendChild(controls.createTime.call(this, 'currentTime'));\n }\n\n // Media duration display\n if (this.config.controls.includes('duration')) {\n container.appendChild(controls.createTime.call(this, 'duration'));\n }\n\n // Toggle mute button\n if (this.config.controls.includes('mute')) {\n container.appendChild(controls.createButton.call(this, 'mute'));\n }\n\n // Volume range control\n if (this.config.controls.includes('volume')) {\n const volume = createElement('div', {\n class: 'plyr__volume',\n });\n\n // Set the attributes\n const attributes = {\n max: 1,\n step: 0.05,\n value: this.config.volume,\n };\n\n // Create the volume range slider\n volume.appendChild(\n controls.createRange.call(\n this,\n 'volume',\n extend(attributes, {\n id: `plyr-volume-${data.id}`,\n }),\n ),\n );\n\n this.elements.volume = volume;\n\n container.appendChild(volume);\n }\n\n // Toggle captions button\n if (this.config.controls.includes('captions')) {\n container.appendChild(controls.createButton.call(this, 'captions'));\n }\n\n // Settings button / menu\n if (this.config.controls.includes('settings') && !is.empty(this.config.settings)) {\n const menu = createElement('div', {\n class: 'plyr__menu',\n hidden: '',\n });\n\n menu.appendChild(\n controls.createButton.call(this, 'settings', {\n id: `plyr-settings-toggle-${data.id}`,\n 'aria-haspopup': true,\n 'aria-controls': `plyr-settings-${data.id}`,\n 'aria-expanded': false,\n }),\n );\n\n const form = createElement('form', {\n class: 'plyr__menu__container',\n id: `plyr-settings-${data.id}`,\n hidden: '',\n 'aria-labelled-by': `plyr-settings-toggle-${data.id}`,\n role: 'tablist',\n tabindex: -1,\n });\n\n const inner = createElement('div');\n\n const home = createElement('div', {\n id: `plyr-settings-${data.id}-home`,\n 'aria-labelled-by': `plyr-settings-toggle-${data.id}`,\n role: 'tabpanel',\n });\n\n // Create the tab list\n const tabs = createElement('ul', {\n role: 'tablist',\n });\n\n // Build the tabs\n this.config.settings.forEach(type => {\n const tab = createElement('li', {\n role: 'tab',\n hidden: '',\n });\n\n const button = createElement(\n 'button',\n extend(getAttributesFromSelector(this.config.selectors.buttons.settings), {\n type: 'button',\n class: `${this.config.classNames.control} ${this.config.classNames.control}--forward`,\n id: `plyr-settings-${data.id}-${type}-tab`,\n 'aria-haspopup': true,\n 'aria-controls': `plyr-settings-${data.id}-${type}`,\n 'aria-expanded': false,\n }),\n i18n.get(type, this.config),\n );\n\n const value = createElement('span', {\n class: this.config.classNames.menu.value,\n });\n\n // Speed contains HTML entities\n value.innerHTML = data[type];\n\n button.appendChild(value);\n tab.appendChild(button);\n tabs.appendChild(tab);\n\n this.elements.settings.tabs[type] = tab;\n });\n\n home.appendChild(tabs);\n inner.appendChild(home);\n\n // Build the panes\n this.config.settings.forEach(type => {\n const pane = createElement('div', {\n id: `plyr-settings-${data.id}-${type}`,\n hidden: '',\n 'aria-labelled-by': `plyr-settings-${data.id}-${type}-tab`,\n role: 'tabpanel',\n tabindex: -1,\n });\n\n const back = createElement(\n 'button',\n {\n type: 'button',\n class: `${this.config.classNames.control} ${this.config.classNames.control}--back`,\n 'aria-haspopup': true,\n 'aria-controls': `plyr-settings-${data.id}-home`,\n 'aria-expanded': false,\n },\n i18n.get(type, this.config),\n );\n\n pane.appendChild(back);\n\n const options = createElement('ul');\n\n pane.appendChild(options);\n inner.appendChild(pane);\n\n this.elements.settings.panes[type] = pane;\n });\n\n form.appendChild(inner);\n menu.appendChild(form);\n container.appendChild(menu);\n\n this.elements.settings.form = form;\n this.elements.settings.menu = menu;\n }\n\n // Picture in picture button\n if (this.config.controls.includes('pip') && support.pip) {\n container.appendChild(controls.createButton.call(this, 'pip'));\n }\n\n // Airplay button\n if (this.config.controls.includes('airplay') && support.airplay) {\n container.appendChild(controls.createButton.call(this, 'airplay'));\n }\n\n // Toggle fullscreen button\n if (this.config.controls.includes('fullscreen')) {\n container.appendChild(controls.createButton.call(this, 'fullscreen'));\n }\n\n // Larger overlaid play button\n if (this.config.controls.includes('play-large')) {\n this.elements.container.appendChild(controls.createButton.call(this, 'play-large'));\n }\n\n this.elements.controls = container;\n\n if (this.isHTML5) {\n controls.setQualityMenu.call(this, html5.getQualityOptions.call(this));\n }\n\n controls.setSpeedMenu.call(this);\n\n return container;\n },\n\n // Insert controls\n inject() {\n // Sprite\n if (this.config.loadSprite) {\n const icon = controls.getIconUrl.call(this);\n\n // Only load external sprite using AJAX\n if (icon.cors) {\n loadSprite(icon.url, 'sprite-plyr');\n }\n }\n\n // Create a unique ID\n this.id = Math.floor(Math.random() * 10000);\n\n // Null by default\n let container = null;\n this.elements.controls = null;\n\n // Set template properties\n const props = {\n id: this.id,\n seektime: this.config.seekTime,\n title: this.config.title,\n };\n let update = true;\n\n if (is.string(this.config.controls) || is.element(this.config.controls)) {\n // String or HTMLElement passed as the option\n container = this.config.controls;\n } else if (is.function(this.config.controls)) {\n // A custom function to build controls\n // The function can return a HTMLElement or String\n container = this.config.controls.call(this, props);\n } else {\n // Create controls\n container = controls.create.call(this, {\n id: this.id,\n seektime: this.config.seekTime,\n speed: this.speed,\n quality: this.quality,\n captions: captions.getLabel.call(this),\n // TODO: Looping\n // loop: 'None',\n });\n update = false;\n }\n\n // Replace props with their value\n const replace = input => {\n let result = input;\n\n Object.entries(props).forEach(([key, value]) => {\n result = replaceAll(result, `{${key}}`, value);\n });\n\n return result;\n };\n\n // Update markup\n if (update) {\n if (is.string(this.config.controls)) {\n container = replace(container);\n } else if (is.element(container)) {\n container.innerHTML = replace(container.innerHTML);\n }\n }\n\n // Controls container\n let target;\n\n // Inject to custom location\n if (is.string(this.config.selectors.controls.container)) {\n target = document.querySelector(this.config.selectors.controls.container);\n }\n\n // Inject into the container by default\n if (!is.element(target)) {\n target = this.elements.container;\n }\n\n // Inject controls HTML\n if (is.element(container)) {\n target.appendChild(container);\n } else if (container) {\n target.insertAdjacentHTML('beforeend', container);\n }\n\n // Find the elements if need be\n if (!is.element(this.elements.controls)) {\n controls.findElements.call(this);\n }\n\n // Edge sometimes doesn't finish the paint so force a redraw\n if (window.navigator.userAgent.includes('Edge')) {\n repaint(target);\n }\n\n // Setup tooltips\n if (this.config.tooltips.controls) {\n const { classNames, selectors } = this.config;\n const selector = `${selectors.controls.wrapper} ${selectors.labels} .${classNames.hidden}`;\n const labels = getElements.call(this, selector);\n\n Array.from(labels).forEach(label => {\n toggleClass(label, this.config.classNames.hidden, false);\n toggleClass(label, this.config.classNames.tooltip, true);\n });\n }\n },\n};\n\nexport default controls;\n","// ==========================================================================\n// Fetch wrapper\n// Using XHR to avoid issues with older browsers\n// ==========================================================================\n\nexport default function fetch(url, responseType = 'text') {\n return new Promise((resolve, reject) => {\n try {\n const request = new XMLHttpRequest();\n\n // Check for CORS support\n if (!('withCredentials' in request)) {\n return;\n }\n\n request.addEventListener('load', () => {\n if (responseType === 'text') {\n try {\n resolve(JSON.parse(request.responseText));\n } catch (e) {\n resolve(request.responseText);\n }\n } else {\n resolve(request.response);\n }\n });\n\n request.addEventListener('error', () => {\n throw new Error(request.statusText);\n });\n\n request.open('GET', url, true);\n\n // Set the required response type\n request.responseType = responseType;\n\n request.send();\n } catch (e) {\n reject(e);\n }\n });\n}\n","// ==========================================================================\n// URL utils\n// ==========================================================================\n\nimport is from './is';\n\n/**\n * Parse a string to a URL object\n * @param {string} input - the URL to be parsed\n * @param {boolean} safe - failsafe parsing\n */\nexport function parseUrl(input, safe = true) {\n let url = input;\n\n if (safe) {\n const parser = document.createElement('a');\n parser.href = url;\n url = parser.href;\n }\n\n try {\n return new URL(url);\n } catch (e) {\n return null;\n }\n}\n\n// Convert object to URLSearchParams\nexport function buildUrlParams(input) {\n const params = new URLSearchParams();\n\n if (is.object(input)) {\n Object.entries(input).forEach(([key, value]) => {\n params.set(key, value);\n });\n }\n\n return params;\n}\n","// ==========================================================================\n// Plyr Captions\n// TODO: Create as class\n// ==========================================================================\n\nimport controls from './controls';\nimport i18n from './i18n';\nimport support from './support';\nimport { dedupe } from './utils/arrays';\nimport browser from './utils/browser';\nimport {\n createElement,\n emptyElement,\n getAttributesFromSelector,\n insertAfter,\n removeElement,\n toggleClass,\n} from './utils/elements';\nimport { on, triggerEvent } from './utils/events';\nimport fetch from './utils/fetch';\nimport is from './utils/is';\nimport { getHTML } from './utils/strings';\nimport { parseUrl } from './utils/urls';\n\nconst captions = {\n // Setup captions\n setup() {\n // Requires UI support\n if (!this.supported.ui) {\n return;\n }\n\n // Only Vimeo and HTML5 video supported at this point\n if (!this.isVideo || this.isYouTube || (this.isHTML5 && !support.textTracks)) {\n // Clear menu and hide\n if (\n is.array(this.config.controls) &&\n this.config.controls.includes('settings') &&\n this.config.settings.includes('captions')\n ) {\n controls.setCaptionsMenu.call(this);\n }\n\n return;\n }\n\n // Inject the container\n if (!is.element(this.elements.captions)) {\n this.elements.captions = createElement('div', getAttributesFromSelector(this.config.selectors.captions));\n\n insertAfter(this.elements.captions, this.elements.wrapper);\n }\n\n // Fix IE captions if CORS is used\n // Fetch captions and inject as blobs instead (data URIs not supported!)\n if (browser.isIE && window.URL) {\n const elements = this.media.querySelectorAll('track');\n\n Array.from(elements).forEach(track => {\n const src = track.getAttribute('src');\n const url = parseUrl(src);\n\n if (\n url !== null &&\n url.hostname !== window.location.href.hostname &&\n ['http:', 'https:'].includes(url.protocol)\n ) {\n fetch(src, 'blob')\n .then(blob => {\n track.setAttribute('src', window.URL.createObjectURL(blob));\n })\n .catch(() => {\n removeElement(track);\n });\n }\n });\n }\n\n // Get and set initial data\n // The \"preferred\" options are not realized unless / until the wanted language has a match\n // * languages: Array of user's browser languages.\n // * language: The language preferred by user settings or config\n // * active: The state preferred by user settings or config\n // * toggled: The real captions state\n\n const languages = dedupe(\n Array.from(navigator.languages || navigator.userLanguage).map(language => language.split('-')[0]),\n );\n\n let language = (this.storage.get('language') || this.config.captions.language || 'auto').toLowerCase();\n\n // Use first browser language when language is 'auto'\n if (language === 'auto') {\n [language] = languages;\n }\n\n let active = this.storage.get('captions');\n if (!is.boolean(active)) {\n ({ active } = this.config.captions);\n }\n\n Object.assign(this.captions, {\n toggled: false,\n active,\n language,\n languages,\n });\n\n // Watch changes to textTracks and update captions menu\n if (this.isHTML5) {\n const trackEvents = this.config.captions.update ? 'addtrack removetrack' : 'removetrack';\n on.call(this, this.media.textTracks, trackEvents, captions.update.bind(this));\n }\n\n // Update available languages in list next tick (the event must not be triggered before the listeners)\n setTimeout(captions.update.bind(this), 0);\n },\n\n // Update available language options in settings based on tracks\n update() {\n const tracks = captions.getTracks.call(this, true);\n // Get the wanted language\n const { active, language, meta, currentTrackNode } = this.captions;\n const languageExists = Boolean(tracks.find(track => track.language === language));\n\n // Handle tracks (add event listener and \"pseudo\"-default)\n if (this.isHTML5 && this.isVideo) {\n tracks.filter(track => !meta.get(track)).forEach(track => {\n this.debug.log('Track added', track);\n // Attempt to store if the original dom element was \"default\"\n meta.set(track, {\n default: track.mode === 'showing',\n });\n\n // Turn off native caption rendering to avoid double captions\n track.mode = 'hidden';\n\n // Add event listener for cue changes\n on.call(this, track, 'cuechange', () => captions.updateCues.call(this));\n });\n }\n\n // Update language first time it matches, or if the previous matching track was removed\n if ((languageExists && this.language !== language) || !tracks.includes(currentTrackNode)) {\n captions.setLanguage.call(this, language);\n captions.toggle.call(this, active && languageExists);\n }\n\n // Enable or disable captions based on track length\n toggleClass(this.elements.container, this.config.classNames.captions.enabled, !is.empty(tracks));\n\n // Update available languages in list\n if ((this.config.controls || []).includes('settings') && this.config.settings.includes('captions')) {\n controls.setCaptionsMenu.call(this);\n }\n },\n\n // Toggle captions display\n // Used internally for the toggleCaptions method, with the passive option forced to false\n toggle(input, passive = true) {\n // If there's no full support\n if (!this.supported.ui) {\n return;\n }\n\n const { toggled } = this.captions; // Current state\n const activeClass = this.config.classNames.captions.active;\n\n // Get the next state\n // If the method is called without parameter, toggle based on current value\n const active = is.nullOrUndefined(input) ? !toggled : input;\n\n // Update state and trigger event\n if (active !== toggled) {\n // When passive, don't override user preferences\n if (!passive) {\n this.captions.active = active;\n this.storage.set({ captions: active });\n }\n\n // Force language if the call isn't passive and there is no matching language to toggle to\n if (!this.language && active && !passive) {\n const tracks = captions.getTracks.call(this);\n const track = captions.findTrack.call(this, [this.captions.language, ...this.captions.languages], true);\n\n // Override user preferences to avoid switching languages if a matching track is added\n this.captions.language = track.language;\n\n // Set caption, but don't store in localStorage as user preference\n captions.set.call(this, tracks.indexOf(track));\n return;\n }\n\n // Toggle state\n this.elements.buttons.captions.pressed = active;\n\n // Add class hook\n toggleClass(this.elements.container, activeClass, active);\n\n this.captions.toggled = active;\n\n // Update settings menu\n controls.updateSetting.call(this, 'captions');\n\n // Trigger event (not used internally)\n triggerEvent.call(this, this.media, active ? 'captionsenabled' : 'captionsdisabled');\n }\n },\n\n // Set captions by track index\n // Used internally for the currentTrack setter with the passive option forced to false\n set(index, passive = true) {\n const tracks = captions.getTracks.call(this);\n\n // Disable captions if setting to -1\n if (index === -1) {\n captions.toggle.call(this, false, passive);\n return;\n }\n\n if (!is.number(index)) {\n this.debug.warn('Invalid caption argument', index);\n return;\n }\n\n if (!(index in tracks)) {\n this.debug.warn('Track not found', index);\n return;\n }\n\n if (this.captions.currentTrack !== index) {\n this.captions.currentTrack = index;\n const track = tracks[index];\n const { language } = track || {};\n\n // Store reference to node for invalidation on remove\n this.captions.currentTrackNode = track;\n\n // Update settings menu\n controls.updateSetting.call(this, 'captions');\n\n // When passive, don't override user preferences\n if (!passive) {\n this.captions.language = language;\n this.storage.set({ language });\n }\n\n // Handle Vimeo captions\n if (this.isVimeo) {\n this.embed.enableTextTrack(language);\n }\n\n // Trigger event\n triggerEvent.call(this, this.media, 'languagechange');\n }\n\n // Show captions\n captions.toggle.call(this, true, passive);\n\n if (this.isHTML5 && this.isVideo) {\n // If we change the active track while a cue is already displayed we need to update it\n captions.updateCues.call(this);\n }\n },\n\n // Set captions by language\n // Used internally for the language setter with the passive option forced to false\n setLanguage(input, passive = true) {\n if (!is.string(input)) {\n this.debug.warn('Invalid language argument', input);\n return;\n }\n // Normalize\n const language = input.toLowerCase();\n this.captions.language = language;\n\n // Set currentTrack\n const tracks = captions.getTracks.call(this);\n const track = captions.findTrack.call(this, [language]);\n captions.set.call(this, tracks.indexOf(track), passive);\n },\n\n // Get current valid caption tracks\n // If update is false it will also ignore tracks without metadata\n // This is used to \"freeze\" the language options when captions.update is false\n getTracks(update = false) {\n // Handle media or textTracks missing or null\n const tracks = Array.from((this.media || {}).textTracks || []);\n // For HTML5, use cache instead of current tracks when it exists (if captions.update is false)\n // Filter out removed tracks and tracks that aren't captions/subtitles (for example metadata)\n return tracks\n .filter(track => !this.isHTML5 || update || this.captions.meta.has(track))\n .filter(track => ['captions', 'subtitles'].includes(track.kind));\n },\n\n // Match tracks based on languages and get the first\n findTrack(languages, force = false) {\n const tracks = captions.getTracks.call(this);\n const sortIsDefault = track => Number((this.captions.meta.get(track) || {}).default);\n const sorted = Array.from(tracks).sort((a, b) => sortIsDefault(b) - sortIsDefault(a));\n let track;\n languages.every(language => {\n track = sorted.find(track => track.language === language);\n return !track; // Break iteration if there is a match\n });\n // If no match is found but is required, get first\n return track || (force ? sorted[0] : undefined);\n },\n\n // Get the current track\n getCurrentTrack() {\n return captions.getTracks.call(this)[this.currentTrack];\n },\n\n // Get UI label for track\n getLabel(track) {\n let currentTrack = track;\n\n if (!is.track(currentTrack) && support.textTracks && this.captions.toggled) {\n currentTrack = captions.getCurrentTrack.call(this);\n }\n\n if (is.track(currentTrack)) {\n if (!is.empty(currentTrack.label)) {\n return currentTrack.label;\n }\n\n if (!is.empty(currentTrack.language)) {\n return track.language.toUpperCase();\n }\n\n return i18n.get('enabled', this.config);\n }\n\n return i18n.get('disabled', this.config);\n },\n\n // Update captions using current track's active cues\n // Also optional array argument in case there isn't any track (ex: vimeo)\n updateCues(input) {\n // Requires UI\n if (!this.supported.ui) {\n return;\n }\n\n if (!is.element(this.elements.captions)) {\n this.debug.warn('No captions element to render to');\n return;\n }\n\n // Only accept array or empty input\n if (!is.nullOrUndefined(input) && !Array.isArray(input)) {\n this.debug.warn('updateCues: Invalid input', input);\n return;\n }\n\n let cues = input;\n\n // Get cues from track\n if (!cues) {\n const track = captions.getCurrentTrack.call(this);\n cues = Array.from((track || {}).activeCues || [])\n .map(cue => cue.getCueAsHTML())\n .map(getHTML);\n }\n\n // Set new caption text\n const content = cues.map(cueText => cueText.trim()).join('\\n');\n const changed = content !== this.elements.captions.innerHTML;\n\n if (changed) {\n // Empty the container and create a new child element\n emptyElement(this.elements.captions);\n const caption = createElement('span', getAttributesFromSelector(this.config.selectors.caption));\n caption.innerHTML = content;\n this.elements.captions.appendChild(caption);\n\n // Trigger event\n triggerEvent.call(this, this.media, 'cuechange');\n }\n },\n};\n\nexport default captions;\n","// ==========================================================================\n// Plyr default config\n// ==========================================================================\n\nconst defaults = {\n // Disable\n enabled: true,\n\n // Custom media title\n title: '',\n\n // Logging to console\n debug: false,\n\n // Auto play (if supported)\n autoplay: false,\n\n // Only allow one media playing at once (vimeo only)\n autopause: true,\n\n // Allow inline playback on iOS (this effects YouTube/Vimeo - HTML5 requires the attribute present)\n // TODO: Remove iosNative fullscreen option in favour of this (logic needs work)\n playsinline: true,\n\n // Default time to skip when rewind/fast forward\n seekTime: 10,\n\n // Default volume\n volume: 1,\n muted: false,\n\n // Pass a custom duration\n duration: null,\n\n // Display the media duration on load in the current time position\n // If you have opted to display both duration and currentTime, this is ignored\n displayDuration: true,\n\n // Invert the current time to be a countdown\n invertTime: true,\n\n // Clicking the currentTime inverts it's value to show time left rather than elapsed\n toggleInvert: true,\n\n // Aspect ratio (for embeds)\n ratio: '16:9',\n\n // Click video container to play/pause\n clickToPlay: true,\n\n // Auto hide the controls\n hideControls: true,\n\n // Reset to start when playback ended\n resetOnEnd: false,\n\n // Disable the standard context menu\n disableContextMenu: true,\n\n // Sprite (for icons)\n loadSprite: true,\n iconPrefix: 'plyr',\n iconUrl: 'https://cdn.plyr.io/3.3.12/plyr.svg',\n\n // Blank video (used to prevent errors on source change)\n blankVideo: 'https://cdn.plyr.io/static/blank.mp4',\n\n // Quality default\n quality: {\n default: 576,\n options: [\n 4320,\n 2880,\n 2160,\n 1440,\n 1080,\n 720,\n 576,\n 480,\n 360,\n 240,\n 'default', // YouTube's \"auto\"\n ],\n },\n\n // Set loops\n loop: {\n active: false,\n // start: null,\n // end: null,\n },\n\n // Speed default and options to display\n speed: {\n selected: 1,\n options: [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2],\n },\n\n // Keyboard shortcut settings\n keyboard: {\n focused: true,\n global: false,\n },\n\n // Display tooltips\n tooltips: {\n controls: false,\n seek: true,\n },\n\n // Captions settings\n captions: {\n active: false,\n language: 'auto',\n // Listen to new tracks added after Plyr is initialized.\n // This is needed for streaming captions, but may result in unselectable options\n update: false,\n },\n\n // Fullscreen settings\n fullscreen: {\n enabled: true, // Allow fullscreen?\n fallback: true, // Fallback for vintage browsers\n iosNative: false, // Use the native fullscreen in iOS (disables custom controls)\n },\n\n // Local storage\n storage: {\n enabled: true,\n key: 'plyr',\n },\n\n // Default controls\n controls: [\n 'play-large',\n // 'restart',\n // 'rewind',\n 'play',\n // 'fast-forward',\n 'progress',\n 'current-time',\n 'mute',\n 'volume',\n 'captions',\n 'settings',\n 'pip',\n 'airplay',\n 'fullscreen',\n ],\n settings: ['captions', 'quality', 'speed'],\n\n // Localisation\n i18n: {\n restart: 'Restart',\n rewind: 'Rewind {seektime}s',\n play: 'Play',\n pause: 'Pause',\n fastForward: 'Forward {seektime}s',\n seek: 'Seek',\n seekLabel: '{currentTime} of {duration}',\n played: 'Played',\n buffered: 'Buffered',\n currentTime: 'Current time',\n duration: 'Duration',\n volume: 'Volume',\n mute: 'Mute',\n unmute: 'Unmute',\n enableCaptions: 'Enable captions',\n disableCaptions: 'Disable captions',\n enterFullscreen: 'Enter fullscreen',\n exitFullscreen: 'Exit fullscreen',\n frameTitle: 'Player for {title}',\n captions: 'Captions',\n settings: 'Settings',\n menuBack: 'Go back to previous menu',\n speed: 'Speed',\n normal: 'Normal',\n quality: 'Quality',\n loop: 'Loop',\n start: 'Start',\n end: 'End',\n all: 'All',\n reset: 'Reset',\n disabled: 'Disabled',\n enabled: 'Enabled',\n advertisement: 'Ad',\n qualityBadge: {\n 2160: '4K',\n 1440: 'HD',\n 1080: 'HD',\n 720: 'HD',\n 576: 'SD',\n 480: 'SD',\n },\n },\n\n // URLs\n urls: {\n vimeo: {\n sdk: 'https://player.vimeo.com/api/player.js',\n iframe: 'https://player.vimeo.com/video/{0}?{1}',\n api: 'https://vimeo.com/api/v2/video/{0}.json',\n },\n youtube: {\n sdk: 'https://www.youtube.com/iframe_api',\n api:\n 'https://www.googleapis.com/youtube/v3/videos?id={0}&key={1}&fields=items(snippet(title))&part=snippet',\n },\n googleIMA: {\n sdk: 'https://imasdk.googleapis.com/js/sdkloader/ima3.js',\n },\n },\n\n // Custom control listeners\n listeners: {\n seek: null,\n play: null,\n pause: null,\n restart: null,\n rewind: null,\n fastForward: null,\n mute: null,\n volume: null,\n captions: null,\n fullscreen: null,\n pip: null,\n airplay: null,\n speed: null,\n quality: null,\n loop: null,\n language: null,\n },\n\n // Events to watch and bubble\n events: [\n // Events to watch on HTML5 media elements and bubble\n // https://developer.mozilla.org/en/docs/Web/Guide/Events/Media_events\n 'ended',\n 'progress',\n 'stalled',\n 'playing',\n 'waiting',\n 'canplay',\n 'canplaythrough',\n 'loadstart',\n 'loadeddata',\n 'loadedmetadata',\n 'timeupdate',\n 'volumechange',\n 'play',\n 'pause',\n 'error',\n 'seeking',\n 'seeked',\n 'emptied',\n 'ratechange',\n 'cuechange',\n\n // Custom events\n 'enterfullscreen',\n 'exitfullscreen',\n 'captionsenabled',\n 'captionsdisabled',\n 'languagechange',\n 'controlshidden',\n 'controlsshown',\n 'ready',\n\n // YouTube\n 'statechange',\n 'qualitychange',\n 'qualityrequested',\n\n // Ads\n 'adsloaded',\n 'adscontentpause',\n 'adscontentresume',\n 'adstarted',\n 'adsmidpoint',\n 'adscomplete',\n 'adsallcomplete',\n 'adsimpression',\n 'adsclick',\n ],\n\n // Selectors\n // Change these to match your template if using custom HTML\n selectors: {\n editable: 'input, textarea, select, [contenteditable]',\n container: '.plyr',\n controls: {\n container: null,\n wrapper: '.plyr__controls',\n },\n labels: '[data-plyr]',\n buttons: {\n play: '[data-plyr=\"play\"]',\n pause: '[data-plyr=\"pause\"]',\n restart: '[data-plyr=\"restart\"]',\n rewind: '[data-plyr=\"rewind\"]',\n fastForward: '[data-plyr=\"fast-forward\"]',\n mute: '[data-plyr=\"mute\"]',\n captions: '[data-plyr=\"captions\"]',\n fullscreen: '[data-plyr=\"fullscreen\"]',\n pip: '[data-plyr=\"pip\"]',\n airplay: '[data-plyr=\"airplay\"]',\n settings: '[data-plyr=\"settings\"]',\n loop: '[data-plyr=\"loop\"]',\n },\n inputs: {\n seek: '[data-plyr=\"seek\"]',\n volume: '[data-plyr=\"volume\"]',\n speed: '[data-plyr=\"speed\"]',\n language: '[data-plyr=\"language\"]',\n quality: '[data-plyr=\"quality\"]',\n },\n display: {\n currentTime: '.plyr__time--current',\n duration: '.plyr__time--duration',\n buffer: '.plyr__progress__buffer',\n loop: '.plyr__progress__loop', // Used later\n volume: '.plyr__volume--display',\n },\n progress: '.plyr__progress',\n captions: '.plyr__captions',\n caption: '.plyr__caption',\n menu: {\n quality: '.js-plyr__menu__list--quality',\n },\n },\n\n // Class hooks added to the player in different states\n classNames: {\n type: 'plyr--{0}',\n provider: 'plyr--{0}',\n video: 'plyr__video-wrapper',\n embed: 'plyr__video-embed',\n embedContainer: 'plyr__video-embed__container',\n poster: 'plyr__poster',\n posterEnabled: 'plyr__poster-enabled',\n ads: 'plyr__ads',\n control: 'plyr__control',\n controlPressed: 'plyr__control--pressed',\n playing: 'plyr--playing',\n paused: 'plyr--paused',\n stopped: 'plyr--stopped',\n loading: 'plyr--loading',\n hover: 'plyr--hover',\n tooltip: 'plyr__tooltip',\n cues: 'plyr__cues',\n hidden: 'plyr__sr-only',\n hideControls: 'plyr--hide-controls',\n isIos: 'plyr--is-ios',\n isTouch: 'plyr--is-touch',\n uiSupported: 'plyr--full-ui',\n noTransition: 'plyr--no-transition',\n menu: {\n value: 'plyr__menu__value',\n badge: 'plyr__badge',\n open: 'plyr--menu-open',\n },\n captions: {\n enabled: 'plyr--captions-enabled',\n active: 'plyr--captions-active',\n },\n fullscreen: {\n enabled: 'plyr--fullscreen-enabled',\n fallback: 'plyr--fullscreen-fallback',\n },\n pip: {\n supported: 'plyr--pip-supported',\n active: 'plyr--pip-active',\n },\n airplay: {\n supported: 'plyr--airplay-supported',\n active: 'plyr--airplay-active',\n },\n tabFocus: 'plyr__tab-focus',\n },\n\n // Embed attributes\n attributes: {\n embed: {\n provider: 'data-plyr-provider',\n id: 'data-plyr-embed-id',\n },\n },\n\n // API keys\n keys: {\n google: null,\n },\n\n // Advertisements plugin\n // Register for an account here: http://vi.ai/publisher-video-monetization/?aid=plyrio\n ads: {\n enabled: false,\n publisherId: '',\n },\n};\n\nexport default defaults;\n","// ==========================================================================\n// Plyr supported types and providers\n// ==========================================================================\n\nexport const providers = {\n html5: 'html5',\n youtube: 'youtube',\n vimeo: 'vimeo',\n};\n\nexport const types = {\n audio: 'audio',\n video: 'video',\n};\n\n/**\n * Get provider by URL\n * @param {string} url\n */\nexport function getProviderByUrl(url) {\n // YouTube\n if (/^(https?:\\/\\/)?(www\\.)?(youtube\\.com|youtu\\.?be)\\/.+$/.test(url)) {\n return providers.youtube;\n }\n\n // Vimeo\n if (/^https?:\\/\\/player.vimeo.com\\/video\\/\\d{0,9}(?=\\b|\\/)/.test(url)) {\n return providers.vimeo;\n }\n\n return null;\n}\n\nexport default { providers, types };\n","// ==========================================================================\n// Console wrapper\n// ==========================================================================\n\nconst noop = () => {};\n\nexport default class Console {\n constructor(enabled = false) {\n this.enabled = window.console && enabled;\n\n if (this.enabled) {\n this.log('Debugging enabled');\n }\n }\n\n get log() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.log, console) : noop;\n }\n get warn() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.warn, console) : noop;\n }\n get error() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.error, console) : noop;\n }\n}\n","// ==========================================================================\n// Fullscreen wrapper\n// https://developer.mozilla.org/en-US/docs/Web/API/Fullscreen_API#prefixing\n// ==========================================================================\n\nimport browser from './utils/browser';\nimport { hasClass, toggleClass, trapFocus } from './utils/elements';\nimport { on, triggerEvent } from './utils/events';\nimport is from './utils/is';\n\nfunction onChange() {\n if (!this.enabled) {\n return;\n }\n\n // Update toggle button\n const button = this.player.elements.buttons.fullscreen;\n if (is.element(button)) {\n button.pressed = this.active;\n }\n\n // Trigger an event\n triggerEvent.call(this.player, this.target, this.active ? 'enterfullscreen' : 'exitfullscreen', true);\n\n // Trap focus in container\n if (!browser.isIos) {\n trapFocus.call(this.player, this.target, this.active);\n }\n}\n\nfunction toggleFallback(toggle = false) {\n // Store or restore scroll position\n if (toggle) {\n this.scrollPosition = {\n x: window.scrollX || 0,\n y: window.scrollY || 0,\n };\n } else {\n window.scrollTo(this.scrollPosition.x, this.scrollPosition.y);\n }\n\n // Toggle scroll\n document.body.style.overflow = toggle ? 'hidden' : '';\n\n // Toggle class hook\n toggleClass(this.target, this.player.config.classNames.fullscreen.fallback, toggle);\n\n // Toggle button and fire events\n onChange.call(this);\n}\n\nclass Fullscreen {\n constructor(player) {\n // Keep reference to parent\n this.player = player;\n\n // Get prefix\n this.prefix = Fullscreen.prefix;\n this.property = Fullscreen.property;\n\n // Scroll position\n this.scrollPosition = { x: 0, y: 0 };\n\n // Register event listeners\n // Handle event (incase user presses escape etc)\n on.call(\n this.player,\n document,\n this.prefix === 'ms' ? 'MSFullscreenChange' : `${this.prefix}fullscreenchange`,\n () => {\n // TODO: Filter for target??\n onChange.call(this);\n },\n );\n\n // Fullscreen toggle on double click\n on.call(this.player, this.player.elements.container, 'dblclick', event => {\n // Ignore double click in controls\n if (is.element(this.player.elements.controls) && this.player.elements.controls.contains(event.target)) {\n return;\n }\n\n this.toggle();\n });\n\n // Update the UI\n this.update();\n }\n\n // Determine if native supported\n static get native() {\n return !!(\n document.fullscreenEnabled ||\n document.webkitFullscreenEnabled ||\n document.mozFullScreenEnabled ||\n document.msFullscreenEnabled\n );\n }\n\n // Get the prefix for handlers\n static get prefix() {\n // No prefix\n if (is.function(document.exitFullscreen)) {\n return '';\n }\n\n // Check for fullscreen support by vendor prefix\n let value = '';\n const prefixes = ['webkit', 'moz', 'ms'];\n\n prefixes.some(pre => {\n if (is.function(document[`${pre}ExitFullscreen`]) || is.function(document[`${pre}CancelFullScreen`])) {\n value = pre;\n return true;\n }\n\n return false;\n });\n\n return value;\n }\n\n static get property() {\n return this.prefix === 'moz' ? 'FullScreen' : 'Fullscreen';\n }\n\n // Determine if fullscreen is enabled\n get enabled() {\n return (\n (Fullscreen.native || this.player.config.fullscreen.fallback) &&\n this.player.config.fullscreen.enabled &&\n this.player.supported.ui &&\n this.player.isVideo\n );\n }\n\n // Get active state\n get active() {\n if (!this.enabled) {\n return false;\n }\n\n // Fallback using classname\n if (!Fullscreen.native) {\n return hasClass(this.target, this.player.config.classNames.fullscreen.fallback);\n }\n\n const element = !this.prefix ? document.fullscreenElement : document[`${this.prefix}${this.property}Element`];\n\n return element === this.target;\n }\n\n // Get target element\n get target() {\n return browser.isIos && this.player.config.fullscreen.iosNative\n ? this.player.media\n : this.player.elements.container;\n }\n\n // Update UI\n update() {\n if (this.enabled) {\n this.player.debug.log(`${Fullscreen.native ? 'Native' : 'Fallback'} fullscreen enabled`);\n } else {\n this.player.debug.log('Fullscreen not supported and fallback disabled');\n }\n\n // Add styling hook to show button\n toggleClass(this.player.elements.container, this.player.config.classNames.fullscreen.enabled, this.enabled);\n }\n\n // Make an element fullscreen\n enter() {\n if (!this.enabled) {\n return;\n }\n\n // iOS native fullscreen doesn't need the request step\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n if (this.player.playing) {\n this.target.webkitEnterFullscreen();\n }\n } else if (!Fullscreen.native) {\n toggleFallback.call(this, true);\n } else if (!this.prefix) {\n this.target.requestFullscreen();\n } else if (!is.empty(this.prefix)) {\n this.target[`${this.prefix}Request${this.property}`]();\n }\n }\n\n // Bail from fullscreen\n exit() {\n if (!this.enabled) {\n return;\n }\n\n // iOS native fullscreen\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n this.target.webkitExitFullscreen();\n this.player.play();\n } else if (!Fullscreen.native) {\n toggleFallback.call(this, false);\n } else if (!this.prefix) {\n (document.cancelFullScreen || document.exitFullscreen).call(document);\n } else if (!is.empty(this.prefix)) {\n const action = this.prefix === 'moz' ? 'Cancel' : 'Exit';\n document[`${this.prefix}${action}${this.property}`]();\n }\n }\n\n // Toggle state\n toggle() {\n if (!this.active) {\n this.enter();\n } else {\n this.exit();\n }\n }\n}\n\nexport default Fullscreen;\n","// ==========================================================================\n// Load image avoiding xhr/fetch CORS issues\n// Server status can't be obtained this way unfortunately, so this uses \"naturalWidth\" to determine if the image has loaded\n// By default it checks if it is at least 1px, but you can add a second argument to change this\n// ==========================================================================\n\nexport default function loadImage(src, minWidth = 1) {\n return new Promise((resolve, reject) => {\n const image = new Image();\n\n const handler = () => {\n delete image.onload;\n delete image.onerror;\n (image.naturalWidth >= minWidth ? resolve : reject)(image);\n };\n\n Object.assign(image, { onload: handler, onerror: handler, src });\n });\n}\n","// ==========================================================================\n// Plyr UI\n// ==========================================================================\n\nimport captions from './captions';\nimport controls from './controls';\nimport i18n from './i18n';\nimport support from './support';\nimport browser from './utils/browser';\nimport { getElement, toggleClass } from './utils/elements';\nimport { ready, triggerEvent } from './utils/events';\nimport is from './utils/is';\nimport loadImage from './utils/loadImage';\n\nconst ui = {\n addStyleHook() {\n toggleClass(this.elements.container, this.config.selectors.container.replace('.', ''), true);\n toggleClass(this.elements.container, this.config.classNames.uiSupported, this.supported.ui);\n },\n\n // Toggle native HTML5 media controls\n toggleNativeControls(toggle = false) {\n if (toggle && this.isHTML5) {\n this.media.setAttribute('controls', '');\n } else {\n this.media.removeAttribute('controls');\n }\n },\n\n // Setup the UI\n build() {\n // Re-attach media element listeners\n // TODO: Use event bubbling?\n this.listeners.media();\n\n // Don't setup interface if no support\n if (!this.supported.ui) {\n this.debug.warn(`Basic support only for ${this.provider} ${this.type}`);\n\n // Restore native controls\n ui.toggleNativeControls.call(this, true);\n\n // Bail\n return;\n }\n\n // Inject custom controls if not present\n if (!is.element(this.elements.controls)) {\n // Inject custom controls\n controls.inject.call(this);\n\n // Re-attach control listeners\n this.listeners.controls();\n }\n\n // Remove native controls\n ui.toggleNativeControls.call(this);\n\n // Setup captions for HTML5\n if (this.isHTML5) {\n captions.setup.call(this);\n }\n\n // Reset volume\n this.volume = null;\n\n // Reset mute state\n this.muted = null;\n\n // Reset speed\n this.speed = null;\n\n // Reset loop state\n this.loop = null;\n\n // Reset quality setting\n this.quality = null;\n\n // Reset volume display\n controls.updateVolume.call(this);\n\n // Reset time display\n controls.timeUpdate.call(this);\n\n // Update the UI\n ui.checkPlaying.call(this);\n\n // Check for picture-in-picture support\n toggleClass(\n this.elements.container,\n this.config.classNames.pip.supported,\n support.pip && this.isHTML5 && this.isVideo,\n );\n\n // Check for airplay support\n toggleClass(this.elements.container, this.config.classNames.airplay.supported, support.airplay && this.isHTML5);\n\n // Add iOS class\n toggleClass(this.elements.container, this.config.classNames.isIos, browser.isIos);\n\n // Add touch class\n toggleClass(this.elements.container, this.config.classNames.isTouch, this.touch);\n\n // Ready for API calls\n this.ready = true;\n\n // Ready event at end of execution stack\n setTimeout(() => {\n triggerEvent.call(this, this.media, 'ready');\n }, 0);\n\n // Set the title\n ui.setTitle.call(this);\n\n // Assure the poster image is set, if the property was added before the element was created\n if (this.poster) {\n ui.setPoster.call(this, this.poster, false).catch(() => {});\n }\n\n // Manually set the duration if user has overridden it.\n // The event listeners for it doesn't get called if preload is disabled (#701)\n if (this.config.duration) {\n controls.durationUpdate.call(this);\n }\n },\n\n // Setup aria attribute for play and iframe title\n setTitle() {\n // Find the current text\n let label = i18n.get('play', this.config);\n\n // If there's a media title set, use that for the label\n if (is.string(this.config.title) && !is.empty(this.config.title)) {\n label += `, ${this.config.title}`;\n }\n\n // If there's a play button, set label\n if (is.nodeList(this.elements.buttons.play)) {\n Array.from(this.elements.buttons.play).forEach(button => {\n button.setAttribute('aria-label', label);\n });\n }\n\n // Set iframe title\n // https://github.com/sampotts/plyr/issues/124\n if (this.isEmbed) {\n const iframe = getElement.call(this, 'iframe');\n\n if (!is.element(iframe)) {\n return;\n }\n\n // Default to media type\n const title = !is.empty(this.config.title) ? this.config.title : 'video';\n const format = i18n.get('frameTitle', this.config);\n\n iframe.setAttribute('title', format.replace('{title}', title));\n }\n },\n\n // Toggle poster\n togglePoster(enable) {\n toggleClass(this.elements.container, this.config.classNames.posterEnabled, enable);\n },\n\n // Set the poster image (async)\n // Used internally for the poster setter, with the passive option forced to false\n setPoster(poster, passive = true) {\n // Don't override if call is passive\n if (passive && this.poster) {\n return Promise.reject(new Error('Poster already set'));\n }\n\n // Set property synchronously to respect the call order\n this.media.setAttribute('poster', poster);\n\n // Wait until ui is ready\n return (\n ready\n .call(this)\n // Load image\n .then(() => loadImage(poster))\n .catch(err => {\n // Hide poster on error unless it's been set by another call\n if (poster === this.poster) {\n ui.togglePoster.call(this, false);\n }\n // Rethrow\n throw err;\n })\n .then(() => {\n // Prevent race conditions\n if (poster !== this.poster) {\n throw new Error('setPoster cancelled by later call to setPoster');\n }\n })\n .then(() => {\n Object.assign(this.elements.poster.style, {\n backgroundImage: `url('${poster}')`,\n // Reset backgroundSize as well (since it can be set to \"cover\" for padded thumbnails for youtube)\n backgroundSize: '',\n });\n ui.togglePoster.call(this, true);\n return poster;\n })\n );\n },\n\n // Check playing state\n checkPlaying(event) {\n // Class hooks\n toggleClass(this.elements.container, this.config.classNames.playing, this.playing);\n toggleClass(this.elements.container, this.config.classNames.paused, this.paused);\n toggleClass(this.elements.container, this.config.classNames.stopped, this.stopped);\n\n // Set state\n Array.from(this.elements.buttons.play).forEach(target => {\n target.pressed = this.playing;\n });\n\n // Only update controls on non timeupdate events\n if (is.event(event) && event.type === 'timeupdate') {\n return;\n }\n\n // Toggle controls\n ui.toggleControls.call(this);\n },\n\n // Check if media is loading\n checkLoading(event) {\n this.loading = ['stalled', 'waiting'].includes(event.type);\n\n // Clear timer\n clearTimeout(this.timers.loading);\n\n // Timer to prevent flicker when seeking\n this.timers.loading = setTimeout(() => {\n // Update progress bar loading class state\n toggleClass(this.elements.container, this.config.classNames.loading, this.loading);\n\n // Update controls visibility\n ui.toggleControls.call(this);\n }, this.loading ? 250 : 0);\n },\n\n // Toggle controls based on state and `force` argument\n toggleControls(force) {\n const { controls } = this.elements;\n\n if (controls && this.config.hideControls) {\n // Show controls if force, loading, paused, or button interaction, otherwise hide\n this.toggleControls(Boolean(force || this.loading || this.paused || controls.pressed || controls.hover));\n }\n },\n};\n\nexport default ui;\n","// ==========================================================================\n// Plyr Event Listeners\n// ==========================================================================\n\nimport controls from './controls';\nimport ui from './ui';\nimport browser from './utils/browser';\nimport { getElement, getElements, getFocusElement, matches, toggleClass, toggleHidden } from './utils/elements';\nimport { on, once, toggleListener, triggerEvent } from './utils/events';\nimport is from './utils/is';\n\nclass Listeners {\n constructor(player) {\n this.player = player;\n this.lastKey = null;\n\n this.handleKey = this.handleKey.bind(this);\n this.toggleMenu = this.toggleMenu.bind(this);\n this.firstTouch = this.firstTouch.bind(this);\n }\n\n // Handle key presses\n handleKey(event) {\n const code = event.keyCode ? event.keyCode : event.which;\n const pressed = event.type === 'keydown';\n const repeat = pressed && code === this.lastKey;\n\n // Bail if a modifier key is set\n if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) {\n return;\n }\n\n // If the event is bubbled from the media element\n // Firefox doesn't get the keycode for whatever reason\n if (!is.number(code)) {\n return;\n }\n\n // Seek by the number keys\n const seekByKey = () => {\n // Divide the max duration into 10th's and times by the number value\n this.player.currentTime = this.player.duration / 10 * (code - 48);\n };\n\n // Handle the key on keydown\n // Reset on keyup\n if (pressed) {\n // Which keycodes should we prevent default\n const preventDefault = [32, 37, 38, 39, 40, 48, 49, 50, 51, 52, 53, 54, 56, 57, 67, 70, 73, 75, 76, 77, 79];\n\n // Check focused element\n // and if the focused element is not editable (e.g. text input)\n // and any that accept key input http://webaim.org/techniques/keyboard/\n const focused = getFocusElement();\n if (\n is.element(focused) &&\n (focused !== this.player.elements.inputs.seek &&\n matches(focused, this.player.config.selectors.editable))\n ) {\n return;\n }\n\n // If the code is found prevent default (e.g. prevent scrolling for arrows)\n if (preventDefault.includes(code)) {\n event.preventDefault();\n event.stopPropagation();\n }\n\n switch (code) {\n case 48:\n case 49:\n case 50:\n case 51:\n case 52:\n case 53:\n case 54:\n case 55:\n case 56:\n case 57:\n // 0-9\n if (!repeat) {\n seekByKey();\n }\n break;\n\n case 32:\n case 75:\n // Space and K key\n if (!repeat) {\n this.player.togglePlay();\n }\n break;\n\n case 38:\n // Arrow up\n this.player.increaseVolume(0.1);\n break;\n\n case 40:\n // Arrow down\n this.player.decreaseVolume(0.1);\n break;\n\n case 77:\n // M key\n if (!repeat) {\n this.player.muted = !this.player.muted;\n }\n break;\n\n case 39:\n // Arrow forward\n this.player.forward();\n break;\n\n case 37:\n // Arrow back\n this.player.rewind();\n break;\n\n case 70:\n // F key\n this.player.fullscreen.toggle();\n break;\n\n case 67:\n // C key\n if (!repeat) {\n this.player.toggleCaptions();\n }\n break;\n\n case 76:\n // L key\n this.player.loop = !this.player.loop;\n break;\n\n /* case 73:\n this.setLoop('start');\n break;\n\n case 76:\n this.setLoop();\n break;\n\n case 79:\n this.setLoop('end');\n break; */\n\n default:\n break;\n }\n\n // Escape is handle natively when in full screen\n // So we only need to worry about non native\n if (!this.player.fullscreen.enabled && this.player.fullscreen.active && code === 27) {\n this.player.fullscreen.toggle();\n }\n\n // Store last code for next cycle\n this.lastKey = code;\n } else {\n this.lastKey = null;\n }\n }\n\n // Toggle menu\n toggleMenu(event) {\n controls.toggleMenu.call(this.player, event);\n }\n\n // Device is touch enabled\n firstTouch() {\n this.player.touch = true;\n\n // Add touch class\n toggleClass(this.player.elements.container, this.player.config.classNames.isTouch, true);\n }\n\n // Global window & document listeners\n global(toggle = true) {\n // Keyboard shortcuts\n if (this.player.config.keyboard.global) {\n toggleListener.call(this.player, window, 'keydown keyup', this.handleKey, toggle, false);\n }\n\n // Click anywhere closes menu\n toggleListener.call(this.player, document.body, 'click', this.toggleMenu, toggle);\n\n // Detect touch by events\n once.call(this.player, document.body, 'touchstart', this.firstTouch);\n }\n\n // Container listeners\n container() {\n // Keyboard shortcuts\n if (!this.player.config.keyboard.global && this.player.config.keyboard.focused) {\n on.call(this.player, this.player.elements.container, 'keydown keyup', this.handleKey, false);\n }\n\n // Detect tab focus\n // Remove class on blur/focusout\n on.call(this.player, this.player.elements.container, 'focusout', event => {\n toggleClass(event.target, this.player.config.classNames.tabFocus, false);\n });\n // Add classname to tabbed elements\n on.call(this.player, this.player.elements.container, 'keydown', event => {\n if (event.keyCode !== 9) {\n return;\n }\n\n // Delay the adding of classname until the focus has changed\n // This event fires before the focusin event\n setTimeout(() => {\n toggleClass(getFocusElement(), this.player.config.classNames.tabFocus, true);\n }, 0);\n });\n\n // Toggle controls on mouse events and entering fullscreen\n on.call(\n this.player,\n this.player.elements.container,\n 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen',\n event => {\n const { controls } = this.player.elements;\n\n // Remove button states for fullscreen\n if (event.type === 'enterfullscreen') {\n controls.pressed = false;\n controls.hover = false;\n }\n\n // Show, then hide after a timeout unless another control event occurs\n const show = ['touchstart', 'touchmove', 'mousemove'].includes(event.type);\n\n let delay = 0;\n\n if (show) {\n ui.toggleControls.call(this.player, true);\n // Use longer timeout for touch devices\n delay = this.player.touch ? 3000 : 2000;\n }\n\n // Clear timer\n clearTimeout(this.player.timers.controls);\n // Timer to prevent flicker when seeking\n this.player.timers.controls = setTimeout(() => ui.toggleControls.call(this.player, false), delay);\n },\n );\n }\n\n // Listen for media events\n media() {\n // Time change on media\n on.call(this.player, this.player.media, 'timeupdate seeking seeked', event =>\n controls.timeUpdate.call(this.player, event),\n );\n\n // Display duration\n on.call(this.player, this.player.media, 'durationchange loadeddata loadedmetadata', event =>\n controls.durationUpdate.call(this.player, event),\n );\n\n // Check for audio tracks on load\n // We can't use `loadedmetadata` as it doesn't seem to have audio tracks at that point\n on.call(this.player, this.player.media, 'canplay', () => {\n toggleHidden(this.player.elements.volume, !this.player.hasAudio);\n toggleHidden(this.player.elements.buttons.mute, !this.player.hasAudio);\n });\n\n // Handle the media finishing\n on.call(this.player, this.player.media, 'ended', () => {\n // Show poster on end\n if (this.player.isHTML5 && this.player.isVideo && this.player.config.resetOnEnd) {\n // Restart\n this.player.restart();\n }\n });\n\n // Check for buffer progress\n on.call(this.player, this.player.media, 'progress playing seeking seeked', event =>\n controls.updateProgress.call(this.player, event),\n );\n\n // Handle volume changes\n on.call(this.player, this.player.media, 'volumechange', event =>\n controls.updateVolume.call(this.player, event),\n );\n\n // Handle play/pause\n on.call(this.player, this.player.media, 'playing play pause ended emptied timeupdate', event =>\n ui.checkPlaying.call(this.player, event),\n );\n\n // Loading state\n on.call(this.player, this.player.media, 'waiting canplay seeked playing', event =>\n ui.checkLoading.call(this.player, event),\n );\n\n // If autoplay, then load advertisement if required\n // TODO: Show some sort of loading state while the ad manager loads else there's a delay before ad shows\n on.call(this.player, this.player.media, 'playing', () => {\n if (!this.player.ads) {\n return;\n }\n\n // If ads are enabled, wait for them first\n if (this.player.ads.enabled && !this.player.ads.initialized) {\n // Wait for manager response\n this.player.ads.managerPromise.then(() => this.player.ads.play()).catch(() => this.player.play());\n }\n });\n\n // Click video\n if (this.player.supported.ui && this.player.config.clickToPlay && !this.player.isAudio) {\n // Re-fetch the wrapper\n const wrapper = getElement.call(this.player, `.${this.player.config.classNames.video}`);\n\n // Bail if there's no wrapper (this should never happen)\n if (!is.element(wrapper)) {\n return;\n }\n\n // On click play, pause ore restart\n on.call(this.player, wrapper, 'click', () => {\n // Touch devices will just show controls (if we're hiding controls)\n if (this.player.config.hideControls && this.player.touch && !this.player.paused) {\n return;\n }\n\n if (this.player.paused) {\n this.player.play();\n } else if (this.player.ended) {\n this.player.restart();\n this.player.play();\n } else {\n this.player.pause();\n }\n });\n }\n\n // Disable right click\n if (this.player.supported.ui && this.player.config.disableContextMenu) {\n on.call(\n this.player,\n this.player.elements.wrapper,\n 'contextmenu',\n event => {\n event.preventDefault();\n },\n false,\n );\n }\n\n // Volume change\n on.call(this.player, this.player.media, 'volumechange', () => {\n // Save to storage\n this.player.storage.set({ volume: this.player.volume, muted: this.player.muted });\n });\n\n // Speed change\n on.call(this.player, this.player.media, 'ratechange', () => {\n // Update UI\n controls.updateSetting.call(this.player, 'speed');\n\n // Save to storage\n this.player.storage.set({ speed: this.player.speed });\n });\n\n // Quality request\n on.call(this.player, this.player.media, 'qualityrequested', event => {\n // Save to storage\n this.player.storage.set({ quality: event.detail.quality });\n });\n\n // Quality change\n on.call(this.player, this.player.media, 'qualitychange', event => {\n // Update UI\n controls.updateSetting.call(this.player, 'quality', null, event.detail.quality);\n });\n\n // Proxy events to container\n // Bubble up key events for Edge\n const proxyEvents = this.player.config.events.concat(['keyup', 'keydown']).join(' ');\n on.call(this.player, this.player.media, proxyEvents, event => {\n let { detail = {} } = event;\n\n // Get error details from media\n if (event.type === 'error') {\n detail = this.player.media.error;\n }\n\n triggerEvent.call(this.player, this.player.elements.container, event.type, true, detail);\n });\n }\n\n // Listen for control events\n controls() {\n // IE doesn't support input event, so we fallback to change\n const inputEvent = browser.isIE ? 'change' : 'input';\n\n // Run default and custom handlers\n const proxy = (event, defaultHandler, customHandlerKey) => {\n const customHandler = this.player.config.listeners[customHandlerKey];\n const hasCustomHandler = is.function(customHandler);\n let returned = true;\n\n // Execute custom handler\n if (hasCustomHandler) {\n returned = customHandler.call(this.player, event);\n }\n\n // Only call default handler if not prevented in custom handler\n if (returned && is.function(defaultHandler)) {\n defaultHandler.call(this.player, event);\n }\n };\n\n // Trigger custom and default handlers\n const bind = (element, type, defaultHandler, customHandlerKey, passive = true) => {\n const customHandler = this.player.config.listeners[customHandlerKey];\n const hasCustomHandler = is.function(customHandler);\n\n on.call(\n this.player,\n element,\n type,\n event => proxy(event, defaultHandler, customHandlerKey),\n passive && !hasCustomHandler,\n );\n };\n\n // Play/pause toggle\n Array.from(this.player.elements.buttons.play).forEach(button => {\n bind(button, 'click', this.player.togglePlay, 'play');\n });\n\n // Pause\n bind(this.player.elements.buttons.restart, 'click', this.player.restart, 'restart');\n\n // Rewind\n bind(this.player.elements.buttons.rewind, 'click', this.player.rewind, 'rewind');\n\n // Rewind\n bind(this.player.elements.buttons.fastForward, 'click', this.player.forward, 'fastForward');\n\n // Mute toggle\n bind(\n this.player.elements.buttons.mute,\n 'click',\n () => {\n this.player.muted = !this.player.muted;\n },\n 'mute',\n );\n\n // Captions toggle\n bind(this.player.elements.buttons.captions, 'click', () => this.player.toggleCaptions());\n\n // Fullscreen toggle\n bind(\n this.player.elements.buttons.fullscreen,\n 'click',\n () => {\n this.player.fullscreen.toggle();\n },\n 'fullscreen',\n );\n\n // Picture-in-Picture\n bind(\n this.player.elements.buttons.pip,\n 'click',\n () => {\n this.player.pip = 'toggle';\n },\n 'pip',\n );\n\n // Airplay\n bind(this.player.elements.buttons.airplay, 'click', this.player.airplay, 'airplay');\n\n // Settings menu\n bind(this.player.elements.buttons.settings, 'click', event => {\n controls.toggleMenu.call(this.player, event);\n });\n\n // Settings menu\n bind(this.player.elements.settings.form, 'click', event => {\n event.stopPropagation();\n\n // Go back to home tab on click\n const showHomeTab = () => {\n const id = `plyr-settings-${this.player.id}-home`;\n controls.showTab.call(this.player, id);\n };\n\n // Settings menu items - use event delegation as items are added/removed\n if (matches(event.target, this.player.config.selectors.inputs.language)) {\n proxy(\n event,\n () => {\n this.player.currentTrack = Number(event.target.value);\n showHomeTab();\n },\n 'language',\n );\n } else if (matches(event.target, this.player.config.selectors.inputs.quality)) {\n proxy(\n event,\n () => {\n this.player.quality = event.target.value;\n showHomeTab();\n },\n 'quality',\n );\n } else if (matches(event.target, this.player.config.selectors.inputs.speed)) {\n proxy(\n event,\n () => {\n this.player.speed = parseFloat(event.target.value);\n showHomeTab();\n },\n 'speed',\n );\n } else {\n const tab = event.target;\n controls.showTab.call(this.player, tab.getAttribute('aria-controls'));\n }\n });\n\n // Set range input alternative \"value\", which matches the tooltip time (#954)\n bind(this.player.elements.inputs.seek, 'mousedown mousemove', event => {\n const clientRect = this.player.elements.progress.getBoundingClientRect();\n const percent = 100 / clientRect.width * (event.pageX - clientRect.left);\n event.currentTarget.setAttribute('seek-value', percent);\n });\n\n // Pause while seeking\n bind(this.player.elements.inputs.seek, 'mousedown mouseup keydown keyup touchstart touchend', event => {\n const seek = event.currentTarget;\n\n const code = event.keyCode ? event.keyCode : event.which;\n const eventType = event.type;\n\n if ((eventType === 'keydown' || eventType === 'keyup') && (code !== 39 && code !== 37)) {\n return;\n }\n // Was playing before?\n const play = seek.hasAttribute('play-on-seeked');\n\n // Done seeking\n const done = ['mouseup', 'touchend', 'keyup'].includes(event.type);\n\n // If we're done seeking and it was playing, resume playback\n if (play && done) {\n seek.removeAttribute('play-on-seeked');\n this.player.play();\n } else if (!done && this.player.playing) {\n seek.setAttribute('play-on-seeked', '');\n this.player.pause();\n }\n });\n\n // Seek\n bind(\n this.player.elements.inputs.seek,\n inputEvent,\n event => {\n const seek = event.currentTarget;\n\n // If it exists, use seek-value instead of \"value\" for consistency with tooltip time (#954)\n let seekTo = seek.getAttribute('seek-value');\n\n if (is.empty(seekTo)) {\n seekTo = seek.value;\n }\n\n seek.removeAttribute('seek-value');\n\n this.player.currentTime = seekTo / seek.max * this.player.duration;\n },\n 'seek',\n );\n\n // Current time invert\n // Only if one time element is used for both currentTime and duration\n if (this.player.config.toggleInvert && !is.element(this.player.elements.display.duration)) {\n bind(this.player.elements.display.currentTime, 'click', () => {\n // Do nothing if we're at the start\n if (this.player.currentTime === 0) {\n return;\n }\n\n this.player.config.invertTime = !this.player.config.invertTime;\n\n controls.timeUpdate.call(this.player);\n });\n }\n\n // Volume\n bind(\n this.player.elements.inputs.volume,\n inputEvent,\n event => {\n this.player.volume = event.target.value;\n },\n 'volume',\n );\n\n // Polyfill for lower fill in <input type=\"range\"> for webkit\n if (browser.isWebkit) {\n Array.from(getElements.call(this.player, 'input[type=\"range\"]')).forEach(element => {\n bind(element, 'input', event => controls.updateRangeFill.call(this.player, event.target));\n });\n }\n\n // Seek tooltip\n bind(this.player.elements.progress, 'mouseenter mouseleave mousemove', event =>\n controls.updateSeekTooltip.call(this.player, event),\n );\n\n // Update controls.hover state (used for ui.toggleControls to avoid hiding when interacting)\n bind(this.player.elements.controls, 'mouseenter mouseleave', event => {\n this.player.elements.controls.hover = !this.player.touch && event.type === 'mouseenter';\n });\n\n // Update controls.pressed state (used for ui.toggleControls to avoid hiding when interacting)\n bind(this.player.elements.controls, 'mousedown mouseup touchstart touchend touchcancel', event => {\n this.player.elements.controls.pressed = ['mousedown', 'touchstart'].includes(event.type);\n });\n\n // Focus in/out on controls\n bind(this.player.elements.controls, 'focusin focusout', event => {\n const { config, elements, timers } = this.player;\n\n // Skip transition to prevent focus from scrolling the parent element\n toggleClass(elements.controls, config.classNames.noTransition, event.type === 'focusin');\n\n // Toggle\n ui.toggleControls.call(this.player, event.type === 'focusin');\n\n // If focusin, hide again after delay\n if (event.type === 'focusin') {\n // Restore transition\n setTimeout(() => {\n toggleClass(elements.controls, config.classNames.noTransition, false);\n }, 0);\n\n // Delay a little more for keyboard users\n const delay = this.touch ? 3000 : 4000;\n\n // Clear timer\n clearTimeout(timers.controls);\n // Hide\n timers.controls = setTimeout(() => ui.toggleControls.call(this.player, false), delay);\n }\n });\n\n // Mouse wheel for volume\n bind(\n this.player.elements.inputs.volume,\n 'wheel',\n event => {\n // Detect \"natural\" scroll - suppored on OS X Safari only\n // Other browsers on OS X will be inverted until support improves\n const inverted = event.webkitDirectionInvertedFromDevice;\n const step = 1 / 50;\n let direction = 0;\n\n // Scroll down (or up on natural) to decrease\n if (event.deltaY < 0 || event.deltaX > 0) {\n if (inverted) {\n this.player.decreaseVolume(step);\n direction = -1;\n } else {\n this.player.increaseVolume(step);\n direction = 1;\n }\n }\n\n // Scroll up (or down on natural) to increase\n if (event.deltaY > 0 || event.deltaX < 0) {\n if (inverted) {\n this.player.increaseVolume(step);\n direction = 1;\n } else {\n this.player.decreaseVolume(step);\n direction = -1;\n }\n }\n\n // Don't break page scrolling at max and min\n if (\n (direction === 1 && this.player.media.volume < 1) ||\n (direction === -1 && this.player.media.volume > 0)\n ) {\n event.preventDefault();\n }\n },\n 'volume',\n false,\n );\n }\n}\n\nexport default Listeners;\n","(function(root, factory) {\n if (typeof define === 'function' && define.amd) {\n define([], factory);\n } else if (typeof exports === 'object') {\n module.exports = factory();\n } else {\n root.loadjs = factory();\n }\n}(this, function() {\n/**\n * Global dependencies.\n * @global {Object} document - DOM\n */\n\nvar devnull = function() {},\n bundleIdCache = {},\n bundleResultCache = {},\n bundleCallbackQueue = {};\n\n\n/**\n * Subscribe to bundle load event.\n * @param {string[]} bundleIds - Bundle ids\n * @param {Function} callbackFn - The callback function\n */\nfunction subscribe(bundleIds, callbackFn) {\n // listify\n bundleIds = bundleIds.push ? bundleIds : [bundleIds];\n\n var depsNotFound = [],\n i = bundleIds.length,\n numWaiting = i,\n fn,\n bundleId,\n r,\n q;\n\n // define callback function\n fn = function (bundleId, pathsNotFound) {\n if (pathsNotFound.length) depsNotFound.push(bundleId);\n\n numWaiting--;\n if (!numWaiting) callbackFn(depsNotFound);\n };\n\n // register callback\n while (i--) {\n bundleId = bundleIds[i];\n\n // execute callback if in result cache\n r = bundleResultCache[bundleId];\n if (r) {\n fn(bundleId, r);\n continue;\n }\n\n // add to callback queue\n q = bundleCallbackQueue[bundleId] = bundleCallbackQueue[bundleId] || [];\n q.push(fn);\n }\n}\n\n\n/**\n * Publish bundle load event.\n * @param {string} bundleId - Bundle id\n * @param {string[]} pathsNotFound - List of files not found\n */\nfunction publish(bundleId, pathsNotFound) {\n // exit if id isn't defined\n if (!bundleId) return;\n\n var q = bundleCallbackQueue[bundleId];\n\n // cache result\n bundleResultCache[bundleId] = pathsNotFound;\n\n // exit if queue is empty\n if (!q) return;\n\n // empty callback queue\n while (q.length) {\n q[0](bundleId, pathsNotFound);\n q.splice(0, 1);\n }\n}\n\n\n/**\n * Execute callbacks.\n * @param {Object or Function} args - The callback args\n * @param {string[]} depsNotFound - List of dependencies not found\n */\nfunction executeCallbacks(args, depsNotFound) {\n // accept function as argument\n if (args.call) args = {success: args};\n\n // success and error callbacks\n if (depsNotFound.length) (args.error || devnull)(depsNotFound);\n else (args.success || devnull)(args);\n}\n\n\n/**\n * Load individual file.\n * @param {string} path - The file path\n * @param {Function} callbackFn - The callback function\n */\nfunction loadFile(path, callbackFn, args, numTries) {\n var doc = document,\n async = args.async,\n maxTries = (args.numRetries || 0) + 1,\n beforeCallbackFn = args.before || devnull,\n pathStripped = path.replace(/^(css|img)!/, ''),\n isCss,\n e;\n\n numTries = numTries || 0;\n\n if (/(^css!|\\.css$)/.test(path)) {\n isCss = true;\n\n // css\n e = doc.createElement('link');\n e.rel = 'stylesheet';\n e.href = pathStripped; //.replace(/^css!/, ''); // remove \"css!\" prefix\n } else if (/(^img!|\\.(png|gif|jpg|svg)$)/.test(path)) {\n // image\n e = doc.createElement('img');\n e.src = pathStripped; \n } else {\n // javascript\n e = doc.createElement('script');\n e.src = path;\n e.async = async === undefined ? true : async;\n }\n\n e.onload = e.onerror = e.onbeforeload = function (ev) {\n var result = ev.type[0];\n\n // Note: The following code isolates IE using `hideFocus` and treats empty\n // stylesheets as failures to get around lack of onerror support\n if (isCss && 'hideFocus' in e) {\n try {\n if (!e.sheet.cssText.length) result = 'e';\n } catch (x) {\n // sheets objects created from load errors don't allow access to\n // `cssText`\n result = 'e';\n }\n }\n\n // handle retries in case of load failure\n if (result == 'e') {\n // increment counter\n numTries += 1;\n\n // exit function and try again\n if (numTries < maxTries) {\n return loadFile(path, callbackFn, args, numTries);\n }\n }\n\n // execute callback\n callbackFn(path, result, ev.defaultPrevented);\n };\n\n // add to document (unless callback returns `false`)\n if (beforeCallbackFn(path, e) !== false) doc.head.appendChild(e);\n}\n\n\n/**\n * Load multiple files.\n * @param {string[]} paths - The file paths\n * @param {Function} callbackFn - The callback function\n */\nfunction loadFiles(paths, callbackFn, args) {\n // listify paths\n paths = paths.push ? paths : [paths];\n\n var numWaiting = paths.length,\n x = numWaiting,\n pathsNotFound = [],\n fn,\n i;\n\n // define callback function\n fn = function(path, result, defaultPrevented) {\n // handle error\n if (result == 'e') pathsNotFound.push(path);\n\n // handle beforeload event. If defaultPrevented then that means the load\n // will be blocked (ex. Ghostery/ABP on Safari)\n if (result == 'b') {\n if (defaultPrevented) pathsNotFound.push(path);\n else return;\n }\n\n numWaiting--;\n if (!numWaiting) callbackFn(pathsNotFound);\n };\n\n // load scripts\n for (i=0; i < x; i++) loadFile(paths[i], fn, args);\n}\n\n\n/**\n * Initiate script load and register bundle.\n * @param {(string|string[])} paths - The file paths\n * @param {(string|Function)} [arg1] - The bundleId or success callback\n * @param {Function} [arg2] - The success or error callback\n * @param {Function} [arg3] - The error callback\n */\nfunction loadjs(paths, arg1, arg2) {\n var bundleId,\n args;\n\n // bundleId (if string)\n if (arg1 && arg1.trim) bundleId = arg1;\n\n // args (default is {})\n args = (bundleId ? arg2 : arg1) || {};\n\n // throw error if bundle is already defined\n if (bundleId) {\n if (bundleId in bundleIdCache) {\n throw \"LoadJS\";\n } else {\n bundleIdCache[bundleId] = true;\n }\n }\n\n // load scripts\n loadFiles(paths, function (pathsNotFound) {\n // execute callbacks\n executeCallbacks(args, pathsNotFound);\n\n // publish bundle load event\n publish(bundleId, pathsNotFound);\n }, args);\n}\n\n\n/**\n * Execute callbacks when dependencies have been satisfied.\n * @param {(string|string[])} deps - List of bundle ids\n * @param {Object} args - success/error arguments\n */\nloadjs.ready = function ready(deps, args) {\n // subscribe to bundle load event\n subscribe(deps, function (depsNotFound) {\n // execute callbacks\n executeCallbacks(args, depsNotFound);\n });\n\n return loadjs;\n};\n\n\n/**\n * Manually satisfy bundle dependencies.\n * @param {string} bundleId - The bundle id\n */\nloadjs.done = function done(bundleId) {\n publish(bundleId, []);\n};\n\n\n/**\n * Reset loadjs dependencies statuses\n */\nloadjs.reset = function reset() {\n bundleIdCache = {};\n bundleResultCache = {};\n bundleCallbackQueue = {};\n};\n\n\n/**\n * Determine if bundle has already been defined\n * @param String} bundleId - The bundle id\n */\nloadjs.isDefined = function isDefined(bundleId) {\n return bundleId in bundleIdCache;\n};\n\n\n// export\nreturn loadjs;\n\n}));\n","// ==========================================================================\n// Load an external script\n// ==========================================================================\n\nimport loadjs from 'loadjs';\n\nexport default function loadScript(url) {\n return new Promise((resolve, reject) => {\n loadjs(url, {\n success: resolve,\n error: reject,\n });\n });\n}\n","// ==========================================================================\n// Vimeo plugin\n// ==========================================================================\n\nimport captions from './../captions';\nimport controls from './../controls';\nimport ui from './../ui';\nimport { createElement, replaceElement, toggleClass } from './../utils/elements';\nimport { triggerEvent } from './../utils/events';\nimport fetch from './../utils/fetch';\nimport is from './../utils/is';\nimport loadScript from './../utils/loadScript';\nimport { format, stripHTML } from './../utils/strings';\nimport { buildUrlParams } from './../utils/urls';\n\n// Parse Vimeo ID from URL\nfunction parseId(url) {\n if (is.empty(url)) {\n return null;\n }\n\n if (is.number(Number(url))) {\n return url;\n }\n\n const regex = /^.*(vimeo.com\\/|video\\/)(\\d+).*/;\n return url.match(regex) ? RegExp.$2 : url;\n}\n\n// Get aspect ratio for dimensions\nfunction getAspectRatio(width, height) {\n const getRatio = (w, h) => (h === 0 ? w : getRatio(h, w % h));\n const ratio = getRatio(width, height);\n return `${width / ratio}:${height / ratio}`;\n}\n\n// Set playback state and trigger change (only on actual change)\nfunction assurePlaybackState(play) {\n if (play && !this.embed.hasPlayed) {\n this.embed.hasPlayed = true;\n }\n if (this.media.paused === play) {\n this.media.paused = !play;\n triggerEvent.call(this, this.media, play ? 'play' : 'pause');\n }\n}\n\nconst vimeo = {\n setup() {\n // Add embed class for responsive\n toggleClass(this.elements.wrapper, this.config.classNames.embed, true);\n\n // Set intial ratio\n vimeo.setAspectRatio.call(this);\n\n // Load the API if not already\n if (!is.object(window.Vimeo)) {\n loadScript(this.config.urls.vimeo.sdk)\n .then(() => {\n vimeo.ready.call(this);\n })\n .catch(error => {\n this.debug.warn('Vimeo API failed to load', error);\n });\n } else {\n vimeo.ready.call(this);\n }\n },\n\n // Set aspect ratio\n // For Vimeo we have an extra 300% height <div> to hide the standard controls and UI\n setAspectRatio(input) {\n const [x, y] = (is.string(input) ? input : this.config.ratio).split(':');\n const padding = 100 / x * y;\n this.elements.wrapper.style.paddingBottom = `${padding}%`;\n\n if (this.supported.ui) {\n const height = 240;\n const offset = (height - padding) / (height / 50);\n\n this.media.style.transform = `translateY(-${offset}%)`;\n }\n },\n\n // API Ready\n ready() {\n const player = this;\n\n // Get Vimeo params for the iframe\n const options = {\n loop: player.config.loop.active,\n autoplay: player.autoplay,\n // muted: player.muted,\n byline: false,\n portrait: false,\n title: false,\n speed: true,\n transparent: 0,\n gesture: 'media',\n playsinline: !this.config.fullscreen.iosNative,\n };\n const params = buildUrlParams(options);\n\n // Get the source URL or ID\n let source = player.media.getAttribute('src');\n\n // Get from <div> if needed\n if (is.empty(source)) {\n source = player.media.getAttribute(player.config.attributes.embed.id);\n }\n\n const id = parseId(source);\n\n // Build an iframe\n const iframe = createElement('iframe');\n const src = format(player.config.urls.vimeo.iframe, id, params);\n iframe.setAttribute('src', src);\n iframe.setAttribute('allowfullscreen', '');\n iframe.setAttribute('allowtransparency', '');\n iframe.setAttribute('allow', 'autoplay');\n\n // Get poster, if already set\n const { poster } = player;\n\n // Inject the package\n const wrapper = createElement('div', { poster, class: player.config.classNames.embedContainer });\n wrapper.appendChild(iframe);\n player.media = replaceElement(wrapper, player.media);\n\n // Get poster image\n fetch(format(player.config.urls.vimeo.api, id), 'json').then(response => {\n if (is.empty(response)) {\n return;\n }\n\n // Get the URL for thumbnail\n const url = new URL(response[0].thumbnail_large);\n\n // Get original image\n url.pathname = `${url.pathname.split('_')[0]}.jpg`;\n\n // Set and show poster\n ui.setPoster.call(player, url.href).catch(() => {});\n });\n\n // Setup instance\n // https://github.com/vimeo/player.js\n player.embed = new window.Vimeo.Player(iframe, {\n autopause: player.config.autopause,\n muted: player.muted,\n });\n\n player.media.paused = true;\n player.media.currentTime = 0;\n\n // Disable native text track rendering\n if (player.supported.ui) {\n player.embed.disableTextTrack();\n }\n\n // Create a faux HTML5 API using the Vimeo API\n player.media.play = () => {\n assurePlaybackState.call(player, true);\n return player.embed.play();\n };\n\n player.media.pause = () => {\n assurePlaybackState.call(player, false);\n return player.embed.pause();\n };\n\n player.media.stop = () => {\n player.pause();\n player.currentTime = 0;\n };\n\n // Seeking\n let { currentTime } = player.media;\n Object.defineProperty(player.media, 'currentTime', {\n get() {\n return currentTime;\n },\n set(time) {\n // Vimeo will automatically play on seek if the video hasn't been played before\n\n // Get current paused state and volume etc\n const { embed, media, paused, volume } = player;\n const restorePause = paused && !embed.hasPlayed;\n\n // Set seeking state and trigger event\n media.seeking = true;\n triggerEvent.call(player, media, 'seeking');\n\n // If paused, mute until seek is complete\n Promise.resolve(restorePause && embed.setVolume(0))\n // Seek\n .then(() => embed.setCurrentTime(time))\n // Restore paused\n .then(() => restorePause && embed.pause())\n // Restore volume\n .then(() => restorePause && embed.setVolume(volume))\n .catch(() => {\n // Do nothing\n });\n },\n });\n\n // Playback speed\n let speed = player.config.speed.selected;\n Object.defineProperty(player.media, 'playbackRate', {\n get() {\n return speed;\n },\n set(input) {\n player.embed\n .setPlaybackRate(input)\n .then(() => {\n speed = input;\n triggerEvent.call(player, player.media, 'ratechange');\n })\n .catch(error => {\n // Hide menu item (and menu if empty)\n if (error.name === 'Error') {\n controls.setSpeedMenu.call(player, []);\n }\n });\n },\n });\n\n // Volume\n let { volume } = player.config;\n Object.defineProperty(player.media, 'volume', {\n get() {\n return volume;\n },\n set(input) {\n player.embed.setVolume(input).then(() => {\n volume = input;\n triggerEvent.call(player, player.media, 'volumechange');\n });\n },\n });\n\n // Muted\n let { muted } = player.config;\n Object.defineProperty(player.media, 'muted', {\n get() {\n return muted;\n },\n set(input) {\n const toggle = is.boolean(input) ? input : false;\n\n player.embed.setVolume(toggle ? 0 : player.config.volume).then(() => {\n muted = toggle;\n triggerEvent.call(player, player.media, 'volumechange');\n });\n },\n });\n\n // Loop\n let { loop } = player.config;\n Object.defineProperty(player.media, 'loop', {\n get() {\n return loop;\n },\n set(input) {\n const toggle = is.boolean(input) ? input : player.config.loop.active;\n\n player.embed.setLoop(toggle).then(() => {\n loop = toggle;\n });\n },\n });\n\n // Source\n let currentSrc;\n player.embed\n .getVideoUrl()\n .then(value => {\n currentSrc = value;\n })\n .catch(error => {\n this.debug.warn(error);\n });\n\n Object.defineProperty(player.media, 'currentSrc', {\n get() {\n return currentSrc;\n },\n });\n\n // Ended\n Object.defineProperty(player.media, 'ended', {\n get() {\n return player.currentTime === player.duration;\n },\n });\n\n // Set aspect ratio based on video size\n Promise.all([player.embed.getVideoWidth(), player.embed.getVideoHeight()]).then(dimensions => {\n const ratio = getAspectRatio(dimensions[0], dimensions[1]);\n vimeo.setAspectRatio.call(this, ratio);\n });\n\n // Set autopause\n player.embed.setAutopause(player.config.autopause).then(state => {\n player.config.autopause = state;\n });\n\n // Get title\n player.embed.getVideoTitle().then(title => {\n player.config.title = title;\n ui.setTitle.call(this);\n });\n\n // Get current time\n player.embed.getCurrentTime().then(value => {\n currentTime = value;\n triggerEvent.call(player, player.media, 'timeupdate');\n });\n\n // Get duration\n player.embed.getDuration().then(value => {\n player.media.duration = value;\n triggerEvent.call(player, player.media, 'durationchange');\n });\n\n // Get captions\n player.embed.getTextTracks().then(tracks => {\n player.media.textTracks = tracks;\n captions.setup.call(player);\n });\n\n player.embed.on('cuechange', ({ cues = [] }) => {\n const strippedCues = cues.map(cue => stripHTML(cue.text));\n captions.updateCues.call(player, strippedCues);\n });\n\n player.embed.on('loaded', () => {\n // Assure state and events are updated on autoplay\n player.embed.getPaused().then(paused => {\n assurePlaybackState.call(player, !paused);\n if (!paused) {\n triggerEvent.call(player, player.media, 'playing');\n }\n });\n\n if (is.element(player.embed.element) && player.supported.ui) {\n const frame = player.embed.element;\n\n // Fix keyboard focus issues\n // https://github.com/sampotts/plyr/issues/317\n frame.setAttribute('tabindex', -1);\n }\n });\n\n player.embed.on('play', () => {\n assurePlaybackState.call(player, true);\n triggerEvent.call(player, player.media, 'playing');\n });\n\n player.embed.on('pause', () => {\n assurePlaybackState.call(player, false);\n });\n\n player.embed.on('timeupdate', data => {\n player.media.seeking = false;\n currentTime = data.seconds;\n triggerEvent.call(player, player.media, 'timeupdate');\n });\n\n player.embed.on('progress', data => {\n player.media.buffered = data.percent;\n triggerEvent.call(player, player.media, 'progress');\n\n // Check all loaded\n if (parseInt(data.percent, 10) === 1) {\n triggerEvent.call(player, player.media, 'canplaythrough');\n }\n\n // Get duration as if we do it before load, it gives an incorrect value\n // https://github.com/sampotts/plyr/issues/891\n player.embed.getDuration().then(value => {\n if (value !== player.media.duration) {\n player.media.duration = value;\n triggerEvent.call(player, player.media, 'durationchange');\n }\n });\n });\n\n player.embed.on('seeked', () => {\n player.media.seeking = false;\n triggerEvent.call(player, player.media, 'seeked');\n });\n\n player.embed.on('ended', () => {\n player.media.paused = true;\n triggerEvent.call(player, player.media, 'ended');\n });\n\n player.embed.on('error', detail => {\n player.media.error = detail;\n triggerEvent.call(player, player.media, 'error');\n });\n\n // Rebuild UI\n setTimeout(() => ui.build.call(player), 0);\n },\n};\n\nexport default vimeo;\n","// ==========================================================================\n// YouTube plugin\n// ==========================================================================\n\nimport controls from './../controls';\nimport ui from './../ui';\nimport { dedupe } from './../utils/arrays';\nimport { createElement, replaceElement, toggleClass } from './../utils/elements';\nimport { triggerEvent } from './../utils/events';\nimport fetch from './../utils/fetch';\nimport is from './../utils/is';\nimport loadImage from './../utils/loadImage';\nimport loadScript from './../utils/loadScript';\nimport { format, generateId } from './../utils/strings';\n\n// Parse YouTube ID from URL\nfunction parseId(url) {\n if (is.empty(url)) {\n return null;\n }\n\n const regex = /^.*(youtu.be\\/|v\\/|u\\/\\w\\/|embed\\/|watch\\?v=|&v=)([^#&?]*).*/;\n return url.match(regex) ? RegExp.$2 : url;\n}\n\n// Standardise YouTube quality unit\nfunction mapQualityUnit(input) {\n const qualities = {\n hd2160: 2160,\n hd1440: 1440,\n hd1080: 1080,\n hd720: 720,\n large: 480,\n medium: 360,\n small: 240,\n tiny: 144,\n };\n\n const entry = Object.entries(qualities).find(entry => entry.includes(input));\n\n if (entry) {\n // Get the match corresponding to the input\n return entry.find(value => value !== input);\n }\n\n return 'default';\n}\n\nfunction mapQualityUnits(levels) {\n if (is.empty(levels)) {\n return levels;\n }\n\n return dedupe(levels.map(level => mapQualityUnit(level)));\n}\n\n// Set playback state and trigger change (only on actual change)\nfunction assurePlaybackState(play) {\n if (play && !this.embed.hasPlayed) {\n this.embed.hasPlayed = true;\n }\n if (this.media.paused === play) {\n this.media.paused = !play;\n triggerEvent.call(this, this.media, play ? 'play' : 'pause');\n }\n}\n\nconst youtube = {\n setup() {\n // Add embed class for responsive\n toggleClass(this.elements.wrapper, this.config.classNames.embed, true);\n\n // Set aspect ratio\n youtube.setAspectRatio.call(this);\n\n // Setup API\n if (is.object(window.YT) && is.function(window.YT.Player)) {\n youtube.ready.call(this);\n } else {\n // Load the API\n loadScript(this.config.urls.youtube.sdk).catch(error => {\n this.debug.warn('YouTube API failed to load', error);\n });\n\n // Setup callback for the API\n // YouTube has it's own system of course...\n window.onYouTubeReadyCallbacks = window.onYouTubeReadyCallbacks || [];\n\n // Add to queue\n window.onYouTubeReadyCallbacks.push(() => {\n youtube.ready.call(this);\n });\n\n // Set callback to process queue\n window.onYouTubeIframeAPIReady = () => {\n window.onYouTubeReadyCallbacks.forEach(callback => {\n callback();\n });\n };\n }\n },\n\n // Get the media title\n getTitle(videoId) {\n // Try via undocumented API method first\n // This method disappears now and then though...\n // https://github.com/sampotts/plyr/issues/709\n if (is.function(this.embed.getVideoData)) {\n const { title } = this.embed.getVideoData();\n\n if (is.empty(title)) {\n this.config.title = title;\n ui.setTitle.call(this);\n return;\n }\n }\n\n // Or via Google API\n const key = this.config.keys.google;\n if (is.string(key) && !is.empty(key)) {\n const url = format(this.config.urls.youtube.api, videoId, key);\n\n fetch(url)\n .then(result => {\n if (is.object(result)) {\n this.config.title = result.items[0].snippet.title;\n ui.setTitle.call(this);\n }\n })\n .catch(() => {});\n }\n },\n\n // Set aspect ratio\n setAspectRatio() {\n const ratio = this.config.ratio.split(':');\n this.elements.wrapper.style.paddingBottom = `${100 / ratio[0] * ratio[1]}%`;\n },\n\n // API ready\n ready() {\n const player = this;\n\n // Ignore already setup (race condition)\n const currentId = player.media.getAttribute('id');\n if (!is.empty(currentId) && currentId.startsWith('youtube-')) {\n return;\n }\n\n // Get the source URL or ID\n let source = player.media.getAttribute('src');\n\n // Get from <div> if needed\n if (is.empty(source)) {\n source = player.media.getAttribute(this.config.attributes.embed.id);\n }\n\n // Replace the <iframe> with a <div> due to YouTube API issues\n const videoId = parseId(source);\n const id = generateId(player.provider);\n\n // Get poster, if already set\n const { poster } = player;\n\n // Replace media element\n const container = createElement('div', { id, poster });\n player.media = replaceElement(container, player.media);\n\n // Id to poster wrapper\n const posterSrc = format => `https://img.youtube.com/vi/${videoId}/${format}default.jpg`;\n\n // Check thumbnail images in order of quality, but reject fallback thumbnails (120px wide)\n loadImage(posterSrc('maxres'), 121) // Higest quality and unpadded\n .catch(() => loadImage(posterSrc('sd'), 121)) // 480p padded 4:3\n .catch(() => loadImage(posterSrc('hq'))) // 360p padded 4:3. Always exists\n .then(image => ui.setPoster.call(player, image.src))\n .then(posterSrc => {\n // If the image is padded, use background-size \"cover\" instead (like youtube does too with their posters)\n if (!posterSrc.includes('maxres')) {\n player.elements.poster.style.backgroundSize = 'cover';\n }\n })\n .catch(() => {});\n\n // Setup instance\n // https://developers.google.com/youtube/iframe_api_reference\n player.embed = new window.YT.Player(id, {\n videoId,\n playerVars: {\n autoplay: player.config.autoplay ? 1 : 0, // Autoplay\n controls: player.supported.ui ? 0 : 1, // Only show controls if not fully supported\n rel: 0, // No related vids\n showinfo: 0, // Hide info\n iv_load_policy: 3, // Hide annotations\n modestbranding: 1, // Hide logos as much as possible (they still show one in the corner when paused)\n disablekb: 1, // Disable keyboard as we handle it\n playsinline: 1, // Allow iOS inline playback\n\n // Tracking for stats\n // origin: window ? `${window.location.protocol}//${window.location.host}` : null,\n widget_referrer: window ? window.location.href : null,\n\n // Captions are flaky on YouTube\n cc_load_policy: player.captions.active ? 1 : 0,\n cc_lang_pref: player.config.captions.language,\n },\n events: {\n onError(event) {\n // YouTube may fire onError twice, so only handle it once\n if (!player.media.error) {\n const code = event.data;\n // Messages copied from https://developers.google.com/youtube/iframe_api_reference#onError\n const message =\n {\n 2: 'The request contains an invalid parameter value. For example, this error occurs if you specify a video ID that does not have 11 characters, or if the video ID contains invalid characters, such as exclamation points or asterisks.',\n 5: 'The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.',\n 100: 'The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.',\n 101: 'The owner of the requested video does not allow it to be played in embedded players.',\n 150: 'The owner of the requested video does not allow it to be played in embedded players.',\n }[code] || 'An unknown error occured';\n\n player.media.error = { code, message };\n\n triggerEvent.call(player, player.media, 'error');\n }\n },\n onPlaybackQualityChange() {\n triggerEvent.call(player, player.media, 'qualitychange', false, {\n quality: player.media.quality,\n });\n },\n onPlaybackRateChange(event) {\n // Get the instance\n const instance = event.target;\n\n // Get current speed\n player.media.playbackRate = instance.getPlaybackRate();\n\n triggerEvent.call(player, player.media, 'ratechange');\n },\n onReady(event) {\n // Get the instance\n const instance = event.target;\n\n // Get the title\n youtube.getTitle.call(player, videoId);\n\n // Create a faux HTML5 API using the YouTube API\n player.media.play = () => {\n assurePlaybackState.call(player, true);\n instance.playVideo();\n };\n\n player.media.pause = () => {\n assurePlaybackState.call(player, false);\n instance.pauseVideo();\n };\n\n player.media.stop = () => {\n instance.stopVideo();\n };\n\n player.media.duration = instance.getDuration();\n player.media.paused = true;\n\n // Seeking\n player.media.currentTime = 0;\n Object.defineProperty(player.media, 'currentTime', {\n get() {\n return Number(instance.getCurrentTime());\n },\n set(time) {\n // If paused, mute audio preventively (YouTube starts playing on seek if the video hasn't been played yet).\n if (player.paused) {\n player.embed.mute();\n }\n\n // Set seeking state and trigger event\n player.media.seeking = true;\n triggerEvent.call(player, player.media, 'seeking');\n\n // Seek after events sent\n instance.seekTo(time);\n },\n });\n\n // Playback speed\n Object.defineProperty(player.media, 'playbackRate', {\n get() {\n return instance.getPlaybackRate();\n },\n set(input) {\n instance.setPlaybackRate(input);\n },\n });\n\n // Quality\n Object.defineProperty(player.media, 'quality', {\n get() {\n return mapQualityUnit(instance.getPlaybackQuality());\n },\n set(input) {\n instance.setPlaybackQuality(mapQualityUnit(input));\n },\n });\n\n // Volume\n let { volume } = player.config;\n Object.defineProperty(player.media, 'volume', {\n get() {\n return volume;\n },\n set(input) {\n volume = input;\n instance.setVolume(volume * 100);\n triggerEvent.call(player, player.media, 'volumechange');\n },\n });\n\n // Muted\n let { muted } = player.config;\n Object.defineProperty(player.media, 'muted', {\n get() {\n return muted;\n },\n set(input) {\n const toggle = is.boolean(input) ? input : muted;\n muted = toggle;\n instance[toggle ? 'mute' : 'unMute']();\n triggerEvent.call(player, player.media, 'volumechange');\n },\n });\n\n // Source\n Object.defineProperty(player.media, 'currentSrc', {\n get() {\n return instance.getVideoUrl();\n },\n });\n\n // Ended\n Object.defineProperty(player.media, 'ended', {\n get() {\n return player.currentTime === player.duration;\n },\n });\n\n // Get available speeds\n player.options.speed = instance.getAvailablePlaybackRates();\n\n // Set the tabindex to avoid focus entering iframe\n if (player.supported.ui) {\n player.media.setAttribute('tabindex', -1);\n }\n\n triggerEvent.call(player, player.media, 'timeupdate');\n triggerEvent.call(player, player.media, 'durationchange');\n\n // Reset timer\n clearInterval(player.timers.buffering);\n\n // Setup buffering\n player.timers.buffering = setInterval(() => {\n // Get loaded % from YouTube\n player.media.buffered = instance.getVideoLoadedFraction();\n\n // Trigger progress only when we actually buffer something\n if (player.media.lastBuffered === null || player.media.lastBuffered < player.media.buffered) {\n triggerEvent.call(player, player.media, 'progress');\n }\n\n // Set last buffer point\n player.media.lastBuffered = player.media.buffered;\n\n // Bail if we're at 100%\n if (player.media.buffered === 1) {\n clearInterval(player.timers.buffering);\n\n // Trigger event\n triggerEvent.call(player, player.media, 'canplaythrough');\n }\n }, 200);\n\n // Rebuild UI\n setTimeout(() => ui.build.call(player), 50);\n },\n onStateChange(event) {\n // Get the instance\n const instance = event.target;\n\n // Reset timer\n clearInterval(player.timers.playing);\n\n const seeked = player.media.seeking && [1, 2].includes(event.data);\n\n if (seeked) {\n // Unset seeking and fire seeked event\n player.media.seeking = false;\n triggerEvent.call(player, player.media, 'seeked');\n }\n\n // Handle events\n // -1 Unstarted\n // 0 Ended\n // 1 Playing\n // 2 Paused\n // 3 Buffering\n // 5 Video cued\n switch (event.data) {\n case -1:\n // Update scrubber\n triggerEvent.call(player, player.media, 'timeupdate');\n\n // Get loaded % from YouTube\n player.media.buffered = instance.getVideoLoadedFraction();\n triggerEvent.call(player, player.media, 'progress');\n\n break;\n\n case 0:\n assurePlaybackState.call(player, false);\n\n // YouTube doesn't support loop for a single video, so mimick it.\n if (player.media.loop) {\n // YouTube needs a call to `stopVideo` before playing again\n instance.stopVideo();\n instance.playVideo();\n } else {\n triggerEvent.call(player, player.media, 'ended');\n }\n\n break;\n\n case 1:\n // Restore paused state (YouTube starts playing on seek if the video hasn't been played yet)\n if (player.media.paused && !player.embed.hasPlayed) {\n player.media.pause();\n } else {\n assurePlaybackState.call(player, true);\n\n triggerEvent.call(player, player.media, 'playing');\n\n // Poll to get playback progress\n player.timers.playing = setInterval(() => {\n triggerEvent.call(player, player.media, 'timeupdate');\n }, 50);\n\n // Check duration again due to YouTube bug\n // https://github.com/sampotts/plyr/issues/374\n // https://code.google.com/p/gdata-issues/issues/detail?id=8690\n if (player.media.duration !== instance.getDuration()) {\n player.media.duration = instance.getDuration();\n triggerEvent.call(player, player.media, 'durationchange');\n }\n\n // Get quality\n controls.setQualityMenu.call(\n player,\n mapQualityUnits(instance.getAvailableQualityLevels()),\n );\n }\n\n break;\n\n case 2:\n // Restore audio (YouTube starts playing on seek if the video hasn't been played yet)\n if (!player.muted) {\n player.embed.unMute();\n }\n assurePlaybackState.call(player, false);\n\n break;\n\n default:\n break;\n }\n\n triggerEvent.call(player, player.elements.container, 'statechange', false, {\n code: event.data,\n });\n },\n },\n });\n },\n};\n\nexport default youtube;\n","// ==========================================================================\n// Plyr Media\n// ==========================================================================\n\nimport html5 from './html5';\nimport vimeo from './plugins/vimeo';\nimport youtube from './plugins/youtube';\nimport { createElement, toggleClass, wrap } from './utils/elements';\n\nconst media = {\n // Setup media\n setup() {\n // If there's no media, bail\n if (!this.media) {\n this.debug.warn('No media element found!');\n return;\n }\n\n // Add type class\n toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', this.type), true);\n\n // Add provider class\n toggleClass(this.elements.container, this.config.classNames.provider.replace('{0}', this.provider), true);\n\n // Add video class for embeds\n // This will require changes if audio embeds are added\n if (this.isEmbed) {\n toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', 'video'), true);\n }\n\n // Inject the player wrapper\n if (this.isVideo) {\n // Create the wrapper div\n this.elements.wrapper = createElement('div', {\n class: this.config.classNames.video,\n });\n\n // Wrap the video in a container\n wrap(this.media, this.elements.wrapper);\n\n // Faux poster container\n this.elements.poster = createElement('div', {\n class: this.config.classNames.poster,\n });\n\n this.elements.wrapper.appendChild(this.elements.poster);\n }\n\n if (this.isHTML5) {\n html5.extend.call(this);\n } else if (this.isYouTube) {\n youtube.setup.call(this);\n } else if (this.isVimeo) {\n vimeo.setup.call(this);\n }\n },\n};\n\nexport default media;\n","// ==========================================================================\n// Advertisement plugin using Google IMA HTML5 SDK\n// Create an account with our ad partner, vi here:\n// https://www.vi.ai/publisher-video-monetization/\n// ==========================================================================\n\n/* global google */\n\nimport i18n from '../i18n';\nimport { createElement } from './../utils/elements';\nimport { triggerEvent } from './../utils/events';\nimport is from './../utils/is';\nimport loadScript from './../utils/loadScript';\nimport { formatTime } from './../utils/time';\nimport { buildUrlParams } from './../utils/urls';\n\nclass Ads {\n /**\n * Ads constructor.\n * @param {object} player\n * @return {Ads}\n */\n constructor(player) {\n this.player = player;\n this.publisherId = player.config.ads.publisherId;\n this.playing = false;\n this.initialized = false;\n this.elements = {\n container: null,\n displayContainer: null,\n };\n this.manager = null;\n this.loader = null;\n this.cuePoints = null;\n this.events = {};\n this.safetyTimer = null;\n this.countdownTimer = null;\n\n // Setup a promise to resolve when the IMA manager is ready\n this.managerPromise = new Promise((resolve, reject) => {\n // The ad is loaded and ready\n this.on('loaded', resolve);\n\n // Ads failed\n this.on('error', reject);\n });\n\n this.load();\n }\n\n get enabled() {\n return this.player.isVideo && this.player.config.ads.enabled && !is.empty(this.publisherId);\n }\n\n /**\n * Load the IMA SDK\n */\n load() {\n if (this.enabled) {\n // Check if the Google IMA3 SDK is loaded or load it ourselves\n if (!is.object(window.google) || !is.object(window.google.ima)) {\n loadScript(this.player.config.urls.googleIMA.sdk)\n .then(() => {\n this.ready();\n })\n .catch(() => {\n // Script failed to load or is blocked\n this.trigger('error', new Error('Google IMA SDK failed to load'));\n });\n } else {\n this.ready();\n }\n }\n }\n\n /**\n * Get the ads instance ready\n */\n ready() {\n // Start ticking our safety timer. If the whole advertisement\n // thing doesn't resolve within our set time; we bail\n this.startSafetyTimer(12000, 'ready()');\n\n // Clear the safety timer\n this.managerPromise.then(() => {\n this.clearSafetyTimer('onAdsManagerLoaded()');\n });\n\n // Set listeners on the Plyr instance\n this.listeners();\n\n // Setup the IMA SDK\n this.setupIMA();\n }\n\n // Build the default tag URL\n get tagUrl() {\n const params = {\n AV_PUBLISHERID: '58c25bb0073ef448b1087ad6',\n AV_CHANNELID: '5a0458dc28a06145e4519d21',\n AV_URL: location.hostname,\n cb: Date.now(),\n AV_WIDTH: 640,\n AV_HEIGHT: 480,\n AV_CDIM2: this.publisherId,\n };\n\n const base = 'https://go.aniview.com/api/adserver6/vast/';\n\n return `${base}?${buildUrlParams(params)}`;\n }\n\n /**\n * In order for the SDK to display ads for our video, we need to tell it where to put them,\n * so here we define our ad container. This div is set up to render on top of the video player.\n * Using the code below, we tell the SDK to render ads within that div. We also provide a\n * handle to the content video player - the SDK will poll the current time of our player to\n * properly place mid-rolls. After we create the ad display container, we initialize it. On\n * mobile devices, this initialization is done as the result of a user action.\n */\n setupIMA() {\n // Create the container for our advertisements\n this.elements.container = createElement('div', {\n class: this.player.config.classNames.ads,\n });\n this.player.elements.container.appendChild(this.elements.container);\n\n // So we can run VPAID2\n google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED);\n\n // Set language\n google.ima.settings.setLocale(this.player.config.ads.language);\n\n // We assume the adContainer is the video container of the plyr element\n // that will house the ads\n this.elements.displayContainer = new google.ima.AdDisplayContainer(this.elements.container);\n\n // Request video ads to be pre-loaded\n this.requestAds();\n }\n\n /**\n * Request advertisements\n */\n requestAds() {\n const { container } = this.player.elements;\n\n try {\n // Create ads loader\n this.loader = new google.ima.AdsLoader(this.elements.displayContainer);\n\n // Listen and respond to ads loaded and error events\n this.loader.addEventListener(\n google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED,\n event => this.onAdsManagerLoaded(event),\n false,\n );\n this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, error => this.onAdError(error), false);\n\n // Request video ads\n const request = new google.ima.AdsRequest();\n request.adTagUrl = this.tagUrl;\n\n // Specify the linear and nonlinear slot sizes. This helps the SDK\n // to select the correct creative if multiple are returned\n request.linearAdSlotWidth = container.offsetWidth;\n request.linearAdSlotHeight = container.offsetHeight;\n request.nonLinearAdSlotWidth = container.offsetWidth;\n request.nonLinearAdSlotHeight = container.offsetHeight;\n\n // We only overlay ads as we only support video.\n request.forceNonLinearFullSlot = false;\n\n // Mute based on current state\n request.setAdWillPlayMuted(!this.player.muted);\n\n this.loader.requestAds(request);\n } catch (e) {\n this.onAdError(e);\n }\n }\n\n /**\n * Update the ad countdown\n * @param {boolean} start\n */\n pollCountdown(start = false) {\n if (!start) {\n clearInterval(this.countdownTimer);\n this.elements.container.removeAttribute('data-badge-text');\n return;\n }\n\n const update = () => {\n const time = formatTime(Math.max(this.manager.getRemainingTime(), 0));\n const label = `${i18n.get('advertisement', this.player.config)} - ${time}`;\n this.elements.container.setAttribute('data-badge-text', label);\n };\n\n this.countdownTimer = setInterval(update, 100);\n }\n\n /**\n * This method is called whenever the ads are ready inside the AdDisplayContainer\n * @param {Event} adsManagerLoadedEvent\n */\n onAdsManagerLoaded(event) {\n // Get the ads manager\n const settings = new google.ima.AdsRenderingSettings();\n\n // Tell the SDK to save and restore content video state on our behalf\n settings.restoreCustomPlaybackStateOnAdBreakComplete = true;\n settings.enablePreloading = true;\n\n // The SDK is polling currentTime on the contentPlayback. And needs a duration\n // so it can determine when to start the mid- and post-roll\n this.manager = event.getAdsManager(this.player, settings);\n\n // Get the cue points for any mid-rolls by filtering out the pre- and post-roll\n this.cuePoints = this.manager.getCuePoints();\n\n // Add advertisement cue's within the time line if available\n if (!is.empty(this.cuePoints)) {\n this.cuePoints.forEach(cuePoint => {\n if (cuePoint !== 0 && cuePoint !== -1 && cuePoint < this.player.duration) {\n const seekElement = this.player.elements.progress;\n\n if (is.element(seekElement)) {\n const cuePercentage = 100 / this.player.duration * cuePoint;\n const cue = createElement('span', {\n class: this.player.config.classNames.cues,\n });\n\n cue.style.left = `${cuePercentage.toString()}%`;\n seekElement.appendChild(cue);\n }\n }\n });\n }\n\n // Get skippable state\n // TODO: Skip button\n // this.player.debug.warn(this.manager.getAdSkippableState());\n\n // Set volume to match player\n this.manager.setVolume(this.player.volume);\n\n // Add listeners to the required events\n // Advertisement error events\n this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, error => this.onAdError(error));\n\n // Advertisement regular events\n Object.keys(google.ima.AdEvent.Type).forEach(type => {\n this.manager.addEventListener(google.ima.AdEvent.Type[type], event => this.onAdEvent(event));\n });\n\n // Resolve our adsManager\n this.trigger('loaded');\n }\n\n /**\n * This is where all the event handling takes place. Retrieve the ad from the event. Some\n * events (e.g. ALL_ADS_COMPLETED) don't have the ad object associated\n * https://developers.google.com/interactive-media-ads/docs/sdks/html5/v3/apis#ima.AdEvent.Type\n * @param {Event} event\n */\n onAdEvent(event) {\n const { container } = this.player.elements;\n\n // Retrieve the ad from the event. Some events (e.g. ALL_ADS_COMPLETED)\n // don't have ad object associated\n const ad = event.getAd();\n\n // Proxy event\n const dispatchEvent = type => {\n const event = `ads${type.replace(/_/g, '').toLowerCase()}`;\n triggerEvent.call(this.player, this.player.media, event);\n };\n\n switch (event.type) {\n case google.ima.AdEvent.Type.LOADED:\n // This is the first event sent for an ad - it is possible to determine whether the\n // ad is a video ad or an overlay\n this.trigger('loaded');\n\n // Bubble event\n dispatchEvent(event.type);\n\n // Start countdown\n this.pollCountdown(true);\n\n if (!ad.isLinear()) {\n // Position AdDisplayContainer correctly for overlay\n ad.width = container.offsetWidth;\n ad.height = container.offsetHeight;\n }\n\n // console.info('Ad type: ' + event.getAd().getAdPodInfo().getPodIndex());\n // console.info('Ad time: ' + event.getAd().getAdPodInfo().getTimeOffset());\n break;\n\n case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:\n // All ads for the current videos are done. We can now request new advertisements\n // in case the video is re-played\n\n // Fire event\n dispatchEvent(event.type);\n\n // TODO: Example for what happens when a next video in a playlist would be loaded.\n // So here we load a new video when all ads are done.\n // Then we load new ads within a new adsManager. When the video\n // Is started - after - the ads are loaded, then we get ads.\n // You can also easily test cancelling and reloading by running\n // player.ads.cancel() and player.ads.play from the console I guess.\n // this.player.source = {\n // type: 'video',\n // title: 'View From A Blue Moon',\n // sources: [{\n // src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.mp4', type:\n // 'video/mp4', }], poster:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg', tracks:\n // [ { kind: 'captions', label: 'English', srclang: 'en', src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt',\n // default: true, }, { kind: 'captions', label: 'French', srclang: 'fr', src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt', }, ],\n // };\n\n // TODO: So there is still this thing where a video should only be allowed to start\n // playing when the IMA SDK is ready or has failed\n\n this.loadAds();\n break;\n\n case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:\n // This event indicates the ad has started - the video player can adjust the UI,\n // for example display a pause button and remaining time. Fired when content should\n // be paused. This usually happens right before an ad is about to cover the content\n\n dispatchEvent(event.type);\n\n this.pauseContent();\n\n break;\n\n case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:\n // This event indicates the ad has finished - the video player can perform\n // appropriate UI actions, such as removing the timer for remaining time detection.\n // Fired when content should be resumed. This usually happens when an ad finishes\n // or collapses\n\n dispatchEvent(event.type);\n\n this.pollCountdown();\n\n this.resumeContent();\n\n break;\n\n case google.ima.AdEvent.Type.STARTED:\n case google.ima.AdEvent.Type.MIDPOINT:\n case google.ima.AdEvent.Type.COMPLETE:\n case google.ima.AdEvent.Type.IMPRESSION:\n case google.ima.AdEvent.Type.CLICK:\n dispatchEvent(event.type);\n break;\n\n default:\n break;\n }\n }\n\n /**\n * Any ad error handling comes through here\n * @param {Event} event\n */\n onAdError(event) {\n this.cancel();\n this.player.debug.warn('Ads error', event);\n }\n\n /**\n * Setup hooks for Plyr and window events. This ensures\n * the mid- and post-roll launch at the correct time. And\n * resize the advertisement when the player resizes\n */\n listeners() {\n const { container } = this.player.elements;\n let time;\n\n // Add listeners to the required events\n this.player.on('ended', () => {\n this.loader.contentComplete();\n });\n\n this.player.on('seeking', () => {\n time = this.player.currentTime;\n return time;\n });\n\n this.player.on('seeked', () => {\n const seekedTime = this.player.currentTime;\n\n if (is.empty(this.cuePoints)) {\n return;\n }\n\n this.cuePoints.forEach((cuePoint, index) => {\n if (time < cuePoint && cuePoint < seekedTime) {\n this.manager.discardAdBreak();\n this.cuePoints.splice(index, 1);\n }\n });\n });\n\n // Listen to the resizing of the window. And resize ad accordingly\n // TODO: eventually implement ResizeObserver\n window.addEventListener('resize', () => {\n if (this.manager) {\n this.manager.resize(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);\n }\n });\n }\n\n /**\n * Initialize the adsManager and start playing advertisements\n */\n play() {\n const { container } = this.player.elements;\n\n if (!this.managerPromise) {\n this.resumeContent();\n }\n\n // Play the requested advertisement whenever the adsManager is ready\n this.managerPromise\n .then(() => {\n // Initialize the container. Must be done via a user action on mobile devices\n this.elements.displayContainer.initialize();\n\n try {\n if (!this.initialized) {\n // Initialize the ads manager. Ad rules playlist will start at this time\n this.manager.init(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);\n\n // Call play to start showing the ad. Single video and overlay ads will\n // start at this time; the call will be ignored for ad rules\n this.manager.start();\n }\n\n this.initialized = true;\n } catch (adError) {\n // An error may be thrown if there was a problem with the\n // VAST response\n this.onAdError(adError);\n }\n })\n .catch(() => {});\n }\n\n /**\n * Resume our video\n */\n resumeContent() {\n // Hide the advertisement container\n this.elements.container.style.zIndex = '';\n\n // Ad is stopped\n this.playing = false;\n\n // Play our video\n if (this.player.currentTime < this.player.duration) {\n this.player.play();\n }\n }\n\n /**\n * Pause our video\n */\n pauseContent() {\n // Show the advertisement container\n this.elements.container.style.zIndex = 3;\n\n // Ad is playing.\n this.playing = true;\n\n // Pause our video.\n this.player.pause();\n }\n\n /**\n * Destroy the adsManager so we can grab new ads after this. If we don't then we're not\n * allowed to call new ads based on google policies, as they interpret this as an accidental\n * video requests. https://developers.google.com/interactive-\n * media-ads/docs/sdks/android/faq#8\n */\n cancel() {\n // Pause our video\n if (this.initialized) {\n this.resumeContent();\n }\n\n // Tell our instance that we're done for now\n this.trigger('error');\n\n // Re-create our adsManager\n this.loadAds();\n }\n\n /**\n * Re-create our adsManager\n */\n loadAds() {\n // Tell our adsManager to go bye bye\n this.managerPromise\n .then(() => {\n // Destroy our adsManager\n if (this.manager) {\n this.manager.destroy();\n }\n\n // Re-set our adsManager promises\n this.managerPromise = new Promise(resolve => {\n this.on('loaded', resolve);\n this.player.debug.log(this.manager);\n });\n\n // Now request some new advertisements\n this.requestAds();\n })\n .catch(() => {});\n }\n\n /**\n * Handles callbacks after an ad event was invoked\n * @param {string} event - Event type\n */\n trigger(event, ...args) {\n const handlers = this.events[event];\n\n if (is.array(handlers)) {\n handlers.forEach(handler => {\n if (is.function(handler)) {\n handler.apply(this, args);\n }\n });\n }\n }\n\n /**\n * Add event listeners\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n * @return {Ads}\n */\n on(event, callback) {\n if (!is.array(this.events[event])) {\n this.events[event] = [];\n }\n\n this.events[event].push(callback);\n\n return this;\n }\n\n /**\n * Setup a safety timer for when the ad network doesn't respond for whatever reason.\n * The advertisement has 12 seconds to get its things together. We stop this timer when the\n * advertisement is playing, or when a user action is required to start, then we clear the\n * timer on ad ready\n * @param {number} time\n * @param {string} from\n */\n startSafetyTimer(time, from) {\n this.player.debug.log(`Safety timer invoked from: ${from}`);\n\n this.safetyTimer = setTimeout(() => {\n this.cancel();\n this.clearSafetyTimer('startSafetyTimer()');\n }, time);\n }\n\n /**\n * Clear our safety timer(s)\n * @param {string} from\n */\n clearSafetyTimer(from) {\n if (!is.nullOrUndefined(this.safetyTimer)) {\n this.player.debug.log(`Safety timer cleared from: ${from}`);\n\n clearTimeout(this.safetyTimer);\n this.safetyTimer = null;\n }\n }\n}\n\nexport default Ads;\n","// ==========================================================================\n// Plyr source update\n// ==========================================================================\n\nimport { providers } from './config/types';\nimport html5 from './html5';\nimport media from './media';\nimport support from './support';\nimport ui from './ui';\nimport { createElement, insertElement, removeElement } from './utils/elements';\nimport is from './utils/is';\nimport { getDeep } from './utils/objects';\n\nconst source = {\n // Add elements to HTML5 media (source, tracks, etc)\n insertElements(type, attributes) {\n if (is.string(attributes)) {\n insertElement(type, this.media, {\n src: attributes,\n });\n } else if (is.array(attributes)) {\n attributes.forEach(attribute => {\n insertElement(type, this.media, attribute);\n });\n }\n },\n\n // Update source\n // Sources are not checked for support so be careful\n change(input) {\n if (!getDeep(input, 'sources.length')) {\n this.debug.warn('Invalid source format');\n return;\n }\n\n // Cancel current network requests\n html5.cancelRequests.call(this);\n\n // Destroy instance and re-setup\n this.destroy.call(\n this,\n () => {\n // Reset quality options\n this.options.quality = [];\n\n // Remove elements\n removeElement(this.media);\n this.media = null;\n\n // Reset class name\n if (is.element(this.elements.container)) {\n this.elements.container.removeAttribute('class');\n }\n\n // Set the type and provider\n const { sources, type } = input;\n const [{ provider = providers.html5, src }] = sources;\n const tagName = provider === 'html5' ? type : 'div';\n const attributes = provider === 'html5' ? {} : { src };\n\n Object.assign(this, {\n provider,\n type,\n // Check for support\n supported: support.check(type, provider, this.config.playsinline),\n // Create new element\n media: createElement(tagName, attributes),\n });\n\n // Inject the new element\n this.elements.container.appendChild(this.media);\n\n // Autoplay the new source?\n if (is.boolean(input.autoplay)) {\n this.config.autoplay = input.autoplay;\n }\n\n // Set attributes for audio and video\n if (this.isHTML5) {\n if (this.config.crossorigin) {\n this.media.setAttribute('crossorigin', '');\n }\n if (this.config.autoplay) {\n this.media.setAttribute('autoplay', '');\n }\n if (!is.empty(input.poster)) {\n this.poster = input.poster;\n }\n if (this.config.loop.active) {\n this.media.setAttribute('loop', '');\n }\n if (this.config.muted) {\n this.media.setAttribute('muted', '');\n }\n if (this.config.playsinline) {\n this.media.setAttribute('playsinline', '');\n }\n }\n\n // Restore class hook\n ui.addStyleHook.call(this);\n\n // Set new sources for html5\n if (this.isHTML5) {\n source.insertElements.call(this, 'source', sources);\n }\n\n // Set video title\n this.config.title = input.title;\n\n // Set up from scratch\n media.setup.call(this);\n\n // HTML5 stuff\n if (this.isHTML5) {\n // Setup captions\n if ('tracks' in input) {\n source.insertElements.call(this, 'track', input.tracks);\n }\n\n // Load HTML5 sources\n this.media.load();\n }\n\n // If HTML5 or embed but not fully supported, setupInterface and call ready now\n if (this.isHTML5 || (this.isEmbed && !this.supported.ui)) {\n // Setup interface\n ui.build.call(this);\n }\n\n // Update the fullscreen support\n this.fullscreen.update();\n },\n true,\n );\n },\n};\n\nexport default source;\n","// ==========================================================================\n// Plyr\n// plyr.js v3.3.12\n// https://github.com/sampotts/plyr\n// License: The MIT License (MIT)\n// ==========================================================================\n\nimport captions from './captions';\nimport defaults from './config/defaults';\nimport { getProviderByUrl, providers, types } from './config/types';\nimport Console from './console';\nimport controls from './controls';\nimport Fullscreen from './fullscreen';\nimport Listeners from './listeners';\nimport media from './media';\nimport Ads from './plugins/ads';\nimport source from './source';\nimport Storage from './storage';\nimport support from './support';\nimport ui from './ui';\nimport { closest } from './utils/arrays';\nimport { createElement, hasClass, removeElement, replaceElement, toggleClass, wrap } from './utils/elements';\nimport { off, on, once, triggerEvent, unbindListeners } from './utils/events';\nimport is from './utils/is';\nimport loadSprite from './utils/loadSprite';\nimport { cloneDeep, extend } from './utils/objects';\nimport { parseUrl } from './utils/urls';\n\n// Private properties\n// TODO: Use a WeakMap for private globals\n// const globals = new WeakMap();\n\n// Plyr instance\nclass Plyr {\n constructor(target, options) {\n this.timers = {};\n\n // State\n this.ready = false;\n this.loading = false;\n this.failed = false;\n\n // Touch device\n this.touch = support.touch;\n\n // Set the media element\n this.media = target;\n\n // String selector passed\n if (is.string(this.media)) {\n this.media = document.querySelectorAll(this.media);\n }\n\n // jQuery, NodeList or Array passed, use first element\n if ((window.jQuery && this.media instanceof jQuery) || is.nodeList(this.media) || is.array(this.media)) {\n // eslint-disable-next-line\n this.media = this.media[0];\n }\n\n // Set config\n this.config = extend(\n {},\n defaults,\n Plyr.defaults,\n options || {},\n (() => {\n try {\n return JSON.parse(this.media.getAttribute('data-plyr-config'));\n } catch (e) {\n return {};\n }\n })(),\n );\n\n // Elements cache\n this.elements = {\n container: null,\n buttons: {},\n display: {},\n progress: {},\n inputs: {},\n settings: {\n menu: null,\n panes: {},\n tabs: {},\n },\n captions: null,\n };\n\n // Captions\n this.captions = {\n active: null,\n currentTrack: -1,\n meta: new WeakMap(),\n };\n\n // Fullscreen\n this.fullscreen = {\n active: false,\n };\n\n // Options\n this.options = {\n speed: [],\n quality: [],\n };\n\n // Debugging\n // TODO: move to globals\n this.debug = new Console(this.config.debug);\n\n // Log config options and support\n this.debug.log('Config', this.config);\n this.debug.log('Support', support);\n\n // We need an element to setup\n if (is.nullOrUndefined(this.media) || !is.element(this.media)) {\n this.debug.error('Setup failed: no suitable element passed');\n return;\n }\n\n // Bail if the element is initialized\n if (this.media.plyr) {\n this.debug.warn('Target already setup');\n return;\n }\n\n // Bail if not enabled\n if (!this.config.enabled) {\n this.debug.error('Setup failed: disabled by config');\n return;\n }\n\n // Bail if disabled or no basic support\n // You may want to disable certain UAs etc\n if (!support.check().api) {\n this.debug.error('Setup failed: no support');\n return;\n }\n\n // Cache original element state for .destroy()\n const clone = this.media.cloneNode(true);\n clone.autoplay = false;\n this.elements.original = clone;\n\n // Set media type based on tag or data attribute\n // Supported: video, audio, vimeo, youtube\n const type = this.media.tagName.toLowerCase();\n\n // Embed properties\n let iframe = null;\n let url = null;\n\n // Different setup based on type\n switch (type) {\n case 'div':\n // Find the frame\n iframe = this.media.querySelector('iframe');\n\n // <iframe> type\n if (is.element(iframe)) {\n // Detect provider\n url = parseUrl(iframe.getAttribute('src'));\n this.provider = getProviderByUrl(url.toString());\n\n // Rework elements\n this.elements.container = this.media;\n this.media = iframe;\n\n // Reset classname\n this.elements.container.className = '';\n\n // Get attributes from URL and set config\n if (url.searchParams.length) {\n const truthy = ['1', 'true'];\n\n if (truthy.includes(url.searchParams.get('autoplay'))) {\n this.config.autoplay = true;\n }\n if (truthy.includes(url.searchParams.get('loop'))) {\n this.config.loop.active = true;\n }\n\n // TODO: replace fullscreen.iosNative with this playsinline config option\n // YouTube requires the playsinline in the URL\n if (this.isYouTube) {\n this.config.playsinline = truthy.includes(url.searchParams.get('playsinline'));\n } else {\n this.config.playsinline = true;\n }\n }\n } else {\n // <div> with attributes\n this.provider = this.media.getAttribute(this.config.attributes.embed.provider);\n\n // Remove attribute\n this.media.removeAttribute(this.config.attributes.embed.provider);\n }\n\n // Unsupported or missing provider\n if (is.empty(this.provider) || !Object.keys(providers).includes(this.provider)) {\n this.debug.error('Setup failed: Invalid provider');\n return;\n }\n\n // Audio will come later for external providers\n this.type = types.video;\n\n break;\n\n case 'video':\n case 'audio':\n this.type = type;\n this.provider = providers.html5;\n\n // Get config from attributes\n if (this.media.hasAttribute('crossorigin')) {\n this.config.crossorigin = true;\n }\n if (this.media.hasAttribute('autoplay')) {\n this.config.autoplay = true;\n }\n if (this.media.hasAttribute('playsinline')) {\n this.config.playsinline = true;\n }\n if (this.media.hasAttribute('muted')) {\n this.config.muted = true;\n }\n if (this.media.hasAttribute('loop')) {\n this.config.loop.active = true;\n }\n\n break;\n\n default:\n this.debug.error('Setup failed: unsupported type');\n return;\n }\n\n // Check for support again but with type\n this.supported = support.check(this.type, this.provider, this.config.playsinline);\n\n // If no support for even API, bail\n if (!this.supported.api) {\n this.debug.error('Setup failed: no support');\n return;\n }\n\n this.eventListeners = [];\n\n // Create listeners\n this.listeners = new Listeners(this);\n\n // Setup local storage for user settings\n this.storage = new Storage(this);\n\n // Store reference\n this.media.plyr = this;\n\n // Wrap media\n if (!is.element(this.elements.container)) {\n this.elements.container = createElement('div');\n wrap(this.media, this.elements.container);\n }\n\n // Add style hook\n ui.addStyleHook.call(this);\n\n // Setup media\n media.setup.call(this);\n\n // Listen for events if debugging\n if (this.config.debug) {\n on.call(this, this.elements.container, this.config.events.join(' '), event => {\n this.debug.log(`event: ${event.type}`);\n });\n }\n\n // Setup interface\n // If embed but not fully supported, build interface now to avoid flash of controls\n if (this.isHTML5 || (this.isEmbed && !this.supported.ui)) {\n ui.build.call(this);\n }\n\n // Container listeners\n this.listeners.container();\n\n // Global listeners\n this.listeners.global();\n\n // Setup fullscreen\n this.fullscreen = new Fullscreen(this);\n\n // Setup ads if provided\n this.ads = new Ads(this);\n\n // Autoplay if required\n if (this.config.autoplay) {\n this.play();\n }\n }\n\n // ---------------------------------------\n // API\n // ---------------------------------------\n\n /**\n * Types and provider helpers\n */\n get isHTML5() {\n return Boolean(this.provider === providers.html5);\n }\n get isEmbed() {\n return Boolean(this.isYouTube || this.isVimeo);\n }\n get isYouTube() {\n return Boolean(this.provider === providers.youtube);\n }\n get isVimeo() {\n return Boolean(this.provider === providers.vimeo);\n }\n get isVideo() {\n return Boolean(this.type === types.video);\n }\n get isAudio() {\n return Boolean(this.type === types.audio);\n }\n\n /**\n * Play the media, or play the advertisement (if they are not blocked)\n */\n play() {\n if (!is.function(this.media.play)) {\n return null;\n }\n\n // Return the promise (for HTML5)\n return this.media.play();\n }\n\n /**\n * Pause the media\n */\n pause() {\n if (!this.playing || !is.function(this.media.pause)) {\n return;\n }\n\n this.media.pause();\n }\n\n /**\n * Get playing state\n */\n get playing() {\n return Boolean(this.ready && !this.paused && !this.ended);\n }\n\n /**\n * Get paused state\n */\n get paused() {\n return Boolean(this.media.paused);\n }\n\n /**\n * Get stopped state\n */\n get stopped() {\n return Boolean(this.paused && this.currentTime === 0);\n }\n\n /**\n * Get ended state\n */\n get ended() {\n return Boolean(this.media.ended);\n }\n\n /**\n * Toggle playback based on current status\n * @param {boolean} input\n */\n togglePlay(input) {\n // Toggle based on current state if nothing passed\n const toggle = is.boolean(input) ? input : !this.playing;\n\n if (toggle) {\n this.play();\n } else {\n this.pause();\n }\n }\n\n /**\n * Stop playback\n */\n stop() {\n if (this.isHTML5) {\n this.pause();\n this.restart();\n } else if (is.function(this.media.stop)) {\n this.media.stop();\n }\n }\n\n /**\n * Restart playback\n */\n restart() {\n this.currentTime = 0;\n }\n\n /**\n * Rewind\n * @param {number} seekTime - how far to rewind in seconds. Defaults to the config.seekTime\n */\n rewind(seekTime) {\n this.currentTime = this.currentTime - (is.number(seekTime) ? seekTime : this.config.seekTime);\n }\n\n /**\n * Fast forward\n * @param {number} seekTime - how far to fast forward in seconds. Defaults to the config.seekTime\n */\n forward(seekTime) {\n this.currentTime = this.currentTime + (is.number(seekTime) ? seekTime : this.config.seekTime);\n }\n\n /**\n * Seek to a time\n * @param {number} input - where to seek to in seconds. Defaults to 0 (the start)\n */\n set currentTime(input) {\n // Bail if media duration isn't available yet\n if (!this.duration) {\n return;\n }\n\n // Validate input\n const inputIsValid = is.number(input) && input > 0;\n\n // Set\n this.media.currentTime = inputIsValid ? Math.min(input, this.duration) : 0;\n\n // Logging\n this.debug.log(`Seeking to ${this.currentTime} seconds`);\n }\n\n /**\n * Get current time\n */\n get currentTime() {\n return Number(this.media.currentTime);\n }\n\n /**\n * Get buffered\n */\n get buffered() {\n const { buffered } = this.media;\n\n // YouTube / Vimeo return a float between 0-1\n if (is.number(buffered)) {\n return buffered;\n }\n\n // HTML5\n // TODO: Handle buffered chunks of the media\n // (i.e. seek to another section buffers only that section)\n if (buffered && buffered.length && this.duration > 0) {\n return buffered.end(0) / this.duration;\n }\n\n return 0;\n }\n\n /**\n * Get seeking status\n */\n get seeking() {\n return Boolean(this.media.seeking);\n }\n\n /**\n * Get the duration of the current media\n */\n get duration() {\n // Faux duration set via config\n const fauxDuration = parseFloat(this.config.duration);\n\n // Media duration can be NaN before the media has loaded\n const duration = (this.media || {}).duration || 0;\n\n // If config duration is funky, use regular duration\n return fauxDuration || duration;\n }\n\n /**\n * Set the player volume\n * @param {number} value - must be between 0 and 1. Defaults to the value from local storage and config.volume if not set in storage\n */\n set volume(value) {\n let volume = value;\n const max = 1;\n const min = 0;\n\n if (is.string(volume)) {\n volume = Number(volume);\n }\n\n // Load volume from storage if no value specified\n if (!is.number(volume)) {\n volume = this.storage.get('volume');\n }\n\n // Use config if all else fails\n if (!is.number(volume)) {\n ({ volume } = this.config);\n }\n\n // Maximum is volumeMax\n if (volume > max) {\n volume = max;\n }\n // Minimum is volumeMin\n if (volume < min) {\n volume = min;\n }\n\n // Update config\n this.config.volume = volume;\n\n // Set the player volume\n this.media.volume = volume;\n\n // If muted, and we're increasing volume manually, reset muted state\n if (!is.empty(value) && this.muted && volume > 0) {\n this.muted = false;\n }\n }\n\n /**\n * Get the current player volume\n */\n get volume() {\n return Number(this.media.volume);\n }\n\n /**\n * Increase volume\n * @param {boolean} step - How much to decrease by (between 0 and 1)\n */\n increaseVolume(step) {\n const volume = this.media.muted ? 0 : this.volume;\n this.volume = volume + (is.number(step) ? step : 1);\n }\n\n /**\n * Decrease volume\n * @param {boolean} step - How much to decrease by (between 0 and 1)\n */\n decreaseVolume(step) {\n const volume = this.media.muted ? 0 : this.volume;\n this.volume = volume - (is.number(step) ? step : 1);\n }\n\n /**\n * Set muted state\n * @param {boolean} mute\n */\n set muted(mute) {\n let toggle = mute;\n\n // Load muted state from storage\n if (!is.boolean(toggle)) {\n toggle = this.storage.get('muted');\n }\n\n // Use config if all else fails\n if (!is.boolean(toggle)) {\n toggle = this.config.muted;\n }\n\n // Update config\n this.config.muted = toggle;\n\n // Set mute on the player\n this.media.muted = toggle;\n }\n\n /**\n * Get current muted state\n */\n get muted() {\n return Boolean(this.media.muted);\n }\n\n /**\n * Check if the media has audio\n */\n get hasAudio() {\n // Assume yes for all non HTML5 (as we can't tell...)\n if (!this.isHTML5) {\n return true;\n }\n\n if (this.isAudio) {\n return true;\n }\n\n // Get audio tracks\n return (\n Boolean(this.media.mozHasAudio) ||\n Boolean(this.media.webkitAudioDecodedByteCount) ||\n Boolean(this.media.audioTracks && this.media.audioTracks.length)\n );\n }\n\n /**\n * Set playback speed\n * @param {number} speed - the speed of playback (0.5-2.0)\n */\n set speed(input) {\n let speed = null;\n\n if (is.number(input)) {\n speed = input;\n }\n\n if (!is.number(speed)) {\n speed = this.storage.get('speed');\n }\n\n if (!is.number(speed)) {\n speed = this.config.speed.selected;\n }\n\n // Set min/max\n if (speed < 0.1) {\n speed = 0.1;\n }\n if (speed > 2.0) {\n speed = 2.0;\n }\n\n if (!this.config.speed.options.includes(speed)) {\n this.debug.warn(`Unsupported speed (${speed})`);\n return;\n }\n\n // Update config\n this.config.speed.selected = speed;\n\n // Set media speed\n this.media.playbackRate = speed;\n }\n\n /**\n * Get current playback speed\n */\n get speed() {\n return Number(this.media.playbackRate);\n }\n\n /**\n * Set playback quality\n * Currently HTML5 & YouTube only\n * @param {number} input - Quality level\n */\n set quality(input) {\n const config = this.config.quality;\n const options = this.options.quality;\n\n if (!options.length) {\n return;\n }\n\n let quality = [\n !is.empty(input) && Number(input),\n this.storage.get('quality'),\n config.selected,\n config.default,\n ].find(is.number);\n\n if (!options.includes(quality)) {\n const value = closest(options, quality);\n this.debug.warn(`Unsupported quality option: ${quality}, using ${value} instead`);\n quality = value;\n }\n\n // Trigger request event\n triggerEvent.call(this, this.media, 'qualityrequested', false, { quality });\n\n // Update config\n config.selected = quality;\n\n // Set quality\n this.media.quality = quality;\n }\n\n /**\n * Get current quality level\n */\n get quality() {\n return this.media.quality;\n }\n\n /**\n * Toggle loop\n * TODO: Finish fancy new logic. Set the indicator on load as user may pass loop as config\n * @param {boolean} input - Whether to loop or not\n */\n set loop(input) {\n const toggle = is.boolean(input) ? input : this.config.loop.active;\n this.config.loop.active = toggle;\n this.media.loop = toggle;\n\n // Set default to be a true toggle\n /* const type = ['start', 'end', 'all', 'none', 'toggle'].includes(input) ? input : 'toggle';\n\n switch (type) {\n case 'start':\n if (this.config.loop.end && this.config.loop.end <= this.currentTime) {\n this.config.loop.end = null;\n }\n this.config.loop.start = this.currentTime;\n // this.config.loop.indicator.start = this.elements.display.played.value;\n break;\n\n case 'end':\n if (this.config.loop.start >= this.currentTime) {\n return this;\n }\n this.config.loop.end = this.currentTime;\n // this.config.loop.indicator.end = this.elements.display.played.value;\n break;\n\n case 'all':\n this.config.loop.start = 0;\n this.config.loop.end = this.duration - 2;\n this.config.loop.indicator.start = 0;\n this.config.loop.indicator.end = 100;\n break;\n\n case 'toggle':\n if (this.config.loop.active) {\n this.config.loop.start = 0;\n this.config.loop.end = null;\n } else {\n this.config.loop.start = 0;\n this.config.loop.end = this.duration - 2;\n }\n break;\n\n default:\n this.config.loop.start = 0;\n this.config.loop.end = null;\n break;\n } */\n }\n\n /**\n * Get current loop state\n */\n get loop() {\n return Boolean(this.media.loop);\n }\n\n /**\n * Set new media source\n * @param {object} input - The new source object (see docs)\n */\n set source(input) {\n source.change.call(this, input);\n }\n\n /**\n * Get current source\n */\n get source() {\n return this.media.currentSrc;\n }\n\n /**\n * Set the poster image for a video\n * @param {input} - the URL for the new poster image\n */\n set poster(input) {\n if (!this.isVideo) {\n this.debug.warn('Poster can only be set for video');\n return;\n }\n\n ui.setPoster.call(this, input, false).catch(() => {});\n }\n\n /**\n * Get the current poster image\n */\n get poster() {\n if (!this.isVideo) {\n return null;\n }\n\n return this.media.getAttribute('poster');\n }\n\n /**\n * Set the autoplay state\n * @param {boolean} input - Whether to autoplay or not\n */\n set autoplay(input) {\n const toggle = is.boolean(input) ? input : this.config.autoplay;\n this.config.autoplay = toggle;\n }\n\n /**\n * Get the current autoplay state\n */\n get autoplay() {\n return Boolean(this.config.autoplay);\n }\n\n /**\n * Toggle captions\n * @param {boolean} input - Whether to enable captions\n */\n toggleCaptions(input) {\n captions.toggle.call(this, input, false);\n }\n\n /**\n * Set the caption track by index\n * @param {number} - Caption index\n */\n set currentTrack(input) {\n captions.set.call(this, input, false);\n }\n\n /**\n * Get the current caption track index (-1 if disabled)\n */\n get currentTrack() {\n const { toggled, currentTrack } = this.captions;\n return toggled ? currentTrack : -1;\n }\n\n /**\n * Set the wanted language for captions\n * Since tracks can be added later it won't update the actual caption track until there is a matching track\n * @param {string} - Two character ISO language code (e.g. EN, FR, PT, etc)\n */\n set language(input) {\n captions.setLanguage.call(this, input, false);\n }\n\n /**\n * Get the current track's language\n */\n get language() {\n return (captions.getCurrentTrack.call(this) || {}).language;\n }\n\n /**\n * Toggle picture-in-picture playback on WebKit/MacOS\n * TODO: update player with state, support, enabled\n * TODO: detect outside changes\n */\n set pip(input) {\n const states = {\n pip: 'picture-in-picture',\n inline: 'inline',\n };\n\n // Bail if no support\n if (!support.pip) {\n return;\n }\n\n // Toggle based on current state if not passed\n const toggle = is.boolean(input) ? input : this.pip === states.inline;\n\n // Toggle based on current state\n this.media.webkitSetPresentationMode(toggle ? states.pip : states.inline);\n }\n\n /**\n * Get the current picture-in-picture state\n */\n get pip() {\n if (!support.pip) {\n return null;\n }\n\n return this.media.webkitPresentationMode;\n }\n\n /**\n * Trigger the airplay dialog\n * TODO: update player with state, support, enabled\n */\n airplay() {\n // Show dialog if supported\n if (support.airplay) {\n this.media.webkitShowPlaybackTargetPicker();\n }\n }\n\n /**\n * Toggle the player controls\n * @param {boolean} [toggle] - Whether to show the controls\n */\n toggleControls(toggle) {\n // Don't toggle if missing UI support or if it's audio\n if (this.supported.ui && !this.isAudio) {\n // Get state before change\n const isHidden = hasClass(this.elements.container, this.config.classNames.hideControls);\n\n // Negate the argument if not undefined since adding the class to hides the controls\n const force = typeof toggle === 'undefined' ? undefined : !toggle;\n\n // Apply and get updated state\n const hiding = toggleClass(this.elements.container, this.config.classNames.hideControls, force);\n\n // Close menu\n if (hiding && this.config.controls.includes('settings') && !is.empty(this.config.settings)) {\n controls.toggleMenu.call(this, false);\n }\n // Trigger event on change\n if (hiding !== isHidden) {\n const eventName = hiding ? 'controlshidden' : 'controlsshown';\n triggerEvent.call(this, this.media, eventName);\n }\n return !hiding;\n }\n return false;\n }\n\n /**\n * Add event listeners\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n */\n on(event, callback) {\n on.call(this, this.elements.container, event, callback);\n }\n /**\n * Add event listeners once\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n */\n once(event, callback) {\n once.call(this, this.elements.container, event, callback);\n }\n /**\n * Remove event listeners\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n */\n off(event, callback) {\n off(this.elements.container, event, callback);\n }\n\n /**\n * Destroy an instance\n * Event listeners are removed when elements are removed\n * http://stackoverflow.com/questions/12528049/if-a-dom-element-is-removed-are-its-listeners-also-removed-from-memory\n * @param {function} callback - Callback for when destroy is complete\n * @param {boolean} soft - Whether it's a soft destroy (for source changes etc)\n */\n destroy(callback, soft = false) {\n if (!this.ready) {\n return;\n }\n\n const done = () => {\n // Reset overflow (incase destroyed while in fullscreen)\n document.body.style.overflow = '';\n\n // GC for embed\n this.embed = null;\n\n // If it's a soft destroy, make minimal changes\n if (soft) {\n if (Object.keys(this.elements).length) {\n // Remove elements\n removeElement(this.elements.buttons.play);\n removeElement(this.elements.captions);\n removeElement(this.elements.controls);\n removeElement(this.elements.wrapper);\n\n // Clear for GC\n this.elements.buttons.play = null;\n this.elements.captions = null;\n this.elements.controls = null;\n this.elements.wrapper = null;\n }\n\n // Callback\n if (is.function(callback)) {\n callback();\n }\n } else {\n // Unbind listeners\n unbindListeners.call(this);\n\n // Replace the container with the original element provided\n replaceElement(this.elements.original, this.elements.container);\n\n // Event\n triggerEvent.call(this, this.elements.original, 'destroyed', true);\n\n // Callback\n if (is.function(callback)) {\n callback.call(this.elements.original);\n }\n\n // Reset state\n this.ready = false;\n\n // Clear for garbage collection\n setTimeout(() => {\n this.elements = null;\n this.media = null;\n }, 200);\n }\n };\n\n // Stop playback\n this.stop();\n\n // Provider specific stuff\n if (this.isHTML5) {\n // Clear timeout\n clearTimeout(this.timers.loading);\n\n // Restore native video controls\n ui.toggleNativeControls.call(this, true);\n\n // Clean up\n done();\n } else if (this.isYouTube) {\n // Clear timers\n clearInterval(this.timers.buffering);\n clearInterval(this.timers.playing);\n\n // Destroy YouTube API\n if (this.embed !== null && is.function(this.embed.destroy)) {\n this.embed.destroy();\n }\n\n // Clean up\n done();\n } else if (this.isVimeo) {\n // Destroy Vimeo API\n // then clean up (wait, to prevent postmessage errors)\n if (this.embed !== null) {\n this.embed.unload().then(done);\n }\n\n // Vimeo does not always return\n setTimeout(done, 200);\n }\n }\n\n /**\n * Check for support for a mime type (HTML5 only)\n * @param {string} type - Mime type\n */\n supports(type) {\n return support.mime.call(this, type);\n }\n\n /**\n * Check for support\n * @param {string} type - Player type (audio/video)\n * @param {string} provider - Provider (html5/youtube/vimeo)\n * @param {bool} inline - Where player has `playsinline` sttribute\n */\n static supported(type, provider, inline) {\n return support.check(type, provider, inline);\n }\n\n /**\n * Load an SVG sprite into the page\n * @param {string} url - URL for the SVG sprite\n * @param {string} [id] - Unique ID\n */\n static loadSprite(url, id) {\n return loadSprite(url, id);\n }\n\n /**\n * Setup multiple instances\n * @param {*} selector\n * @param {object} options\n */\n static setup(selector, options = {}) {\n let targets = null;\n\n if (is.string(selector)) {\n targets = Array.from(document.querySelectorAll(selector));\n } else if (is.nodeList(selector)) {\n targets = Array.from(selector);\n } else if (is.array(selector)) {\n targets = selector.filter(is.element);\n }\n\n if (is.empty(targets)) {\n return null;\n }\n\n return targets.map(t => new Plyr(t, options));\n }\n}\n\nPlyr.defaults = cloneDeep(defaults);\n\nexport default Plyr;\n"]} \ No newline at end of file
diff --git a/dist/plyr.polyfilled.js b/dist/plyr.polyfilled.js
index 6751f5e2..34c27c7e 100644
--- a/dist/plyr.polyfilled.js
+++ b/dist/plyr.polyfilled.js
@@ -4,2379 +4,2378 @@ typeof navigator === "object" && (function (global, factory) {
(global.Plyr = factory());
}(this, (function () { 'use strict';
-var commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
-
-function createCommonjsModule(fn, module) {
- return module = { exports: {} }, fn(module, module.exports), module.exports;
-}
-
-var _global = createCommonjsModule(function (module) {
-// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028
-var global = module.exports = typeof window != 'undefined' && window.Math == Math
- ? window : typeof self != 'undefined' && self.Math == Math ? self
- // eslint-disable-next-line no-new-func
- : Function('return this')();
-if (typeof __g == 'number') __g = global; // eslint-disable-line no-undef
-});
-
-var _core = createCommonjsModule(function (module) {
-var core = module.exports = { version: '2.5.3' };
-if (typeof __e == 'number') __e = core; // eslint-disable-line no-undef
-});
-var _core_1 = _core.version;
-
-var _isObject = function (it) {
- return typeof it === 'object' ? it !== null : typeof it === 'function';
-};
-
-var _anObject = function (it) {
- if (!_isObject(it)) throw TypeError(it + ' is not an object!');
- return it;
-};
-
-var _fails = function (exec) {
- try {
- return !!exec();
- } catch (e) {
- return true;
- }
-};
-
-// Thank's IE8 for his funny defineProperty
-var _descriptors = !_fails(function () {
- return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;
-});
-
-var document$1 = _global.document;
-// typeof document.createElement is 'object' in old IE
-var is = _isObject(document$1) && _isObject(document$1.createElement);
-var _domCreate = function (it) {
- return is ? document$1.createElement(it) : {};
-};
-
-var _ie8DomDefine = !_descriptors && !_fails(function () {
- return Object.defineProperty(_domCreate('div'), 'a', { get: function () { return 7; } }).a != 7;
-});
-
-// 7.1.1 ToPrimitive(input [, PreferredType])
-
-// instead of the ES6 spec version, we didn't implement @@toPrimitive case
-// and the second argument - flag - preferred type is a string
-var _toPrimitive = function (it, S) {
- if (!_isObject(it)) return it;
- var fn, val;
- if (S && typeof (fn = it.toString) == 'function' && !_isObject(val = fn.call(it))) return val;
- if (typeof (fn = it.valueOf) == 'function' && !_isObject(val = fn.call(it))) return val;
- if (!S && typeof (fn = it.toString) == 'function' && !_isObject(val = fn.call(it))) return val;
- throw TypeError("Can't convert object to primitive value");
-};
-
-var dP = Object.defineProperty;
-
-var f = _descriptors ? Object.defineProperty : function defineProperty(O, P, Attributes) {
- _anObject(O);
- P = _toPrimitive(P, true);
- _anObject(Attributes);
- if (_ie8DomDefine) try {
- return dP(O, P, Attributes);
- } catch (e) { /* empty */ }
- if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');
- if ('value' in Attributes) O[P] = Attributes.value;
- return O;
-};
-
-var _objectDp = {
- f: f
-};
-
-var _propertyDesc = function (bitmap, value) {
- return {
- enumerable: !(bitmap & 1),
- configurable: !(bitmap & 2),
- writable: !(bitmap & 4),
- value: value
- };
-};
-
-var _hide = _descriptors ? function (object, key, value) {
- return _objectDp.f(object, key, _propertyDesc(1, value));
-} : function (object, key, value) {
- object[key] = value;
- return object;
-};
-
-var hasOwnProperty = {}.hasOwnProperty;
-var _has = function (it, key) {
- return hasOwnProperty.call(it, key);
-};
-
-var id = 0;
-var px = Math.random();
-var _uid = function (key) {
- return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));
-};
-
-var _redefine = createCommonjsModule(function (module) {
-var SRC = _uid('src');
-var TO_STRING = 'toString';
-var $toString = Function[TO_STRING];
-var TPL = ('' + $toString).split(TO_STRING);
-
-_core.inspectSource = function (it) {
- return $toString.call(it);
-};
-
-(module.exports = function (O, key, val, safe) {
- var isFunction = typeof val == 'function';
- if (isFunction) _has(val, 'name') || _hide(val, 'name', key);
- if (O[key] === val) return;
- if (isFunction) _has(val, SRC) || _hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key)));
- if (O === _global) {
- O[key] = val;
- } else if (!safe) {
- delete O[key];
- _hide(O, key, val);
- } else if (O[key]) {
- O[key] = val;
- } else {
- _hide(O, key, val);
- }
-// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative
-})(Function.prototype, TO_STRING, function toString() {
- return typeof this == 'function' && this[SRC] || $toString.call(this);
-});
-});
-
-var _aFunction = function (it) {
- if (typeof it != 'function') throw TypeError(it + ' is not a function!');
- return it;
-};
-
-// optional / simple context binding
-
-var _ctx = function (fn, that, length) {
- _aFunction(fn);
- if (that === undefined) return fn;
- switch (length) {
- case 1: return function (a) {
- return fn.call(that, a);
- };
- case 2: return function (a, b) {
- return fn.call(that, a, b);
- };
- case 3: return function (a, b, c) {
- return fn.call(that, a, b, c);
- };
- }
- return function (/* ...args */) {
- return fn.apply(that, arguments);
- };
-};
-
-var PROTOTYPE = 'prototype';
-
-var $export = function (type, name, source) {
- var IS_FORCED = type & $export.F;
- var IS_GLOBAL = type & $export.G;
- var IS_STATIC = type & $export.S;
- var IS_PROTO = type & $export.P;
- var IS_BIND = type & $export.B;
- var target = IS_GLOBAL ? _global : IS_STATIC ? _global[name] || (_global[name] = {}) : (_global[name] || {})[PROTOTYPE];
- var exports = IS_GLOBAL ? _core : _core[name] || (_core[name] = {});
- var expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {});
- var key, own, out, exp;
- if (IS_GLOBAL) source = name;
- for (key in source) {
- // contains in native
- own = !IS_FORCED && target && target[key] !== undefined;
- // export native or passed
- out = (own ? target : source)[key];
- // bind timers to global for call from export context
- exp = IS_BIND && own ? _ctx(out, _global) : IS_PROTO && typeof out == 'function' ? _ctx(Function.call, out) : out;
- // extend global
- if (target) _redefine(target, key, out, type & $export.U);
- // export
- if (exports[key] != out) _hide(exports, key, exp);
- if (IS_PROTO && expProto[key] != out) expProto[key] = out;
- }
-};
-_global.core = _core;
-// type bitmap
-$export.F = 1; // forced
-$export.G = 2; // global
-$export.S = 4; // static
-$export.P = 8; // proto
-$export.B = 16; // bind
-$export.W = 32; // wrap
-$export.U = 64; // safe
-$export.R = 128; // real proto method for `library`
-var _export = $export;
-
-var TYPED = _uid('typed_array');
-var VIEW = _uid('view');
-var ABV = !!(_global.ArrayBuffer && _global.DataView);
-var CONSTR = ABV;
-var i = 0;
-var l = 9;
-var Typed;
-
-var TypedArrayConstructors = (
- 'Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array'
-).split(',');
-
-while (i < l) {
- if (Typed = _global[TypedArrayConstructors[i++]]) {
- _hide(Typed.prototype, TYPED, true);
- _hide(Typed.prototype, VIEW, true);
- } else CONSTR = false;
-}
-
-var _typed = {
- ABV: ABV,
- CONSTR: CONSTR,
- TYPED: TYPED,
- VIEW: VIEW
-};
-
-var _library = false;
-
-var _redefineAll = function (target, src, safe) {
- for (var key in src) _redefine(target, key, src[key], safe);
- return target;
-};
-
-var _anInstance = function (it, Constructor, name, forbiddenField) {
- if (!(it instanceof Constructor) || (forbiddenField !== undefined && forbiddenField in it)) {
- throw TypeError(name + ': incorrect invocation!');
- } return it;
-};
-
-// 7.1.4 ToInteger
-var ceil = Math.ceil;
-var floor = Math.floor;
-var _toInteger = function (it) {
- return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);
-};
-
-// 7.1.15 ToLength
-
-var min = Math.min;
-var _toLength = function (it) {
- return it > 0 ? min(_toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991
-};
-
-// https://tc39.github.io/ecma262/#sec-toindex
-
-
-var _toIndex = function (it) {
- if (it === undefined) return 0;
- var number = _toInteger(it);
- var length = _toLength(number);
- if (number !== length) throw RangeError('Wrong length!');
- return length;
-};
-
-var toString = {}.toString;
-
-var _cof = function (it) {
- return toString.call(it).slice(8, -1);
-};
-
-// fallback for non-array-like ES3 and non-enumerable old V8 strings
-
-// eslint-disable-next-line no-prototype-builtins
-var _iobject = Object('z').propertyIsEnumerable(0) ? Object : function (it) {
- return _cof(it) == 'String' ? it.split('') : Object(it);
-};
-
-// 7.2.1 RequireObjectCoercible(argument)
-var _defined = function (it) {
- if (it == undefined) throw TypeError("Can't call method on " + it);
- return it;
-};
-
-// to indexed object, toObject with fallback for non-array-like ES3 strings
-
-
-var _toIobject = function (it) {
- return _iobject(_defined(it));
-};
-
-var max = Math.max;
-var min$1 = Math.min;
-var _toAbsoluteIndex = function (index, length) {
- index = _toInteger(index);
- return index < 0 ? max(index + length, 0) : min$1(index, length);
-};
-
-// false -> Array#indexOf
-// true -> Array#includes
-
-
-
-var _arrayIncludes = function (IS_INCLUDES) {
- return function ($this, el, fromIndex) {
- var O = _toIobject($this);
- var length = _toLength(O.length);
- var index = _toAbsoluteIndex(fromIndex, length);
- var value;
- // Array#includes uses SameValueZero equality algorithm
- // eslint-disable-next-line no-self-compare
- if (IS_INCLUDES && el != el) while (length > index) {
- value = O[index++];
- // eslint-disable-next-line no-self-compare
- if (value != value) return true;
- // Array#indexOf ignores holes, Array#includes - not
- } else for (;length > index; index++) if (IS_INCLUDES || index in O) {
- if (O[index] === el) return IS_INCLUDES || index || 0;
- } return !IS_INCLUDES && -1;
- };
-};
+ var commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
+
+ function createCommonjsModule(fn, module) {
+ return module = { exports: {} }, fn(module, module.exports), module.exports;
+ }
+
+ var _global = createCommonjsModule(function (module) {
+ // https://github.com/zloirock/core-js/issues/86#issuecomment-115759028
+ var global = module.exports = typeof window != 'undefined' && window.Math == Math
+ ? window : typeof self != 'undefined' && self.Math == Math ? self
+ // eslint-disable-next-line no-new-func
+ : Function('return this')();
+ if (typeof __g == 'number') __g = global; // eslint-disable-line no-undef
+ });
+
+ var _core = createCommonjsModule(function (module) {
+ var core = module.exports = { version: '2.5.3' };
+ if (typeof __e == 'number') __e = core; // eslint-disable-line no-undef
+ });
+ var _core_1 = _core.version;
+
+ var _isObject = function (it) {
+ return typeof it === 'object' ? it !== null : typeof it === 'function';
+ };
+
+ var _anObject = function (it) {
+ if (!_isObject(it)) throw TypeError(it + ' is not an object!');
+ return it;
+ };
+
+ var _fails = function (exec) {
+ try {
+ return !!exec();
+ } catch (e) {
+ return true;
+ }
+ };
+
+ // Thank's IE8 for his funny defineProperty
+ var _descriptors = !_fails(function () {
+ return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;
+ });
+
+ var document$1 = _global.document;
+ // typeof document.createElement is 'object' in old IE
+ var is = _isObject(document$1) && _isObject(document$1.createElement);
+ var _domCreate = function (it) {
+ return is ? document$1.createElement(it) : {};
+ };
+
+ var _ie8DomDefine = !_descriptors && !_fails(function () {
+ return Object.defineProperty(_domCreate('div'), 'a', { get: function () { return 7; } }).a != 7;
+ });
+
+ // 7.1.1 ToPrimitive(input [, PreferredType])
+
+ // instead of the ES6 spec version, we didn't implement @@toPrimitive case
+ // and the second argument - flag - preferred type is a string
+ var _toPrimitive = function (it, S) {
+ if (!_isObject(it)) return it;
+ var fn, val;
+ if (S && typeof (fn = it.toString) == 'function' && !_isObject(val = fn.call(it))) return val;
+ if (typeof (fn = it.valueOf) == 'function' && !_isObject(val = fn.call(it))) return val;
+ if (!S && typeof (fn = it.toString) == 'function' && !_isObject(val = fn.call(it))) return val;
+ throw TypeError("Can't convert object to primitive value");
+ };
+
+ var dP = Object.defineProperty;
+
+ var f = _descriptors ? Object.defineProperty : function defineProperty(O, P, Attributes) {
+ _anObject(O);
+ P = _toPrimitive(P, true);
+ _anObject(Attributes);
+ if (_ie8DomDefine) try {
+ return dP(O, P, Attributes);
+ } catch (e) { /* empty */ }
+ if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');
+ if ('value' in Attributes) O[P] = Attributes.value;
+ return O;
+ };
+
+ var _objectDp = {
+ f: f
+ };
+
+ var _propertyDesc = function (bitmap, value) {
+ return {
+ enumerable: !(bitmap & 1),
+ configurable: !(bitmap & 2),
+ writable: !(bitmap & 4),
+ value: value
+ };
+ };
+
+ var _hide = _descriptors ? function (object, key, value) {
+ return _objectDp.f(object, key, _propertyDesc(1, value));
+ } : function (object, key, value) {
+ object[key] = value;
+ return object;
+ };
+
+ var hasOwnProperty = {}.hasOwnProperty;
+ var _has = function (it, key) {
+ return hasOwnProperty.call(it, key);
+ };
+
+ var id = 0;
+ var px = Math.random();
+ var _uid = function (key) {
+ return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));
+ };
+
+ var _redefine = createCommonjsModule(function (module) {
+ var SRC = _uid('src');
+ var TO_STRING = 'toString';
+ var $toString = Function[TO_STRING];
+ var TPL = ('' + $toString).split(TO_STRING);
+
+ _core.inspectSource = function (it) {
+ return $toString.call(it);
+ };
+
+ (module.exports = function (O, key, val, safe) {
+ var isFunction = typeof val == 'function';
+ if (isFunction) _has(val, 'name') || _hide(val, 'name', key);
+ if (O[key] === val) return;
+ if (isFunction) _has(val, SRC) || _hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key)));
+ if (O === _global) {
+ O[key] = val;
+ } else if (!safe) {
+ delete O[key];
+ _hide(O, key, val);
+ } else if (O[key]) {
+ O[key] = val;
+ } else {
+ _hide(O, key, val);
+ }
+ // add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative
+ })(Function.prototype, TO_STRING, function toString() {
+ return typeof this == 'function' && this[SRC] || $toString.call(this);
+ });
+ });
+
+ var _aFunction = function (it) {
+ if (typeof it != 'function') throw TypeError(it + ' is not a function!');
+ return it;
+ };
+
+ // optional / simple context binding
+
+ var _ctx = function (fn, that, length) {
+ _aFunction(fn);
+ if (that === undefined) return fn;
+ switch (length) {
+ case 1: return function (a) {
+ return fn.call(that, a);
+ };
+ case 2: return function (a, b) {
+ return fn.call(that, a, b);
+ };
+ case 3: return function (a, b, c) {
+ return fn.call(that, a, b, c);
+ };
+ }
+ return function (/* ...args */) {
+ return fn.apply(that, arguments);
+ };
+ };
+
+ var PROTOTYPE = 'prototype';
+
+ var $export = function (type, name, source) {
+ var IS_FORCED = type & $export.F;
+ var IS_GLOBAL = type & $export.G;
+ var IS_STATIC = type & $export.S;
+ var IS_PROTO = type & $export.P;
+ var IS_BIND = type & $export.B;
+ var target = IS_GLOBAL ? _global : IS_STATIC ? _global[name] || (_global[name] = {}) : (_global[name] || {})[PROTOTYPE];
+ var exports = IS_GLOBAL ? _core : _core[name] || (_core[name] = {});
+ var expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {});
+ var key, own, out, exp;
+ if (IS_GLOBAL) source = name;
+ for (key in source) {
+ // contains in native
+ own = !IS_FORCED && target && target[key] !== undefined;
+ // export native or passed
+ out = (own ? target : source)[key];
+ // bind timers to global for call from export context
+ exp = IS_BIND && own ? _ctx(out, _global) : IS_PROTO && typeof out == 'function' ? _ctx(Function.call, out) : out;
+ // extend global
+ if (target) _redefine(target, key, out, type & $export.U);
+ // export
+ if (exports[key] != out) _hide(exports, key, exp);
+ if (IS_PROTO && expProto[key] != out) expProto[key] = out;
+ }
+ };
+ _global.core = _core;
+ // type bitmap
+ $export.F = 1; // forced
+ $export.G = 2; // global
+ $export.S = 4; // static
+ $export.P = 8; // proto
+ $export.B = 16; // bind
+ $export.W = 32; // wrap
+ $export.U = 64; // safe
+ $export.R = 128; // real proto method for `library`
+ var _export = $export;
+
+ var TYPED = _uid('typed_array');
+ var VIEW = _uid('view');
+ var ABV = !!(_global.ArrayBuffer && _global.DataView);
+ var CONSTR = ABV;
+ var i = 0;
+ var l = 9;
+ var Typed;
+
+ var TypedArrayConstructors = (
+ 'Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array'
+ ).split(',');
+
+ while (i < l) {
+ if (Typed = _global[TypedArrayConstructors[i++]]) {
+ _hide(Typed.prototype, TYPED, true);
+ _hide(Typed.prototype, VIEW, true);
+ } else CONSTR = false;
+ }
+
+ var _typed = {
+ ABV: ABV,
+ CONSTR: CONSTR,
+ TYPED: TYPED,
+ VIEW: VIEW
+ };
+
+ var _library = false;
+
+ var _redefineAll = function (target, src, safe) {
+ for (var key in src) _redefine(target, key, src[key], safe);
+ return target;
+ };
+
+ var _anInstance = function (it, Constructor, name, forbiddenField) {
+ if (!(it instanceof Constructor) || (forbiddenField !== undefined && forbiddenField in it)) {
+ throw TypeError(name + ': incorrect invocation!');
+ } return it;
+ };
+
+ // 7.1.4 ToInteger
+ var ceil = Math.ceil;
+ var floor = Math.floor;
+ var _toInteger = function (it) {
+ return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);
+ };
+
+ // 7.1.15 ToLength
+
+ var min = Math.min;
+ var _toLength = function (it) {
+ return it > 0 ? min(_toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991
+ };
+
+ // https://tc39.github.io/ecma262/#sec-toindex
+
+
+ var _toIndex = function (it) {
+ if (it === undefined) return 0;
+ var number = _toInteger(it);
+ var length = _toLength(number);
+ if (number !== length) throw RangeError('Wrong length!');
+ return length;
+ };
+
+ var toString = {}.toString;
+
+ var _cof = function (it) {
+ return toString.call(it).slice(8, -1);
+ };
+
+ // fallback for non-array-like ES3 and non-enumerable old V8 strings
+
+ // eslint-disable-next-line no-prototype-builtins
+ var _iobject = Object('z').propertyIsEnumerable(0) ? Object : function (it) {
+ return _cof(it) == 'String' ? it.split('') : Object(it);
+ };
+
+ // 7.2.1 RequireObjectCoercible(argument)
+ var _defined = function (it) {
+ if (it == undefined) throw TypeError("Can't call method on " + it);
+ return it;
+ };
+
+ // to indexed object, toObject with fallback for non-array-like ES3 strings
+
+
+ var _toIobject = function (it) {
+ return _iobject(_defined(it));
+ };
+
+ var max = Math.max;
+ var min$1 = Math.min;
+ var _toAbsoluteIndex = function (index, length) {
+ index = _toInteger(index);
+ return index < 0 ? max(index + length, 0) : min$1(index, length);
+ };
+
+ // false -> Array#indexOf
+ // true -> Array#includes
+
+
+
+ var _arrayIncludes = function (IS_INCLUDES) {
+ return function ($this, el, fromIndex) {
+ var O = _toIobject($this);
+ var length = _toLength(O.length);
+ var index = _toAbsoluteIndex(fromIndex, length);
+ var value;
+ // Array#includes uses SameValueZero equality algorithm
+ // eslint-disable-next-line no-self-compare
+ if (IS_INCLUDES && el != el) while (length > index) {
+ value = O[index++];
+ // eslint-disable-next-line no-self-compare
+ if (value != value) return true;
+ // Array#indexOf ignores holes, Array#includes - not
+ } else for (;length > index; index++) if (IS_INCLUDES || index in O) {
+ if (O[index] === el) return IS_INCLUDES || index || 0;
+ } return !IS_INCLUDES && -1;
+ };
+ };
-var SHARED = '__core-js_shared__';
-var store = _global[SHARED] || (_global[SHARED] = {});
-var _shared = function (key) {
- return store[key] || (store[key] = {});
-};
+ var SHARED = '__core-js_shared__';
+ var store = _global[SHARED] || (_global[SHARED] = {});
+ var _shared = function (key) {
+ return store[key] || (store[key] = {});
+ };
-var shared = _shared('keys');
+ var shared = _shared('keys');
-var _sharedKey = function (key) {
- return shared[key] || (shared[key] = _uid(key));
-};
+ var _sharedKey = function (key) {
+ return shared[key] || (shared[key] = _uid(key));
+ };
-var arrayIndexOf = _arrayIncludes(false);
-var IE_PROTO = _sharedKey('IE_PROTO');
+ var arrayIndexOf = _arrayIncludes(false);
+ var IE_PROTO = _sharedKey('IE_PROTO');
-var _objectKeysInternal = function (object, names) {
- var O = _toIobject(object);
- var i = 0;
- var result = [];
- var key;
- for (key in O) if (key != IE_PROTO) _has(O, key) && result.push(key);
- // Don't enum bug & hidden keys
- while (names.length > i) if (_has(O, key = names[i++])) {
- ~arrayIndexOf(result, key) || result.push(key);
- }
- return result;
-};
+ var _objectKeysInternal = function (object, names) {
+ var O = _toIobject(object);
+ var i = 0;
+ var result = [];
+ var key;
+ for (key in O) if (key != IE_PROTO) _has(O, key) && result.push(key);
+ // Don't enum bug & hidden keys
+ while (names.length > i) if (_has(O, key = names[i++])) {
+ ~arrayIndexOf(result, key) || result.push(key);
+ }
+ return result;
+ };
-// IE 8- don't enum bug keys
-var _enumBugKeys = (
- 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'
-).split(',');
+ // IE 8- don't enum bug keys
+ var _enumBugKeys = (
+ 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'
+ ).split(',');
-// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)
-
-var hiddenKeys = _enumBugKeys.concat('length', 'prototype');
-
-var f$1 = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {
- return _objectKeysInternal(O, hiddenKeys);
-};
-
-var _objectGopn = {
- f: f$1
-};
-
-// 7.1.13 ToObject(argument)
-
-var _toObject = function (it) {
- return Object(_defined(it));
-};
-
-var _arrayFill = function fill(value /* , start = 0, end = @length */) {
- var O = _toObject(this);
- var length = _toLength(O.length);
- var aLen = arguments.length;
- var index = _toAbsoluteIndex(aLen > 1 ? arguments[1] : undefined, length);
- var end = aLen > 2 ? arguments[2] : undefined;
- var endPos = end === undefined ? length : _toAbsoluteIndex(end, length);
- while (endPos > index) O[index++] = value;
- return O;
-};
-
-var _wks = createCommonjsModule(function (module) {
-var store = _shared('wks');
-
-var Symbol = _global.Symbol;
-var USE_SYMBOL = typeof Symbol == 'function';
-
-var $exports = module.exports = function (name) {
- return store[name] || (store[name] =
- USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : _uid)('Symbol.' + name));
-};
-
-$exports.store = store;
-});
-
-var def = _objectDp.f;
-
-var TAG = _wks('toStringTag');
-
-var _setToStringTag = function (it, tag, stat) {
- if (it && !_has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag });
-};
-
-var _typedBuffer = createCommonjsModule(function (module, exports) {
-
-
-
-
-
-
-
-
-
-
-
-var gOPN = _objectGopn.f;
-var dP = _objectDp.f;
-
-
-var ARRAY_BUFFER = 'ArrayBuffer';
-var DATA_VIEW = 'DataView';
-var PROTOTYPE = 'prototype';
-var WRONG_LENGTH = 'Wrong length!';
-var WRONG_INDEX = 'Wrong index!';
-var $ArrayBuffer = _global[ARRAY_BUFFER];
-var $DataView = _global[DATA_VIEW];
-var Math = _global.Math;
-var RangeError = _global.RangeError;
-// eslint-disable-next-line no-shadow-restricted-names
-var Infinity = _global.Infinity;
-var BaseBuffer = $ArrayBuffer;
-var abs = Math.abs;
-var pow = Math.pow;
-var floor = Math.floor;
-var log = Math.log;
-var LN2 = Math.LN2;
-var BUFFER = 'buffer';
-var BYTE_LENGTH = 'byteLength';
-var BYTE_OFFSET = 'byteOffset';
-var $BUFFER = _descriptors ? '_b' : BUFFER;
-var $LENGTH = _descriptors ? '_l' : BYTE_LENGTH;
-var $OFFSET = _descriptors ? '_o' : BYTE_OFFSET;
-
-// IEEE754 conversions based on https://github.com/feross/ieee754
-function packIEEE754(value, mLen, nBytes) {
- var buffer = new Array(nBytes);
- var eLen = nBytes * 8 - mLen - 1;
- var eMax = (1 << eLen) - 1;
- var eBias = eMax >> 1;
- var rt = mLen === 23 ? pow(2, -24) - pow(2, -77) : 0;
- var i = 0;
- var s = value < 0 || value === 0 && 1 / value < 0 ? 1 : 0;
- var e, m, c;
- value = abs(value);
- // eslint-disable-next-line no-self-compare
- if (value != value || value === Infinity) {
- // eslint-disable-next-line no-self-compare
- m = value != value ? 1 : 0;
- e = eMax;
- } else {
- e = floor(log(value) / LN2);
- if (value * (c = pow(2, -e)) < 1) {
- e--;
- c *= 2;
- }
- if (e + eBias >= 1) {
- value += rt / c;
- } else {
- value += rt * pow(2, 1 - eBias);
- }
- if (value * c >= 2) {
- e++;
- c /= 2;
- }
- if (e + eBias >= eMax) {
- m = 0;
- e = eMax;
- } else if (e + eBias >= 1) {
- m = (value * c - 1) * pow(2, mLen);
- e = e + eBias;
- } else {
- m = value * pow(2, eBias - 1) * pow(2, mLen);
- e = 0;
- }
- }
- for (; mLen >= 8; buffer[i++] = m & 255, m /= 256, mLen -= 8);
- e = e << mLen | m;
- eLen += mLen;
- for (; eLen > 0; buffer[i++] = e & 255, e /= 256, eLen -= 8);
- buffer[--i] |= s * 128;
- return buffer;
-}
-function unpackIEEE754(buffer, mLen, nBytes) {
- var eLen = nBytes * 8 - mLen - 1;
- var eMax = (1 << eLen) - 1;
- var eBias = eMax >> 1;
- var nBits = eLen - 7;
- var i = nBytes - 1;
- var s = buffer[i--];
- var e = s & 127;
- var m;
- s >>= 7;
- for (; nBits > 0; e = e * 256 + buffer[i], i--, nBits -= 8);
- m = e & (1 << -nBits) - 1;
- e >>= -nBits;
- nBits += mLen;
- for (; nBits > 0; m = m * 256 + buffer[i], i--, nBits -= 8);
- if (e === 0) {
- e = 1 - eBias;
- } else if (e === eMax) {
- return m ? NaN : s ? -Infinity : Infinity;
- } else {
- m = m + pow(2, mLen);
- e = e - eBias;
- } return (s ? -1 : 1) * m * pow(2, e - mLen);
-}
-
-function unpackI32(bytes) {
- return bytes[3] << 24 | bytes[2] << 16 | bytes[1] << 8 | bytes[0];
-}
-function packI8(it) {
- return [it & 0xff];
-}
-function packI16(it) {
- return [it & 0xff, it >> 8 & 0xff];
-}
-function packI32(it) {
- return [it & 0xff, it >> 8 & 0xff, it >> 16 & 0xff, it >> 24 & 0xff];
-}
-function packF64(it) {
- return packIEEE754(it, 52, 8);
-}
-function packF32(it) {
- return packIEEE754(it, 23, 4);
-}
-
-function addGetter(C, key, internal) {
- dP(C[PROTOTYPE], key, { get: function () { return this[internal]; } });
-}
-
-function get(view, bytes, index, isLittleEndian) {
- var numIndex = +index;
- var intIndex = _toIndex(numIndex);
- if (intIndex + bytes > view[$LENGTH]) throw RangeError(WRONG_INDEX);
- var store = view[$BUFFER]._b;
- var start = intIndex + view[$OFFSET];
- var pack = store.slice(start, start + bytes);
- return isLittleEndian ? pack : pack.reverse();
-}
-function set(view, bytes, index, conversion, value, isLittleEndian) {
- var numIndex = +index;
- var intIndex = _toIndex(numIndex);
- if (intIndex + bytes > view[$LENGTH]) throw RangeError(WRONG_INDEX);
- var store = view[$BUFFER]._b;
- var start = intIndex + view[$OFFSET];
- var pack = conversion(+value);
- for (var i = 0; i < bytes; i++) store[start + i] = pack[isLittleEndian ? i : bytes - i - 1];
-}
-
-if (!_typed.ABV) {
- $ArrayBuffer = function ArrayBuffer(length) {
- _anInstance(this, $ArrayBuffer, ARRAY_BUFFER);
- var byteLength = _toIndex(length);
- this._b = _arrayFill.call(new Array(byteLength), 0);
- this[$LENGTH] = byteLength;
- };
-
- $DataView = function DataView(buffer, byteOffset, byteLength) {
- _anInstance(this, $DataView, DATA_VIEW);
- _anInstance(buffer, $ArrayBuffer, DATA_VIEW);
- var bufferLength = buffer[$LENGTH];
- var offset = _toInteger(byteOffset);
- if (offset < 0 || offset > bufferLength) throw RangeError('Wrong offset!');
- byteLength = byteLength === undefined ? bufferLength - offset : _toLength(byteLength);
- if (offset + byteLength > bufferLength) throw RangeError(WRONG_LENGTH);
- this[$BUFFER] = buffer;
- this[$OFFSET] = offset;
- this[$LENGTH] = byteLength;
- };
-
- if (_descriptors) {
- addGetter($ArrayBuffer, BYTE_LENGTH, '_l');
- addGetter($DataView, BUFFER, '_b');
- addGetter($DataView, BYTE_LENGTH, '_l');
- addGetter($DataView, BYTE_OFFSET, '_o');
- }
-
- _redefineAll($DataView[PROTOTYPE], {
- getInt8: function getInt8(byteOffset) {
- return get(this, 1, byteOffset)[0] << 24 >> 24;
- },
- getUint8: function getUint8(byteOffset) {
- return get(this, 1, byteOffset)[0];
- },
- getInt16: function getInt16(byteOffset /* , littleEndian */) {
- var bytes = get(this, 2, byteOffset, arguments[1]);
- return (bytes[1] << 8 | bytes[0]) << 16 >> 16;
- },
- getUint16: function getUint16(byteOffset /* , littleEndian */) {
- var bytes = get(this, 2, byteOffset, arguments[1]);
- return bytes[1] << 8 | bytes[0];
- },
- getInt32: function getInt32(byteOffset /* , littleEndian */) {
- return unpackI32(get(this, 4, byteOffset, arguments[1]));
- },
- getUint32: function getUint32(byteOffset /* , littleEndian */) {
- return unpackI32(get(this, 4, byteOffset, arguments[1])) >>> 0;
- },
- getFloat32: function getFloat32(byteOffset /* , littleEndian */) {
- return unpackIEEE754(get(this, 4, byteOffset, arguments[1]), 23, 4);
- },
- getFloat64: function getFloat64(byteOffset /* , littleEndian */) {
- return unpackIEEE754(get(this, 8, byteOffset, arguments[1]), 52, 8);
- },
- setInt8: function setInt8(byteOffset, value) {
- set(this, 1, byteOffset, packI8, value);
- },
- setUint8: function setUint8(byteOffset, value) {
- set(this, 1, byteOffset, packI8, value);
- },
- setInt16: function setInt16(byteOffset, value /* , littleEndian */) {
- set(this, 2, byteOffset, packI16, value, arguments[2]);
- },
- setUint16: function setUint16(byteOffset, value /* , littleEndian */) {
- set(this, 2, byteOffset, packI16, value, arguments[2]);
- },
- setInt32: function setInt32(byteOffset, value /* , littleEndian */) {
- set(this, 4, byteOffset, packI32, value, arguments[2]);
- },
- setUint32: function setUint32(byteOffset, value /* , littleEndian */) {
- set(this, 4, byteOffset, packI32, value, arguments[2]);
- },
- setFloat32: function setFloat32(byteOffset, value /* , littleEndian */) {
- set(this, 4, byteOffset, packF32, value, arguments[2]);
- },
- setFloat64: function setFloat64(byteOffset, value /* , littleEndian */) {
- set(this, 8, byteOffset, packF64, value, arguments[2]);
- }
- });
-} else {
- if (!_fails(function () {
- $ArrayBuffer(1);
- }) || !_fails(function () {
- new $ArrayBuffer(-1); // eslint-disable-line no-new
- }) || _fails(function () {
- new $ArrayBuffer(); // eslint-disable-line no-new
- new $ArrayBuffer(1.5); // eslint-disable-line no-new
- new $ArrayBuffer(NaN); // eslint-disable-line no-new
- return $ArrayBuffer.name != ARRAY_BUFFER;
- })) {
- $ArrayBuffer = function ArrayBuffer(length) {
- _anInstance(this, $ArrayBuffer);
- return new BaseBuffer(_toIndex(length));
- };
- var ArrayBufferProto = $ArrayBuffer[PROTOTYPE] = BaseBuffer[PROTOTYPE];
- for (var keys = gOPN(BaseBuffer), j = 0, key; keys.length > j;) {
- if (!((key = keys[j++]) in $ArrayBuffer)) _hide($ArrayBuffer, key, BaseBuffer[key]);
- }
- if (!_library) ArrayBufferProto.constructor = $ArrayBuffer;
- }
- // iOS Safari 7.x bug
- var view = new $DataView(new $ArrayBuffer(2));
- var $setInt8 = $DataView[PROTOTYPE].setInt8;
- view.setInt8(0, 2147483648);
- view.setInt8(1, 2147483649);
- if (view.getInt8(0) || !view.getInt8(1)) _redefineAll($DataView[PROTOTYPE], {
- setInt8: function setInt8(byteOffset, value) {
- $setInt8.call(this, byteOffset, value << 24 >> 24);
- },
- setUint8: function setUint8(byteOffset, value) {
- $setInt8.call(this, byteOffset, value << 24 >> 24);
- }
- }, true);
-}
-_setToStringTag($ArrayBuffer, ARRAY_BUFFER);
-_setToStringTag($DataView, DATA_VIEW);
-_hide($DataView[PROTOTYPE], _typed.VIEW, true);
-exports[ARRAY_BUFFER] = $ArrayBuffer;
-exports[DATA_VIEW] = $DataView;
-});
-
-// 7.3.20 SpeciesConstructor(O, defaultConstructor)
-
-
-var SPECIES = _wks('species');
-var _speciesConstructor = function (O, D) {
- var C = _anObject(O).constructor;
- var S;
- return C === undefined || (S = _anObject(C)[SPECIES]) == undefined ? D : _aFunction(S);
-};
-
-var SPECIES$1 = _wks('species');
-
-var _setSpecies = function (KEY) {
- var C = _global[KEY];
- if (_descriptors && C && !C[SPECIES$1]) _objectDp.f(C, SPECIES$1, {
- configurable: true,
- get: function () { return this; }
- });
-};
-
-var ArrayBuffer = _global.ArrayBuffer;
-
-var $ArrayBuffer = _typedBuffer.ArrayBuffer;
-var $DataView = _typedBuffer.DataView;
-var $isView = _typed.ABV && ArrayBuffer.isView;
-var $slice = $ArrayBuffer.prototype.slice;
-var VIEW$1 = _typed.VIEW;
-var ARRAY_BUFFER = 'ArrayBuffer';
-
-_export(_export.G + _export.W + _export.F * (ArrayBuffer !== $ArrayBuffer), { ArrayBuffer: $ArrayBuffer });
-
-_export(_export.S + _export.F * !_typed.CONSTR, ARRAY_BUFFER, {
- // 24.1.3.1 ArrayBuffer.isView(arg)
- isView: function isView(it) {
- return $isView && $isView(it) || _isObject(it) && VIEW$1 in it;
- }
-});
-
-_export(_export.P + _export.U + _export.F * _fails(function () {
- return !new $ArrayBuffer(2).slice(1, undefined).byteLength;
-}), ARRAY_BUFFER, {
- // 24.1.4.3 ArrayBuffer.prototype.slice(start, end)
- slice: function slice(start, end) {
- if ($slice !== undefined && end === undefined) return $slice.call(_anObject(this), start); // FF fix
- var len = _anObject(this).byteLength;
- var first = _toAbsoluteIndex(start, len);
- var final = _toAbsoluteIndex(end === undefined ? len : end, len);
- var result = new (_speciesConstructor(this, $ArrayBuffer))(_toLength(final - first));
- var viewS = new $DataView(this);
- var viewT = new $DataView(result);
- var index = 0;
- while (first < final) {
- viewT.setUint8(index++, viewS.getUint8(first++));
- } return result;
- }
-});
-
-_setSpecies(ARRAY_BUFFER);
-
-// getting tag from 19.1.3.6 Object.prototype.toString()
-
-var TAG$1 = _wks('toStringTag');
-// ES3 wrong here
-var ARG = _cof(function () { return arguments; }()) == 'Arguments';
-
-// fallback for IE11 Script Access Denied error
-var tryGet = function (it, key) {
- try {
- return it[key];
- } catch (e) { /* empty */ }
-};
-
-var _classof = function (it) {
- var O, T, B;
- return it === undefined ? 'Undefined' : it === null ? 'Null'
- // @@toStringTag case
- : typeof (T = tryGet(O = Object(it), TAG$1)) == 'string' ? T
- // builtinTag case
- : ARG ? _cof(O)
- // ES3 arguments fallback
- : (B = _cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;
-};
-
-var _iterators = {};
-
-// check on default Array iterator
-
-var ITERATOR = _wks('iterator');
-var ArrayProto = Array.prototype;
-
-var _isArrayIter = function (it) {
- return it !== undefined && (_iterators.Array === it || ArrayProto[ITERATOR] === it);
-};
-
-// 19.1.2.14 / 15.2.3.14 Object.keys(O)
-
-
-
-var _objectKeys = Object.keys || function keys(O) {
- return _objectKeysInternal(O, _enumBugKeys);
-};
-
-var _objectDps = _descriptors ? Object.defineProperties : function defineProperties(O, Properties) {
- _anObject(O);
- var keys = _objectKeys(Properties);
- var length = keys.length;
- var i = 0;
- var P;
- while (length > i) _objectDp.f(O, P = keys[i++], Properties[P]);
- return O;
-};
-
-var document$2 = _global.document;
-var _html = document$2 && document$2.documentElement;
-
-// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])
-
-
-
-var IE_PROTO$1 = _sharedKey('IE_PROTO');
-var Empty = function () { /* empty */ };
-var PROTOTYPE$1 = 'prototype';
-
-// Create object with fake `null` prototype: use iframe Object with cleared prototype
-var createDict = function () {
- // Thrash, waste and sodomy: IE GC bug
- var iframe = _domCreate('iframe');
- var i = _enumBugKeys.length;
- var lt = '<';
- var gt = '>';
- var iframeDocument;
- iframe.style.display = 'none';
- _html.appendChild(iframe);
- iframe.src = 'javascript:'; // eslint-disable-line no-script-url
- // createDict = iframe.contentWindow.Object;
- // html.removeChild(iframe);
- iframeDocument = iframe.contentWindow.document;
- iframeDocument.open();
- iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);
- iframeDocument.close();
- createDict = iframeDocument.F;
- while (i--) delete createDict[PROTOTYPE$1][_enumBugKeys[i]];
- return createDict();
-};
-
-var _objectCreate = Object.create || function create(O, Properties) {
- var result;
- if (O !== null) {
- Empty[PROTOTYPE$1] = _anObject(O);
- result = new Empty();
- Empty[PROTOTYPE$1] = null;
- // add "__proto__" for Object.getPrototypeOf polyfill
- result[IE_PROTO$1] = O;
- } else result = createDict();
- return Properties === undefined ? result : _objectDps(result, Properties);
-};
-
-// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)
-
-
-var IE_PROTO$2 = _sharedKey('IE_PROTO');
-var ObjectProto = Object.prototype;
-
-var _objectGpo = Object.getPrototypeOf || function (O) {
- O = _toObject(O);
- if (_has(O, IE_PROTO$2)) return O[IE_PROTO$2];
- if (typeof O.constructor == 'function' && O instanceof O.constructor) {
- return O.constructor.prototype;
- } return O instanceof Object ? ObjectProto : null;
-};
-
-var ITERATOR$1 = _wks('iterator');
-
-var core_getIteratorMethod = _core.getIteratorMethod = function (it) {
- if (it != undefined) return it[ITERATOR$1]
- || it['@@iterator']
- || _iterators[_classof(it)];
-};
-
-// 7.2.2 IsArray(argument)
-
-var _isArray = Array.isArray || function isArray(arg) {
- return _cof(arg) == 'Array';
-};
-
-var SPECIES$2 = _wks('species');
-
-var _arraySpeciesConstructor = function (original) {
- var C;
- if (_isArray(original)) {
- C = original.constructor;
- // cross-realm fallback
- if (typeof C == 'function' && (C === Array || _isArray(C.prototype))) C = undefined;
- if (_isObject(C)) {
- C = C[SPECIES$2];
- if (C === null) C = undefined;
- }
- } return C === undefined ? Array : C;
-};
-
-// 9.4.2.3 ArraySpeciesCreate(originalArray, length)
-
-
-var _arraySpeciesCreate = function (original, length) {
- return new (_arraySpeciesConstructor(original))(length);
-};
-
-// 0 -> Array#forEach
-// 1 -> Array#map
-// 2 -> Array#filter
-// 3 -> Array#some
-// 4 -> Array#every
-// 5 -> Array#find
-// 6 -> Array#findIndex
-
-
-
-
-
-var _arrayMethods = function (TYPE, $create) {
- var IS_MAP = TYPE == 1;
- var IS_FILTER = TYPE == 2;
- var IS_SOME = TYPE == 3;
- var IS_EVERY = TYPE == 4;
- var IS_FIND_INDEX = TYPE == 6;
- var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;
- var create = $create || _arraySpeciesCreate;
- return function ($this, callbackfn, that) {
- var O = _toObject($this);
- var self = _iobject(O);
- var f = _ctx(callbackfn, that, 3);
- var length = _toLength(self.length);
- var index = 0;
- var result = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined;
- var val, res;
- for (;length > index; index++) if (NO_HOLES || index in self) {
- val = self[index];
- res = f(val, index, O);
- if (TYPE) {
- if (IS_MAP) result[index] = res; // map
- else if (res) switch (TYPE) {
- case 3: return true; // some
- case 5: return val; // find
- case 6: return index; // findIndex
- case 2: result.push(val); // filter
- } else if (IS_EVERY) return false; // every
- }
- }
- return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : result;
- };
-};
-
-// 22.1.3.31 Array.prototype[@@unscopables]
-var UNSCOPABLES = _wks('unscopables');
-var ArrayProto$1 = Array.prototype;
-if (ArrayProto$1[UNSCOPABLES] == undefined) _hide(ArrayProto$1, UNSCOPABLES, {});
-var _addToUnscopables = function (key) {
- ArrayProto$1[UNSCOPABLES][key] = true;
-};
-
-var _iterStep = function (done, value) {
- return { value: value, done: !!done };
-};
-
-var IteratorPrototype = {};
-
-// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()
-_hide(IteratorPrototype, _wks('iterator'), function () { return this; });
-
-var _iterCreate = function (Constructor, NAME, next) {
- Constructor.prototype = _objectCreate(IteratorPrototype, { next: _propertyDesc(1, next) });
- _setToStringTag(Constructor, NAME + ' Iterator');
-};
-
-var ITERATOR$2 = _wks('iterator');
-var BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next`
-var FF_ITERATOR = '@@iterator';
-var KEYS = 'keys';
-var VALUES = 'values';
-
-var returnThis = function () { return this; };
-
-var _iterDefine = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {
- _iterCreate(Constructor, NAME, next);
- var getMethod = function (kind) {
- if (!BUGGY && kind in proto) return proto[kind];
- switch (kind) {
- case KEYS: return function keys() { return new Constructor(this, kind); };
- case VALUES: return function values() { return new Constructor(this, kind); };
- } return function entries() { return new Constructor(this, kind); };
- };
- var TAG = NAME + ' Iterator';
- var DEF_VALUES = DEFAULT == VALUES;
- var VALUES_BUG = false;
- var proto = Base.prototype;
- var $native = proto[ITERATOR$2] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT];
- var $default = (!BUGGY && $native) || getMethod(DEFAULT);
- var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined;
- var $anyNative = NAME == 'Array' ? proto.entries || $native : $native;
- var methods, key, IteratorPrototype;
- // Fix native
- if ($anyNative) {
- IteratorPrototype = _objectGpo($anyNative.call(new Base()));
- if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) {
- // Set @@toStringTag to native iterators
- _setToStringTag(IteratorPrototype, TAG, true);
- // fix for some old engines
- if (!_library && !_has(IteratorPrototype, ITERATOR$2)) _hide(IteratorPrototype, ITERATOR$2, returnThis);
- }
- }
- // fix Array#{values, @@iterator}.name in V8 / FF
- if (DEF_VALUES && $native && $native.name !== VALUES) {
- VALUES_BUG = true;
- $default = function values() { return $native.call(this); };
- }
- // Define iterator
- if ((!_library || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR$2])) {
- _hide(proto, ITERATOR$2, $default);
- }
- // Plug for library
- _iterators[NAME] = $default;
- _iterators[TAG] = returnThis;
- if (DEFAULT) {
- methods = {
- values: DEF_VALUES ? $default : getMethod(VALUES),
- keys: IS_SET ? $default : getMethod(KEYS),
- entries: $entries
- };
- if (FORCED) for (key in methods) {
- if (!(key in proto)) _redefine(proto, key, methods[key]);
- } else _export(_export.P + _export.F * (BUGGY || VALUES_BUG), NAME, methods);
- }
- return methods;
-};
-
-// 22.1.3.4 Array.prototype.entries()
-// 22.1.3.13 Array.prototype.keys()
-// 22.1.3.29 Array.prototype.values()
-// 22.1.3.30 Array.prototype[@@iterator]()
-var es6_array_iterator = _iterDefine(Array, 'Array', function (iterated, kind) {
- this._t = _toIobject(iterated); // target
- this._i = 0; // next index
- this._k = kind; // kind
-// 22.1.5.2.1 %ArrayIteratorPrototype%.next()
-}, function () {
- var O = this._t;
- var kind = this._k;
- var index = this._i++;
- if (!O || index >= O.length) {
- this._t = undefined;
- return _iterStep(1);
- }
- if (kind == 'keys') return _iterStep(0, index);
- if (kind == 'values') return _iterStep(0, O[index]);
- return _iterStep(0, [index, O[index]]);
-}, 'values');
-
-// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)
-_iterators.Arguments = _iterators.Array;
-
-_addToUnscopables('keys');
-_addToUnscopables('values');
-_addToUnscopables('entries');
-
-var ITERATOR$3 = _wks('iterator');
-var SAFE_CLOSING = false;
-
-try {
- var riter = [7][ITERATOR$3]();
- riter['return'] = function () { SAFE_CLOSING = true; };
-} catch (e) { /* empty */ }
-
-var _iterDetect = function (exec, skipClosing) {
- if (!skipClosing && !SAFE_CLOSING) return false;
- var safe = false;
- try {
- var arr = [7];
- var iter = arr[ITERATOR$3]();
- iter.next = function () { return { done: safe = true }; };
- arr[ITERATOR$3] = function () { return iter; };
- exec(arr);
- } catch (e) { /* empty */ }
- return safe;
-};
-
-var _arrayCopyWithin = [].copyWithin || function copyWithin(target /* = 0 */, start /* = 0, end = @length */) {
- var O = _toObject(this);
- var len = _toLength(O.length);
- var to = _toAbsoluteIndex(target, len);
- var from = _toAbsoluteIndex(start, len);
- var end = arguments.length > 2 ? arguments[2] : undefined;
- var count = Math.min((end === undefined ? len : _toAbsoluteIndex(end, len)) - from, len - to);
- var inc = 1;
- if (from < to && to < from + count) {
- inc = -1;
- from += count - 1;
- to += count - 1;
- }
- while (count-- > 0) {
- if (from in O) O[to] = O[from];
- else delete O[to];
- to += inc;
- from += inc;
- } return O;
-};
-
-var f$2 = {}.propertyIsEnumerable;
-
-var _objectPie = {
- f: f$2
-};
-
-var gOPD = Object.getOwnPropertyDescriptor;
-
-var f$3 = _descriptors ? gOPD : function getOwnPropertyDescriptor(O, P) {
- O = _toIobject(O);
- P = _toPrimitive(P, true);
- if (_ie8DomDefine) try {
- return gOPD(O, P);
- } catch (e) { /* empty */ }
- if (_has(O, P)) return _propertyDesc(!_objectPie.f.call(O, P), O[P]);
-};
-
-var _objectGopd = {
- f: f$3
-};
-
-var _typedArray = createCommonjsModule(function (module) {
-if (_descriptors) {
- var LIBRARY = _library;
- var global = _global;
- var fails = _fails;
- var $export = _export;
- var $typed = _typed;
- var $buffer = _typedBuffer;
- var ctx = _ctx;
- var anInstance = _anInstance;
- var propertyDesc = _propertyDesc;
- var hide = _hide;
- var redefineAll = _redefineAll;
- var toInteger = _toInteger;
- var toLength = _toLength;
- var toIndex = _toIndex;
- var toAbsoluteIndex = _toAbsoluteIndex;
- var toPrimitive = _toPrimitive;
- var has = _has;
- var classof = _classof;
- var isObject = _isObject;
- var toObject = _toObject;
- var isArrayIter = _isArrayIter;
- var create = _objectCreate;
- var getPrototypeOf = _objectGpo;
- var gOPN = _objectGopn.f;
- var getIterFn = core_getIteratorMethod;
- var uid = _uid;
- var wks = _wks;
- var createArrayMethod = _arrayMethods;
- var createArrayIncludes = _arrayIncludes;
- var speciesConstructor = _speciesConstructor;
- var ArrayIterators = es6_array_iterator;
- var Iterators = _iterators;
- var $iterDetect = _iterDetect;
- var setSpecies = _setSpecies;
- var arrayFill = _arrayFill;
- var arrayCopyWithin = _arrayCopyWithin;
- var $DP = _objectDp;
- var $GOPD = _objectGopd;
- var dP = $DP.f;
- var gOPD = $GOPD.f;
- var RangeError = global.RangeError;
- var TypeError = global.TypeError;
- var Uint8Array = global.Uint8Array;
- var ARRAY_BUFFER = 'ArrayBuffer';
- var SHARED_BUFFER = 'Shared' + ARRAY_BUFFER;
- var BYTES_PER_ELEMENT = 'BYTES_PER_ELEMENT';
- var PROTOTYPE = 'prototype';
- var ArrayProto = Array[PROTOTYPE];
- var $ArrayBuffer = $buffer.ArrayBuffer;
- var $DataView = $buffer.DataView;
- var arrayForEach = createArrayMethod(0);
- var arrayFilter = createArrayMethod(2);
- var arraySome = createArrayMethod(3);
- var arrayEvery = createArrayMethod(4);
- var arrayFind = createArrayMethod(5);
- var arrayFindIndex = createArrayMethod(6);
- var arrayIncludes = createArrayIncludes(true);
- var arrayIndexOf = createArrayIncludes(false);
- var arrayValues = ArrayIterators.values;
- var arrayKeys = ArrayIterators.keys;
- var arrayEntries = ArrayIterators.entries;
- var arrayLastIndexOf = ArrayProto.lastIndexOf;
- var arrayReduce = ArrayProto.reduce;
- var arrayReduceRight = ArrayProto.reduceRight;
- var arrayJoin = ArrayProto.join;
- var arraySort = ArrayProto.sort;
- var arraySlice = ArrayProto.slice;
- var arrayToString = ArrayProto.toString;
- var arrayToLocaleString = ArrayProto.toLocaleString;
- var ITERATOR = wks('iterator');
- var TAG = wks('toStringTag');
- var TYPED_CONSTRUCTOR = uid('typed_constructor');
- var DEF_CONSTRUCTOR = uid('def_constructor');
- var ALL_CONSTRUCTORS = $typed.CONSTR;
- var TYPED_ARRAY = $typed.TYPED;
- var VIEW = $typed.VIEW;
- var WRONG_LENGTH = 'Wrong length!';
-
- var $map = createArrayMethod(1, function (O, length) {
- return allocate(speciesConstructor(O, O[DEF_CONSTRUCTOR]), length);
- });
-
- var LITTLE_ENDIAN = fails(function () {
- // eslint-disable-next-line no-undef
- return new Uint8Array(new Uint16Array([1]).buffer)[0] === 1;
- });
-
- var FORCED_SET = !!Uint8Array && !!Uint8Array[PROTOTYPE].set && fails(function () {
- new Uint8Array(1).set({});
- });
-
- var toOffset = function (it, BYTES) {
- var offset = toInteger(it);
- if (offset < 0 || offset % BYTES) throw RangeError('Wrong offset!');
- return offset;
- };
-
- var validate = function (it) {
- if (isObject(it) && TYPED_ARRAY in it) return it;
- throw TypeError(it + ' is not a typed array!');
- };
-
- var allocate = function (C, length) {
- if (!(isObject(C) && TYPED_CONSTRUCTOR in C)) {
- throw TypeError('It is not a typed array constructor!');
- } return new C(length);
- };
-
- var speciesFromList = function (O, list) {
- return fromList(speciesConstructor(O, O[DEF_CONSTRUCTOR]), list);
- };
-
- var fromList = function (C, list) {
- var index = 0;
- var length = list.length;
- var result = allocate(C, length);
- while (length > index) result[index] = list[index++];
- return result;
- };
-
- var addGetter = function (it, key, internal) {
- dP(it, key, { get: function () { return this._d[internal]; } });
- };
-
- var $from = function from(source /* , mapfn, thisArg */) {
- var O = toObject(source);
- var aLen = arguments.length;
- var mapfn = aLen > 1 ? arguments[1] : undefined;
- var mapping = mapfn !== undefined;
- var iterFn = getIterFn(O);
- var i, length, values, result, step, iterator;
- if (iterFn != undefined && !isArrayIter(iterFn)) {
- for (iterator = iterFn.call(O), values = [], i = 0; !(step = iterator.next()).done; i++) {
- values.push(step.value);
- } O = values;
- }
- if (mapping && aLen > 2) mapfn = ctx(mapfn, arguments[2], 2);
- for (i = 0, length = toLength(O.length), result = allocate(this, length); length > i; i++) {
- result[i] = mapping ? mapfn(O[i], i) : O[i];
- }
- return result;
- };
-
- var $of = function of(/* ...items */) {
- var index = 0;
- var length = arguments.length;
- var result = allocate(this, length);
- while (length > index) result[index] = arguments[index++];
- return result;
- };
-
- // iOS Safari 6.x fails here
- var TO_LOCALE_BUG = !!Uint8Array && fails(function () { arrayToLocaleString.call(new Uint8Array(1)); });
-
- var $toLocaleString = function toLocaleString() {
- return arrayToLocaleString.apply(TO_LOCALE_BUG ? arraySlice.call(validate(this)) : validate(this), arguments);
- };
-
- var proto = {
- copyWithin: function copyWithin(target, start /* , end */) {
- return arrayCopyWithin.call(validate(this), target, start, arguments.length > 2 ? arguments[2] : undefined);
- },
- every: function every(callbackfn /* , thisArg */) {
- return arrayEvery(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);
- },
- fill: function fill(value /* , start, end */) { // eslint-disable-line no-unused-vars
- return arrayFill.apply(validate(this), arguments);
- },
- filter: function filter(callbackfn /* , thisArg */) {
- return speciesFromList(this, arrayFilter(validate(this), callbackfn,
- arguments.length > 1 ? arguments[1] : undefined));
- },
- find: function find(predicate /* , thisArg */) {
- return arrayFind(validate(this), predicate, arguments.length > 1 ? arguments[1] : undefined);
- },
- findIndex: function findIndex(predicate /* , thisArg */) {
- return arrayFindIndex(validate(this), predicate, arguments.length > 1 ? arguments[1] : undefined);
- },
- forEach: function forEach(callbackfn /* , thisArg */) {
- arrayForEach(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);
- },
- indexOf: function indexOf(searchElement /* , fromIndex */) {
- return arrayIndexOf(validate(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);
- },
- includes: function includes(searchElement /* , fromIndex */) {
- return arrayIncludes(validate(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);
- },
- join: function join(separator) { // eslint-disable-line no-unused-vars
- return arrayJoin.apply(validate(this), arguments);
- },
- lastIndexOf: function lastIndexOf(searchElement /* , fromIndex */) { // eslint-disable-line no-unused-vars
- return arrayLastIndexOf.apply(validate(this), arguments);
- },
- map: function map(mapfn /* , thisArg */) {
- return $map(validate(this), mapfn, arguments.length > 1 ? arguments[1] : undefined);
- },
- reduce: function reduce(callbackfn /* , initialValue */) { // eslint-disable-line no-unused-vars
- return arrayReduce.apply(validate(this), arguments);
- },
- reduceRight: function reduceRight(callbackfn /* , initialValue */) { // eslint-disable-line no-unused-vars
- return arrayReduceRight.apply(validate(this), arguments);
- },
- reverse: function reverse() {
- var that = this;
- var length = validate(that).length;
- var middle = Math.floor(length / 2);
- var index = 0;
- var value;
- while (index < middle) {
- value = that[index];
- that[index++] = that[--length];
- that[length] = value;
- } return that;
- },
- some: function some(callbackfn /* , thisArg */) {
- return arraySome(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);
- },
- sort: function sort(comparefn) {
- return arraySort.call(validate(this), comparefn);
- },
- subarray: function subarray(begin, end) {
- var O = validate(this);
- var length = O.length;
- var $begin = toAbsoluteIndex(begin, length);
- return new (speciesConstructor(O, O[DEF_CONSTRUCTOR]))(
- O.buffer,
- O.byteOffset + $begin * O.BYTES_PER_ELEMENT,
- toLength((end === undefined ? length : toAbsoluteIndex(end, length)) - $begin)
- );
- }
- };
-
- var $slice = function slice(start, end) {
- return speciesFromList(this, arraySlice.call(validate(this), start, end));
- };
-
- var $set = function set(arrayLike /* , offset */) {
- validate(this);
- var offset = toOffset(arguments[1], 1);
- var length = this.length;
- var src = toObject(arrayLike);
- var len = toLength(src.length);
- var index = 0;
- if (len + offset > length) throw RangeError(WRONG_LENGTH);
- while (index < len) this[offset + index] = src[index++];
- };
-
- var $iterators = {
- entries: function entries() {
- return arrayEntries.call(validate(this));
- },
- keys: function keys() {
- return arrayKeys.call(validate(this));
- },
- values: function values() {
- return arrayValues.call(validate(this));
- }
- };
-
- var isTAIndex = function (target, key) {
- return isObject(target)
- && target[TYPED_ARRAY]
- && typeof key != 'symbol'
- && key in target
- && String(+key) == String(key);
- };
- var $getDesc = function getOwnPropertyDescriptor(target, key) {
- return isTAIndex(target, key = toPrimitive(key, true))
- ? propertyDesc(2, target[key])
- : gOPD(target, key);
- };
- var $setDesc = function defineProperty(target, key, desc) {
- if (isTAIndex(target, key = toPrimitive(key, true))
- && isObject(desc)
- && has(desc, 'value')
- && !has(desc, 'get')
- && !has(desc, 'set')
- // TODO: add validation descriptor w/o calling accessors
- && !desc.configurable
- && (!has(desc, 'writable') || desc.writable)
- && (!has(desc, 'enumerable') || desc.enumerable)
- ) {
- target[key] = desc.value;
- return target;
- } return dP(target, key, desc);
- };
-
- if (!ALL_CONSTRUCTORS) {
- $GOPD.f = $getDesc;
- $DP.f = $setDesc;
- }
-
- $export($export.S + $export.F * !ALL_CONSTRUCTORS, 'Object', {
- getOwnPropertyDescriptor: $getDesc,
- defineProperty: $setDesc
- });
-
- if (fails(function () { arrayToString.call({}); })) {
- arrayToString = arrayToLocaleString = function toString() {
- return arrayJoin.call(this);
- };
- }
-
- var $TypedArrayPrototype$ = redefineAll({}, proto);
- redefineAll($TypedArrayPrototype$, $iterators);
- hide($TypedArrayPrototype$, ITERATOR, $iterators.values);
- redefineAll($TypedArrayPrototype$, {
- slice: $slice,
- set: $set,
- constructor: function () { /* noop */ },
- toString: arrayToString,
- toLocaleString: $toLocaleString
- });
- addGetter($TypedArrayPrototype$, 'buffer', 'b');
- addGetter($TypedArrayPrototype$, 'byteOffset', 'o');
- addGetter($TypedArrayPrototype$, 'byteLength', 'l');
- addGetter($TypedArrayPrototype$, 'length', 'e');
- dP($TypedArrayPrototype$, TAG, {
- get: function () { return this[TYPED_ARRAY]; }
- });
-
- // eslint-disable-next-line max-statements
- module.exports = function (KEY, BYTES, wrapper, CLAMPED) {
- CLAMPED = !!CLAMPED;
- var NAME = KEY + (CLAMPED ? 'Clamped' : '') + 'Array';
- var GETTER = 'get' + KEY;
- var SETTER = 'set' + KEY;
- var TypedArray = global[NAME];
- var Base = TypedArray || {};
- var TAC = TypedArray && getPrototypeOf(TypedArray);
- var FORCED = !TypedArray || !$typed.ABV;
- var O = {};
- var TypedArrayPrototype = TypedArray && TypedArray[PROTOTYPE];
- var getter = function (that, index) {
- var data = that._d;
- return data.v[GETTER](index * BYTES + data.o, LITTLE_ENDIAN);
- };
- var setter = function (that, index, value) {
- var data = that._d;
- if (CLAMPED) value = (value = Math.round(value)) < 0 ? 0 : value > 0xff ? 0xff : value & 0xff;
- data.v[SETTER](index * BYTES + data.o, value, LITTLE_ENDIAN);
- };
- var addElement = function (that, index) {
- dP(that, index, {
- get: function () {
- return getter(this, index);
- },
- set: function (value) {
- return setter(this, index, value);
- },
- enumerable: true
- });
- };
- if (FORCED) {
- TypedArray = wrapper(function (that, data, $offset, $length) {
- anInstance(that, TypedArray, NAME, '_d');
- var index = 0;
- var offset = 0;
- var buffer, byteLength, length, klass;
- if (!isObject(data)) {
- length = toIndex(data);
- byteLength = length * BYTES;
- buffer = new $ArrayBuffer(byteLength);
- } else if (data instanceof $ArrayBuffer || (klass = classof(data)) == ARRAY_BUFFER || klass == SHARED_BUFFER) {
- buffer = data;
- offset = toOffset($offset, BYTES);
- var $len = data.byteLength;
- if ($length === undefined) {
- if ($len % BYTES) throw RangeError(WRONG_LENGTH);
- byteLength = $len - offset;
- if (byteLength < 0) throw RangeError(WRONG_LENGTH);
- } else {
- byteLength = toLength($length) * BYTES;
- if (byteLength + offset > $len) throw RangeError(WRONG_LENGTH);
- }
- length = byteLength / BYTES;
- } else if (TYPED_ARRAY in data) {
- return fromList(TypedArray, data);
- } else {
- return $from.call(TypedArray, data);
- }
- hide(that, '_d', {
- b: buffer,
- o: offset,
- l: byteLength,
- e: length,
- v: new $DataView(buffer)
- });
- while (index < length) addElement(that, index++);
- });
- TypedArrayPrototype = TypedArray[PROTOTYPE] = create($TypedArrayPrototype$);
- hide(TypedArrayPrototype, 'constructor', TypedArray);
- } else if (!fails(function () {
- TypedArray(1);
- }) || !fails(function () {
- new TypedArray(-1); // eslint-disable-line no-new
- }) || !$iterDetect(function (iter) {
- new TypedArray(); // eslint-disable-line no-new
- new TypedArray(null); // eslint-disable-line no-new
- new TypedArray(1.5); // eslint-disable-line no-new
- new TypedArray(iter); // eslint-disable-line no-new
- }, true)) {
- TypedArray = wrapper(function (that, data, $offset, $length) {
- anInstance(that, TypedArray, NAME);
- var klass;
- // `ws` module bug, temporarily remove validation length for Uint8Array
- // https://github.com/websockets/ws/pull/645
- if (!isObject(data)) return new Base(toIndex(data));
- if (data instanceof $ArrayBuffer || (klass = classof(data)) == ARRAY_BUFFER || klass == SHARED_BUFFER) {
- return $length !== undefined
- ? new Base(data, toOffset($offset, BYTES), $length)
- : $offset !== undefined
- ? new Base(data, toOffset($offset, BYTES))
- : new Base(data);
- }
- if (TYPED_ARRAY in data) return fromList(TypedArray, data);
- return $from.call(TypedArray, data);
- });
- arrayForEach(TAC !== Function.prototype ? gOPN(Base).concat(gOPN(TAC)) : gOPN(Base), function (key) {
- if (!(key in TypedArray)) hide(TypedArray, key, Base[key]);
- });
- TypedArray[PROTOTYPE] = TypedArrayPrototype;
- if (!LIBRARY) TypedArrayPrototype.constructor = TypedArray;
- }
- var $nativeIterator = TypedArrayPrototype[ITERATOR];
- var CORRECT_ITER_NAME = !!$nativeIterator
- && ($nativeIterator.name == 'values' || $nativeIterator.name == undefined);
- var $iterator = $iterators.values;
- hide(TypedArray, TYPED_CONSTRUCTOR, true);
- hide(TypedArrayPrototype, TYPED_ARRAY, NAME);
- hide(TypedArrayPrototype, VIEW, true);
- hide(TypedArrayPrototype, DEF_CONSTRUCTOR, TypedArray);
-
- if (CLAMPED ? new TypedArray(1)[TAG] != NAME : !(TAG in TypedArrayPrototype)) {
- dP(TypedArrayPrototype, TAG, {
- get: function () { return NAME; }
- });
- }
-
- O[NAME] = TypedArray;
-
- $export($export.G + $export.W + $export.F * (TypedArray != Base), O);
-
- $export($export.S, NAME, {
- BYTES_PER_ELEMENT: BYTES
- });
-
- $export($export.S + $export.F * fails(function () { Base.of.call(TypedArray, 1); }), NAME, {
- from: $from,
- of: $of
- });
-
- if (!(BYTES_PER_ELEMENT in TypedArrayPrototype)) hide(TypedArrayPrototype, BYTES_PER_ELEMENT, BYTES);
-
- $export($export.P, NAME, proto);
-
- setSpecies(NAME);
-
- $export($export.P + $export.F * FORCED_SET, NAME, { set: $set });
-
- $export($export.P + $export.F * !CORRECT_ITER_NAME, NAME, $iterators);
-
- if (!LIBRARY && TypedArrayPrototype.toString != arrayToString) TypedArrayPrototype.toString = arrayToString;
-
- $export($export.P + $export.F * fails(function () {
- new TypedArray(1).slice();
- }), NAME, { slice: $slice });
-
- $export($export.P + $export.F * (fails(function () {
- return [1, 2].toLocaleString() != new TypedArray([1, 2]).toLocaleString();
- }) || !fails(function () {
- TypedArrayPrototype.toLocaleString.call([1, 2]);
- })), NAME, { toLocaleString: $toLocaleString });
-
- Iterators[NAME] = CORRECT_ITER_NAME ? $nativeIterator : $iterator;
- if (!LIBRARY && !CORRECT_ITER_NAME) hide(TypedArrayPrototype, ITERATOR, $iterator);
- };
-} else module.exports = function () { /* empty */ };
-});
-
-_typedArray('Int8', 1, function (init) {
- return function Int8Array(data, byteOffset, length) {
- return init(this, data, byteOffset, length);
- };
-});
-
-_typedArray('Uint8', 1, function (init) {
- return function Uint8Array(data, byteOffset, length) {
- return init(this, data, byteOffset, length);
- };
-});
-
-_typedArray('Uint8', 1, function (init) {
- return function Uint8ClampedArray(data, byteOffset, length) {
- return init(this, data, byteOffset, length);
- };
-}, true);
-
-_typedArray('Int16', 2, function (init) {
- return function Int16Array(data, byteOffset, length) {
- return init(this, data, byteOffset, length);
- };
-});
-
-_typedArray('Uint16', 2, function (init) {
- return function Uint16Array(data, byteOffset, length) {
- return init(this, data, byteOffset, length);
- };
-});
-
-_typedArray('Int32', 4, function (init) {
- return function Int32Array(data, byteOffset, length) {
- return init(this, data, byteOffset, length);
- };
-});
-
-_typedArray('Uint32', 4, function (init) {
- return function Uint32Array(data, byteOffset, length) {
- return init(this, data, byteOffset, length);
- };
-});
-
-_typedArray('Float32', 4, function (init) {
- return function Float32Array(data, byteOffset, length) {
- return init(this, data, byteOffset, length);
- };
-});
-
-_typedArray('Float64', 8, function (init) {
- return function Float64Array(data, byteOffset, length) {
- return init(this, data, byteOffset, length);
- };
-});
-
-// call something on iterator step with safe closing on error
-
-var _iterCall = function (iterator, fn, value, entries) {
- try {
- return entries ? fn(_anObject(value)[0], value[1]) : fn(value);
- // 7.4.6 IteratorClose(iterator, completion)
- } catch (e) {
- var ret = iterator['return'];
- if (ret !== undefined) _anObject(ret.call(iterator));
- throw e;
- }
-};
-
-var _forOf = createCommonjsModule(function (module) {
-var BREAK = {};
-var RETURN = {};
-var exports = module.exports = function (iterable, entries, fn, that, ITERATOR) {
- var iterFn = ITERATOR ? function () { return iterable; } : core_getIteratorMethod(iterable);
- var f = _ctx(fn, that, entries ? 2 : 1);
- var index = 0;
- var length, step, iterator, result;
- if (typeof iterFn != 'function') throw TypeError(iterable + ' is not iterable!');
- // fast case for arrays with default iterator
- if (_isArrayIter(iterFn)) for (length = _toLength(iterable.length); length > index; index++) {
- result = entries ? f(_anObject(step = iterable[index])[0], step[1]) : f(iterable[index]);
- if (result === BREAK || result === RETURN) return result;
- } else for (iterator = iterFn.call(iterable); !(step = iterator.next()).done;) {
- result = _iterCall(iterator, f, step.value, entries);
- if (result === BREAK || result === RETURN) return result;
- }
-};
-exports.BREAK = BREAK;
-exports.RETURN = RETURN;
-});
-
-var _meta = createCommonjsModule(function (module) {
-var META = _uid('meta');
-
-
-var setDesc = _objectDp.f;
-var id = 0;
-var isExtensible = Object.isExtensible || function () {
- return true;
-};
-var FREEZE = !_fails(function () {
- return isExtensible(Object.preventExtensions({}));
-});
-var setMeta = function (it) {
- setDesc(it, META, { value: {
- i: 'O' + ++id, // object ID
- w: {} // weak collections IDs
- } });
-};
-var fastKey = function (it, create) {
- // return primitive with prefix
- if (!_isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;
- if (!_has(it, META)) {
- // can't set metadata to uncaught frozen object
- if (!isExtensible(it)) return 'F';
- // not necessary to add metadata
- if (!create) return 'E';
- // add missing metadata
- setMeta(it);
- // return object ID
- } return it[META].i;
-};
-var getWeak = function (it, create) {
- if (!_has(it, META)) {
- // can't set metadata to uncaught frozen object
- if (!isExtensible(it)) return true;
- // not necessary to add metadata
- if (!create) return false;
- // add missing metadata
- setMeta(it);
- // return hash weak collections IDs
- } return it[META].w;
-};
-// add metadata on freeze-family methods calling
-var onFreeze = function (it) {
- if (FREEZE && meta.NEED && isExtensible(it) && !_has(it, META)) setMeta(it);
- return it;
-};
-var meta = module.exports = {
- KEY: META,
- NEED: false,
- fastKey: fastKey,
- getWeak: getWeak,
- onFreeze: onFreeze
-};
-});
-var _meta_1 = _meta.KEY;
-var _meta_2 = _meta.NEED;
-var _meta_3 = _meta.fastKey;
-var _meta_4 = _meta.getWeak;
-var _meta_5 = _meta.onFreeze;
-
-var _validateCollection = function (it, TYPE) {
- if (!_isObject(it) || it._t !== TYPE) throw TypeError('Incompatible receiver, ' + TYPE + ' required!');
- return it;
-};
-
-var dP$1 = _objectDp.f;
-
-
-
-
-
-
-
-
-
-var fastKey = _meta.fastKey;
-
-var SIZE = _descriptors ? '_s' : 'size';
-
-var getEntry = function (that, key) {
- // fast case
- var index = fastKey(key);
- var entry;
- if (index !== 'F') return that._i[index];
- // frozen object case
- for (entry = that._f; entry; entry = entry.n) {
- if (entry.k == key) return entry;
- }
-};
-
-var _collectionStrong = {
- getConstructor: function (wrapper, NAME, IS_MAP, ADDER) {
- var C = wrapper(function (that, iterable) {
- _anInstance(that, C, NAME, '_i');
- that._t = NAME; // collection type
- that._i = _objectCreate(null); // index
- that._f = undefined; // first entry
- that._l = undefined; // last entry
- that[SIZE] = 0; // size
- if (iterable != undefined) _forOf(iterable, IS_MAP, that[ADDER], that);
- });
- _redefineAll(C.prototype, {
- // 23.1.3.1 Map.prototype.clear()
- // 23.2.3.2 Set.prototype.clear()
- clear: function clear() {
- for (var that = _validateCollection(this, NAME), data = that._i, entry = that._f; entry; entry = entry.n) {
- entry.r = true;
- if (entry.p) entry.p = entry.p.n = undefined;
- delete data[entry.i];
- }
- that._f = that._l = undefined;
- that[SIZE] = 0;
- },
- // 23.1.3.3 Map.prototype.delete(key)
- // 23.2.3.4 Set.prototype.delete(value)
- 'delete': function (key) {
- var that = _validateCollection(this, NAME);
- var entry = getEntry(that, key);
- if (entry) {
- var next = entry.n;
- var prev = entry.p;
- delete that._i[entry.i];
- entry.r = true;
- if (prev) prev.n = next;
- if (next) next.p = prev;
- if (that._f == entry) that._f = next;
- if (that._l == entry) that._l = prev;
- that[SIZE]--;
- } return !!entry;
- },
- // 23.2.3.6 Set.prototype.forEach(callbackfn, thisArg = undefined)
- // 23.1.3.5 Map.prototype.forEach(callbackfn, thisArg = undefined)
- forEach: function forEach(callbackfn /* , that = undefined */) {
- _validateCollection(this, NAME);
- var f = _ctx(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3);
- var entry;
- while (entry = entry ? entry.n : this._f) {
- f(entry.v, entry.k, this);
- // revert to the last existing entry
- while (entry && entry.r) entry = entry.p;
- }
- },
- // 23.1.3.7 Map.prototype.has(key)
- // 23.2.3.7 Set.prototype.has(value)
- has: function has(key) {
- return !!getEntry(_validateCollection(this, NAME), key);
- }
- });
- if (_descriptors) dP$1(C.prototype, 'size', {
- get: function () {
- return _validateCollection(this, NAME)[SIZE];
- }
- });
- return C;
- },
- def: function (that, key, value) {
- var entry = getEntry(that, key);
- var prev, index;
- // change existing entry
- if (entry) {
- entry.v = value;
- // create new entry
- } else {
- that._l = entry = {
- i: index = fastKey(key, true), // <- index
- k: key, // <- key
- v: value, // <- value
- p: prev = that._l, // <- previous entry
- n: undefined, // <- next entry
- r: false // <- removed
- };
- if (!that._f) that._f = entry;
- if (prev) prev.n = entry;
- that[SIZE]++;
- // add to index
- if (index !== 'F') that._i[index] = entry;
- } return that;
- },
- getEntry: getEntry,
- setStrong: function (C, NAME, IS_MAP) {
- // add .keys, .values, .entries, [@@iterator]
- // 23.1.3.4, 23.1.3.8, 23.1.3.11, 23.1.3.12, 23.2.3.5, 23.2.3.8, 23.2.3.10, 23.2.3.11
- _iterDefine(C, NAME, function (iterated, kind) {
- this._t = _validateCollection(iterated, NAME); // target
- this._k = kind; // kind
- this._l = undefined; // previous
- }, function () {
- var that = this;
- var kind = that._k;
- var entry = that._l;
- // revert to the last existing entry
- while (entry && entry.r) entry = entry.p;
- // get next entry
- if (!that._t || !(that._l = entry = entry ? entry.n : that._t._f)) {
- // or finish the iteration
- that._t = undefined;
- return _iterStep(1);
- }
- // return step by kind
- if (kind == 'keys') return _iterStep(0, entry.k);
- if (kind == 'values') return _iterStep(0, entry.v);
- return _iterStep(0, [entry.k, entry.v]);
- }, IS_MAP ? 'entries' : 'values', !IS_MAP, true);
-
- // add [@@species], 23.1.2.2, 23.2.2.2
- _setSpecies(NAME);
- }
-};
-
-// Works with __proto__ only. Old v8 can't work with null proto objects.
-/* eslint-disable no-proto */
-
-
-var check = function (O, proto) {
- _anObject(O);
- if (!_isObject(proto) && proto !== null) throw TypeError(proto + ": can't set as prototype!");
-};
-var _setProto = {
- set: Object.setPrototypeOf || ('__proto__' in {} ? // eslint-disable-line
- function (test, buggy, set) {
- try {
- set = _ctx(Function.call, _objectGopd.f(Object.prototype, '__proto__').set, 2);
- set(test, []);
- buggy = !(test instanceof Array);
- } catch (e) { buggy = true; }
- return function setPrototypeOf(O, proto) {
- check(O, proto);
- if (buggy) O.__proto__ = proto;
- else set(O, proto);
- return O;
- };
- }({}, false) : undefined),
- check: check
-};
-
-var setPrototypeOf = _setProto.set;
-var _inheritIfRequired = function (that, target, C) {
- var S = target.constructor;
- var P;
- if (S !== C && typeof S == 'function' && (P = S.prototype) !== C.prototype && _isObject(P) && setPrototypeOf) {
- setPrototypeOf(that, P);
- } return that;
-};
-
-var _collection = function (NAME, wrapper, methods, common, IS_MAP, IS_WEAK) {
- var Base = _global[NAME];
- var C = Base;
- var ADDER = IS_MAP ? 'set' : 'add';
- var proto = C && C.prototype;
- var O = {};
- var fixMethod = function (KEY) {
- var fn = proto[KEY];
- _redefine(proto, KEY,
- KEY == 'delete' ? function (a) {
- return IS_WEAK && !_isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);
- } : KEY == 'has' ? function has(a) {
- return IS_WEAK && !_isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);
- } : KEY == 'get' ? function get(a) {
- return IS_WEAK && !_isObject(a) ? undefined : fn.call(this, a === 0 ? 0 : a);
- } : KEY == 'add' ? function add(a) { fn.call(this, a === 0 ? 0 : a); return this; }
- : function set(a, b) { fn.call(this, a === 0 ? 0 : a, b); return this; }
- );
- };
- if (typeof C != 'function' || !(IS_WEAK || proto.forEach && !_fails(function () {
- new C().entries().next();
- }))) {
- // create collection constructor
- C = common.getConstructor(wrapper, NAME, IS_MAP, ADDER);
- _redefineAll(C.prototype, methods);
- _meta.NEED = true;
- } else {
- var instance = new C();
- // early implementations not supports chaining
- var HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) != instance;
- // V8 ~ Chromium 40- weak-collections throws on primitives, but should return false
- var THROWS_ON_PRIMITIVES = _fails(function () { instance.has(1); });
- // most early implementations doesn't supports iterables, most modern - not close it correctly
- var ACCEPT_ITERABLES = _iterDetect(function (iter) { new C(iter); }); // eslint-disable-line no-new
- // for early implementations -0 and +0 not the same
- var BUGGY_ZERO = !IS_WEAK && _fails(function () {
- // V8 ~ Chromium 42- fails only with 5+ elements
- var $instance = new C();
- var index = 5;
- while (index--) $instance[ADDER](index, index);
- return !$instance.has(-0);
- });
- if (!ACCEPT_ITERABLES) {
- C = wrapper(function (target, iterable) {
- _anInstance(target, C, NAME);
- var that = _inheritIfRequired(new Base(), target, C);
- if (iterable != undefined) _forOf(iterable, IS_MAP, that[ADDER], that);
- return that;
- });
- C.prototype = proto;
- proto.constructor = C;
- }
- if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) {
- fixMethod('delete');
- fixMethod('has');
- IS_MAP && fixMethod('get');
- }
- if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER);
- // weak collections should not contains .clear method
- if (IS_WEAK && proto.clear) delete proto.clear;
- }
-
- _setToStringTag(C, NAME);
-
- O[NAME] = C;
- _export(_export.G + _export.W + _export.F * (C != Base), O);
-
- if (!IS_WEAK) common.setStrong(C, NAME, IS_MAP);
-
- return C;
-};
-
-var MAP = 'Map';
-
-// 23.1 Map Objects
-var es6_map = _collection(MAP, function (get) {
- return function Map() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };
-}, {
- // 23.1.3.6 Map.prototype.get(key)
- get: function get(key) {
- var entry = _collectionStrong.getEntry(_validateCollection(this, MAP), key);
- return entry && entry.v;
- },
- // 23.1.3.9 Map.prototype.set(key, value)
- set: function set(key, value) {
- return _collectionStrong.def(_validateCollection(this, MAP), key === 0 ? 0 : key, value);
- }
-}, _collectionStrong, true);
-
-var SET = 'Set';
-
-// 23.2 Set Objects
-var es6_set = _collection(SET, function (get) {
- return function Set() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };
-}, {
- // 23.2.3.1 Set.prototype.add(value)
- add: function add(value) {
- return _collectionStrong.def(_validateCollection(this, SET), value = value === 0 ? 0 : value, value);
- }
-}, _collectionStrong);
-
-var f$4 = Object.getOwnPropertySymbols;
-
-var _objectGops = {
- f: f$4
-};
-
-// 19.1.2.1 Object.assign(target, source, ...)
-
-
-
-
-
-var $assign = Object.assign;
-
-// should work with symbols and should have deterministic property order (V8 bug)
-var _objectAssign = !$assign || _fails(function () {
- var A = {};
- var B = {};
- // eslint-disable-next-line no-undef
- var S = Symbol();
- var K = 'abcdefghijklmnopqrst';
- A[S] = 7;
- K.split('').forEach(function (k) { B[k] = k; });
- return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K;
-}) ? function assign(target, source) { // eslint-disable-line no-unused-vars
- var T = _toObject(target);
- var aLen = arguments.length;
- var index = 1;
- var getSymbols = _objectGops.f;
- var isEnum = _objectPie.f;
- while (aLen > index) {
- var S = _iobject(arguments[index++]);
- var keys = getSymbols ? _objectKeys(S).concat(getSymbols(S)) : _objectKeys(S);
- var length = keys.length;
- var j = 0;
- var key;
- while (length > j) if (isEnum.call(S, key = keys[j++])) T[key] = S[key];
- } return T;
-} : $assign;
-
-var getWeak = _meta.getWeak;
-
-
-
-
-
-
-
-var arrayFind = _arrayMethods(5);
-var arrayFindIndex = _arrayMethods(6);
-var id$1 = 0;
-
-// fallback for uncaught frozen keys
-var uncaughtFrozenStore = function (that) {
- return that._l || (that._l = new UncaughtFrozenStore());
-};
-var UncaughtFrozenStore = function () {
- this.a = [];
-};
-var findUncaughtFrozen = function (store, key) {
- return arrayFind(store.a, function (it) {
- return it[0] === key;
- });
-};
-UncaughtFrozenStore.prototype = {
- get: function (key) {
- var entry = findUncaughtFrozen(this, key);
- if (entry) return entry[1];
- },
- has: function (key) {
- return !!findUncaughtFrozen(this, key);
- },
- set: function (key, value) {
- var entry = findUncaughtFrozen(this, key);
- if (entry) entry[1] = value;
- else this.a.push([key, value]);
- },
- 'delete': function (key) {
- var index = arrayFindIndex(this.a, function (it) {
- return it[0] === key;
- });
- if (~index) this.a.splice(index, 1);
- return !!~index;
- }
-};
-
-var _collectionWeak = {
- getConstructor: function (wrapper, NAME, IS_MAP, ADDER) {
- var C = wrapper(function (that, iterable) {
- _anInstance(that, C, NAME, '_i');
- that._t = NAME; // collection type
- that._i = id$1++; // collection id
- that._l = undefined; // leak store for uncaught frozen objects
- if (iterable != undefined) _forOf(iterable, IS_MAP, that[ADDER], that);
- });
- _redefineAll(C.prototype, {
- // 23.3.3.2 WeakMap.prototype.delete(key)
- // 23.4.3.3 WeakSet.prototype.delete(value)
- 'delete': function (key) {
- if (!_isObject(key)) return false;
- var data = getWeak(key);
- if (data === true) return uncaughtFrozenStore(_validateCollection(this, NAME))['delete'](key);
- return data && _has(data, this._i) && delete data[this._i];
- },
- // 23.3.3.4 WeakMap.prototype.has(key)
- // 23.4.3.4 WeakSet.prototype.has(value)
- has: function has(key) {
- if (!_isObject(key)) return false;
- var data = getWeak(key);
- if (data === true) return uncaughtFrozenStore(_validateCollection(this, NAME)).has(key);
- return data && _has(data, this._i);
- }
- });
- return C;
- },
- def: function (that, key, value) {
- var data = getWeak(_anObject(key), true);
- if (data === true) uncaughtFrozenStore(that).set(key, value);
- else data[that._i] = value;
- return that;
- },
- ufstore: uncaughtFrozenStore
-};
-
-var es6_weakMap = createCommonjsModule(function (module) {
-var each = _arrayMethods(0);
-
-
-
-
-
-
-
-var WEAK_MAP = 'WeakMap';
-var getWeak = _meta.getWeak;
-var isExtensible = Object.isExtensible;
-var uncaughtFrozenStore = _collectionWeak.ufstore;
-var tmp = {};
-var InternalMap;
-
-var wrapper = function (get) {
- return function WeakMap() {
- return get(this, arguments.length > 0 ? arguments[0] : undefined);
- };
-};
-
-var methods = {
- // 23.3.3.3 WeakMap.prototype.get(key)
- get: function get(key) {
- if (_isObject(key)) {
- var data = getWeak(key);
- if (data === true) return uncaughtFrozenStore(_validateCollection(this, WEAK_MAP)).get(key);
- return data ? data[this._i] : undefined;
- }
- },
- // 23.3.3.5 WeakMap.prototype.set(key, value)
- set: function set(key, value) {
- return _collectionWeak.def(_validateCollection(this, WEAK_MAP), key, value);
- }
-};
-
-// 23.3 WeakMap Objects
-var $WeakMap = module.exports = _collection(WEAK_MAP, wrapper, methods, _collectionWeak, true, true);
-
-// IE11 WeakMap frozen keys fix
-if (_fails(function () { return new $WeakMap().set((Object.freeze || Object)(tmp), 7).get(tmp) != 7; })) {
- InternalMap = _collectionWeak.getConstructor(wrapper, WEAK_MAP);
- _objectAssign(InternalMap.prototype, methods);
- _meta.NEED = true;
- each(['delete', 'has', 'get', 'set'], function (key) {
- var proto = $WeakMap.prototype;
- var method = proto[key];
- _redefine(proto, key, function (a, b) {
- // store frozen objects on internal weakmap shim
- if (_isObject(a) && !isExtensible(a)) {
- if (!this._f) this._f = new InternalMap();
- var result = this._f[key](a, b);
- return key == 'set' ? this : result;
- // store all the rest on native weakmap
- } return method.call(this, a, b);
- });
- });
-}
-});
-
-var WEAK_SET = 'WeakSet';
-
-// 23.4 WeakSet Objects
-_collection(WEAK_SET, function (get) {
- return function WeakSet() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };
-}, {
- // 23.4.3.1 WeakSet.prototype.add(value)
- add: function add(value) {
- return _collectionWeak.def(_validateCollection(this, WEAK_SET), value, true);
- }
-}, _collectionWeak, false, true);
-
-// 26.1.1 Reflect.apply(target, thisArgument, argumentsList)
-
-
-
-var rApply = (_global.Reflect || {}).apply;
-var fApply = Function.apply;
-// MS Edge argumentsList argument is optional
-_export(_export.S + _export.F * !_fails(function () {
- rApply(function () { /* empty */ });
-}), 'Reflect', {
- apply: function apply(target, thisArgument, argumentsList) {
- var T = _aFunction(target);
- var L = _anObject(argumentsList);
- return rApply ? rApply(T, thisArgument, L) : fApply.call(T, thisArgument, L);
- }
-});
-
-// fast apply, http://jsperf.lnkit.com/fast-apply/5
-var _invoke = function (fn, args, that) {
- var un = that === undefined;
- switch (args.length) {
- case 0: return un ? fn()
- : fn.call(that);
- case 1: return un ? fn(args[0])
- : fn.call(that, args[0]);
- case 2: return un ? fn(args[0], args[1])
- : fn.call(that, args[0], args[1]);
- case 3: return un ? fn(args[0], args[1], args[2])
- : fn.call(that, args[0], args[1], args[2]);
- case 4: return un ? fn(args[0], args[1], args[2], args[3])
- : fn.call(that, args[0], args[1], args[2], args[3]);
- } return fn.apply(that, args);
-};
-
-var arraySlice = [].slice;
-var factories = {};
-
-var construct = function (F, len, args) {
- if (!(len in factories)) {
- for (var n = [], i = 0; i < len; i++) n[i] = 'a[' + i + ']';
- // eslint-disable-next-line no-new-func
- factories[len] = Function('F,a', 'return new F(' + n.join(',') + ')');
- } return factories[len](F, args);
-};
-
-var _bind = Function.bind || function bind(that /* , ...args */) {
- var fn = _aFunction(this);
- var partArgs = arraySlice.call(arguments, 1);
- var bound = function (/* args... */) {
- var args = partArgs.concat(arraySlice.call(arguments));
- return this instanceof bound ? construct(fn, args.length, args) : _invoke(fn, args, that);
- };
- if (_isObject(fn.prototype)) bound.prototype = fn.prototype;
- return bound;
-};
-
-// 26.1.2 Reflect.construct(target, argumentsList [, newTarget])
-
-
-
-
-
-
-
-var rConstruct = (_global.Reflect || {}).construct;
-
-// MS Edge supports only 2 arguments and argumentsList argument is optional
-// FF Nightly sets third argument as `new.target`, but does not create `this` from it
-var NEW_TARGET_BUG = _fails(function () {
- function F() { /* empty */ }
- return !(rConstruct(function () { /* empty */ }, [], F) instanceof F);
-});
-var ARGS_BUG = !_fails(function () {
- rConstruct(function () { /* empty */ });
-});
-
-_export(_export.S + _export.F * (NEW_TARGET_BUG || ARGS_BUG), 'Reflect', {
- construct: function construct(Target, args /* , newTarget */) {
- _aFunction(Target);
- _anObject(args);
- var newTarget = arguments.length < 3 ? Target : _aFunction(arguments[2]);
- if (ARGS_BUG && !NEW_TARGET_BUG) return rConstruct(Target, args, newTarget);
- if (Target == newTarget) {
- // w/o altered newTarget, optimization for 0-4 arguments
- switch (args.length) {
- case 0: return new Target();
- case 1: return new Target(args[0]);
- case 2: return new Target(args[0], args[1]);
- case 3: return new Target(args[0], args[1], args[2]);
- case 4: return new Target(args[0], args[1], args[2], args[3]);
- }
- // w/o altered newTarget, lot of arguments case
- var $args = [null];
- $args.push.apply($args, args);
- return new (_bind.apply(Target, $args))();
- }
- // with altered newTarget, not support built-in constructors
- var proto = newTarget.prototype;
- var instance = _objectCreate(_isObject(proto) ? proto : Object.prototype);
- var result = Function.apply.call(Target, instance, args);
- return _isObject(result) ? result : instance;
- }
-});
+ // 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)
+
+ var hiddenKeys = _enumBugKeys.concat('length', 'prototype');
+
+ var f$1 = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {
+ return _objectKeysInternal(O, hiddenKeys);
+ };
+
+ var _objectGopn = {
+ f: f$1
+ };
+
+ // 7.1.13 ToObject(argument)
+
+ var _toObject = function (it) {
+ return Object(_defined(it));
+ };
+
+ var _arrayFill = function fill(value /* , start = 0, end = @length */) {
+ var O = _toObject(this);
+ var length = _toLength(O.length);
+ var aLen = arguments.length;
+ var index = _toAbsoluteIndex(aLen > 1 ? arguments[1] : undefined, length);
+ var end = aLen > 2 ? arguments[2] : undefined;
+ var endPos = end === undefined ? length : _toAbsoluteIndex(end, length);
+ while (endPos > index) O[index++] = value;
+ return O;
+ };
+
+ var _wks = createCommonjsModule(function (module) {
+ var store = _shared('wks');
+
+ var Symbol = _global.Symbol;
+ var USE_SYMBOL = typeof Symbol == 'function';
+
+ var $exports = module.exports = function (name) {
+ return store[name] || (store[name] =
+ USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : _uid)('Symbol.' + name));
+ };
+
+ $exports.store = store;
+ });
+
+ var def = _objectDp.f;
+
+ var TAG = _wks('toStringTag');
+
+ var _setToStringTag = function (it, tag, stat) {
+ if (it && !_has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag });
+ };
+
+ var _typedBuffer = createCommonjsModule(function (module, exports) {
+
+
+
+
+
+
+
+
+
+
+
+ var gOPN = _objectGopn.f;
+ var dP = _objectDp.f;
+
+
+ var ARRAY_BUFFER = 'ArrayBuffer';
+ var DATA_VIEW = 'DataView';
+ var PROTOTYPE = 'prototype';
+ var WRONG_LENGTH = 'Wrong length!';
+ var WRONG_INDEX = 'Wrong index!';
+ var $ArrayBuffer = _global[ARRAY_BUFFER];
+ var $DataView = _global[DATA_VIEW];
+ var Math = _global.Math;
+ var RangeError = _global.RangeError;
+ // eslint-disable-next-line no-shadow-restricted-names
+ var Infinity = _global.Infinity;
+ var BaseBuffer = $ArrayBuffer;
+ var abs = Math.abs;
+ var pow = Math.pow;
+ var floor = Math.floor;
+ var log = Math.log;
+ var LN2 = Math.LN2;
+ var BUFFER = 'buffer';
+ var BYTE_LENGTH = 'byteLength';
+ var BYTE_OFFSET = 'byteOffset';
+ var $BUFFER = _descriptors ? '_b' : BUFFER;
+ var $LENGTH = _descriptors ? '_l' : BYTE_LENGTH;
+ var $OFFSET = _descriptors ? '_o' : BYTE_OFFSET;
+
+ // IEEE754 conversions based on https://github.com/feross/ieee754
+ function packIEEE754(value, mLen, nBytes) {
+ var buffer = new Array(nBytes);
+ var eLen = nBytes * 8 - mLen - 1;
+ var eMax = (1 << eLen) - 1;
+ var eBias = eMax >> 1;
+ var rt = mLen === 23 ? pow(2, -24) - pow(2, -77) : 0;
+ var i = 0;
+ var s = value < 0 || value === 0 && 1 / value < 0 ? 1 : 0;
+ var e, m, c;
+ value = abs(value);
+ // eslint-disable-next-line no-self-compare
+ if (value != value || value === Infinity) {
+ // eslint-disable-next-line no-self-compare
+ m = value != value ? 1 : 0;
+ e = eMax;
+ } else {
+ e = floor(log(value) / LN2);
+ if (value * (c = pow(2, -e)) < 1) {
+ e--;
+ c *= 2;
+ }
+ if (e + eBias >= 1) {
+ value += rt / c;
+ } else {
+ value += rt * pow(2, 1 - eBias);
+ }
+ if (value * c >= 2) {
+ e++;
+ c /= 2;
+ }
+ if (e + eBias >= eMax) {
+ m = 0;
+ e = eMax;
+ } else if (e + eBias >= 1) {
+ m = (value * c - 1) * pow(2, mLen);
+ e = e + eBias;
+ } else {
+ m = value * pow(2, eBias - 1) * pow(2, mLen);
+ e = 0;
+ }
+ }
+ for (; mLen >= 8; buffer[i++] = m & 255, m /= 256, mLen -= 8);
+ e = e << mLen | m;
+ eLen += mLen;
+ for (; eLen > 0; buffer[i++] = e & 255, e /= 256, eLen -= 8);
+ buffer[--i] |= s * 128;
+ return buffer;
+ }
+ function unpackIEEE754(buffer, mLen, nBytes) {
+ var eLen = nBytes * 8 - mLen - 1;
+ var eMax = (1 << eLen) - 1;
+ var eBias = eMax >> 1;
+ var nBits = eLen - 7;
+ var i = nBytes - 1;
+ var s = buffer[i--];
+ var e = s & 127;
+ var m;
+ s >>= 7;
+ for (; nBits > 0; e = e * 256 + buffer[i], i--, nBits -= 8);
+ m = e & (1 << -nBits) - 1;
+ e >>= -nBits;
+ nBits += mLen;
+ for (; nBits > 0; m = m * 256 + buffer[i], i--, nBits -= 8);
+ if (e === 0) {
+ e = 1 - eBias;
+ } else if (e === eMax) {
+ return m ? NaN : s ? -Infinity : Infinity;
+ } else {
+ m = m + pow(2, mLen);
+ e = e - eBias;
+ } return (s ? -1 : 1) * m * pow(2, e - mLen);
+ }
+
+ function unpackI32(bytes) {
+ return bytes[3] << 24 | bytes[2] << 16 | bytes[1] << 8 | bytes[0];
+ }
+ function packI8(it) {
+ return [it & 0xff];
+ }
+ function packI16(it) {
+ return [it & 0xff, it >> 8 & 0xff];
+ }
+ function packI32(it) {
+ return [it & 0xff, it >> 8 & 0xff, it >> 16 & 0xff, it >> 24 & 0xff];
+ }
+ function packF64(it) {
+ return packIEEE754(it, 52, 8);
+ }
+ function packF32(it) {
+ return packIEEE754(it, 23, 4);
+ }
+
+ function addGetter(C, key, internal) {
+ dP(C[PROTOTYPE], key, { get: function () { return this[internal]; } });
+ }
+
+ function get(view, bytes, index, isLittleEndian) {
+ var numIndex = +index;
+ var intIndex = _toIndex(numIndex);
+ if (intIndex + bytes > view[$LENGTH]) throw RangeError(WRONG_INDEX);
+ var store = view[$BUFFER]._b;
+ var start = intIndex + view[$OFFSET];
+ var pack = store.slice(start, start + bytes);
+ return isLittleEndian ? pack : pack.reverse();
+ }
+ function set(view, bytes, index, conversion, value, isLittleEndian) {
+ var numIndex = +index;
+ var intIndex = _toIndex(numIndex);
+ if (intIndex + bytes > view[$LENGTH]) throw RangeError(WRONG_INDEX);
+ var store = view[$BUFFER]._b;
+ var start = intIndex + view[$OFFSET];
+ var pack = conversion(+value);
+ for (var i = 0; i < bytes; i++) store[start + i] = pack[isLittleEndian ? i : bytes - i - 1];
+ }
+
+ if (!_typed.ABV) {
+ $ArrayBuffer = function ArrayBuffer(length) {
+ _anInstance(this, $ArrayBuffer, ARRAY_BUFFER);
+ var byteLength = _toIndex(length);
+ this._b = _arrayFill.call(new Array(byteLength), 0);
+ this[$LENGTH] = byteLength;
+ };
+
+ $DataView = function DataView(buffer, byteOffset, byteLength) {
+ _anInstance(this, $DataView, DATA_VIEW);
+ _anInstance(buffer, $ArrayBuffer, DATA_VIEW);
+ var bufferLength = buffer[$LENGTH];
+ var offset = _toInteger(byteOffset);
+ if (offset < 0 || offset > bufferLength) throw RangeError('Wrong offset!');
+ byteLength = byteLength === undefined ? bufferLength - offset : _toLength(byteLength);
+ if (offset + byteLength > bufferLength) throw RangeError(WRONG_LENGTH);
+ this[$BUFFER] = buffer;
+ this[$OFFSET] = offset;
+ this[$LENGTH] = byteLength;
+ };
+
+ if (_descriptors) {
+ addGetter($ArrayBuffer, BYTE_LENGTH, '_l');
+ addGetter($DataView, BUFFER, '_b');
+ addGetter($DataView, BYTE_LENGTH, '_l');
+ addGetter($DataView, BYTE_OFFSET, '_o');
+ }
+
+ _redefineAll($DataView[PROTOTYPE], {
+ getInt8: function getInt8(byteOffset) {
+ return get(this, 1, byteOffset)[0] << 24 >> 24;
+ },
+ getUint8: function getUint8(byteOffset) {
+ return get(this, 1, byteOffset)[0];
+ },
+ getInt16: function getInt16(byteOffset /* , littleEndian */) {
+ var bytes = get(this, 2, byteOffset, arguments[1]);
+ return (bytes[1] << 8 | bytes[0]) << 16 >> 16;
+ },
+ getUint16: function getUint16(byteOffset /* , littleEndian */) {
+ var bytes = get(this, 2, byteOffset, arguments[1]);
+ return bytes[1] << 8 | bytes[0];
+ },
+ getInt32: function getInt32(byteOffset /* , littleEndian */) {
+ return unpackI32(get(this, 4, byteOffset, arguments[1]));
+ },
+ getUint32: function getUint32(byteOffset /* , littleEndian */) {
+ return unpackI32(get(this, 4, byteOffset, arguments[1])) >>> 0;
+ },
+ getFloat32: function getFloat32(byteOffset /* , littleEndian */) {
+ return unpackIEEE754(get(this, 4, byteOffset, arguments[1]), 23, 4);
+ },
+ getFloat64: function getFloat64(byteOffset /* , littleEndian */) {
+ return unpackIEEE754(get(this, 8, byteOffset, arguments[1]), 52, 8);
+ },
+ setInt8: function setInt8(byteOffset, value) {
+ set(this, 1, byteOffset, packI8, value);
+ },
+ setUint8: function setUint8(byteOffset, value) {
+ set(this, 1, byteOffset, packI8, value);
+ },
+ setInt16: function setInt16(byteOffset, value /* , littleEndian */) {
+ set(this, 2, byteOffset, packI16, value, arguments[2]);
+ },
+ setUint16: function setUint16(byteOffset, value /* , littleEndian */) {
+ set(this, 2, byteOffset, packI16, value, arguments[2]);
+ },
+ setInt32: function setInt32(byteOffset, value /* , littleEndian */) {
+ set(this, 4, byteOffset, packI32, value, arguments[2]);
+ },
+ setUint32: function setUint32(byteOffset, value /* , littleEndian */) {
+ set(this, 4, byteOffset, packI32, value, arguments[2]);
+ },
+ setFloat32: function setFloat32(byteOffset, value /* , littleEndian */) {
+ set(this, 4, byteOffset, packF32, value, arguments[2]);
+ },
+ setFloat64: function setFloat64(byteOffset, value /* , littleEndian */) {
+ set(this, 8, byteOffset, packF64, value, arguments[2]);
+ }
+ });
+ } else {
+ if (!_fails(function () {
+ $ArrayBuffer(1);
+ }) || !_fails(function () {
+ new $ArrayBuffer(-1); // eslint-disable-line no-new
+ }) || _fails(function () {
+ new $ArrayBuffer(); // eslint-disable-line no-new
+ new $ArrayBuffer(1.5); // eslint-disable-line no-new
+ new $ArrayBuffer(NaN); // eslint-disable-line no-new
+ return $ArrayBuffer.name != ARRAY_BUFFER;
+ })) {
+ $ArrayBuffer = function ArrayBuffer(length) {
+ _anInstance(this, $ArrayBuffer);
+ return new BaseBuffer(_toIndex(length));
+ };
+ var ArrayBufferProto = $ArrayBuffer[PROTOTYPE] = BaseBuffer[PROTOTYPE];
+ for (var keys = gOPN(BaseBuffer), j = 0, key; keys.length > j;) {
+ if (!((key = keys[j++]) in $ArrayBuffer)) _hide($ArrayBuffer, key, BaseBuffer[key]);
+ }
+ ArrayBufferProto.constructor = $ArrayBuffer;
+ }
+ // iOS Safari 7.x bug
+ var view = new $DataView(new $ArrayBuffer(2));
+ var $setInt8 = $DataView[PROTOTYPE].setInt8;
+ view.setInt8(0, 2147483648);
+ view.setInt8(1, 2147483649);
+ if (view.getInt8(0) || !view.getInt8(1)) _redefineAll($DataView[PROTOTYPE], {
+ setInt8: function setInt8(byteOffset, value) {
+ $setInt8.call(this, byteOffset, value << 24 >> 24);
+ },
+ setUint8: function setUint8(byteOffset, value) {
+ $setInt8.call(this, byteOffset, value << 24 >> 24);
+ }
+ }, true);
+ }
+ _setToStringTag($ArrayBuffer, ARRAY_BUFFER);
+ _setToStringTag($DataView, DATA_VIEW);
+ _hide($DataView[PROTOTYPE], _typed.VIEW, true);
+ exports[ARRAY_BUFFER] = $ArrayBuffer;
+ exports[DATA_VIEW] = $DataView;
+ });
+
+ // 7.3.20 SpeciesConstructor(O, defaultConstructor)
+
+
+ var SPECIES = _wks('species');
+ var _speciesConstructor = function (O, D) {
+ var C = _anObject(O).constructor;
+ var S;
+ return C === undefined || (S = _anObject(C)[SPECIES]) == undefined ? D : _aFunction(S);
+ };
+
+ var SPECIES$1 = _wks('species');
+
+ var _setSpecies = function (KEY) {
+ var C = _global[KEY];
+ if (_descriptors && C && !C[SPECIES$1]) _objectDp.f(C, SPECIES$1, {
+ configurable: true,
+ get: function () { return this; }
+ });
+ };
+
+ var ArrayBuffer = _global.ArrayBuffer;
+
+ var $ArrayBuffer = _typedBuffer.ArrayBuffer;
+ var $DataView = _typedBuffer.DataView;
+ var $isView = _typed.ABV && ArrayBuffer.isView;
+ var $slice = $ArrayBuffer.prototype.slice;
+ var VIEW$1 = _typed.VIEW;
+ var ARRAY_BUFFER = 'ArrayBuffer';
+
+ _export(_export.G + _export.W + _export.F * (ArrayBuffer !== $ArrayBuffer), { ArrayBuffer: $ArrayBuffer });
+
+ _export(_export.S + _export.F * !_typed.CONSTR, ARRAY_BUFFER, {
+ // 24.1.3.1 ArrayBuffer.isView(arg)
+ isView: function isView(it) {
+ return $isView && $isView(it) || _isObject(it) && VIEW$1 in it;
+ }
+ });
+
+ _export(_export.P + _export.U + _export.F * _fails(function () {
+ return !new $ArrayBuffer(2).slice(1, undefined).byteLength;
+ }), ARRAY_BUFFER, {
+ // 24.1.4.3 ArrayBuffer.prototype.slice(start, end)
+ slice: function slice(start, end) {
+ if ($slice !== undefined && end === undefined) return $slice.call(_anObject(this), start); // FF fix
+ var len = _anObject(this).byteLength;
+ var first = _toAbsoluteIndex(start, len);
+ var final = _toAbsoluteIndex(end === undefined ? len : end, len);
+ var result = new (_speciesConstructor(this, $ArrayBuffer))(_toLength(final - first));
+ var viewS = new $DataView(this);
+ var viewT = new $DataView(result);
+ var index = 0;
+ while (first < final) {
+ viewT.setUint8(index++, viewS.getUint8(first++));
+ } return result;
+ }
+ });
+
+ _setSpecies(ARRAY_BUFFER);
+
+ // getting tag from 19.1.3.6 Object.prototype.toString()
+
+ var TAG$1 = _wks('toStringTag');
+ // ES3 wrong here
+ var ARG = _cof(function () { return arguments; }()) == 'Arguments';
+
+ // fallback for IE11 Script Access Denied error
+ var tryGet = function (it, key) {
+ try {
+ return it[key];
+ } catch (e) { /* empty */ }
+ };
+
+ var _classof = function (it) {
+ var O, T, B;
+ return it === undefined ? 'Undefined' : it === null ? 'Null'
+ // @@toStringTag case
+ : typeof (T = tryGet(O = Object(it), TAG$1)) == 'string' ? T
+ // builtinTag case
+ : ARG ? _cof(O)
+ // ES3 arguments fallback
+ : (B = _cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;
+ };
+
+ var _iterators = {};
+
+ // check on default Array iterator
+
+ var ITERATOR = _wks('iterator');
+ var ArrayProto = Array.prototype;
+
+ var _isArrayIter = function (it) {
+ return it !== undefined && (_iterators.Array === it || ArrayProto[ITERATOR] === it);
+ };
+
+ // 19.1.2.14 / 15.2.3.14 Object.keys(O)
+
+
+
+ var _objectKeys = Object.keys || function keys(O) {
+ return _objectKeysInternal(O, _enumBugKeys);
+ };
+
+ var _objectDps = _descriptors ? Object.defineProperties : function defineProperties(O, Properties) {
+ _anObject(O);
+ var keys = _objectKeys(Properties);
+ var length = keys.length;
+ var i = 0;
+ var P;
+ while (length > i) _objectDp.f(O, P = keys[i++], Properties[P]);
+ return O;
+ };
+
+ var document$2 = _global.document;
+ var _html = document$2 && document$2.documentElement;
+
+ // 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])
+
+
+
+ var IE_PROTO$1 = _sharedKey('IE_PROTO');
+ var Empty = function () { /* empty */ };
+ var PROTOTYPE$1 = 'prototype';
+
+ // Create object with fake `null` prototype: use iframe Object with cleared prototype
+ var createDict = function () {
+ // Thrash, waste and sodomy: IE GC bug
+ var iframe = _domCreate('iframe');
+ var i = _enumBugKeys.length;
+ var lt = '<';
+ var gt = '>';
+ var iframeDocument;
+ iframe.style.display = 'none';
+ _html.appendChild(iframe);
+ iframe.src = 'javascript:'; // eslint-disable-line no-script-url
+ // createDict = iframe.contentWindow.Object;
+ // html.removeChild(iframe);
+ iframeDocument = iframe.contentWindow.document;
+ iframeDocument.open();
+ iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);
+ iframeDocument.close();
+ createDict = iframeDocument.F;
+ while (i--) delete createDict[PROTOTYPE$1][_enumBugKeys[i]];
+ return createDict();
+ };
+
+ var _objectCreate = Object.create || function create(O, Properties) {
+ var result;
+ if (O !== null) {
+ Empty[PROTOTYPE$1] = _anObject(O);
+ result = new Empty();
+ Empty[PROTOTYPE$1] = null;
+ // add "__proto__" for Object.getPrototypeOf polyfill
+ result[IE_PROTO$1] = O;
+ } else result = createDict();
+ return Properties === undefined ? result : _objectDps(result, Properties);
+ };
+
+ // 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)
+
+
+ var IE_PROTO$2 = _sharedKey('IE_PROTO');
+ var ObjectProto = Object.prototype;
+
+ var _objectGpo = Object.getPrototypeOf || function (O) {
+ O = _toObject(O);
+ if (_has(O, IE_PROTO$2)) return O[IE_PROTO$2];
+ if (typeof O.constructor == 'function' && O instanceof O.constructor) {
+ return O.constructor.prototype;
+ } return O instanceof Object ? ObjectProto : null;
+ };
+
+ var ITERATOR$1 = _wks('iterator');
+
+ var core_getIteratorMethod = _core.getIteratorMethod = function (it) {
+ if (it != undefined) return it[ITERATOR$1]
+ || it['@@iterator']
+ || _iterators[_classof(it)];
+ };
+
+ // 7.2.2 IsArray(argument)
+
+ var _isArray = Array.isArray || function isArray(arg) {
+ return _cof(arg) == 'Array';
+ };
+
+ var SPECIES$2 = _wks('species');
+
+ var _arraySpeciesConstructor = function (original) {
+ var C;
+ if (_isArray(original)) {
+ C = original.constructor;
+ // cross-realm fallback
+ if (typeof C == 'function' && (C === Array || _isArray(C.prototype))) C = undefined;
+ if (_isObject(C)) {
+ C = C[SPECIES$2];
+ if (C === null) C = undefined;
+ }
+ } return C === undefined ? Array : C;
+ };
+
+ // 9.4.2.3 ArraySpeciesCreate(originalArray, length)
+
+
+ var _arraySpeciesCreate = function (original, length) {
+ return new (_arraySpeciesConstructor(original))(length);
+ };
+
+ // 0 -> Array#forEach
+ // 1 -> Array#map
+ // 2 -> Array#filter
+ // 3 -> Array#some
+ // 4 -> Array#every
+ // 5 -> Array#find
+ // 6 -> Array#findIndex
+
+
+
+
+
+ var _arrayMethods = function (TYPE, $create) {
+ var IS_MAP = TYPE == 1;
+ var IS_FILTER = TYPE == 2;
+ var IS_SOME = TYPE == 3;
+ var IS_EVERY = TYPE == 4;
+ var IS_FIND_INDEX = TYPE == 6;
+ var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;
+ var create = $create || _arraySpeciesCreate;
+ return function ($this, callbackfn, that) {
+ var O = _toObject($this);
+ var self = _iobject(O);
+ var f = _ctx(callbackfn, that, 3);
+ var length = _toLength(self.length);
+ var index = 0;
+ var result = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined;
+ var val, res;
+ for (;length > index; index++) if (NO_HOLES || index in self) {
+ val = self[index];
+ res = f(val, index, O);
+ if (TYPE) {
+ if (IS_MAP) result[index] = res; // map
+ else if (res) switch (TYPE) {
+ case 3: return true; // some
+ case 5: return val; // find
+ case 6: return index; // findIndex
+ case 2: result.push(val); // filter
+ } else if (IS_EVERY) return false; // every
+ }
+ }
+ return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : result;
+ };
+ };
+
+ // 22.1.3.31 Array.prototype[@@unscopables]
+ var UNSCOPABLES = _wks('unscopables');
+ var ArrayProto$1 = Array.prototype;
+ if (ArrayProto$1[UNSCOPABLES] == undefined) _hide(ArrayProto$1, UNSCOPABLES, {});
+ var _addToUnscopables = function (key) {
+ ArrayProto$1[UNSCOPABLES][key] = true;
+ };
+
+ var _iterStep = function (done, value) {
+ return { value: value, done: !!done };
+ };
+
+ var IteratorPrototype = {};
+
+ // 25.1.2.1.1 %IteratorPrototype%[@@iterator]()
+ _hide(IteratorPrototype, _wks('iterator'), function () { return this; });
+
+ var _iterCreate = function (Constructor, NAME, next) {
+ Constructor.prototype = _objectCreate(IteratorPrototype, { next: _propertyDesc(1, next) });
+ _setToStringTag(Constructor, NAME + ' Iterator');
+ };
+
+ var ITERATOR$2 = _wks('iterator');
+ var BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next`
+ var FF_ITERATOR = '@@iterator';
+ var KEYS = 'keys';
+ var VALUES = 'values';
+
+ var returnThis = function () { return this; };
+
+ var _iterDefine = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {
+ _iterCreate(Constructor, NAME, next);
+ var getMethod = function (kind) {
+ if (!BUGGY && kind in proto) return proto[kind];
+ switch (kind) {
+ case KEYS: return function keys() { return new Constructor(this, kind); };
+ case VALUES: return function values() { return new Constructor(this, kind); };
+ } return function entries() { return new Constructor(this, kind); };
+ };
+ var TAG = NAME + ' Iterator';
+ var DEF_VALUES = DEFAULT == VALUES;
+ var VALUES_BUG = false;
+ var proto = Base.prototype;
+ var $native = proto[ITERATOR$2] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT];
+ var $default = (!BUGGY && $native) || getMethod(DEFAULT);
+ var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined;
+ var $anyNative = NAME == 'Array' ? proto.entries || $native : $native;
+ var methods, key, IteratorPrototype;
+ // Fix native
+ if ($anyNative) {
+ IteratorPrototype = _objectGpo($anyNative.call(new Base()));
+ if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) {
+ // Set @@toStringTag to native iterators
+ _setToStringTag(IteratorPrototype, TAG, true);
+ // fix for some old engines
+ if (!_has(IteratorPrototype, ITERATOR$2)) _hide(IteratorPrototype, ITERATOR$2, returnThis);
+ }
+ }
+ // fix Array#{values, @@iterator}.name in V8 / FF
+ if (DEF_VALUES && $native && $native.name !== VALUES) {
+ VALUES_BUG = true;
+ $default = function values() { return $native.call(this); };
+ }
+ // Define iterator
+ if (BUGGY || VALUES_BUG || !proto[ITERATOR$2]) {
+ _hide(proto, ITERATOR$2, $default);
+ }
+ // Plug for library
+ _iterators[NAME] = $default;
+ _iterators[TAG] = returnThis;
+ if (DEFAULT) {
+ methods = {
+ values: DEF_VALUES ? $default : getMethod(VALUES),
+ keys: IS_SET ? $default : getMethod(KEYS),
+ entries: $entries
+ };
+ if (FORCED) for (key in methods) {
+ if (!(key in proto)) _redefine(proto, key, methods[key]);
+ } else _export(_export.P + _export.F * (BUGGY || VALUES_BUG), NAME, methods);
+ }
+ return methods;
+ };
+
+ // 22.1.3.4 Array.prototype.entries()
+ // 22.1.3.13 Array.prototype.keys()
+ // 22.1.3.29 Array.prototype.values()
+ // 22.1.3.30 Array.prototype[@@iterator]()
+ var es6_array_iterator = _iterDefine(Array, 'Array', function (iterated, kind) {
+ this._t = _toIobject(iterated); // target
+ this._i = 0; // next index
+ this._k = kind; // kind
+ // 22.1.5.2.1 %ArrayIteratorPrototype%.next()
+ }, function () {
+ var O = this._t;
+ var kind = this._k;
+ var index = this._i++;
+ if (!O || index >= O.length) {
+ this._t = undefined;
+ return _iterStep(1);
+ }
+ if (kind == 'keys') return _iterStep(0, index);
+ if (kind == 'values') return _iterStep(0, O[index]);
+ return _iterStep(0, [index, O[index]]);
+ }, 'values');
+
+ // argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)
+ _iterators.Arguments = _iterators.Array;
+
+ _addToUnscopables('keys');
+ _addToUnscopables('values');
+ _addToUnscopables('entries');
+
+ var ITERATOR$3 = _wks('iterator');
+ var SAFE_CLOSING = false;
+
+ try {
+ var riter = [7][ITERATOR$3]();
+ riter['return'] = function () { SAFE_CLOSING = true; };
+ } catch (e) { /* empty */ }
+
+ var _iterDetect = function (exec, skipClosing) {
+ if (!skipClosing && !SAFE_CLOSING) return false;
+ var safe = false;
+ try {
+ var arr = [7];
+ var iter = arr[ITERATOR$3]();
+ iter.next = function () { return { done: safe = true }; };
+ arr[ITERATOR$3] = function () { return iter; };
+ exec(arr);
+ } catch (e) { /* empty */ }
+ return safe;
+ };
+
+ var _arrayCopyWithin = [].copyWithin || function copyWithin(target /* = 0 */, start /* = 0, end = @length */) {
+ var O = _toObject(this);
+ var len = _toLength(O.length);
+ var to = _toAbsoluteIndex(target, len);
+ var from = _toAbsoluteIndex(start, len);
+ var end = arguments.length > 2 ? arguments[2] : undefined;
+ var count = Math.min((end === undefined ? len : _toAbsoluteIndex(end, len)) - from, len - to);
+ var inc = 1;
+ if (from < to && to < from + count) {
+ inc = -1;
+ from += count - 1;
+ to += count - 1;
+ }
+ while (count-- > 0) {
+ if (from in O) O[to] = O[from];
+ else delete O[to];
+ to += inc;
+ from += inc;
+ } return O;
+ };
+
+ var f$2 = {}.propertyIsEnumerable;
+
+ var _objectPie = {
+ f: f$2
+ };
+
+ var gOPD = Object.getOwnPropertyDescriptor;
+
+ var f$3 = _descriptors ? gOPD : function getOwnPropertyDescriptor(O, P) {
+ O = _toIobject(O);
+ P = _toPrimitive(P, true);
+ if (_ie8DomDefine) try {
+ return gOPD(O, P);
+ } catch (e) { /* empty */ }
+ if (_has(O, P)) return _propertyDesc(!_objectPie.f.call(O, P), O[P]);
+ };
+
+ var _objectGopd = {
+ f: f$3
+ };
+
+ var _typedArray = createCommonjsModule(function (module) {
+ if (_descriptors) {
+ var global = _global;
+ var fails = _fails;
+ var $export = _export;
+ var $typed = _typed;
+ var $buffer = _typedBuffer;
+ var ctx = _ctx;
+ var anInstance = _anInstance;
+ var propertyDesc = _propertyDesc;
+ var hide = _hide;
+ var redefineAll = _redefineAll;
+ var toInteger = _toInteger;
+ var toLength = _toLength;
+ var toIndex = _toIndex;
+ var toAbsoluteIndex = _toAbsoluteIndex;
+ var toPrimitive = _toPrimitive;
+ var has = _has;
+ var classof = _classof;
+ var isObject = _isObject;
+ var toObject = _toObject;
+ var isArrayIter = _isArrayIter;
+ var create = _objectCreate;
+ var getPrototypeOf = _objectGpo;
+ var gOPN = _objectGopn.f;
+ var getIterFn = core_getIteratorMethod;
+ var uid = _uid;
+ var wks = _wks;
+ var createArrayMethod = _arrayMethods;
+ var createArrayIncludes = _arrayIncludes;
+ var speciesConstructor = _speciesConstructor;
+ var ArrayIterators = es6_array_iterator;
+ var Iterators = _iterators;
+ var $iterDetect = _iterDetect;
+ var setSpecies = _setSpecies;
+ var arrayFill = _arrayFill;
+ var arrayCopyWithin = _arrayCopyWithin;
+ var $DP = _objectDp;
+ var $GOPD = _objectGopd;
+ var dP = $DP.f;
+ var gOPD = $GOPD.f;
+ var RangeError = global.RangeError;
+ var TypeError = global.TypeError;
+ var Uint8Array = global.Uint8Array;
+ var ARRAY_BUFFER = 'ArrayBuffer';
+ var SHARED_BUFFER = 'Shared' + ARRAY_BUFFER;
+ var BYTES_PER_ELEMENT = 'BYTES_PER_ELEMENT';
+ var PROTOTYPE = 'prototype';
+ var ArrayProto = Array[PROTOTYPE];
+ var $ArrayBuffer = $buffer.ArrayBuffer;
+ var $DataView = $buffer.DataView;
+ var arrayForEach = createArrayMethod(0);
+ var arrayFilter = createArrayMethod(2);
+ var arraySome = createArrayMethod(3);
+ var arrayEvery = createArrayMethod(4);
+ var arrayFind = createArrayMethod(5);
+ var arrayFindIndex = createArrayMethod(6);
+ var arrayIncludes = createArrayIncludes(true);
+ var arrayIndexOf = createArrayIncludes(false);
+ var arrayValues = ArrayIterators.values;
+ var arrayKeys = ArrayIterators.keys;
+ var arrayEntries = ArrayIterators.entries;
+ var arrayLastIndexOf = ArrayProto.lastIndexOf;
+ var arrayReduce = ArrayProto.reduce;
+ var arrayReduceRight = ArrayProto.reduceRight;
+ var arrayJoin = ArrayProto.join;
+ var arraySort = ArrayProto.sort;
+ var arraySlice = ArrayProto.slice;
+ var arrayToString = ArrayProto.toString;
+ var arrayToLocaleString = ArrayProto.toLocaleString;
+ var ITERATOR = wks('iterator');
+ var TAG = wks('toStringTag');
+ var TYPED_CONSTRUCTOR = uid('typed_constructor');
+ var DEF_CONSTRUCTOR = uid('def_constructor');
+ var ALL_CONSTRUCTORS = $typed.CONSTR;
+ var TYPED_ARRAY = $typed.TYPED;
+ var VIEW = $typed.VIEW;
+ var WRONG_LENGTH = 'Wrong length!';
+
+ var $map = createArrayMethod(1, function (O, length) {
+ return allocate(speciesConstructor(O, O[DEF_CONSTRUCTOR]), length);
+ });
+
+ var LITTLE_ENDIAN = fails(function () {
+ // eslint-disable-next-line no-undef
+ return new Uint8Array(new Uint16Array([1]).buffer)[0] === 1;
+ });
+
+ var FORCED_SET = !!Uint8Array && !!Uint8Array[PROTOTYPE].set && fails(function () {
+ new Uint8Array(1).set({});
+ });
+
+ var toOffset = function (it, BYTES) {
+ var offset = toInteger(it);
+ if (offset < 0 || offset % BYTES) throw RangeError('Wrong offset!');
+ return offset;
+ };
+
+ var validate = function (it) {
+ if (isObject(it) && TYPED_ARRAY in it) return it;
+ throw TypeError(it + ' is not a typed array!');
+ };
+
+ var allocate = function (C, length) {
+ if (!(isObject(C) && TYPED_CONSTRUCTOR in C)) {
+ throw TypeError('It is not a typed array constructor!');
+ } return new C(length);
+ };
+
+ var speciesFromList = function (O, list) {
+ return fromList(speciesConstructor(O, O[DEF_CONSTRUCTOR]), list);
+ };
+
+ var fromList = function (C, list) {
+ var index = 0;
+ var length = list.length;
+ var result = allocate(C, length);
+ while (length > index) result[index] = list[index++];
+ return result;
+ };
+
+ var addGetter = function (it, key, internal) {
+ dP(it, key, { get: function () { return this._d[internal]; } });
+ };
+
+ var $from = function from(source /* , mapfn, thisArg */) {
+ var O = toObject(source);
+ var aLen = arguments.length;
+ var mapfn = aLen > 1 ? arguments[1] : undefined;
+ var mapping = mapfn !== undefined;
+ var iterFn = getIterFn(O);
+ var i, length, values, result, step, iterator;
+ if (iterFn != undefined && !isArrayIter(iterFn)) {
+ for (iterator = iterFn.call(O), values = [], i = 0; !(step = iterator.next()).done; i++) {
+ values.push(step.value);
+ } O = values;
+ }
+ if (mapping && aLen > 2) mapfn = ctx(mapfn, arguments[2], 2);
+ for (i = 0, length = toLength(O.length), result = allocate(this, length); length > i; i++) {
+ result[i] = mapping ? mapfn(O[i], i) : O[i];
+ }
+ return result;
+ };
+
+ var $of = function of(/* ...items */) {
+ var index = 0;
+ var length = arguments.length;
+ var result = allocate(this, length);
+ while (length > index) result[index] = arguments[index++];
+ return result;
+ };
+
+ // iOS Safari 6.x fails here
+ var TO_LOCALE_BUG = !!Uint8Array && fails(function () { arrayToLocaleString.call(new Uint8Array(1)); });
+
+ var $toLocaleString = function toLocaleString() {
+ return arrayToLocaleString.apply(TO_LOCALE_BUG ? arraySlice.call(validate(this)) : validate(this), arguments);
+ };
+
+ var proto = {
+ copyWithin: function copyWithin(target, start /* , end */) {
+ return arrayCopyWithin.call(validate(this), target, start, arguments.length > 2 ? arguments[2] : undefined);
+ },
+ every: function every(callbackfn /* , thisArg */) {
+ return arrayEvery(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);
+ },
+ fill: function fill(value /* , start, end */) { // eslint-disable-line no-unused-vars
+ return arrayFill.apply(validate(this), arguments);
+ },
+ filter: function filter(callbackfn /* , thisArg */) {
+ return speciesFromList(this, arrayFilter(validate(this), callbackfn,
+ arguments.length > 1 ? arguments[1] : undefined));
+ },
+ find: function find(predicate /* , thisArg */) {
+ return arrayFind(validate(this), predicate, arguments.length > 1 ? arguments[1] : undefined);
+ },
+ findIndex: function findIndex(predicate /* , thisArg */) {
+ return arrayFindIndex(validate(this), predicate, arguments.length > 1 ? arguments[1] : undefined);
+ },
+ forEach: function forEach(callbackfn /* , thisArg */) {
+ arrayForEach(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);
+ },
+ indexOf: function indexOf(searchElement /* , fromIndex */) {
+ return arrayIndexOf(validate(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);
+ },
+ includes: function includes(searchElement /* , fromIndex */) {
+ return arrayIncludes(validate(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);
+ },
+ join: function join(separator) { // eslint-disable-line no-unused-vars
+ return arrayJoin.apply(validate(this), arguments);
+ },
+ lastIndexOf: function lastIndexOf(searchElement /* , fromIndex */) { // eslint-disable-line no-unused-vars
+ return arrayLastIndexOf.apply(validate(this), arguments);
+ },
+ map: function map(mapfn /* , thisArg */) {
+ return $map(validate(this), mapfn, arguments.length > 1 ? arguments[1] : undefined);
+ },
+ reduce: function reduce(callbackfn /* , initialValue */) { // eslint-disable-line no-unused-vars
+ return arrayReduce.apply(validate(this), arguments);
+ },
+ reduceRight: function reduceRight(callbackfn /* , initialValue */) { // eslint-disable-line no-unused-vars
+ return arrayReduceRight.apply(validate(this), arguments);
+ },
+ reverse: function reverse() {
+ var that = this;
+ var length = validate(that).length;
+ var middle = Math.floor(length / 2);
+ var index = 0;
+ var value;
+ while (index < middle) {
+ value = that[index];
+ that[index++] = that[--length];
+ that[length] = value;
+ } return that;
+ },
+ some: function some(callbackfn /* , thisArg */) {
+ return arraySome(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);
+ },
+ sort: function sort(comparefn) {
+ return arraySort.call(validate(this), comparefn);
+ },
+ subarray: function subarray(begin, end) {
+ var O = validate(this);
+ var length = O.length;
+ var $begin = toAbsoluteIndex(begin, length);
+ return new (speciesConstructor(O, O[DEF_CONSTRUCTOR]))(
+ O.buffer,
+ O.byteOffset + $begin * O.BYTES_PER_ELEMENT,
+ toLength((end === undefined ? length : toAbsoluteIndex(end, length)) - $begin)
+ );
+ }
+ };
+
+ var $slice = function slice(start, end) {
+ return speciesFromList(this, arraySlice.call(validate(this), start, end));
+ };
+
+ var $set = function set(arrayLike /* , offset */) {
+ validate(this);
+ var offset = toOffset(arguments[1], 1);
+ var length = this.length;
+ var src = toObject(arrayLike);
+ var len = toLength(src.length);
+ var index = 0;
+ if (len + offset > length) throw RangeError(WRONG_LENGTH);
+ while (index < len) this[offset + index] = src[index++];
+ };
+
+ var $iterators = {
+ entries: function entries() {
+ return arrayEntries.call(validate(this));
+ },
+ keys: function keys() {
+ return arrayKeys.call(validate(this));
+ },
+ values: function values() {
+ return arrayValues.call(validate(this));
+ }
+ };
+
+ var isTAIndex = function (target, key) {
+ return isObject(target)
+ && target[TYPED_ARRAY]
+ && typeof key != 'symbol'
+ && key in target
+ && String(+key) == String(key);
+ };
+ var $getDesc = function getOwnPropertyDescriptor(target, key) {
+ return isTAIndex(target, key = toPrimitive(key, true))
+ ? propertyDesc(2, target[key])
+ : gOPD(target, key);
+ };
+ var $setDesc = function defineProperty(target, key, desc) {
+ if (isTAIndex(target, key = toPrimitive(key, true))
+ && isObject(desc)
+ && has(desc, 'value')
+ && !has(desc, 'get')
+ && !has(desc, 'set')
+ // TODO: add validation descriptor w/o calling accessors
+ && !desc.configurable
+ && (!has(desc, 'writable') || desc.writable)
+ && (!has(desc, 'enumerable') || desc.enumerable)
+ ) {
+ target[key] = desc.value;
+ return target;
+ } return dP(target, key, desc);
+ };
+
+ if (!ALL_CONSTRUCTORS) {
+ $GOPD.f = $getDesc;
+ $DP.f = $setDesc;
+ }
+
+ $export($export.S + $export.F * !ALL_CONSTRUCTORS, 'Object', {
+ getOwnPropertyDescriptor: $getDesc,
+ defineProperty: $setDesc
+ });
+
+ if (fails(function () { arrayToString.call({}); })) {
+ arrayToString = arrayToLocaleString = function toString() {
+ return arrayJoin.call(this);
+ };
+ }
+
+ var $TypedArrayPrototype$ = redefineAll({}, proto);
+ redefineAll($TypedArrayPrototype$, $iterators);
+ hide($TypedArrayPrototype$, ITERATOR, $iterators.values);
+ redefineAll($TypedArrayPrototype$, {
+ slice: $slice,
+ set: $set,
+ constructor: function () { /* noop */ },
+ toString: arrayToString,
+ toLocaleString: $toLocaleString
+ });
+ addGetter($TypedArrayPrototype$, 'buffer', 'b');
+ addGetter($TypedArrayPrototype$, 'byteOffset', 'o');
+ addGetter($TypedArrayPrototype$, 'byteLength', 'l');
+ addGetter($TypedArrayPrototype$, 'length', 'e');
+ dP($TypedArrayPrototype$, TAG, {
+ get: function () { return this[TYPED_ARRAY]; }
+ });
+
+ // eslint-disable-next-line max-statements
+ module.exports = function (KEY, BYTES, wrapper, CLAMPED) {
+ CLAMPED = !!CLAMPED;
+ var NAME = KEY + (CLAMPED ? 'Clamped' : '') + 'Array';
+ var GETTER = 'get' + KEY;
+ var SETTER = 'set' + KEY;
+ var TypedArray = global[NAME];
+ var Base = TypedArray || {};
+ var TAC = TypedArray && getPrototypeOf(TypedArray);
+ var FORCED = !TypedArray || !$typed.ABV;
+ var O = {};
+ var TypedArrayPrototype = TypedArray && TypedArray[PROTOTYPE];
+ var getter = function (that, index) {
+ var data = that._d;
+ return data.v[GETTER](index * BYTES + data.o, LITTLE_ENDIAN);
+ };
+ var setter = function (that, index, value) {
+ var data = that._d;
+ if (CLAMPED) value = (value = Math.round(value)) < 0 ? 0 : value > 0xff ? 0xff : value & 0xff;
+ data.v[SETTER](index * BYTES + data.o, value, LITTLE_ENDIAN);
+ };
+ var addElement = function (that, index) {
+ dP(that, index, {
+ get: function () {
+ return getter(this, index);
+ },
+ set: function (value) {
+ return setter(this, index, value);
+ },
+ enumerable: true
+ });
+ };
+ if (FORCED) {
+ TypedArray = wrapper(function (that, data, $offset, $length) {
+ anInstance(that, TypedArray, NAME, '_d');
+ var index = 0;
+ var offset = 0;
+ var buffer, byteLength, length, klass;
+ if (!isObject(data)) {
+ length = toIndex(data);
+ byteLength = length * BYTES;
+ buffer = new $ArrayBuffer(byteLength);
+ } else if (data instanceof $ArrayBuffer || (klass = classof(data)) == ARRAY_BUFFER || klass == SHARED_BUFFER) {
+ buffer = data;
+ offset = toOffset($offset, BYTES);
+ var $len = data.byteLength;
+ if ($length === undefined) {
+ if ($len % BYTES) throw RangeError(WRONG_LENGTH);
+ byteLength = $len - offset;
+ if (byteLength < 0) throw RangeError(WRONG_LENGTH);
+ } else {
+ byteLength = toLength($length) * BYTES;
+ if (byteLength + offset > $len) throw RangeError(WRONG_LENGTH);
+ }
+ length = byteLength / BYTES;
+ } else if (TYPED_ARRAY in data) {
+ return fromList(TypedArray, data);
+ } else {
+ return $from.call(TypedArray, data);
+ }
+ hide(that, '_d', {
+ b: buffer,
+ o: offset,
+ l: byteLength,
+ e: length,
+ v: new $DataView(buffer)
+ });
+ while (index < length) addElement(that, index++);
+ });
+ TypedArrayPrototype = TypedArray[PROTOTYPE] = create($TypedArrayPrototype$);
+ hide(TypedArrayPrototype, 'constructor', TypedArray);
+ } else if (!fails(function () {
+ TypedArray(1);
+ }) || !fails(function () {
+ new TypedArray(-1); // eslint-disable-line no-new
+ }) || !$iterDetect(function (iter) {
+ new TypedArray(); // eslint-disable-line no-new
+ new TypedArray(null); // eslint-disable-line no-new
+ new TypedArray(1.5); // eslint-disable-line no-new
+ new TypedArray(iter); // eslint-disable-line no-new
+ }, true)) {
+ TypedArray = wrapper(function (that, data, $offset, $length) {
+ anInstance(that, TypedArray, NAME);
+ var klass;
+ // `ws` module bug, temporarily remove validation length for Uint8Array
+ // https://github.com/websockets/ws/pull/645
+ if (!isObject(data)) return new Base(toIndex(data));
+ if (data instanceof $ArrayBuffer || (klass = classof(data)) == ARRAY_BUFFER || klass == SHARED_BUFFER) {
+ return $length !== undefined
+ ? new Base(data, toOffset($offset, BYTES), $length)
+ : $offset !== undefined
+ ? new Base(data, toOffset($offset, BYTES))
+ : new Base(data);
+ }
+ if (TYPED_ARRAY in data) return fromList(TypedArray, data);
+ return $from.call(TypedArray, data);
+ });
+ arrayForEach(TAC !== Function.prototype ? gOPN(Base).concat(gOPN(TAC)) : gOPN(Base), function (key) {
+ if (!(key in TypedArray)) hide(TypedArray, key, Base[key]);
+ });
+ TypedArray[PROTOTYPE] = TypedArrayPrototype;
+ TypedArrayPrototype.constructor = TypedArray;
+ }
+ var $nativeIterator = TypedArrayPrototype[ITERATOR];
+ var CORRECT_ITER_NAME = !!$nativeIterator
+ && ($nativeIterator.name == 'values' || $nativeIterator.name == undefined);
+ var $iterator = $iterators.values;
+ hide(TypedArray, TYPED_CONSTRUCTOR, true);
+ hide(TypedArrayPrototype, TYPED_ARRAY, NAME);
+ hide(TypedArrayPrototype, VIEW, true);
+ hide(TypedArrayPrototype, DEF_CONSTRUCTOR, TypedArray);
+
+ if (CLAMPED ? new TypedArray(1)[TAG] != NAME : !(TAG in TypedArrayPrototype)) {
+ dP(TypedArrayPrototype, TAG, {
+ get: function () { return NAME; }
+ });
+ }
+
+ O[NAME] = TypedArray;
+
+ $export($export.G + $export.W + $export.F * (TypedArray != Base), O);
+
+ $export($export.S, NAME, {
+ BYTES_PER_ELEMENT: BYTES
+ });
+
+ $export($export.S + $export.F * fails(function () { Base.of.call(TypedArray, 1); }), NAME, {
+ from: $from,
+ of: $of
+ });
+
+ if (!(BYTES_PER_ELEMENT in TypedArrayPrototype)) hide(TypedArrayPrototype, BYTES_PER_ELEMENT, BYTES);
+
+ $export($export.P, NAME, proto);
+
+ setSpecies(NAME);
+
+ $export($export.P + $export.F * FORCED_SET, NAME, { set: $set });
+
+ $export($export.P + $export.F * !CORRECT_ITER_NAME, NAME, $iterators);
+
+ if (TypedArrayPrototype.toString != arrayToString) TypedArrayPrototype.toString = arrayToString;
+
+ $export($export.P + $export.F * fails(function () {
+ new TypedArray(1).slice();
+ }), NAME, { slice: $slice });
+
+ $export($export.P + $export.F * (fails(function () {
+ return [1, 2].toLocaleString() != new TypedArray([1, 2]).toLocaleString();
+ }) || !fails(function () {
+ TypedArrayPrototype.toLocaleString.call([1, 2]);
+ })), NAME, { toLocaleString: $toLocaleString });
+
+ Iterators[NAME] = CORRECT_ITER_NAME ? $nativeIterator : $iterator;
+ if (!CORRECT_ITER_NAME) hide(TypedArrayPrototype, ITERATOR, $iterator);
+ };
+ } else module.exports = function () { /* empty */ };
+ });
+
+ _typedArray('Int8', 1, function (init) {
+ return function Int8Array(data, byteOffset, length) {
+ return init(this, data, byteOffset, length);
+ };
+ });
+
+ _typedArray('Uint8', 1, function (init) {
+ return function Uint8Array(data, byteOffset, length) {
+ return init(this, data, byteOffset, length);
+ };
+ });
+
+ _typedArray('Uint8', 1, function (init) {
+ return function Uint8ClampedArray(data, byteOffset, length) {
+ return init(this, data, byteOffset, length);
+ };
+ }, true);
+
+ _typedArray('Int16', 2, function (init) {
+ return function Int16Array(data, byteOffset, length) {
+ return init(this, data, byteOffset, length);
+ };
+ });
+
+ _typedArray('Uint16', 2, function (init) {
+ return function Uint16Array(data, byteOffset, length) {
+ return init(this, data, byteOffset, length);
+ };
+ });
+
+ _typedArray('Int32', 4, function (init) {
+ return function Int32Array(data, byteOffset, length) {
+ return init(this, data, byteOffset, length);
+ };
+ });
+
+ _typedArray('Uint32', 4, function (init) {
+ return function Uint32Array(data, byteOffset, length) {
+ return init(this, data, byteOffset, length);
+ };
+ });
+
+ _typedArray('Float32', 4, function (init) {
+ return function Float32Array(data, byteOffset, length) {
+ return init(this, data, byteOffset, length);
+ };
+ });
+
+ _typedArray('Float64', 8, function (init) {
+ return function Float64Array(data, byteOffset, length) {
+ return init(this, data, byteOffset, length);
+ };
+ });
+
+ // call something on iterator step with safe closing on error
+
+ var _iterCall = function (iterator, fn, value, entries) {
+ try {
+ return entries ? fn(_anObject(value)[0], value[1]) : fn(value);
+ // 7.4.6 IteratorClose(iterator, completion)
+ } catch (e) {
+ var ret = iterator['return'];
+ if (ret !== undefined) _anObject(ret.call(iterator));
+ throw e;
+ }
+ };
+
+ var _forOf = createCommonjsModule(function (module) {
+ var BREAK = {};
+ var RETURN = {};
+ var exports = module.exports = function (iterable, entries, fn, that, ITERATOR) {
+ var iterFn = ITERATOR ? function () { return iterable; } : core_getIteratorMethod(iterable);
+ var f = _ctx(fn, that, entries ? 2 : 1);
+ var index = 0;
+ var length, step, iterator, result;
+ if (typeof iterFn != 'function') throw TypeError(iterable + ' is not iterable!');
+ // fast case for arrays with default iterator
+ if (_isArrayIter(iterFn)) for (length = _toLength(iterable.length); length > index; index++) {
+ result = entries ? f(_anObject(step = iterable[index])[0], step[1]) : f(iterable[index]);
+ if (result === BREAK || result === RETURN) return result;
+ } else for (iterator = iterFn.call(iterable); !(step = iterator.next()).done;) {
+ result = _iterCall(iterator, f, step.value, entries);
+ if (result === BREAK || result === RETURN) return result;
+ }
+ };
+ exports.BREAK = BREAK;
+ exports.RETURN = RETURN;
+ });
+
+ var _meta = createCommonjsModule(function (module) {
+ var META = _uid('meta');
+
+
+ var setDesc = _objectDp.f;
+ var id = 0;
+ var isExtensible = Object.isExtensible || function () {
+ return true;
+ };
+ var FREEZE = !_fails(function () {
+ return isExtensible(Object.preventExtensions({}));
+ });
+ var setMeta = function (it) {
+ setDesc(it, META, { value: {
+ i: 'O' + ++id, // object ID
+ w: {} // weak collections IDs
+ } });
+ };
+ var fastKey = function (it, create) {
+ // return primitive with prefix
+ if (!_isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;
+ if (!_has(it, META)) {
+ // can't set metadata to uncaught frozen object
+ if (!isExtensible(it)) return 'F';
+ // not necessary to add metadata
+ if (!create) return 'E';
+ // add missing metadata
+ setMeta(it);
+ // return object ID
+ } return it[META].i;
+ };
+ var getWeak = function (it, create) {
+ if (!_has(it, META)) {
+ // can't set metadata to uncaught frozen object
+ if (!isExtensible(it)) return true;
+ // not necessary to add metadata
+ if (!create) return false;
+ // add missing metadata
+ setMeta(it);
+ // return hash weak collections IDs
+ } return it[META].w;
+ };
+ // add metadata on freeze-family methods calling
+ var onFreeze = function (it) {
+ if (FREEZE && meta.NEED && isExtensible(it) && !_has(it, META)) setMeta(it);
+ return it;
+ };
+ var meta = module.exports = {
+ KEY: META,
+ NEED: false,
+ fastKey: fastKey,
+ getWeak: getWeak,
+ onFreeze: onFreeze
+ };
+ });
+ var _meta_1 = _meta.KEY;
+ var _meta_2 = _meta.NEED;
+ var _meta_3 = _meta.fastKey;
+ var _meta_4 = _meta.getWeak;
+ var _meta_5 = _meta.onFreeze;
+
+ var _validateCollection = function (it, TYPE) {
+ if (!_isObject(it) || it._t !== TYPE) throw TypeError('Incompatible receiver, ' + TYPE + ' required!');
+ return it;
+ };
+
+ var dP$1 = _objectDp.f;
+
+
+
+
+
+
+
+
+
+ var fastKey = _meta.fastKey;
+
+ var SIZE = _descriptors ? '_s' : 'size';
+
+ var getEntry = function (that, key) {
+ // fast case
+ var index = fastKey(key);
+ var entry;
+ if (index !== 'F') return that._i[index];
+ // frozen object case
+ for (entry = that._f; entry; entry = entry.n) {
+ if (entry.k == key) return entry;
+ }
+ };
+
+ var _collectionStrong = {
+ getConstructor: function (wrapper, NAME, IS_MAP, ADDER) {
+ var C = wrapper(function (that, iterable) {
+ _anInstance(that, C, NAME, '_i');
+ that._t = NAME; // collection type
+ that._i = _objectCreate(null); // index
+ that._f = undefined; // first entry
+ that._l = undefined; // last entry
+ that[SIZE] = 0; // size
+ if (iterable != undefined) _forOf(iterable, IS_MAP, that[ADDER], that);
+ });
+ _redefineAll(C.prototype, {
+ // 23.1.3.1 Map.prototype.clear()
+ // 23.2.3.2 Set.prototype.clear()
+ clear: function clear() {
+ for (var that = _validateCollection(this, NAME), data = that._i, entry = that._f; entry; entry = entry.n) {
+ entry.r = true;
+ if (entry.p) entry.p = entry.p.n = undefined;
+ delete data[entry.i];
+ }
+ that._f = that._l = undefined;
+ that[SIZE] = 0;
+ },
+ // 23.1.3.3 Map.prototype.delete(key)
+ // 23.2.3.4 Set.prototype.delete(value)
+ 'delete': function (key) {
+ var that = _validateCollection(this, NAME);
+ var entry = getEntry(that, key);
+ if (entry) {
+ var next = entry.n;
+ var prev = entry.p;
+ delete that._i[entry.i];
+ entry.r = true;
+ if (prev) prev.n = next;
+ if (next) next.p = prev;
+ if (that._f == entry) that._f = next;
+ if (that._l == entry) that._l = prev;
+ that[SIZE]--;
+ } return !!entry;
+ },
+ // 23.2.3.6 Set.prototype.forEach(callbackfn, thisArg = undefined)
+ // 23.1.3.5 Map.prototype.forEach(callbackfn, thisArg = undefined)
+ forEach: function forEach(callbackfn /* , that = undefined */) {
+ _validateCollection(this, NAME);
+ var f = _ctx(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3);
+ var entry;
+ while (entry = entry ? entry.n : this._f) {
+ f(entry.v, entry.k, this);
+ // revert to the last existing entry
+ while (entry && entry.r) entry = entry.p;
+ }
+ },
+ // 23.1.3.7 Map.prototype.has(key)
+ // 23.2.3.7 Set.prototype.has(value)
+ has: function has(key) {
+ return !!getEntry(_validateCollection(this, NAME), key);
+ }
+ });
+ if (_descriptors) dP$1(C.prototype, 'size', {
+ get: function () {
+ return _validateCollection(this, NAME)[SIZE];
+ }
+ });
+ return C;
+ },
+ def: function (that, key, value) {
+ var entry = getEntry(that, key);
+ var prev, index;
+ // change existing entry
+ if (entry) {
+ entry.v = value;
+ // create new entry
+ } else {
+ that._l = entry = {
+ i: index = fastKey(key, true), // <- index
+ k: key, // <- key
+ v: value, // <- value
+ p: prev = that._l, // <- previous entry
+ n: undefined, // <- next entry
+ r: false // <- removed
+ };
+ if (!that._f) that._f = entry;
+ if (prev) prev.n = entry;
+ that[SIZE]++;
+ // add to index
+ if (index !== 'F') that._i[index] = entry;
+ } return that;
+ },
+ getEntry: getEntry,
+ setStrong: function (C, NAME, IS_MAP) {
+ // add .keys, .values, .entries, [@@iterator]
+ // 23.1.3.4, 23.1.3.8, 23.1.3.11, 23.1.3.12, 23.2.3.5, 23.2.3.8, 23.2.3.10, 23.2.3.11
+ _iterDefine(C, NAME, function (iterated, kind) {
+ this._t = _validateCollection(iterated, NAME); // target
+ this._k = kind; // kind
+ this._l = undefined; // previous
+ }, function () {
+ var that = this;
+ var kind = that._k;
+ var entry = that._l;
+ // revert to the last existing entry
+ while (entry && entry.r) entry = entry.p;
+ // get next entry
+ if (!that._t || !(that._l = entry = entry ? entry.n : that._t._f)) {
+ // or finish the iteration
+ that._t = undefined;
+ return _iterStep(1);
+ }
+ // return step by kind
+ if (kind == 'keys') return _iterStep(0, entry.k);
+ if (kind == 'values') return _iterStep(0, entry.v);
+ return _iterStep(0, [entry.k, entry.v]);
+ }, IS_MAP ? 'entries' : 'values', !IS_MAP, true);
+
+ // add [@@species], 23.1.2.2, 23.2.2.2
+ _setSpecies(NAME);
+ }
+ };
+
+ // Works with __proto__ only. Old v8 can't work with null proto objects.
+ /* eslint-disable no-proto */
+
+
+ var check = function (O, proto) {
+ _anObject(O);
+ if (!_isObject(proto) && proto !== null) throw TypeError(proto + ": can't set as prototype!");
+ };
+ var _setProto = {
+ set: Object.setPrototypeOf || ('__proto__' in {} ? // eslint-disable-line
+ function (test, buggy, set) {
+ try {
+ set = _ctx(Function.call, _objectGopd.f(Object.prototype, '__proto__').set, 2);
+ set(test, []);
+ buggy = !(test instanceof Array);
+ } catch (e) { buggy = true; }
+ return function setPrototypeOf(O, proto) {
+ check(O, proto);
+ if (buggy) O.__proto__ = proto;
+ else set(O, proto);
+ return O;
+ };
+ }({}, false) : undefined),
+ check: check
+ };
+
+ var setPrototypeOf = _setProto.set;
+ var _inheritIfRequired = function (that, target, C) {
+ var S = target.constructor;
+ var P;
+ if (S !== C && typeof S == 'function' && (P = S.prototype) !== C.prototype && _isObject(P) && setPrototypeOf) {
+ setPrototypeOf(that, P);
+ } return that;
+ };
+
+ var _collection = function (NAME, wrapper, methods, common, IS_MAP, IS_WEAK) {
+ var Base = _global[NAME];
+ var C = Base;
+ var ADDER = IS_MAP ? 'set' : 'add';
+ var proto = C && C.prototype;
+ var O = {};
+ var fixMethod = function (KEY) {
+ var fn = proto[KEY];
+ _redefine(proto, KEY,
+ KEY == 'delete' ? function (a) {
+ return IS_WEAK && !_isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);
+ } : KEY == 'has' ? function has(a) {
+ return IS_WEAK && !_isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);
+ } : KEY == 'get' ? function get(a) {
+ return IS_WEAK && !_isObject(a) ? undefined : fn.call(this, a === 0 ? 0 : a);
+ } : KEY == 'add' ? function add(a) { fn.call(this, a === 0 ? 0 : a); return this; }
+ : function set(a, b) { fn.call(this, a === 0 ? 0 : a, b); return this; }
+ );
+ };
+ if (typeof C != 'function' || !(IS_WEAK || proto.forEach && !_fails(function () {
+ new C().entries().next();
+ }))) {
+ // create collection constructor
+ C = common.getConstructor(wrapper, NAME, IS_MAP, ADDER);
+ _redefineAll(C.prototype, methods);
+ _meta.NEED = true;
+ } else {
+ var instance = new C();
+ // early implementations not supports chaining
+ var HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) != instance;
+ // V8 ~ Chromium 40- weak-collections throws on primitives, but should return false
+ var THROWS_ON_PRIMITIVES = _fails(function () { instance.has(1); });
+ // most early implementations doesn't supports iterables, most modern - not close it correctly
+ var ACCEPT_ITERABLES = _iterDetect(function (iter) { new C(iter); }); // eslint-disable-line no-new
+ // for early implementations -0 and +0 not the same
+ var BUGGY_ZERO = !IS_WEAK && _fails(function () {
+ // V8 ~ Chromium 42- fails only with 5+ elements
+ var $instance = new C();
+ var index = 5;
+ while (index--) $instance[ADDER](index, index);
+ return !$instance.has(-0);
+ });
+ if (!ACCEPT_ITERABLES) {
+ C = wrapper(function (target, iterable) {
+ _anInstance(target, C, NAME);
+ var that = _inheritIfRequired(new Base(), target, C);
+ if (iterable != undefined) _forOf(iterable, IS_MAP, that[ADDER], that);
+ return that;
+ });
+ C.prototype = proto;
+ proto.constructor = C;
+ }
+ if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) {
+ fixMethod('delete');
+ fixMethod('has');
+ IS_MAP && fixMethod('get');
+ }
+ if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER);
+ // weak collections should not contains .clear method
+ if (IS_WEAK && proto.clear) delete proto.clear;
+ }
+
+ _setToStringTag(C, NAME);
+
+ O[NAME] = C;
+ _export(_export.G + _export.W + _export.F * (C != Base), O);
+
+ if (!IS_WEAK) common.setStrong(C, NAME, IS_MAP);
+
+ return C;
+ };
+
+ var MAP = 'Map';
+
+ // 23.1 Map Objects
+ var es6_map = _collection(MAP, function (get) {
+ return function Map() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };
+ }, {
+ // 23.1.3.6 Map.prototype.get(key)
+ get: function get(key) {
+ var entry = _collectionStrong.getEntry(_validateCollection(this, MAP), key);
+ return entry && entry.v;
+ },
+ // 23.1.3.9 Map.prototype.set(key, value)
+ set: function set(key, value) {
+ return _collectionStrong.def(_validateCollection(this, MAP), key === 0 ? 0 : key, value);
+ }
+ }, _collectionStrong, true);
+
+ var SET = 'Set';
+
+ // 23.2 Set Objects
+ var es6_set = _collection(SET, function (get) {
+ return function Set() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };
+ }, {
+ // 23.2.3.1 Set.prototype.add(value)
+ add: function add(value) {
+ return _collectionStrong.def(_validateCollection(this, SET), value = value === 0 ? 0 : value, value);
+ }
+ }, _collectionStrong);
+
+ var f$4 = Object.getOwnPropertySymbols;
+
+ var _objectGops = {
+ f: f$4
+ };
+
+ // 19.1.2.1 Object.assign(target, source, ...)
+
+
+
+
+
+ var $assign = Object.assign;
+
+ // should work with symbols and should have deterministic property order (V8 bug)
+ var _objectAssign = !$assign || _fails(function () {
+ var A = {};
+ var B = {};
+ // eslint-disable-next-line no-undef
+ var S = Symbol();
+ var K = 'abcdefghijklmnopqrst';
+ A[S] = 7;
+ K.split('').forEach(function (k) { B[k] = k; });
+ return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K;
+ }) ? function assign(target, source) { // eslint-disable-line no-unused-vars
+ var T = _toObject(target);
+ var aLen = arguments.length;
+ var index = 1;
+ var getSymbols = _objectGops.f;
+ var isEnum = _objectPie.f;
+ while (aLen > index) {
+ var S = _iobject(arguments[index++]);
+ var keys = getSymbols ? _objectKeys(S).concat(getSymbols(S)) : _objectKeys(S);
+ var length = keys.length;
+ var j = 0;
+ var key;
+ while (length > j) if (isEnum.call(S, key = keys[j++])) T[key] = S[key];
+ } return T;
+ } : $assign;
+
+ var getWeak = _meta.getWeak;
+
+
+
+
+
+
+
+ var arrayFind = _arrayMethods(5);
+ var arrayFindIndex = _arrayMethods(6);
+ var id$1 = 0;
+
+ // fallback for uncaught frozen keys
+ var uncaughtFrozenStore = function (that) {
+ return that._l || (that._l = new UncaughtFrozenStore());
+ };
+ var UncaughtFrozenStore = function () {
+ this.a = [];
+ };
+ var findUncaughtFrozen = function (store, key) {
+ return arrayFind(store.a, function (it) {
+ return it[0] === key;
+ });
+ };
+ UncaughtFrozenStore.prototype = {
+ get: function (key) {
+ var entry = findUncaughtFrozen(this, key);
+ if (entry) return entry[1];
+ },
+ has: function (key) {
+ return !!findUncaughtFrozen(this, key);
+ },
+ set: function (key, value) {
+ var entry = findUncaughtFrozen(this, key);
+ if (entry) entry[1] = value;
+ else this.a.push([key, value]);
+ },
+ 'delete': function (key) {
+ var index = arrayFindIndex(this.a, function (it) {
+ return it[0] === key;
+ });
+ if (~index) this.a.splice(index, 1);
+ return !!~index;
+ }
+ };
+
+ var _collectionWeak = {
+ getConstructor: function (wrapper, NAME, IS_MAP, ADDER) {
+ var C = wrapper(function (that, iterable) {
+ _anInstance(that, C, NAME, '_i');
+ that._t = NAME; // collection type
+ that._i = id$1++; // collection id
+ that._l = undefined; // leak store for uncaught frozen objects
+ if (iterable != undefined) _forOf(iterable, IS_MAP, that[ADDER], that);
+ });
+ _redefineAll(C.prototype, {
+ // 23.3.3.2 WeakMap.prototype.delete(key)
+ // 23.4.3.3 WeakSet.prototype.delete(value)
+ 'delete': function (key) {
+ if (!_isObject(key)) return false;
+ var data = getWeak(key);
+ if (data === true) return uncaughtFrozenStore(_validateCollection(this, NAME))['delete'](key);
+ return data && _has(data, this._i) && delete data[this._i];
+ },
+ // 23.3.3.4 WeakMap.prototype.has(key)
+ // 23.4.3.4 WeakSet.prototype.has(value)
+ has: function has(key) {
+ if (!_isObject(key)) return false;
+ var data = getWeak(key);
+ if (data === true) return uncaughtFrozenStore(_validateCollection(this, NAME)).has(key);
+ return data && _has(data, this._i);
+ }
+ });
+ return C;
+ },
+ def: function (that, key, value) {
+ var data = getWeak(_anObject(key), true);
+ if (data === true) uncaughtFrozenStore(that).set(key, value);
+ else data[that._i] = value;
+ return that;
+ },
+ ufstore: uncaughtFrozenStore
+ };
+
+ var es6_weakMap = createCommonjsModule(function (module) {
+ var each = _arrayMethods(0);
+
+
+
+
+
+
+
+ var WEAK_MAP = 'WeakMap';
+ var getWeak = _meta.getWeak;
+ var isExtensible = Object.isExtensible;
+ var uncaughtFrozenStore = _collectionWeak.ufstore;
+ var tmp = {};
+ var InternalMap;
+
+ var wrapper = function (get) {
+ return function WeakMap() {
+ return get(this, arguments.length > 0 ? arguments[0] : undefined);
+ };
+ };
+
+ var methods = {
+ // 23.3.3.3 WeakMap.prototype.get(key)
+ get: function get(key) {
+ if (_isObject(key)) {
+ var data = getWeak(key);
+ if (data === true) return uncaughtFrozenStore(_validateCollection(this, WEAK_MAP)).get(key);
+ return data ? data[this._i] : undefined;
+ }
+ },
+ // 23.3.3.5 WeakMap.prototype.set(key, value)
+ set: function set(key, value) {
+ return _collectionWeak.def(_validateCollection(this, WEAK_MAP), key, value);
+ }
+ };
+
+ // 23.3 WeakMap Objects
+ var $WeakMap = module.exports = _collection(WEAK_MAP, wrapper, methods, _collectionWeak, true, true);
+
+ // IE11 WeakMap frozen keys fix
+ if (_fails(function () { return new $WeakMap().set((Object.freeze || Object)(tmp), 7).get(tmp) != 7; })) {
+ InternalMap = _collectionWeak.getConstructor(wrapper, WEAK_MAP);
+ _objectAssign(InternalMap.prototype, methods);
+ _meta.NEED = true;
+ each(['delete', 'has', 'get', 'set'], function (key) {
+ var proto = $WeakMap.prototype;
+ var method = proto[key];
+ _redefine(proto, key, function (a, b) {
+ // store frozen objects on internal weakmap shim
+ if (_isObject(a) && !isExtensible(a)) {
+ if (!this._f) this._f = new InternalMap();
+ var result = this._f[key](a, b);
+ return key == 'set' ? this : result;
+ // store all the rest on native weakmap
+ } return method.call(this, a, b);
+ });
+ });
+ }
+ });
+
+ var WEAK_SET = 'WeakSet';
+
+ // 23.4 WeakSet Objects
+ _collection(WEAK_SET, function (get) {
+ return function WeakSet() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };
+ }, {
+ // 23.4.3.1 WeakSet.prototype.add(value)
+ add: function add(value) {
+ return _collectionWeak.def(_validateCollection(this, WEAK_SET), value, true);
+ }
+ }, _collectionWeak, false, true);
+
+ // 26.1.1 Reflect.apply(target, thisArgument, argumentsList)
+
+
+
+ var rApply = (_global.Reflect || {}).apply;
+ var fApply = Function.apply;
+ // MS Edge argumentsList argument is optional
+ _export(_export.S + _export.F * !_fails(function () {
+ rApply(function () { /* empty */ });
+ }), 'Reflect', {
+ apply: function apply(target, thisArgument, argumentsList) {
+ var T = _aFunction(target);
+ var L = _anObject(argumentsList);
+ return rApply ? rApply(T, thisArgument, L) : fApply.call(T, thisArgument, L);
+ }
+ });
+
+ // fast apply, http://jsperf.lnkit.com/fast-apply/5
+ var _invoke = function (fn, args, that) {
+ var un = that === undefined;
+ switch (args.length) {
+ case 0: return un ? fn()
+ : fn.call(that);
+ case 1: return un ? fn(args[0])
+ : fn.call(that, args[0]);
+ case 2: return un ? fn(args[0], args[1])
+ : fn.call(that, args[0], args[1]);
+ case 3: return un ? fn(args[0], args[1], args[2])
+ : fn.call(that, args[0], args[1], args[2]);
+ case 4: return un ? fn(args[0], args[1], args[2], args[3])
+ : fn.call(that, args[0], args[1], args[2], args[3]);
+ } return fn.apply(that, args);
+ };
+
+ var arraySlice = [].slice;
+ var factories = {};
+
+ var construct = function (F, len, args) {
+ if (!(len in factories)) {
+ for (var n = [], i = 0; i < len; i++) n[i] = 'a[' + i + ']';
+ // eslint-disable-next-line no-new-func
+ factories[len] = Function('F,a', 'return new F(' + n.join(',') + ')');
+ } return factories[len](F, args);
+ };
+
+ var _bind = Function.bind || function bind(that /* , ...args */) {
+ var fn = _aFunction(this);
+ var partArgs = arraySlice.call(arguments, 1);
+ var bound = function (/* args... */) {
+ var args = partArgs.concat(arraySlice.call(arguments));
+ return this instanceof bound ? construct(fn, args.length, args) : _invoke(fn, args, that);
+ };
+ if (_isObject(fn.prototype)) bound.prototype = fn.prototype;
+ return bound;
+ };
+
+ // 26.1.2 Reflect.construct(target, argumentsList [, newTarget])
+
+
+
+
+
+
+
+ var rConstruct = (_global.Reflect || {}).construct;
+
+ // MS Edge supports only 2 arguments and argumentsList argument is optional
+ // FF Nightly sets third argument as `new.target`, but does not create `this` from it
+ var NEW_TARGET_BUG = _fails(function () {
+ function F() { /* empty */ }
+ return !(rConstruct(function () { /* empty */ }, [], F) instanceof F);
+ });
+ var ARGS_BUG = !_fails(function () {
+ rConstruct(function () { /* empty */ });
+ });
+
+ _export(_export.S + _export.F * (NEW_TARGET_BUG || ARGS_BUG), 'Reflect', {
+ construct: function construct(Target, args /* , newTarget */) {
+ _aFunction(Target);
+ _anObject(args);
+ var newTarget = arguments.length < 3 ? Target : _aFunction(arguments[2]);
+ if (ARGS_BUG && !NEW_TARGET_BUG) return rConstruct(Target, args, newTarget);
+ if (Target == newTarget) {
+ // w/o altered newTarget, optimization for 0-4 arguments
+ switch (args.length) {
+ case 0: return new Target();
+ case 1: return new Target(args[0]);
+ case 2: return new Target(args[0], args[1]);
+ case 3: return new Target(args[0], args[1], args[2]);
+ case 4: return new Target(args[0], args[1], args[2], args[3]);
+ }
+ // w/o altered newTarget, lot of arguments case
+ var $args = [null];
+ $args.push.apply($args, args);
+ return new (_bind.apply(Target, $args))();
+ }
+ // with altered newTarget, not support built-in constructors
+ var proto = newTarget.prototype;
+ var instance = _objectCreate(_isObject(proto) ? proto : Object.prototype);
+ var result = Function.apply.call(Target, instance, args);
+ return _isObject(result) ? result : instance;
+ }
+ });
-// 26.1.3 Reflect.defineProperty(target, propertyKey, attributes)
+ // 26.1.3 Reflect.defineProperty(target, propertyKey, attributes)
-// MS Edge has broken Reflect.defineProperty - throwing instead of returning false
-_export(_export.S + _export.F * _fails(function () {
- // eslint-disable-next-line no-undef
- Reflect.defineProperty(_objectDp.f({}, 1, { value: 1 }), 1, { value: 2 });
-}), 'Reflect', {
- defineProperty: function defineProperty(target, propertyKey, attributes) {
- _anObject(target);
- propertyKey = _toPrimitive(propertyKey, true);
- _anObject(attributes);
- try {
- _objectDp.f(target, propertyKey, attributes);
- return true;
- } catch (e) {
- return false;
- }
- }
-});
+ // MS Edge has broken Reflect.defineProperty - throwing instead of returning false
+ _export(_export.S + _export.F * _fails(function () {
+ // eslint-disable-next-line no-undef
+ Reflect.defineProperty(_objectDp.f({}, 1, { value: 1 }), 1, { value: 2 });
+ }), 'Reflect', {
+ defineProperty: function defineProperty(target, propertyKey, attributes) {
+ _anObject(target);
+ propertyKey = _toPrimitive(propertyKey, true);
+ _anObject(attributes);
+ try {
+ _objectDp.f(target, propertyKey, attributes);
+ return true;
+ } catch (e) {
+ return false;
+ }
+ }
+ });
-// 26.1.4 Reflect.deleteProperty(target, propertyKey)
+ // 26.1.4 Reflect.deleteProperty(target, propertyKey)
-var gOPD$1 = _objectGopd.f;
+ var gOPD$1 = _objectGopd.f;
-_export(_export.S, 'Reflect', {
- deleteProperty: function deleteProperty(target, propertyKey) {
- var desc = gOPD$1(_anObject(target), propertyKey);
- return desc && !desc.configurable ? false : delete target[propertyKey];
- }
-});
+ _export(_export.S, 'Reflect', {
+ deleteProperty: function deleteProperty(target, propertyKey) {
+ var desc = gOPD$1(_anObject(target), propertyKey);
+ return desc && !desc.configurable ? false : delete target[propertyKey];
+ }
+ });
-// 26.1.6 Reflect.get(target, propertyKey [, receiver])
+ // 26.1.6 Reflect.get(target, propertyKey [, receiver])
@@ -2384,97 +2383,97 @@ _export(_export.S, 'Reflect', {
-function get(target, propertyKey /* , receiver */) {
- var receiver = arguments.length < 3 ? target : arguments[2];
- var desc, proto;
- if (_anObject(target) === receiver) return target[propertyKey];
- if (desc = _objectGopd.f(target, propertyKey)) return _has(desc, 'value')
- ? desc.value
- : desc.get !== undefined
- ? desc.get.call(receiver)
- : undefined;
- if (_isObject(proto = _objectGpo(target))) return get(proto, propertyKey, receiver);
-}
+ function get(target, propertyKey /* , receiver */) {
+ var receiver = arguments.length < 3 ? target : arguments[2];
+ var desc, proto;
+ if (_anObject(target) === receiver) return target[propertyKey];
+ if (desc = _objectGopd.f(target, propertyKey)) return _has(desc, 'value')
+ ? desc.value
+ : desc.get !== undefined
+ ? desc.get.call(receiver)
+ : undefined;
+ if (_isObject(proto = _objectGpo(target))) return get(proto, propertyKey, receiver);
+ }
-_export(_export.S, 'Reflect', { get: get });
+ _export(_export.S, 'Reflect', { get: get });
-// 26.1.7 Reflect.getOwnPropertyDescriptor(target, propertyKey)
+ // 26.1.7 Reflect.getOwnPropertyDescriptor(target, propertyKey)
-_export(_export.S, 'Reflect', {
- getOwnPropertyDescriptor: function getOwnPropertyDescriptor(target, propertyKey) {
- return _objectGopd.f(_anObject(target), propertyKey);
- }
-});
+ _export(_export.S, 'Reflect', {
+ getOwnPropertyDescriptor: function getOwnPropertyDescriptor(target, propertyKey) {
+ return _objectGopd.f(_anObject(target), propertyKey);
+ }
+ });
-// 26.1.8 Reflect.getPrototypeOf(target)
+ // 26.1.8 Reflect.getPrototypeOf(target)
-_export(_export.S, 'Reflect', {
- getPrototypeOf: function getPrototypeOf(target) {
- return _objectGpo(_anObject(target));
- }
-});
+ _export(_export.S, 'Reflect', {
+ getPrototypeOf: function getPrototypeOf(target) {
+ return _objectGpo(_anObject(target));
+ }
+ });
-// 26.1.9 Reflect.has(target, propertyKey)
+ // 26.1.9 Reflect.has(target, propertyKey)
-_export(_export.S, 'Reflect', {
- has: function has(target, propertyKey) {
- return propertyKey in target;
- }
-});
+ _export(_export.S, 'Reflect', {
+ has: function has(target, propertyKey) {
+ return propertyKey in target;
+ }
+ });
-// 26.1.10 Reflect.isExtensible(target)
+ // 26.1.10 Reflect.isExtensible(target)
-var $isExtensible = Object.isExtensible;
+ var $isExtensible = Object.isExtensible;
-_export(_export.S, 'Reflect', {
- isExtensible: function isExtensible(target) {
- _anObject(target);
- return $isExtensible ? $isExtensible(target) : true;
- }
-});
+ _export(_export.S, 'Reflect', {
+ isExtensible: function isExtensible(target) {
+ _anObject(target);
+ return $isExtensible ? $isExtensible(target) : true;
+ }
+ });
-// all object keys, includes non-enumerable and symbols
+ // all object keys, includes non-enumerable and symbols
-var Reflect$1 = _global.Reflect;
-var _ownKeys = Reflect$1 && Reflect$1.ownKeys || function ownKeys(it) {
- var keys = _objectGopn.f(_anObject(it));
- var getSymbols = _objectGops.f;
- return getSymbols ? keys.concat(getSymbols(it)) : keys;
-};
+ var Reflect$1 = _global.Reflect;
+ var _ownKeys = Reflect$1 && Reflect$1.ownKeys || function ownKeys(it) {
+ var keys = _objectGopn.f(_anObject(it));
+ var getSymbols = _objectGops.f;
+ return getSymbols ? keys.concat(getSymbols(it)) : keys;
+ };
-// 26.1.11 Reflect.ownKeys(target)
+ // 26.1.11 Reflect.ownKeys(target)
-_export(_export.S, 'Reflect', { ownKeys: _ownKeys });
+ _export(_export.S, 'Reflect', { ownKeys: _ownKeys });
-// 26.1.12 Reflect.preventExtensions(target)
+ // 26.1.12 Reflect.preventExtensions(target)
-var $preventExtensions = Object.preventExtensions;
+ var $preventExtensions = Object.preventExtensions;
-_export(_export.S, 'Reflect', {
- preventExtensions: function preventExtensions(target) {
- _anObject(target);
- try {
- if ($preventExtensions) $preventExtensions(target);
- return true;
- } catch (e) {
- return false;
- }
- }
-});
+ _export(_export.S, 'Reflect', {
+ preventExtensions: function preventExtensions(target) {
+ _anObject(target);
+ try {
+ if ($preventExtensions) $preventExtensions(target);
+ return true;
+ } catch (e) {
+ return false;
+ }
+ }
+ });
-// 26.1.13 Reflect.set(target, propertyKey, V [, receiver])
+ // 26.1.13 Reflect.set(target, propertyKey, V [, receiver])
@@ -2484,11141 +2483,11046 @@ _export(_export.S, 'Reflect', {
-function set(target, propertyKey, V /* , receiver */) {
- var receiver = arguments.length < 4 ? target : arguments[3];
- var ownDesc = _objectGopd.f(_anObject(target), propertyKey);
- var existingDescriptor, proto;
- if (!ownDesc) {
- if (_isObject(proto = _objectGpo(target))) {
- return set(proto, propertyKey, V, receiver);
- }
- ownDesc = _propertyDesc(0);
- }
- if (_has(ownDesc, 'value')) {
- if (ownDesc.writable === false || !_isObject(receiver)) return false;
- existingDescriptor = _objectGopd.f(receiver, propertyKey) || _propertyDesc(0);
- existingDescriptor.value = V;
- _objectDp.f(receiver, propertyKey, existingDescriptor);
- return true;
- }
- return ownDesc.set === undefined ? false : (ownDesc.set.call(receiver, V), true);
-}
-
-_export(_export.S, 'Reflect', { set: set });
-
-// 26.1.14 Reflect.setPrototypeOf(target, proto)
-
-
-
-if (_setProto) _export(_export.S, 'Reflect', {
- setPrototypeOf: function setPrototypeOf(target, proto) {
- _setProto.check(target, proto);
- try {
- _setProto.set(target, proto);
- return true;
- } catch (e) {
- return false;
- }
- }
-});
-
-var process = _global.process;
-var setTask = _global.setImmediate;
-var clearTask = _global.clearImmediate;
-var MessageChannel = _global.MessageChannel;
-var Dispatch = _global.Dispatch;
-var counter = 0;
-var queue = {};
-var ONREADYSTATECHANGE = 'onreadystatechange';
-var defer, channel, port;
-var run = function () {
- var id = +this;
- // eslint-disable-next-line no-prototype-builtins
- if (queue.hasOwnProperty(id)) {
- var fn = queue[id];
- delete queue[id];
- fn();
- }
-};
-var listener = function (event) {
- run.call(event.data);
-};
-// Node.js 0.9+ & IE10+ has setImmediate, otherwise:
-if (!setTask || !clearTask) {
- setTask = function setImmediate(fn) {
- var args = [];
- var i = 1;
- while (arguments.length > i) args.push(arguments[i++]);
- queue[++counter] = function () {
- // eslint-disable-next-line no-new-func
- _invoke(typeof fn == 'function' ? fn : Function(fn), args);
- };
- defer(counter);
- return counter;
- };
- clearTask = function clearImmediate(id) {
- delete queue[id];
- };
- // Node.js 0.8-
- if (_cof(process) == 'process') {
- defer = function (id) {
- process.nextTick(_ctx(run, id, 1));
- };
- // Sphere (JS game engine) Dispatch API
- } else if (Dispatch && Dispatch.now) {
- defer = function (id) {
- Dispatch.now(_ctx(run, id, 1));
- };
- // Browsers with MessageChannel, includes WebWorkers
- } else if (MessageChannel) {
- channel = new MessageChannel();
- port = channel.port2;
- channel.port1.onmessage = listener;
- defer = _ctx(port.postMessage, port, 1);
- // Browsers with postMessage, skip WebWorkers
- // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'
- } else if (_global.addEventListener && typeof postMessage == 'function' && !_global.importScripts) {
- defer = function (id) {
- _global.postMessage(id + '', '*');
- };
- _global.addEventListener('message', listener, false);
- // IE8-
- } else if (ONREADYSTATECHANGE in _domCreate('script')) {
- defer = function (id) {
- _html.appendChild(_domCreate('script'))[ONREADYSTATECHANGE] = function () {
- _html.removeChild(this);
- run.call(id);
- };
- };
- // Rest old browsers
- } else {
- defer = function (id) {
- setTimeout(_ctx(run, id, 1), 0);
- };
- }
-}
-var _task = {
- set: setTask,
- clear: clearTask
-};
-
-var macrotask = _task.set;
-var Observer = _global.MutationObserver || _global.WebKitMutationObserver;
-var process$1 = _global.process;
-var Promise$1 = _global.Promise;
-var isNode = _cof(process$1) == 'process';
-
-var _microtask = function () {
- var head, last, notify;
-
- var flush = function () {
- var parent, fn;
- if (isNode && (parent = process$1.domain)) parent.exit();
- while (head) {
- fn = head.fn;
- head = head.next;
- try {
- fn();
- } catch (e) {
- if (head) notify();
- else last = undefined;
- throw e;
- }
- } last = undefined;
- if (parent) parent.enter();
- };
-
- // Node.js
- if (isNode) {
- notify = function () {
- process$1.nextTick(flush);
- };
- // browsers with MutationObserver, except iOS Safari - https://github.com/zloirock/core-js/issues/339
- } else if (Observer && !(_global.navigator && _global.navigator.standalone)) {
- var toggle = true;
- var node = document.createTextNode('');
- new Observer(flush).observe(node, { characterData: true }); // eslint-disable-line no-new
- notify = function () {
- node.data = toggle = !toggle;
- };
- // environments with maybe non-completely correct, but existent Promise
- } else if (Promise$1 && Promise$1.resolve) {
- var promise = Promise$1.resolve();
- notify = function () {
- promise.then(flush);
- };
- // for other environments - macrotask based on:
- // - setImmediate
- // - MessageChannel
- // - window.postMessag
- // - onreadystatechange
- // - setTimeout
- } else {
- notify = function () {
- // strange IE + webpack dev server bug - use .call(global)
- macrotask.call(_global, flush);
- };
- }
-
- return function (fn) {
- var task = { fn: fn, next: undefined };
- if (last) last.next = task;
- if (!head) {
- head = task;
- notify();
- } last = task;
- };
-};
-
-// 25.4.1.5 NewPromiseCapability(C)
-
-
-function PromiseCapability(C) {
- var resolve, reject;
- this.promise = new C(function ($$resolve, $$reject) {
- if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor');
- resolve = $$resolve;
- reject = $$reject;
- });
- this.resolve = _aFunction(resolve);
- this.reject = _aFunction(reject);
-}
-
-var f$5 = function (C) {
- return new PromiseCapability(C);
-};
-
-var _newPromiseCapability = {
- f: f$5
-};
-
-var _perform = function (exec) {
- try {
- return { e: false, v: exec() };
- } catch (e) {
- return { e: true, v: e };
- }
-};
-
-var _promiseResolve = function (C, x) {
- _anObject(C);
- if (_isObject(x) && x.constructor === C) return x;
- var promiseCapability = _newPromiseCapability.f(C);
- var resolve = promiseCapability.resolve;
- resolve(x);
- return promiseCapability.promise;
-};
-
-var task = _task.set;
-var microtask = _microtask();
-
-
-
-var PROMISE = 'Promise';
-var TypeError$1 = _global.TypeError;
-var process$2 = _global.process;
-var $Promise = _global[PROMISE];
-var isNode$1 = _classof(process$2) == 'process';
-var empty = function () { /* empty */ };
-var Internal, newGenericPromiseCapability, OwnPromiseCapability, Wrapper;
-var newPromiseCapability = newGenericPromiseCapability = _newPromiseCapability.f;
-
-var USE_NATIVE = !!function () {
- try {
- // correct subclassing with @@species support
- var promise = $Promise.resolve(1);
- var FakePromise = (promise.constructor = {})[_wks('species')] = function (exec) {
- exec(empty, empty);
- };
- // unhandled rejections tracking support, NodeJS Promise without it fails @@species test
- return (isNode$1 || typeof PromiseRejectionEvent == 'function') && promise.then(empty) instanceof FakePromise;
- } catch (e) { /* empty */ }
-}();
-
-// helpers
-var isThenable = function (it) {
- var then;
- return _isObject(it) && typeof (then = it.then) == 'function' ? then : false;
-};
-var notify = function (promise, isReject) {
- if (promise._n) return;
- promise._n = true;
- var chain = promise._c;
- microtask(function () {
- var value = promise._v;
- var ok = promise._s == 1;
- var i = 0;
- var run = function (reaction) {
- var handler = ok ? reaction.ok : reaction.fail;
- var resolve = reaction.resolve;
- var reject = reaction.reject;
- var domain = reaction.domain;
- var result, then;
- try {
- if (handler) {
- if (!ok) {
- if (promise._h == 2) onHandleUnhandled(promise);
- promise._h = 1;
- }
- if (handler === true) result = value;
- else {
- if (domain) domain.enter();
- result = handler(value);
- if (domain) domain.exit();
- }
- if (result === reaction.promise) {
- reject(TypeError$1('Promise-chain cycle'));
- } else if (then = isThenable(result)) {
- then.call(result, resolve, reject);
- } else resolve(result);
- } else reject(value);
- } catch (e) {
- reject(e);
- }
- };
- while (chain.length > i) run(chain[i++]); // variable length - can't use forEach
- promise._c = [];
- promise._n = false;
- if (isReject && !promise._h) onUnhandled(promise);
- });
-};
-var onUnhandled = function (promise) {
- task.call(_global, function () {
- var value = promise._v;
- var unhandled = isUnhandled(promise);
- var result, handler, console;
- if (unhandled) {
- result = _perform(function () {
- if (isNode$1) {
- process$2.emit('unhandledRejection', value, promise);
- } else if (handler = _global.onunhandledrejection) {
- handler({ promise: promise, reason: value });
- } else if ((console = _global.console) && console.error) {
- console.error('Unhandled promise rejection', value);
- }
- });
- // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should
- promise._h = isNode$1 || isUnhandled(promise) ? 2 : 1;
- } promise._a = undefined;
- if (unhandled && result.e) throw result.v;
- });
-};
-var isUnhandled = function (promise) {
- return promise._h !== 1 && (promise._a || promise._c).length === 0;
-};
-var onHandleUnhandled = function (promise) {
- task.call(_global, function () {
- var handler;
- if (isNode$1) {
- process$2.emit('rejectionHandled', promise);
- } else if (handler = _global.onrejectionhandled) {
- handler({ promise: promise, reason: promise._v });
- }
- });
-};
-var $reject = function (value) {
- var promise = this;
- if (promise._d) return;
- promise._d = true;
- promise = promise._w || promise; // unwrap
- promise._v = value;
- promise._s = 2;
- if (!promise._a) promise._a = promise._c.slice();
- notify(promise, true);
-};
-var $resolve = function (value) {
- var promise = this;
- var then;
- if (promise._d) return;
- promise._d = true;
- promise = promise._w || promise; // unwrap
- try {
- if (promise === value) throw TypeError$1("Promise can't be resolved itself");
- if (then = isThenable(value)) {
- microtask(function () {
- var wrapper = { _w: promise, _d: false }; // wrap
- try {
- then.call(value, _ctx($resolve, wrapper, 1), _ctx($reject, wrapper, 1));
- } catch (e) {
- $reject.call(wrapper, e);
- }
- });
- } else {
- promise._v = value;
- promise._s = 1;
- notify(promise, false);
- }
- } catch (e) {
- $reject.call({ _w: promise, _d: false }, e); // wrap
- }
-};
-
-// constructor polyfill
-if (!USE_NATIVE) {
- // 25.4.3.1 Promise(executor)
- $Promise = function Promise(executor) {
- _anInstance(this, $Promise, PROMISE, '_h');
- _aFunction(executor);
- Internal.call(this);
- try {
- executor(_ctx($resolve, this, 1), _ctx($reject, this, 1));
- } catch (err) {
- $reject.call(this, err);
- }
- };
- // eslint-disable-next-line no-unused-vars
- Internal = function Promise(executor) {
- this._c = []; // <- awaiting reactions
- this._a = undefined; // <- checked in isUnhandled reactions
- this._s = 0; // <- state
- this._d = false; // <- done
- this._v = undefined; // <- value
- this._h = 0; // <- rejection state, 0 - default, 1 - handled, 2 - unhandled
- this._n = false; // <- notify
- };
- Internal.prototype = _redefineAll($Promise.prototype, {
- // 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected)
- then: function then(onFulfilled, onRejected) {
- var reaction = newPromiseCapability(_speciesConstructor(this, $Promise));
- reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;
- reaction.fail = typeof onRejected == 'function' && onRejected;
- reaction.domain = isNode$1 ? process$2.domain : undefined;
- this._c.push(reaction);
- if (this._a) this._a.push(reaction);
- if (this._s) notify(this, false);
- return reaction.promise;
- },
- // 25.4.5.1 Promise.prototype.catch(onRejected)
- 'catch': function (onRejected) {
- return this.then(undefined, onRejected);
- }
- });
- OwnPromiseCapability = function () {
- var promise = new Internal();
- this.promise = promise;
- this.resolve = _ctx($resolve, promise, 1);
- this.reject = _ctx($reject, promise, 1);
- };
- _newPromiseCapability.f = newPromiseCapability = function (C) {
- return C === $Promise || C === Wrapper
- ? new OwnPromiseCapability(C)
- : newGenericPromiseCapability(C);
- };
-}
-
-_export(_export.G + _export.W + _export.F * !USE_NATIVE, { Promise: $Promise });
-_setToStringTag($Promise, PROMISE);
-_setSpecies(PROMISE);
-Wrapper = _core[PROMISE];
-
-// statics
-_export(_export.S + _export.F * !USE_NATIVE, PROMISE, {
- // 25.4.4.5 Promise.reject(r)
- reject: function reject(r) {
- var capability = newPromiseCapability(this);
- var $$reject = capability.reject;
- $$reject(r);
- return capability.promise;
- }
-});
-_export(_export.S + _export.F * (_library || !USE_NATIVE), PROMISE, {
- // 25.4.4.6 Promise.resolve(x)
- resolve: function resolve(x) {
- return _promiseResolve(_library && this === Wrapper ? $Promise : this, x);
- }
-});
-_export(_export.S + _export.F * !(USE_NATIVE && _iterDetect(function (iter) {
- $Promise.all(iter)['catch'](empty);
-})), PROMISE, {
- // 25.4.4.1 Promise.all(iterable)
- all: function all(iterable) {
- var C = this;
- var capability = newPromiseCapability(C);
- var resolve = capability.resolve;
- var reject = capability.reject;
- var result = _perform(function () {
- var values = [];
- var index = 0;
- var remaining = 1;
- _forOf(iterable, false, function (promise) {
- var $index = index++;
- var alreadyCalled = false;
- values.push(undefined);
- remaining++;
- C.resolve(promise).then(function (value) {
- if (alreadyCalled) return;
- alreadyCalled = true;
- values[$index] = value;
- --remaining || resolve(values);
- }, reject);
- });
- --remaining || resolve(values);
- });
- if (result.e) reject(result.v);
- return capability.promise;
- },
- // 25.4.4.4 Promise.race(iterable)
- race: function race(iterable) {
- var C = this;
- var capability = newPromiseCapability(C);
- var reject = capability.reject;
- var result = _perform(function () {
- _forOf(iterable, false, function (promise) {
- C.resolve(promise).then(capability.resolve, reject);
- });
- });
- if (result.e) reject(result.v);
- return capability.promise;
- }
-});
-
-var f$6 = _wks;
-
-var _wksExt = {
- f: f$6
-};
-
-var defineProperty = _objectDp.f;
-var _wksDefine = function (name) {
- var $Symbol = _core.Symbol || (_core.Symbol = _library ? {} : _global.Symbol || {});
- if (name.charAt(0) != '_' && !(name in $Symbol)) defineProperty($Symbol, name, { value: _wksExt.f(name) });
-};
-
-// all enumerable object keys, includes symbols
-
-
-
-var _enumKeys = function (it) {
- var result = _objectKeys(it);
- var getSymbols = _objectGops.f;
- if (getSymbols) {
- var symbols = getSymbols(it);
- var isEnum = _objectPie.f;
- var i = 0;
- var key;
- while (symbols.length > i) if (isEnum.call(it, key = symbols[i++])) result.push(key);
- } return result;
-};
-
-// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window
-
-var gOPN = _objectGopn.f;
-var toString$1 = {}.toString;
-
-var windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames
- ? Object.getOwnPropertyNames(window) : [];
-
-var getWindowNames = function (it) {
- try {
- return gOPN(it);
- } catch (e) {
- return windowNames.slice();
- }
-};
-
-var f$7 = function getOwnPropertyNames(it) {
- return windowNames && toString$1.call(it) == '[object Window]' ? getWindowNames(it) : gOPN(_toIobject(it));
-};
-
-var _objectGopnExt = {
- f: f$7
-};
-
-// ECMAScript 6 symbols shim
-
-
-
-
-
-var META = _meta.KEY;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-var gOPD$2 = _objectGopd.f;
-var dP$2 = _objectDp.f;
-var gOPN$1 = _objectGopnExt.f;
-var $Symbol = _global.Symbol;
-var $JSON = _global.JSON;
-var _stringify = $JSON && $JSON.stringify;
-var PROTOTYPE$2 = 'prototype';
-var HIDDEN = _wks('_hidden');
-var TO_PRIMITIVE = _wks('toPrimitive');
-var isEnum = {}.propertyIsEnumerable;
-var SymbolRegistry = _shared('symbol-registry');
-var AllSymbols = _shared('symbols');
-var OPSymbols = _shared('op-symbols');
-var ObjectProto$1 = Object[PROTOTYPE$2];
-var USE_NATIVE$1 = typeof $Symbol == 'function';
-var QObject = _global.QObject;
-// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173
-var setter = !QObject || !QObject[PROTOTYPE$2] || !QObject[PROTOTYPE$2].findChild;
-
-// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687
-var setSymbolDesc = _descriptors && _fails(function () {
- return _objectCreate(dP$2({}, 'a', {
- get: function () { return dP$2(this, 'a', { value: 7 }).a; }
- })).a != 7;
-}) ? function (it, key, D) {
- var protoDesc = gOPD$2(ObjectProto$1, key);
- if (protoDesc) delete ObjectProto$1[key];
- dP$2(it, key, D);
- if (protoDesc && it !== ObjectProto$1) dP$2(ObjectProto$1, key, protoDesc);
-} : dP$2;
-
-var wrap = function (tag) {
- var sym = AllSymbols[tag] = _objectCreate($Symbol[PROTOTYPE$2]);
- sym._k = tag;
- return sym;
-};
-
-var isSymbol = USE_NATIVE$1 && typeof $Symbol.iterator == 'symbol' ? function (it) {
- return typeof it == 'symbol';
-} : function (it) {
- return it instanceof $Symbol;
-};
-
-var $defineProperty = function defineProperty(it, key, D) {
- if (it === ObjectProto$1) $defineProperty(OPSymbols, key, D);
- _anObject(it);
- key = _toPrimitive(key, true);
- _anObject(D);
- if (_has(AllSymbols, key)) {
- if (!D.enumerable) {
- if (!_has(it, HIDDEN)) dP$2(it, HIDDEN, _propertyDesc(1, {}));
- it[HIDDEN][key] = true;
- } else {
- if (_has(it, HIDDEN) && it[HIDDEN][key]) it[HIDDEN][key] = false;
- D = _objectCreate(D, { enumerable: _propertyDesc(0, false) });
- } return setSymbolDesc(it, key, D);
- } return dP$2(it, key, D);
-};
-var $defineProperties = function defineProperties(it, P) {
- _anObject(it);
- var keys = _enumKeys(P = _toIobject(P));
- var i = 0;
- var l = keys.length;
- var key;
- while (l > i) $defineProperty(it, key = keys[i++], P[key]);
- return it;
-};
-var $create = function create(it, P) {
- return P === undefined ? _objectCreate(it) : $defineProperties(_objectCreate(it), P);
-};
-var $propertyIsEnumerable = function propertyIsEnumerable(key) {
- var E = isEnum.call(this, key = _toPrimitive(key, true));
- if (this === ObjectProto$1 && _has(AllSymbols, key) && !_has(OPSymbols, key)) return false;
- return E || !_has(this, key) || !_has(AllSymbols, key) || _has(this, HIDDEN) && this[HIDDEN][key] ? E : true;
-};
-var $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key) {
- it = _toIobject(it);
- key = _toPrimitive(key, true);
- if (it === ObjectProto$1 && _has(AllSymbols, key) && !_has(OPSymbols, key)) return;
- var D = gOPD$2(it, key);
- if (D && _has(AllSymbols, key) && !(_has(it, HIDDEN) && it[HIDDEN][key])) D.enumerable = true;
- return D;
-};
-var $getOwnPropertyNames = function getOwnPropertyNames(it) {
- var names = gOPN$1(_toIobject(it));
- var result = [];
- var i = 0;
- var key;
- while (names.length > i) {
- if (!_has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META) result.push(key);
- } return result;
-};
-var $getOwnPropertySymbols = function getOwnPropertySymbols(it) {
- var IS_OP = it === ObjectProto$1;
- var names = gOPN$1(IS_OP ? OPSymbols : _toIobject(it));
- var result = [];
- var i = 0;
- var key;
- while (names.length > i) {
- if (_has(AllSymbols, key = names[i++]) && (IS_OP ? _has(ObjectProto$1, key) : true)) result.push(AllSymbols[key]);
- } return result;
-};
-
-// 19.4.1.1 Symbol([description])
-if (!USE_NATIVE$1) {
- $Symbol = function Symbol() {
- if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor!');
- var tag = _uid(arguments.length > 0 ? arguments[0] : undefined);
- var $set = function (value) {
- if (this === ObjectProto$1) $set.call(OPSymbols, value);
- if (_has(this, HIDDEN) && _has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;
- setSymbolDesc(this, tag, _propertyDesc(1, value));
- };
- if (_descriptors && setter) setSymbolDesc(ObjectProto$1, tag, { configurable: true, set: $set });
- return wrap(tag);
- };
- _redefine($Symbol[PROTOTYPE$2], 'toString', function toString() {
- return this._k;
- });
-
- _objectGopd.f = $getOwnPropertyDescriptor;
- _objectDp.f = $defineProperty;
- _objectGopn.f = _objectGopnExt.f = $getOwnPropertyNames;
- _objectPie.f = $propertyIsEnumerable;
- _objectGops.f = $getOwnPropertySymbols;
-
- if (_descriptors && !_library) {
- _redefine(ObjectProto$1, 'propertyIsEnumerable', $propertyIsEnumerable, true);
- }
-
- _wksExt.f = function (name) {
- return wrap(_wks(name));
- };
-}
-
-_export(_export.G + _export.W + _export.F * !USE_NATIVE$1, { Symbol: $Symbol });
-
-for (var es6Symbols = (
- // 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14
- 'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'
-).split(','), j = 0; es6Symbols.length > j;)_wks(es6Symbols[j++]);
-
-for (var wellKnownSymbols = _objectKeys(_wks.store), k = 0; wellKnownSymbols.length > k;) _wksDefine(wellKnownSymbols[k++]);
-
-_export(_export.S + _export.F * !USE_NATIVE$1, 'Symbol', {
- // 19.4.2.1 Symbol.for(key)
- 'for': function (key) {
- return _has(SymbolRegistry, key += '')
- ? SymbolRegistry[key]
- : SymbolRegistry[key] = $Symbol(key);
- },
- // 19.4.2.5 Symbol.keyFor(sym)
- keyFor: function keyFor(sym) {
- if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol!');
- for (var key in SymbolRegistry) if (SymbolRegistry[key] === sym) return key;
- },
- useSetter: function () { setter = true; },
- useSimple: function () { setter = false; }
-});
-
-_export(_export.S + _export.F * !USE_NATIVE$1, 'Object', {
- // 19.1.2.2 Object.create(O [, Properties])
- create: $create,
- // 19.1.2.4 Object.defineProperty(O, P, Attributes)
- defineProperty: $defineProperty,
- // 19.1.2.3 Object.defineProperties(O, Properties)
- defineProperties: $defineProperties,
- // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)
- getOwnPropertyDescriptor: $getOwnPropertyDescriptor,
- // 19.1.2.7 Object.getOwnPropertyNames(O)
- getOwnPropertyNames: $getOwnPropertyNames,
- // 19.1.2.8 Object.getOwnPropertySymbols(O)
- getOwnPropertySymbols: $getOwnPropertySymbols
-});
-
-// 24.3.2 JSON.stringify(value [, replacer [, space]])
-$JSON && _export(_export.S + _export.F * (!USE_NATIVE$1 || _fails(function () {
- var S = $Symbol();
- // MS Edge converts symbol values to JSON as {}
- // WebKit converts symbol values to JSON as null
- // V8 throws on boxed symbols
- return _stringify([S]) != '[null]' || _stringify({ a: S }) != '{}' || _stringify(Object(S)) != '{}';
-})), 'JSON', {
- stringify: function stringify(it) {
- var args = [it];
- var i = 1;
- var replacer, $replacer;
- while (arguments.length > i) args.push(arguments[i++]);
- $replacer = replacer = args[1];
- if (!_isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined
- if (!_isArray(replacer)) replacer = function (key, value) {
- if (typeof $replacer == 'function') value = $replacer.call(this, key, value);
- if (!isSymbol(value)) return value;
- };
- args[1] = replacer;
- return _stringify.apply($JSON, args);
- }
-});
-
-// 19.4.3.4 Symbol.prototype[@@toPrimitive](hint)
-$Symbol[PROTOTYPE$2][TO_PRIMITIVE] || _hide($Symbol[PROTOTYPE$2], TO_PRIMITIVE, $Symbol[PROTOTYPE$2].valueOf);
-// 19.4.3.5 Symbol.prototype[@@toStringTag]
-_setToStringTag($Symbol, 'Symbol');
-// 20.2.1.9 Math[@@toStringTag]
-_setToStringTag(Math, 'Math', true);
-// 24.3.3 JSON[@@toStringTag]
-_setToStringTag(_global.JSON, 'JSON', true);
-
-// most Object methods by ES6 should accept primitives
-
-
-
-var _objectSap = function (KEY, exec) {
- var fn = (_core.Object || {})[KEY] || Object[KEY];
- var exp = {};
- exp[KEY] = exec(fn);
- _export(_export.S + _export.F * _fails(function () { fn(1); }), 'Object', exp);
-};
-
-// 19.1.2.5 Object.freeze(O)
-
-var meta = _meta.onFreeze;
-
-_objectSap('freeze', function ($freeze) {
- return function freeze(it) {
- return $freeze && _isObject(it) ? $freeze(meta(it)) : it;
- };
-});
-
-// 19.1.2.17 Object.seal(O)
-
-var meta$1 = _meta.onFreeze;
-
-_objectSap('seal', function ($seal) {
- return function seal(it) {
- return $seal && _isObject(it) ? $seal(meta$1(it)) : it;
- };
-});
-
-// 19.1.2.15 Object.preventExtensions(O)
-
-var meta$2 = _meta.onFreeze;
-
-_objectSap('preventExtensions', function ($preventExtensions) {
- return function preventExtensions(it) {
- return $preventExtensions && _isObject(it) ? $preventExtensions(meta$2(it)) : it;
- };
-});
-
-// 19.1.2.12 Object.isFrozen(O)
-
-
-_objectSap('isFrozen', function ($isFrozen) {
- return function isFrozen(it) {
- return _isObject(it) ? $isFrozen ? $isFrozen(it) : false : true;
- };
-});
-
-// 19.1.2.13 Object.isSealed(O)
-
-
-_objectSap('isSealed', function ($isSealed) {
- return function isSealed(it) {
- return _isObject(it) ? $isSealed ? $isSealed(it) : false : true;
- };
-});
-
-// 19.1.2.11 Object.isExtensible(O)
-
-
-_objectSap('isExtensible', function ($isExtensible) {
- return function isExtensible(it) {
- return _isObject(it) ? $isExtensible ? $isExtensible(it) : true : false;
- };
-});
-
-// 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)
-
-var $getOwnPropertyDescriptor$1 = _objectGopd.f;
-
-_objectSap('getOwnPropertyDescriptor', function () {
- return function getOwnPropertyDescriptor(it, key) {
- return $getOwnPropertyDescriptor$1(_toIobject(it), key);
- };
-});
-
-// 19.1.2.9 Object.getPrototypeOf(O)
-
-
-
-_objectSap('getPrototypeOf', function () {
- return function getPrototypeOf(it) {
- return _objectGpo(_toObject(it));
- };
-});
-
-// 19.1.2.14 Object.keys(O)
-
-
-
-_objectSap('keys', function () {
- return function keys(it) {
- return _objectKeys(_toObject(it));
- };
-});
-
-// 19.1.2.7 Object.getOwnPropertyNames(O)
-_objectSap('getOwnPropertyNames', function () {
- return _objectGopnExt.f;
-});
-
-// 19.1.3.1 Object.assign(target, source)
-
-
-_export(_export.S + _export.F, 'Object', { assign: _objectAssign });
-
-// 7.2.9 SameValue(x, y)
-var _sameValue = Object.is || function is(x, y) {
- // eslint-disable-next-line no-self-compare
- return x === y ? x !== 0 || 1 / x === 1 / y : x != x && y != y;
-};
-
-// 19.1.3.10 Object.is(value1, value2)
-
-_export(_export.S, 'Object', { is: _sameValue });
-
-var dP$3 = _objectDp.f;
-var FProto = Function.prototype;
-var nameRE = /^\s*function ([^ (]*)/;
-var NAME = 'name';
-
-// 19.2.4.2 name
-NAME in FProto || _descriptors && dP$3(FProto, NAME, {
- configurable: true,
- get: function () {
- try {
- return ('' + this).match(nameRE)[1];
- } catch (e) {
- return '';
- }
- }
-});
-
-_export(_export.S, 'String', {
- // 21.1.2.4 String.raw(callSite, ...substitutions)
- raw: function raw(callSite) {
- var tpl = _toIobject(callSite.raw);
- var len = _toLength(tpl.length);
- var aLen = arguments.length;
- var res = [];
- var i = 0;
- while (len > i) {
- res.push(String(tpl[i++]));
- if (i < aLen) res.push(String(arguments[i]));
- } return res.join('');
- }
-});
-
-var fromCharCode = String.fromCharCode;
-var $fromCodePoint = String.fromCodePoint;
-
-// length should be 1, old FF problem
-_export(_export.S + _export.F * (!!$fromCodePoint && $fromCodePoint.length != 1), 'String', {
- // 21.1.2.2 String.fromCodePoint(...codePoints)
- fromCodePoint: function fromCodePoint(x) { // eslint-disable-line no-unused-vars
- var res = [];
- var aLen = arguments.length;
- var i = 0;
- var code;
- while (aLen > i) {
- code = +arguments[i++];
- if (_toAbsoluteIndex(code, 0x10ffff) !== code) throw RangeError(code + ' is not a valid code point');
- res.push(code < 0x10000
- ? fromCharCode(code)
- : fromCharCode(((code -= 0x10000) >> 10) + 0xd800, code % 0x400 + 0xdc00)
- );
- } return res.join('');
- }
-});
-
-// true -> String#at
-// false -> String#codePointAt
-var _stringAt = function (TO_STRING) {
- return function (that, pos) {
- var s = String(_defined(that));
- var i = _toInteger(pos);
- var l = s.length;
- var a, b;
- if (i < 0 || i >= l) return TO_STRING ? '' : undefined;
- a = s.charCodeAt(i);
- return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff
- ? TO_STRING ? s.charAt(i) : a
- : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;
- };
-};
-
-var $at = _stringAt(false);
-_export(_export.P, 'String', {
- // 21.1.3.3 String.prototype.codePointAt(pos)
- codePointAt: function codePointAt(pos) {
- return $at(this, pos);
- }
-});
-
-var _stringRepeat = function repeat(count) {
- var str = String(_defined(this));
- var res = '';
- var n = _toInteger(count);
- if (n < 0 || n == Infinity) throw RangeError("Count can't be negative");
- for (;n > 0; (n >>>= 1) && (str += str)) if (n & 1) res += str;
- return res;
-};
-
-_export(_export.P, 'String', {
- // 21.1.3.13 String.prototype.repeat(count)
- repeat: _stringRepeat
-});
-
-// 7.2.8 IsRegExp(argument)
-
-
-var MATCH = _wks('match');
-var _isRegexp = function (it) {
- var isRegExp;
- return _isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : _cof(it) == 'RegExp');
-};
-
-// helper for String#{startsWith, endsWith, includes}
-
-
-
-var _stringContext = function (that, searchString, NAME) {
- if (_isRegexp(searchString)) throw TypeError('String#' + NAME + " doesn't accept regex!");
- return String(_defined(that));
-};
-
-var MATCH$1 = _wks('match');
-var _failsIsRegexp = function (KEY) {
- var re = /./;
- try {
- '/./'[KEY](re);
- } catch (e) {
- try {
- re[MATCH$1] = false;
- return !'/./'[KEY](re);
- } catch (f) { /* empty */ }
- } return true;
-};
-
-var STARTS_WITH = 'startsWith';
-var $startsWith = ''[STARTS_WITH];
-
-_export(_export.P + _export.F * _failsIsRegexp(STARTS_WITH), 'String', {
- startsWith: function startsWith(searchString /* , position = 0 */) {
- var that = _stringContext(this, searchString, STARTS_WITH);
- var index = _toLength(Math.min(arguments.length > 1 ? arguments[1] : undefined, that.length));
- var search = String(searchString);
- return $startsWith
- ? $startsWith.call(that, search, index)
- : that.slice(index, index + search.length) === search;
- }
-});
-
-var ENDS_WITH = 'endsWith';
-var $endsWith = ''[ENDS_WITH];
-
-_export(_export.P + _export.F * _failsIsRegexp(ENDS_WITH), 'String', {
- endsWith: function endsWith(searchString /* , endPosition = @length */) {
- var that = _stringContext(this, searchString, ENDS_WITH);
- var endPosition = arguments.length > 1 ? arguments[1] : undefined;
- var len = _toLength(that.length);
- var end = endPosition === undefined ? len : Math.min(_toLength(endPosition), len);
- var search = String(searchString);
- return $endsWith
- ? $endsWith.call(that, search, end)
- : that.slice(end - search.length, end) === search;
- }
-});
-
-var INCLUDES = 'includes';
-
-_export(_export.P + _export.F * _failsIsRegexp(INCLUDES), 'String', {
- includes: function includes(searchString /* , position = 0 */) {
- return !!~_stringContext(this, searchString, INCLUDES)
- .indexOf(searchString, arguments.length > 1 ? arguments[1] : undefined);
- }
-});
-
-// 21.2.5.3 get RegExp.prototype.flags
-
-var _flags = function () {
- var that = _anObject(this);
- var result = '';
- if (that.global) result += 'g';
- if (that.ignoreCase) result += 'i';
- if (that.multiline) result += 'm';
- if (that.unicode) result += 'u';
- if (that.sticky) result += 'y';
- return result;
-};
-
-// 21.2.5.3 get RegExp.prototype.flags()
-if (_descriptors && /./g.flags != 'g') _objectDp.f(RegExp.prototype, 'flags', {
- configurable: true,
- get: _flags
-});
-
-var _fixReWks = function (KEY, length, exec) {
- var SYMBOL = _wks(KEY);
- var fns = exec(_defined, SYMBOL, ''[KEY]);
- var strfn = fns[0];
- var rxfn = fns[1];
- if (_fails(function () {
- var O = {};
- O[SYMBOL] = function () { return 7; };
- return ''[KEY](O) != 7;
- })) {
- _redefine(String.prototype, KEY, strfn);
- _hide(RegExp.prototype, SYMBOL, length == 2
- // 21.2.5.8 RegExp.prototype[@@replace](string, replaceValue)
- // 21.2.5.11 RegExp.prototype[@@split](string, limit)
- ? function (string, arg) { return rxfn.call(string, this, arg); }
- // 21.2.5.6 RegExp.prototype[@@match](string)
- // 21.2.5.9 RegExp.prototype[@@search](string)
- : function (string) { return rxfn.call(string, this); }
- );
- }
-};
-
-// @@match logic
-_fixReWks('match', 1, function (defined, MATCH, $match) {
- // 21.1.3.11 String.prototype.match(regexp)
- return [function match(regexp) {
- var O = defined(this);
- var fn = regexp == undefined ? undefined : regexp[MATCH];
- return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[MATCH](String(O));
- }, $match];
-});
-
-// @@replace logic
-_fixReWks('replace', 2, function (defined, REPLACE, $replace) {
- // 21.1.3.14 String.prototype.replace(searchValue, replaceValue)
- return [function replace(searchValue, replaceValue) {
- var O = defined(this);
- var fn = searchValue == undefined ? undefined : searchValue[REPLACE];
- return fn !== undefined
- ? fn.call(searchValue, O, replaceValue)
- : $replace.call(String(O), searchValue, replaceValue);
- }, $replace];
-});
-
-// @@split logic
-_fixReWks('split', 2, function (defined, SPLIT, $split) {
- var isRegExp = _isRegexp;
- var _split = $split;
- var $push = [].push;
- var $SPLIT = 'split';
- var LENGTH = 'length';
- var LAST_INDEX = 'lastIndex';
- if (
- 'abbc'[$SPLIT](/(b)*/)[1] == 'c' ||
- 'test'[$SPLIT](/(?:)/, -1)[LENGTH] != 4 ||
- 'ab'[$SPLIT](/(?:ab)*/)[LENGTH] != 2 ||
- '.'[$SPLIT](/(.?)(.?)/)[LENGTH] != 4 ||
- '.'[$SPLIT](/()()/)[LENGTH] > 1 ||
- ''[$SPLIT](/.?/)[LENGTH]
- ) {
- var NPCG = /()??/.exec('')[1] === undefined; // nonparticipating capturing group
- // based on es5-shim implementation, need to rework it
- $split = function (separator, limit) {
- var string = String(this);
- if (separator === undefined && limit === 0) return [];
- // If `separator` is not a regex, use native split
- if (!isRegExp(separator)) return _split.call(string, separator, limit);
- var output = [];
- var flags = (separator.ignoreCase ? 'i' : '') +
- (separator.multiline ? 'm' : '') +
- (separator.unicode ? 'u' : '') +
- (separator.sticky ? 'y' : '');
- var lastLastIndex = 0;
- var splitLimit = limit === undefined ? 4294967295 : limit >>> 0;
- // Make `global` and avoid `lastIndex` issues by working with a copy
- var separatorCopy = new RegExp(separator.source, flags + 'g');
- var separator2, match, lastIndex, lastLength, i;
- // Doesn't need flags gy, but they don't hurt
- if (!NPCG) separator2 = new RegExp('^' + separatorCopy.source + '$(?!\\s)', flags);
- while (match = separatorCopy.exec(string)) {
- // `separatorCopy.lastIndex` is not reliable cross-browser
- lastIndex = match.index + match[0][LENGTH];
- if (lastIndex > lastLastIndex) {
- output.push(string.slice(lastLastIndex, match.index));
- // Fix browsers whose `exec` methods don't consistently return `undefined` for NPCG
- // eslint-disable-next-line no-loop-func
- if (!NPCG && match[LENGTH] > 1) match[0].replace(separator2, function () {
- for (i = 1; i < arguments[LENGTH] - 2; i++) if (arguments[i] === undefined) match[i] = undefined;
- });
- if (match[LENGTH] > 1 && match.index < string[LENGTH]) $push.apply(output, match.slice(1));
- lastLength = match[0][LENGTH];
- lastLastIndex = lastIndex;
- if (output[LENGTH] >= splitLimit) break;
- }
- if (separatorCopy[LAST_INDEX] === match.index) separatorCopy[LAST_INDEX]++; // Avoid an infinite loop
- }
- if (lastLastIndex === string[LENGTH]) {
- if (lastLength || !separatorCopy.test('')) output.push('');
- } else output.push(string.slice(lastLastIndex));
- return output[LENGTH] > splitLimit ? output.slice(0, splitLimit) : output;
- };
- // Chakra, V8
- } else if ('0'[$SPLIT](undefined, 0)[LENGTH]) {
- $split = function (separator, limit) {
- return separator === undefined && limit === 0 ? [] : _split.call(this, separator, limit);
- };
- }
- // 21.1.3.17 String.prototype.split(separator, limit)
- return [function split(separator, limit) {
- var O = defined(this);
- var fn = separator == undefined ? undefined : separator[SPLIT];
- return fn !== undefined ? fn.call(separator, O, limit) : $split.call(String(O), separator, limit);
- }, $split];
-});
-
-// @@search logic
-_fixReWks('search', 1, function (defined, SEARCH, $search) {
- // 21.1.3.15 String.prototype.search(regexp)
- return [function search(regexp) {
- var O = defined(this);
- var fn = regexp == undefined ? undefined : regexp[SEARCH];
- return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[SEARCH](String(O));
- }, $search];
-});
-
-var _createProperty = function (object, index, value) {
- if (index in object) _objectDp.f(object, index, _propertyDesc(0, value));
- else object[index] = value;
-};
-
-_export(_export.S + _export.F * !_iterDetect(function (iter) { }), 'Array', {
- // 22.1.2.1 Array.from(arrayLike, mapfn = undefined, thisArg = undefined)
- from: function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {
- var O = _toObject(arrayLike);
- var C = typeof this == 'function' ? this : Array;
- var aLen = arguments.length;
- var mapfn = aLen > 1 ? arguments[1] : undefined;
- var mapping = mapfn !== undefined;
- var index = 0;
- var iterFn = core_getIteratorMethod(O);
- var length, result, step, iterator;
- if (mapping) mapfn = _ctx(mapfn, aLen > 2 ? arguments[2] : undefined, 2);
- // if object isn't iterable or it's array with default iterator - use simple case
- if (iterFn != undefined && !(C == Array && _isArrayIter(iterFn))) {
- for (iterator = iterFn.call(O), result = new C(); !(step = iterator.next()).done; index++) {
- _createProperty(result, index, mapping ? _iterCall(iterator, mapfn, [step.value, index], true) : step.value);
- }
- } else {
- length = _toLength(O.length);
- for (result = new C(length); length > index; index++) {
- _createProperty(result, index, mapping ? mapfn(O[index], index) : O[index]);
- }
- }
- result.length = index;
- return result;
- }
-});
-
-// WebKit Array.of isn't generic
-_export(_export.S + _export.F * _fails(function () {
- function F() { /* empty */ }
- return !(Array.of.call(F) instanceof F);
-}), 'Array', {
- // 22.1.2.3 Array.of( ...items)
- of: function of(/* ...args */) {
- var index = 0;
- var aLen = arguments.length;
- var result = new (typeof this == 'function' ? this : Array)(aLen);
- while (aLen > index) _createProperty(result, index, arguments[index++]);
- result.length = aLen;
- return result;
- }
-});
-
-// 22.1.3.3 Array.prototype.copyWithin(target, start, end = this.length)
-
-
-_export(_export.P, 'Array', { copyWithin: _arrayCopyWithin });
-
-_addToUnscopables('copyWithin');
-
-// 22.1.3.8 Array.prototype.find(predicate, thisArg = undefined)
-
-var $find = _arrayMethods(5);
-var KEY = 'find';
-var forced = true;
-// Shouldn't skip holes
-if (KEY in []) Array(1)[KEY](function () { forced = false; });
-_export(_export.P + _export.F * forced, 'Array', {
- find: function find(callbackfn /* , that = undefined */) {
- return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
- }
-});
-_addToUnscopables(KEY);
-
-// 22.1.3.9 Array.prototype.findIndex(predicate, thisArg = undefined)
-
-var $find$1 = _arrayMethods(6);
-var KEY$1 = 'findIndex';
-var forced$1 = true;
-// Shouldn't skip holes
-if (KEY$1 in []) Array(1)[KEY$1](function () { forced$1 = false; });
-_export(_export.P + _export.F * forced$1, 'Array', {
- findIndex: function findIndex(callbackfn /* , that = undefined */) {
- return $find$1(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
- }
-});
-_addToUnscopables(KEY$1);
-
-// 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length)
-
-
-_export(_export.P, 'Array', { fill: _arrayFill });
-
-_addToUnscopables('fill');
+ function set(target, propertyKey, V /* , receiver */) {
+ var receiver = arguments.length < 4 ? target : arguments[3];
+ var ownDesc = _objectGopd.f(_anObject(target), propertyKey);
+ var existingDescriptor, proto;
+ if (!ownDesc) {
+ if (_isObject(proto = _objectGpo(target))) {
+ return set(proto, propertyKey, V, receiver);
+ }
+ ownDesc = _propertyDesc(0);
+ }
+ if (_has(ownDesc, 'value')) {
+ if (ownDesc.writable === false || !_isObject(receiver)) return false;
+ existingDescriptor = _objectGopd.f(receiver, propertyKey) || _propertyDesc(0);
+ existingDescriptor.value = V;
+ _objectDp.f(receiver, propertyKey, existingDescriptor);
+ return true;
+ }
+ return ownDesc.set === undefined ? false : (ownDesc.set.call(receiver, V), true);
+ }
+
+ _export(_export.S, 'Reflect', { set: set });
+
+ // 26.1.14 Reflect.setPrototypeOf(target, proto)
+
+
+
+ if (_setProto) _export(_export.S, 'Reflect', {
+ setPrototypeOf: function setPrototypeOf(target, proto) {
+ _setProto.check(target, proto);
+ try {
+ _setProto.set(target, proto);
+ return true;
+ } catch (e) {
+ return false;
+ }
+ }
+ });
+
+ var process = _global.process;
+ var setTask = _global.setImmediate;
+ var clearTask = _global.clearImmediate;
+ var MessageChannel = _global.MessageChannel;
+ var Dispatch = _global.Dispatch;
+ var counter = 0;
+ var queue = {};
+ var ONREADYSTATECHANGE = 'onreadystatechange';
+ var defer, channel, port;
+ var run = function () {
+ var id = +this;
+ // eslint-disable-next-line no-prototype-builtins
+ if (queue.hasOwnProperty(id)) {
+ var fn = queue[id];
+ delete queue[id];
+ fn();
+ }
+ };
+ var listener = function (event) {
+ run.call(event.data);
+ };
+ // Node.js 0.9+ & IE10+ has setImmediate, otherwise:
+ if (!setTask || !clearTask) {
+ setTask = function setImmediate(fn) {
+ var args = [];
+ var i = 1;
+ while (arguments.length > i) args.push(arguments[i++]);
+ queue[++counter] = function () {
+ // eslint-disable-next-line no-new-func
+ _invoke(typeof fn == 'function' ? fn : Function(fn), args);
+ };
+ defer(counter);
+ return counter;
+ };
+ clearTask = function clearImmediate(id) {
+ delete queue[id];
+ };
+ // Node.js 0.8-
+ if (_cof(process) == 'process') {
+ defer = function (id) {
+ process.nextTick(_ctx(run, id, 1));
+ };
+ // Sphere (JS game engine) Dispatch API
+ } else if (Dispatch && Dispatch.now) {
+ defer = function (id) {
+ Dispatch.now(_ctx(run, id, 1));
+ };
+ // Browsers with MessageChannel, includes WebWorkers
+ } else if (MessageChannel) {
+ channel = new MessageChannel();
+ port = channel.port2;
+ channel.port1.onmessage = listener;
+ defer = _ctx(port.postMessage, port, 1);
+ // Browsers with postMessage, skip WebWorkers
+ // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'
+ } else if (_global.addEventListener && typeof postMessage == 'function' && !_global.importScripts) {
+ defer = function (id) {
+ _global.postMessage(id + '', '*');
+ };
+ _global.addEventListener('message', listener, false);
+ // IE8-
+ } else if (ONREADYSTATECHANGE in _domCreate('script')) {
+ defer = function (id) {
+ _html.appendChild(_domCreate('script'))[ONREADYSTATECHANGE] = function () {
+ _html.removeChild(this);
+ run.call(id);
+ };
+ };
+ // Rest old browsers
+ } else {
+ defer = function (id) {
+ setTimeout(_ctx(run, id, 1), 0);
+ };
+ }
+ }
+ var _task = {
+ set: setTask,
+ clear: clearTask
+ };
+
+ var macrotask = _task.set;
+ var Observer = _global.MutationObserver || _global.WebKitMutationObserver;
+ var process$1 = _global.process;
+ var Promise$1 = _global.Promise;
+ var isNode = _cof(process$1) == 'process';
+
+ var _microtask = function () {
+ var head, last, notify;
+
+ var flush = function () {
+ var parent, fn;
+ if (isNode && (parent = process$1.domain)) parent.exit();
+ while (head) {
+ fn = head.fn;
+ head = head.next;
+ try {
+ fn();
+ } catch (e) {
+ if (head) notify();
+ else last = undefined;
+ throw e;
+ }
+ } last = undefined;
+ if (parent) parent.enter();
+ };
+
+ // Node.js
+ if (isNode) {
+ notify = function () {
+ process$1.nextTick(flush);
+ };
+ // browsers with MutationObserver, except iOS Safari - https://github.com/zloirock/core-js/issues/339
+ } else if (Observer && !(_global.navigator && _global.navigator.standalone)) {
+ var toggle = true;
+ var node = document.createTextNode('');
+ new Observer(flush).observe(node, { characterData: true }); // eslint-disable-line no-new
+ notify = function () {
+ node.data = toggle = !toggle;
+ };
+ // environments with maybe non-completely correct, but existent Promise
+ } else if (Promise$1 && Promise$1.resolve) {
+ var promise = Promise$1.resolve();
+ notify = function () {
+ promise.then(flush);
+ };
+ // for other environments - macrotask based on:
+ // - setImmediate
+ // - MessageChannel
+ // - window.postMessag
+ // - onreadystatechange
+ // - setTimeout
+ } else {
+ notify = function () {
+ // strange IE + webpack dev server bug - use .call(global)
+ macrotask.call(_global, flush);
+ };
+ }
+
+ return function (fn) {
+ var task = { fn: fn, next: undefined };
+ if (last) last.next = task;
+ if (!head) {
+ head = task;
+ notify();
+ } last = task;
+ };
+ };
+
+ // 25.4.1.5 NewPromiseCapability(C)
+
+
+ function PromiseCapability(C) {
+ var resolve, reject;
+ this.promise = new C(function ($$resolve, $$reject) {
+ if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor');
+ resolve = $$resolve;
+ reject = $$reject;
+ });
+ this.resolve = _aFunction(resolve);
+ this.reject = _aFunction(reject);
+ }
+
+ var f$5 = function (C) {
+ return new PromiseCapability(C);
+ };
+
+ var _newPromiseCapability = {
+ f: f$5
+ };
+
+ var _perform = function (exec) {
+ try {
+ return { e: false, v: exec() };
+ } catch (e) {
+ return { e: true, v: e };
+ }
+ };
+
+ var _promiseResolve = function (C, x) {
+ _anObject(C);
+ if (_isObject(x) && x.constructor === C) return x;
+ var promiseCapability = _newPromiseCapability.f(C);
+ var resolve = promiseCapability.resolve;
+ resolve(x);
+ return promiseCapability.promise;
+ };
+
+ var task = _task.set;
+ var microtask = _microtask();
+
+
+
+ var PROMISE = 'Promise';
+ var TypeError$1 = _global.TypeError;
+ var process$2 = _global.process;
+ var $Promise = _global[PROMISE];
+ var isNode$1 = _classof(process$2) == 'process';
+ var empty = function () { /* empty */ };
+ var Internal, newGenericPromiseCapability, OwnPromiseCapability, Wrapper;
+ var newPromiseCapability = newGenericPromiseCapability = _newPromiseCapability.f;
+
+ var USE_NATIVE = !!function () {
+ try {
+ // correct subclassing with @@species support
+ var promise = $Promise.resolve(1);
+ var FakePromise = (promise.constructor = {})[_wks('species')] = function (exec) {
+ exec(empty, empty);
+ };
+ // unhandled rejections tracking support, NodeJS Promise without it fails @@species test
+ return (isNode$1 || typeof PromiseRejectionEvent == 'function') && promise.then(empty) instanceof FakePromise;
+ } catch (e) { /* empty */ }
+ }();
+
+ // helpers
+ var isThenable = function (it) {
+ var then;
+ return _isObject(it) && typeof (then = it.then) == 'function' ? then : false;
+ };
+ var notify = function (promise, isReject) {
+ if (promise._n) return;
+ promise._n = true;
+ var chain = promise._c;
+ microtask(function () {
+ var value = promise._v;
+ var ok = promise._s == 1;
+ var i = 0;
+ var run = function (reaction) {
+ var handler = ok ? reaction.ok : reaction.fail;
+ var resolve = reaction.resolve;
+ var reject = reaction.reject;
+ var domain = reaction.domain;
+ var result, then;
+ try {
+ if (handler) {
+ if (!ok) {
+ if (promise._h == 2) onHandleUnhandled(promise);
+ promise._h = 1;
+ }
+ if (handler === true) result = value;
+ else {
+ if (domain) domain.enter();
+ result = handler(value);
+ if (domain) domain.exit();
+ }
+ if (result === reaction.promise) {
+ reject(TypeError$1('Promise-chain cycle'));
+ } else if (then = isThenable(result)) {
+ then.call(result, resolve, reject);
+ } else resolve(result);
+ } else reject(value);
+ } catch (e) {
+ reject(e);
+ }
+ };
+ while (chain.length > i) run(chain[i++]); // variable length - can't use forEach
+ promise._c = [];
+ promise._n = false;
+ if (isReject && !promise._h) onUnhandled(promise);
+ });
+ };
+ var onUnhandled = function (promise) {
+ task.call(_global, function () {
+ var value = promise._v;
+ var unhandled = isUnhandled(promise);
+ var result, handler, console;
+ if (unhandled) {
+ result = _perform(function () {
+ if (isNode$1) {
+ process$2.emit('unhandledRejection', value, promise);
+ } else if (handler = _global.onunhandledrejection) {
+ handler({ promise: promise, reason: value });
+ } else if ((console = _global.console) && console.error) {
+ console.error('Unhandled promise rejection', value);
+ }
+ });
+ // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should
+ promise._h = isNode$1 || isUnhandled(promise) ? 2 : 1;
+ } promise._a = undefined;
+ if (unhandled && result.e) throw result.v;
+ });
+ };
+ var isUnhandled = function (promise) {
+ return promise._h !== 1 && (promise._a || promise._c).length === 0;
+ };
+ var onHandleUnhandled = function (promise) {
+ task.call(_global, function () {
+ var handler;
+ if (isNode$1) {
+ process$2.emit('rejectionHandled', promise);
+ } else if (handler = _global.onrejectionhandled) {
+ handler({ promise: promise, reason: promise._v });
+ }
+ });
+ };
+ var $reject = function (value) {
+ var promise = this;
+ if (promise._d) return;
+ promise._d = true;
+ promise = promise._w || promise; // unwrap
+ promise._v = value;
+ promise._s = 2;
+ if (!promise._a) promise._a = promise._c.slice();
+ notify(promise, true);
+ };
+ var $resolve = function (value) {
+ var promise = this;
+ var then;
+ if (promise._d) return;
+ promise._d = true;
+ promise = promise._w || promise; // unwrap
+ try {
+ if (promise === value) throw TypeError$1("Promise can't be resolved itself");
+ if (then = isThenable(value)) {
+ microtask(function () {
+ var wrapper = { _w: promise, _d: false }; // wrap
+ try {
+ then.call(value, _ctx($resolve, wrapper, 1), _ctx($reject, wrapper, 1));
+ } catch (e) {
+ $reject.call(wrapper, e);
+ }
+ });
+ } else {
+ promise._v = value;
+ promise._s = 1;
+ notify(promise, false);
+ }
+ } catch (e) {
+ $reject.call({ _w: promise, _d: false }, e); // wrap
+ }
+ };
+
+ // constructor polyfill
+ if (!USE_NATIVE) {
+ // 25.4.3.1 Promise(executor)
+ $Promise = function Promise(executor) {
+ _anInstance(this, $Promise, PROMISE, '_h');
+ _aFunction(executor);
+ Internal.call(this);
+ try {
+ executor(_ctx($resolve, this, 1), _ctx($reject, this, 1));
+ } catch (err) {
+ $reject.call(this, err);
+ }
+ };
+ // eslint-disable-next-line no-unused-vars
+ Internal = function Promise(executor) {
+ this._c = []; // <- awaiting reactions
+ this._a = undefined; // <- checked in isUnhandled reactions
+ this._s = 0; // <- state
+ this._d = false; // <- done
+ this._v = undefined; // <- value
+ this._h = 0; // <- rejection state, 0 - default, 1 - handled, 2 - unhandled
+ this._n = false; // <- notify
+ };
+ Internal.prototype = _redefineAll($Promise.prototype, {
+ // 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected)
+ then: function then(onFulfilled, onRejected) {
+ var reaction = newPromiseCapability(_speciesConstructor(this, $Promise));
+ reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;
+ reaction.fail = typeof onRejected == 'function' && onRejected;
+ reaction.domain = isNode$1 ? process$2.domain : undefined;
+ this._c.push(reaction);
+ if (this._a) this._a.push(reaction);
+ if (this._s) notify(this, false);
+ return reaction.promise;
+ },
+ // 25.4.5.1 Promise.prototype.catch(onRejected)
+ 'catch': function (onRejected) {
+ return this.then(undefined, onRejected);
+ }
+ });
+ OwnPromiseCapability = function () {
+ var promise = new Internal();
+ this.promise = promise;
+ this.resolve = _ctx($resolve, promise, 1);
+ this.reject = _ctx($reject, promise, 1);
+ };
+ _newPromiseCapability.f = newPromiseCapability = function (C) {
+ return C === $Promise || C === Wrapper
+ ? new OwnPromiseCapability(C)
+ : newGenericPromiseCapability(C);
+ };
+ }
+
+ _export(_export.G + _export.W + _export.F * !USE_NATIVE, { Promise: $Promise });
+ _setToStringTag($Promise, PROMISE);
+ _setSpecies(PROMISE);
+ Wrapper = _core[PROMISE];
+
+ // statics
+ _export(_export.S + _export.F * !USE_NATIVE, PROMISE, {
+ // 25.4.4.5 Promise.reject(r)
+ reject: function reject(r) {
+ var capability = newPromiseCapability(this);
+ var $$reject = capability.reject;
+ $$reject(r);
+ return capability.promise;
+ }
+ });
+ _export(_export.S + _export.F * (!USE_NATIVE), PROMISE, {
+ // 25.4.4.6 Promise.resolve(x)
+ resolve: function resolve(x) {
+ return _promiseResolve(_library && this === Wrapper ? $Promise : this, x);
+ }
+ });
+ _export(_export.S + _export.F * !(USE_NATIVE && _iterDetect(function (iter) {
+ $Promise.all(iter)['catch'](empty);
+ })), PROMISE, {
+ // 25.4.4.1 Promise.all(iterable)
+ all: function all(iterable) {
+ var C = this;
+ var capability = newPromiseCapability(C);
+ var resolve = capability.resolve;
+ var reject = capability.reject;
+ var result = _perform(function () {
+ var values = [];
+ var index = 0;
+ var remaining = 1;
+ _forOf(iterable, false, function (promise) {
+ var $index = index++;
+ var alreadyCalled = false;
+ values.push(undefined);
+ remaining++;
+ C.resolve(promise).then(function (value) {
+ if (alreadyCalled) return;
+ alreadyCalled = true;
+ values[$index] = value;
+ --remaining || resolve(values);
+ }, reject);
+ });
+ --remaining || resolve(values);
+ });
+ if (result.e) reject(result.v);
+ return capability.promise;
+ },
+ // 25.4.4.4 Promise.race(iterable)
+ race: function race(iterable) {
+ var C = this;
+ var capability = newPromiseCapability(C);
+ var reject = capability.reject;
+ var result = _perform(function () {
+ _forOf(iterable, false, function (promise) {
+ C.resolve(promise).then(capability.resolve, reject);
+ });
+ });
+ if (result.e) reject(result.v);
+ return capability.promise;
+ }
+ });
+
+ var f$6 = _wks;
+
+ var _wksExt = {
+ f: f$6
+ };
+
+ var defineProperty = _objectDp.f;
+ var _wksDefine = function (name) {
+ var $Symbol = _core.Symbol || (_core.Symbol = _global.Symbol || {});
+ if (name.charAt(0) != '_' && !(name in $Symbol)) defineProperty($Symbol, name, { value: _wksExt.f(name) });
+ };
+
+ // all enumerable object keys, includes symbols
+
+
+
+ var _enumKeys = function (it) {
+ var result = _objectKeys(it);
+ var getSymbols = _objectGops.f;
+ if (getSymbols) {
+ var symbols = getSymbols(it);
+ var isEnum = _objectPie.f;
+ var i = 0;
+ var key;
+ while (symbols.length > i) if (isEnum.call(it, key = symbols[i++])) result.push(key);
+ } return result;
+ };
+
+ // fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window
+
+ var gOPN = _objectGopn.f;
+ var toString$1 = {}.toString;
+
+ var windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames
+ ? Object.getOwnPropertyNames(window) : [];
+
+ var getWindowNames = function (it) {
+ try {
+ return gOPN(it);
+ } catch (e) {
+ return windowNames.slice();
+ }
+ };
+
+ var f$7 = function getOwnPropertyNames(it) {
+ return windowNames && toString$1.call(it) == '[object Window]' ? getWindowNames(it) : gOPN(_toIobject(it));
+ };
+
+ var _objectGopnExt = {
+ f: f$7
+ };
+
+ // ECMAScript 6 symbols shim
+
+
+
+
+
+ var META = _meta.KEY;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ var gOPD$2 = _objectGopd.f;
+ var dP$2 = _objectDp.f;
+ var gOPN$1 = _objectGopnExt.f;
+ var $Symbol = _global.Symbol;
+ var $JSON = _global.JSON;
+ var _stringify = $JSON && $JSON.stringify;
+ var PROTOTYPE$2 = 'prototype';
+ var HIDDEN = _wks('_hidden');
+ var TO_PRIMITIVE = _wks('toPrimitive');
+ var isEnum = {}.propertyIsEnumerable;
+ var SymbolRegistry = _shared('symbol-registry');
+ var AllSymbols = _shared('symbols');
+ var OPSymbols = _shared('op-symbols');
+ var ObjectProto$1 = Object[PROTOTYPE$2];
+ var USE_NATIVE$1 = typeof $Symbol == 'function';
+ var QObject = _global.QObject;
+ // Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173
+ var setter = !QObject || !QObject[PROTOTYPE$2] || !QObject[PROTOTYPE$2].findChild;
+
+ // fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687
+ var setSymbolDesc = _descriptors && _fails(function () {
+ return _objectCreate(dP$2({}, 'a', {
+ get: function () { return dP$2(this, 'a', { value: 7 }).a; }
+ })).a != 7;
+ }) ? function (it, key, D) {
+ var protoDesc = gOPD$2(ObjectProto$1, key);
+ if (protoDesc) delete ObjectProto$1[key];
+ dP$2(it, key, D);
+ if (protoDesc && it !== ObjectProto$1) dP$2(ObjectProto$1, key, protoDesc);
+ } : dP$2;
+
+ var wrap = function (tag) {
+ var sym = AllSymbols[tag] = _objectCreate($Symbol[PROTOTYPE$2]);
+ sym._k = tag;
+ return sym;
+ };
+
+ var isSymbol = USE_NATIVE$1 && typeof $Symbol.iterator == 'symbol' ? function (it) {
+ return typeof it == 'symbol';
+ } : function (it) {
+ return it instanceof $Symbol;
+ };
+
+ var $defineProperty = function defineProperty(it, key, D) {
+ if (it === ObjectProto$1) $defineProperty(OPSymbols, key, D);
+ _anObject(it);
+ key = _toPrimitive(key, true);
+ _anObject(D);
+ if (_has(AllSymbols, key)) {
+ if (!D.enumerable) {
+ if (!_has(it, HIDDEN)) dP$2(it, HIDDEN, _propertyDesc(1, {}));
+ it[HIDDEN][key] = true;
+ } else {
+ if (_has(it, HIDDEN) && it[HIDDEN][key]) it[HIDDEN][key] = false;
+ D = _objectCreate(D, { enumerable: _propertyDesc(0, false) });
+ } return setSymbolDesc(it, key, D);
+ } return dP$2(it, key, D);
+ };
+ var $defineProperties = function defineProperties(it, P) {
+ _anObject(it);
+ var keys = _enumKeys(P = _toIobject(P));
+ var i = 0;
+ var l = keys.length;
+ var key;
+ while (l > i) $defineProperty(it, key = keys[i++], P[key]);
+ return it;
+ };
+ var $create = function create(it, P) {
+ return P === undefined ? _objectCreate(it) : $defineProperties(_objectCreate(it), P);
+ };
+ var $propertyIsEnumerable = function propertyIsEnumerable(key) {
+ var E = isEnum.call(this, key = _toPrimitive(key, true));
+ if (this === ObjectProto$1 && _has(AllSymbols, key) && !_has(OPSymbols, key)) return false;
+ return E || !_has(this, key) || !_has(AllSymbols, key) || _has(this, HIDDEN) && this[HIDDEN][key] ? E : true;
+ };
+ var $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key) {
+ it = _toIobject(it);
+ key = _toPrimitive(key, true);
+ if (it === ObjectProto$1 && _has(AllSymbols, key) && !_has(OPSymbols, key)) return;
+ var D = gOPD$2(it, key);
+ if (D && _has(AllSymbols, key) && !(_has(it, HIDDEN) && it[HIDDEN][key])) D.enumerable = true;
+ return D;
+ };
+ var $getOwnPropertyNames = function getOwnPropertyNames(it) {
+ var names = gOPN$1(_toIobject(it));
+ var result = [];
+ var i = 0;
+ var key;
+ while (names.length > i) {
+ if (!_has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META) result.push(key);
+ } return result;
+ };
+ var $getOwnPropertySymbols = function getOwnPropertySymbols(it) {
+ var IS_OP = it === ObjectProto$1;
+ var names = gOPN$1(IS_OP ? OPSymbols : _toIobject(it));
+ var result = [];
+ var i = 0;
+ var key;
+ while (names.length > i) {
+ if (_has(AllSymbols, key = names[i++]) && (IS_OP ? _has(ObjectProto$1, key) : true)) result.push(AllSymbols[key]);
+ } return result;
+ };
+
+ // 19.4.1.1 Symbol([description])
+ if (!USE_NATIVE$1) {
+ $Symbol = function Symbol() {
+ if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor!');
+ var tag = _uid(arguments.length > 0 ? arguments[0] : undefined);
+ var $set = function (value) {
+ if (this === ObjectProto$1) $set.call(OPSymbols, value);
+ if (_has(this, HIDDEN) && _has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;
+ setSymbolDesc(this, tag, _propertyDesc(1, value));
+ };
+ if (_descriptors && setter) setSymbolDesc(ObjectProto$1, tag, { configurable: true, set: $set });
+ return wrap(tag);
+ };
+ _redefine($Symbol[PROTOTYPE$2], 'toString', function toString() {
+ return this._k;
+ });
+
+ _objectGopd.f = $getOwnPropertyDescriptor;
+ _objectDp.f = $defineProperty;
+ _objectGopn.f = _objectGopnExt.f = $getOwnPropertyNames;
+ _objectPie.f = $propertyIsEnumerable;
+ _objectGops.f = $getOwnPropertySymbols;
+
+ if (_descriptors && !_library) {
+ _redefine(ObjectProto$1, 'propertyIsEnumerable', $propertyIsEnumerable, true);
+ }
+
+ _wksExt.f = function (name) {
+ return wrap(_wks(name));
+ };
+ }
+
+ _export(_export.G + _export.W + _export.F * !USE_NATIVE$1, { Symbol: $Symbol });
+
+ for (var es6Symbols = (
+ // 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14
+ 'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'
+ ).split(','), j = 0; es6Symbols.length > j;)_wks(es6Symbols[j++]);
+
+ for (var wellKnownSymbols = _objectKeys(_wks.store), k = 0; wellKnownSymbols.length > k;) _wksDefine(wellKnownSymbols[k++]);
+
+ _export(_export.S + _export.F * !USE_NATIVE$1, 'Symbol', {
+ // 19.4.2.1 Symbol.for(key)
+ 'for': function (key) {
+ return _has(SymbolRegistry, key += '')
+ ? SymbolRegistry[key]
+ : SymbolRegistry[key] = $Symbol(key);
+ },
+ // 19.4.2.5 Symbol.keyFor(sym)
+ keyFor: function keyFor(sym) {
+ if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol!');
+ for (var key in SymbolRegistry) if (SymbolRegistry[key] === sym) return key;
+ },
+ useSetter: function () { setter = true; },
+ useSimple: function () { setter = false; }
+ });
+
+ _export(_export.S + _export.F * !USE_NATIVE$1, 'Object', {
+ // 19.1.2.2 Object.create(O [, Properties])
+ create: $create,
+ // 19.1.2.4 Object.defineProperty(O, P, Attributes)
+ defineProperty: $defineProperty,
+ // 19.1.2.3 Object.defineProperties(O, Properties)
+ defineProperties: $defineProperties,
+ // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)
+ getOwnPropertyDescriptor: $getOwnPropertyDescriptor,
+ // 19.1.2.7 Object.getOwnPropertyNames(O)
+ getOwnPropertyNames: $getOwnPropertyNames,
+ // 19.1.2.8 Object.getOwnPropertySymbols(O)
+ getOwnPropertySymbols: $getOwnPropertySymbols
+ });
+
+ // 24.3.2 JSON.stringify(value [, replacer [, space]])
+ $JSON && _export(_export.S + _export.F * (!USE_NATIVE$1 || _fails(function () {
+ var S = $Symbol();
+ // MS Edge converts symbol values to JSON as {}
+ // WebKit converts symbol values to JSON as null
+ // V8 throws on boxed symbols
+ return _stringify([S]) != '[null]' || _stringify({ a: S }) != '{}' || _stringify(Object(S)) != '{}';
+ })), 'JSON', {
+ stringify: function stringify(it) {
+ var args = [it];
+ var i = 1;
+ var replacer, $replacer;
+ while (arguments.length > i) args.push(arguments[i++]);
+ $replacer = replacer = args[1];
+ if (!_isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined
+ if (!_isArray(replacer)) replacer = function (key, value) {
+ if (typeof $replacer == 'function') value = $replacer.call(this, key, value);
+ if (!isSymbol(value)) return value;
+ };
+ args[1] = replacer;
+ return _stringify.apply($JSON, args);
+ }
+ });
+
+ // 19.4.3.4 Symbol.prototype[@@toPrimitive](hint)
+ $Symbol[PROTOTYPE$2][TO_PRIMITIVE] || _hide($Symbol[PROTOTYPE$2], TO_PRIMITIVE, $Symbol[PROTOTYPE$2].valueOf);
+ // 19.4.3.5 Symbol.prototype[@@toStringTag]
+ _setToStringTag($Symbol, 'Symbol');
+ // 20.2.1.9 Math[@@toStringTag]
+ _setToStringTag(Math, 'Math', true);
+ // 24.3.3 JSON[@@toStringTag]
+ _setToStringTag(_global.JSON, 'JSON', true);
+
+ // most Object methods by ES6 should accept primitives
+
+
+
+ var _objectSap = function (KEY, exec) {
+ var fn = (_core.Object || {})[KEY] || Object[KEY];
+ var exp = {};
+ exp[KEY] = exec(fn);
+ _export(_export.S + _export.F * _fails(function () { fn(1); }), 'Object', exp);
+ };
+
+ // 19.1.2.5 Object.freeze(O)
+
+ var meta = _meta.onFreeze;
+
+ _objectSap('freeze', function ($freeze) {
+ return function freeze(it) {
+ return $freeze && _isObject(it) ? $freeze(meta(it)) : it;
+ };
+ });
+
+ // 19.1.2.17 Object.seal(O)
+
+ var meta$1 = _meta.onFreeze;
+
+ _objectSap('seal', function ($seal) {
+ return function seal(it) {
+ return $seal && _isObject(it) ? $seal(meta$1(it)) : it;
+ };
+ });
+
+ // 19.1.2.15 Object.preventExtensions(O)
+
+ var meta$2 = _meta.onFreeze;
+
+ _objectSap('preventExtensions', function ($preventExtensions) {
+ return function preventExtensions(it) {
+ return $preventExtensions && _isObject(it) ? $preventExtensions(meta$2(it)) : it;
+ };
+ });
+
+ // 19.1.2.12 Object.isFrozen(O)
+
+
+ _objectSap('isFrozen', function ($isFrozen) {
+ return function isFrozen(it) {
+ return _isObject(it) ? $isFrozen ? $isFrozen(it) : false : true;
+ };
+ });
+
+ // 19.1.2.13 Object.isSealed(O)
+
+
+ _objectSap('isSealed', function ($isSealed) {
+ return function isSealed(it) {
+ return _isObject(it) ? $isSealed ? $isSealed(it) : false : true;
+ };
+ });
+
+ // 19.1.2.11 Object.isExtensible(O)
+
+
+ _objectSap('isExtensible', function ($isExtensible) {
+ return function isExtensible(it) {
+ return _isObject(it) ? $isExtensible ? $isExtensible(it) : true : false;
+ };
+ });
+
+ // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)
+
+ var $getOwnPropertyDescriptor$1 = _objectGopd.f;
+
+ _objectSap('getOwnPropertyDescriptor', function () {
+ return function getOwnPropertyDescriptor(it, key) {
+ return $getOwnPropertyDescriptor$1(_toIobject(it), key);
+ };
+ });
+
+ // 19.1.2.9 Object.getPrototypeOf(O)
+
+
+
+ _objectSap('getPrototypeOf', function () {
+ return function getPrototypeOf(it) {
+ return _objectGpo(_toObject(it));
+ };
+ });
+
+ // 19.1.2.14 Object.keys(O)
+
+
+
+ _objectSap('keys', function () {
+ return function keys(it) {
+ return _objectKeys(_toObject(it));
+ };
+ });
+
+ // 19.1.2.7 Object.getOwnPropertyNames(O)
+ _objectSap('getOwnPropertyNames', function () {
+ return _objectGopnExt.f;
+ });
+
+ // 19.1.3.1 Object.assign(target, source)
+
+
+ _export(_export.S + _export.F, 'Object', { assign: _objectAssign });
+
+ // 7.2.9 SameValue(x, y)
+ var _sameValue = Object.is || function is(x, y) {
+ // eslint-disable-next-line no-self-compare
+ return x === y ? x !== 0 || 1 / x === 1 / y : x != x && y != y;
+ };
+
+ // 19.1.3.10 Object.is(value1, value2)
+
+ _export(_export.S, 'Object', { is: _sameValue });
+
+ var dP$3 = _objectDp.f;
+ var FProto = Function.prototype;
+ var nameRE = /^\s*function ([^ (]*)/;
+ var NAME = 'name';
+
+ // 19.2.4.2 name
+ NAME in FProto || _descriptors && dP$3(FProto, NAME, {
+ configurable: true,
+ get: function () {
+ try {
+ return ('' + this).match(nameRE)[1];
+ } catch (e) {
+ return '';
+ }
+ }
+ });
+
+ _export(_export.S, 'String', {
+ // 21.1.2.4 String.raw(callSite, ...substitutions)
+ raw: function raw(callSite) {
+ var tpl = _toIobject(callSite.raw);
+ var len = _toLength(tpl.length);
+ var aLen = arguments.length;
+ var res = [];
+ var i = 0;
+ while (len > i) {
+ res.push(String(tpl[i++]));
+ if (i < aLen) res.push(String(arguments[i]));
+ } return res.join('');
+ }
+ });
+
+ var fromCharCode = String.fromCharCode;
+ var $fromCodePoint = String.fromCodePoint;
+
+ // length should be 1, old FF problem
+ _export(_export.S + _export.F * (!!$fromCodePoint && $fromCodePoint.length != 1), 'String', {
+ // 21.1.2.2 String.fromCodePoint(...codePoints)
+ fromCodePoint: function fromCodePoint(x) { // eslint-disable-line no-unused-vars
+ var res = [];
+ var aLen = arguments.length;
+ var i = 0;
+ var code;
+ while (aLen > i) {
+ code = +arguments[i++];
+ if (_toAbsoluteIndex(code, 0x10ffff) !== code) throw RangeError(code + ' is not a valid code point');
+ res.push(code < 0x10000
+ ? fromCharCode(code)
+ : fromCharCode(((code -= 0x10000) >> 10) + 0xd800, code % 0x400 + 0xdc00)
+ );
+ } return res.join('');
+ }
+ });
+
+ // true -> String#at
+ // false -> String#codePointAt
+ var _stringAt = function (TO_STRING) {
+ return function (that, pos) {
+ var s = String(_defined(that));
+ var i = _toInteger(pos);
+ var l = s.length;
+ var a, b;
+ if (i < 0 || i >= l) return TO_STRING ? '' : undefined;
+ a = s.charCodeAt(i);
+ return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff
+ ? TO_STRING ? s.charAt(i) : a
+ : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;
+ };
+ };
+
+ var $at = _stringAt(false);
+ _export(_export.P, 'String', {
+ // 21.1.3.3 String.prototype.codePointAt(pos)
+ codePointAt: function codePointAt(pos) {
+ return $at(this, pos);
+ }
+ });
+
+ var _stringRepeat = function repeat(count) {
+ var str = String(_defined(this));
+ var res = '';
+ var n = _toInteger(count);
+ if (n < 0 || n == Infinity) throw RangeError("Count can't be negative");
+ for (;n > 0; (n >>>= 1) && (str += str)) if (n & 1) res += str;
+ return res;
+ };
+
+ _export(_export.P, 'String', {
+ // 21.1.3.13 String.prototype.repeat(count)
+ repeat: _stringRepeat
+ });
+
+ // 7.2.8 IsRegExp(argument)
+
+
+ var MATCH = _wks('match');
+ var _isRegexp = function (it) {
+ var isRegExp;
+ return _isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : _cof(it) == 'RegExp');
+ };
+
+ // helper for String#{startsWith, endsWith, includes}
+
+
+
+ var _stringContext = function (that, searchString, NAME) {
+ if (_isRegexp(searchString)) throw TypeError('String#' + NAME + " doesn't accept regex!");
+ return String(_defined(that));
+ };
+
+ var MATCH$1 = _wks('match');
+ var _failsIsRegexp = function (KEY) {
+ var re = /./;
+ try {
+ '/./'[KEY](re);
+ } catch (e) {
+ try {
+ re[MATCH$1] = false;
+ return !'/./'[KEY](re);
+ } catch (f) { /* empty */ }
+ } return true;
+ };
+
+ var STARTS_WITH = 'startsWith';
+ var $startsWith = ''[STARTS_WITH];
+
+ _export(_export.P + _export.F * _failsIsRegexp(STARTS_WITH), 'String', {
+ startsWith: function startsWith(searchString /* , position = 0 */) {
+ var that = _stringContext(this, searchString, STARTS_WITH);
+ var index = _toLength(Math.min(arguments.length > 1 ? arguments[1] : undefined, that.length));
+ var search = String(searchString);
+ return $startsWith
+ ? $startsWith.call(that, search, index)
+ : that.slice(index, index + search.length) === search;
+ }
+ });
+
+ var ENDS_WITH = 'endsWith';
+ var $endsWith = ''[ENDS_WITH];
+
+ _export(_export.P + _export.F * _failsIsRegexp(ENDS_WITH), 'String', {
+ endsWith: function endsWith(searchString /* , endPosition = @length */) {
+ var that = _stringContext(this, searchString, ENDS_WITH);
+ var endPosition = arguments.length > 1 ? arguments[1] : undefined;
+ var len = _toLength(that.length);
+ var end = endPosition === undefined ? len : Math.min(_toLength(endPosition), len);
+ var search = String(searchString);
+ return $endsWith
+ ? $endsWith.call(that, search, end)
+ : that.slice(end - search.length, end) === search;
+ }
+ });
+
+ var INCLUDES = 'includes';
+
+ _export(_export.P + _export.F * _failsIsRegexp(INCLUDES), 'String', {
+ includes: function includes(searchString /* , position = 0 */) {
+ return !!~_stringContext(this, searchString, INCLUDES)
+ .indexOf(searchString, arguments.length > 1 ? arguments[1] : undefined);
+ }
+ });
+
+ // 21.2.5.3 get RegExp.prototype.flags
+
+ var _flags = function () {
+ var that = _anObject(this);
+ var result = '';
+ if (that.global) result += 'g';
+ if (that.ignoreCase) result += 'i';
+ if (that.multiline) result += 'm';
+ if (that.unicode) result += 'u';
+ if (that.sticky) result += 'y';
+ return result;
+ };
+
+ // 21.2.5.3 get RegExp.prototype.flags()
+ if (_descriptors && /./g.flags != 'g') _objectDp.f(RegExp.prototype, 'flags', {
+ configurable: true,
+ get: _flags
+ });
+
+ var _fixReWks = function (KEY, length, exec) {
+ var SYMBOL = _wks(KEY);
+ var fns = exec(_defined, SYMBOL, ''[KEY]);
+ var strfn = fns[0];
+ var rxfn = fns[1];
+ if (_fails(function () {
+ var O = {};
+ O[SYMBOL] = function () { return 7; };
+ return ''[KEY](O) != 7;
+ })) {
+ _redefine(String.prototype, KEY, strfn);
+ _hide(RegExp.prototype, SYMBOL, length == 2
+ // 21.2.5.8 RegExp.prototype[@@replace](string, replaceValue)
+ // 21.2.5.11 RegExp.prototype[@@split](string, limit)
+ ? function (string, arg) { return rxfn.call(string, this, arg); }
+ // 21.2.5.6 RegExp.prototype[@@match](string)
+ // 21.2.5.9 RegExp.prototype[@@search](string)
+ : function (string) { return rxfn.call(string, this); }
+ );
+ }
+ };
+
+ // @@match logic
+ _fixReWks('match', 1, function (defined, MATCH, $match) {
+ // 21.1.3.11 String.prototype.match(regexp)
+ return [function match(regexp) {
+ var O = defined(this);
+ var fn = regexp == undefined ? undefined : regexp[MATCH];
+ return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[MATCH](String(O));
+ }, $match];
+ });
+
+ // @@replace logic
+ _fixReWks('replace', 2, function (defined, REPLACE, $replace) {
+ // 21.1.3.14 String.prototype.replace(searchValue, replaceValue)
+ return [function replace(searchValue, replaceValue) {
+ var O = defined(this);
+ var fn = searchValue == undefined ? undefined : searchValue[REPLACE];
+ return fn !== undefined
+ ? fn.call(searchValue, O, replaceValue)
+ : $replace.call(String(O), searchValue, replaceValue);
+ }, $replace];
+ });
+
+ // @@split logic
+ _fixReWks('split', 2, function (defined, SPLIT, $split) {
+ var isRegExp = _isRegexp;
+ var _split = $split;
+ var $push = [].push;
+ var $SPLIT = 'split';
+ var LENGTH = 'length';
+ var LAST_INDEX = 'lastIndex';
+ if (
+ 'abbc'[$SPLIT](/(b)*/)[1] == 'c' ||
+ 'test'[$SPLIT](/(?:)/, -1)[LENGTH] != 4 ||
+ 'ab'[$SPLIT](/(?:ab)*/)[LENGTH] != 2 ||
+ '.'[$SPLIT](/(.?)(.?)/)[LENGTH] != 4 ||
+ '.'[$SPLIT](/()()/)[LENGTH] > 1 ||
+ ''[$SPLIT](/.?/)[LENGTH]
+ ) {
+ var NPCG = /()??/.exec('')[1] === undefined; // nonparticipating capturing group
+ // based on es5-shim implementation, need to rework it
+ $split = function (separator, limit) {
+ var string = String(this);
+ if (separator === undefined && limit === 0) return [];
+ // If `separator` is not a regex, use native split
+ if (!isRegExp(separator)) return _split.call(string, separator, limit);
+ var output = [];
+ var flags = (separator.ignoreCase ? 'i' : '') +
+ (separator.multiline ? 'm' : '') +
+ (separator.unicode ? 'u' : '') +
+ (separator.sticky ? 'y' : '');
+ var lastLastIndex = 0;
+ var splitLimit = limit === undefined ? 4294967295 : limit >>> 0;
+ // Make `global` and avoid `lastIndex` issues by working with a copy
+ var separatorCopy = new RegExp(separator.source, flags + 'g');
+ var separator2, match, lastIndex, lastLength, i;
+ // Doesn't need flags gy, but they don't hurt
+ if (!NPCG) separator2 = new RegExp('^' + separatorCopy.source + '$(?!\\s)', flags);
+ while (match = separatorCopy.exec(string)) {
+ // `separatorCopy.lastIndex` is not reliable cross-browser
+ lastIndex = match.index + match[0][LENGTH];
+ if (lastIndex > lastLastIndex) {
+ output.push(string.slice(lastLastIndex, match.index));
+ // Fix browsers whose `exec` methods don't consistently return `undefined` for NPCG
+ // eslint-disable-next-line no-loop-func
+ if (!NPCG && match[LENGTH] > 1) match[0].replace(separator2, function () {
+ for (i = 1; i < arguments[LENGTH] - 2; i++) if (arguments[i] === undefined) match[i] = undefined;
+ });
+ if (match[LENGTH] > 1 && match.index < string[LENGTH]) $push.apply(output, match.slice(1));
+ lastLength = match[0][LENGTH];
+ lastLastIndex = lastIndex;
+ if (output[LENGTH] >= splitLimit) break;
+ }
+ if (separatorCopy[LAST_INDEX] === match.index) separatorCopy[LAST_INDEX]++; // Avoid an infinite loop
+ }
+ if (lastLastIndex === string[LENGTH]) {
+ if (lastLength || !separatorCopy.test('')) output.push('');
+ } else output.push(string.slice(lastLastIndex));
+ return output[LENGTH] > splitLimit ? output.slice(0, splitLimit) : output;
+ };
+ // Chakra, V8
+ } else if ('0'[$SPLIT](undefined, 0)[LENGTH]) {
+ $split = function (separator, limit) {
+ return separator === undefined && limit === 0 ? [] : _split.call(this, separator, limit);
+ };
+ }
+ // 21.1.3.17 String.prototype.split(separator, limit)
+ return [function split(separator, limit) {
+ var O = defined(this);
+ var fn = separator == undefined ? undefined : separator[SPLIT];
+ return fn !== undefined ? fn.call(separator, O, limit) : $split.call(String(O), separator, limit);
+ }, $split];
+ });
+
+ // @@search logic
+ _fixReWks('search', 1, function (defined, SEARCH, $search) {
+ // 21.1.3.15 String.prototype.search(regexp)
+ return [function search(regexp) {
+ var O = defined(this);
+ var fn = regexp == undefined ? undefined : regexp[SEARCH];
+ return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[SEARCH](String(O));
+ }, $search];
+ });
+
+ var _createProperty = function (object, index, value) {
+ if (index in object) _objectDp.f(object, index, _propertyDesc(0, value));
+ else object[index] = value;
+ };
+
+ _export(_export.S + _export.F * !_iterDetect(function (iter) { }), 'Array', {
+ // 22.1.2.1 Array.from(arrayLike, mapfn = undefined, thisArg = undefined)
+ from: function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {
+ var O = _toObject(arrayLike);
+ var C = typeof this == 'function' ? this : Array;
+ var aLen = arguments.length;
+ var mapfn = aLen > 1 ? arguments[1] : undefined;
+ var mapping = mapfn !== undefined;
+ var index = 0;
+ var iterFn = core_getIteratorMethod(O);
+ var length, result, step, iterator;
+ if (mapping) mapfn = _ctx(mapfn, aLen > 2 ? arguments[2] : undefined, 2);
+ // if object isn't iterable or it's array with default iterator - use simple case
+ if (iterFn != undefined && !(C == Array && _isArrayIter(iterFn))) {
+ for (iterator = iterFn.call(O), result = new C(); !(step = iterator.next()).done; index++) {
+ _createProperty(result, index, mapping ? _iterCall(iterator, mapfn, [step.value, index], true) : step.value);
+ }
+ } else {
+ length = _toLength(O.length);
+ for (result = new C(length); length > index; index++) {
+ _createProperty(result, index, mapping ? mapfn(O[index], index) : O[index]);
+ }
+ }
+ result.length = index;
+ return result;
+ }
+ });
+
+ // WebKit Array.of isn't generic
+ _export(_export.S + _export.F * _fails(function () {
+ function F() { /* empty */ }
+ return !(Array.of.call(F) instanceof F);
+ }), 'Array', {
+ // 22.1.2.3 Array.of( ...items)
+ of: function of(/* ...args */) {
+ var index = 0;
+ var aLen = arguments.length;
+ var result = new (typeof this == 'function' ? this : Array)(aLen);
+ while (aLen > index) _createProperty(result, index, arguments[index++]);
+ result.length = aLen;
+ return result;
+ }
+ });
+
+ // 22.1.3.3 Array.prototype.copyWithin(target, start, end = this.length)
+
+
+ _export(_export.P, 'Array', { copyWithin: _arrayCopyWithin });
+
+ _addToUnscopables('copyWithin');
+
+ // 22.1.3.8 Array.prototype.find(predicate, thisArg = undefined)
+
+ var $find = _arrayMethods(5);
+ var KEY = 'find';
+ var forced = true;
+ // Shouldn't skip holes
+ if (KEY in []) Array(1)[KEY](function () { forced = false; });
+ _export(_export.P + _export.F * forced, 'Array', {
+ find: function find(callbackfn /* , that = undefined */) {
+ return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
+ }
+ });
+ _addToUnscopables(KEY);
+
+ // 22.1.3.9 Array.prototype.findIndex(predicate, thisArg = undefined)
+
+ var $find$1 = _arrayMethods(6);
+ var KEY$1 = 'findIndex';
+ var forced$1 = true;
+ // Shouldn't skip holes
+ if (KEY$1 in []) Array(1)[KEY$1](function () { forced$1 = false; });
+ _export(_export.P + _export.F * forced$1, 'Array', {
+ findIndex: function findIndex(callbackfn /* , that = undefined */) {
+ return $find$1(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
+ }
+ });
+ _addToUnscopables(KEY$1);
+
+ // 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length)
+
+
+ _export(_export.P, 'Array', { fill: _arrayFill });
+
+ _addToUnscopables('fill');
-// 20.1.2.2 Number.isFinite(number)
+ // 20.1.2.2 Number.isFinite(number)
-var _isFinite = _global.isFinite;
+ var _isFinite = _global.isFinite;
-_export(_export.S, 'Number', {
- isFinite: function isFinite(it) {
- return typeof it == 'number' && _isFinite(it);
- }
-});
+ _export(_export.S, 'Number', {
+ isFinite: function isFinite(it) {
+ return typeof it == 'number' && _isFinite(it);
+ }
+ });
-// 20.1.2.3 Number.isInteger(number)
+ // 20.1.2.3 Number.isInteger(number)
-var floor$1 = Math.floor;
-var _isInteger = function isInteger(it) {
- return !_isObject(it) && isFinite(it) && floor$1(it) === it;
-};
+ var floor$1 = Math.floor;
+ var _isInteger = function isInteger(it) {
+ return !_isObject(it) && isFinite(it) && floor$1(it) === it;
+ };
-// 20.1.2.3 Number.isInteger(number)
+ // 20.1.2.3 Number.isInteger(number)
-_export(_export.S, 'Number', { isInteger: _isInteger });
+ _export(_export.S, 'Number', { isInteger: _isInteger });
-// 20.1.2.5 Number.isSafeInteger(number)
+ // 20.1.2.5 Number.isSafeInteger(number)
-var abs = Math.abs;
+ var abs = Math.abs;
-_export(_export.S, 'Number', {
- isSafeInteger: function isSafeInteger(number) {
- return _isInteger(number) && abs(number) <= 0x1fffffffffffff;
- }
-});
+ _export(_export.S, 'Number', {
+ isSafeInteger: function isSafeInteger(number) {
+ return _isInteger(number) && abs(number) <= 0x1fffffffffffff;
+ }
+ });
-// 20.1.2.4 Number.isNaN(number)
+ // 20.1.2.4 Number.isNaN(number)
-_export(_export.S, 'Number', {
- isNaN: function isNaN(number) {
- // eslint-disable-next-line no-self-compare
- return number != number;
- }
-});
+ _export(_export.S, 'Number', {
+ isNaN: function isNaN(number) {
+ // eslint-disable-next-line no-self-compare
+ return number != number;
+ }
+ });
-// 20.1.2.1 Number.EPSILON
+ // 20.1.2.1 Number.EPSILON
-_export(_export.S, 'Number', { EPSILON: Math.pow(2, -52) });
+ _export(_export.S, 'Number', { EPSILON: Math.pow(2, -52) });
-// 20.1.2.10 Number.MIN_SAFE_INTEGER
+ // 20.1.2.10 Number.MIN_SAFE_INTEGER
-_export(_export.S, 'Number', { MIN_SAFE_INTEGER: -0x1fffffffffffff });
+ _export(_export.S, 'Number', { MIN_SAFE_INTEGER: -0x1fffffffffffff });
-// 20.1.2.6 Number.MAX_SAFE_INTEGER
+ // 20.1.2.6 Number.MAX_SAFE_INTEGER
-_export(_export.S, 'Number', { MAX_SAFE_INTEGER: 0x1fffffffffffff });
+ _export(_export.S, 'Number', { MAX_SAFE_INTEGER: 0x1fffffffffffff });
-// 20.2.2.20 Math.log1p(x)
-var _mathLog1p = Math.log1p || function log1p(x) {
- return (x = +x) > -1e-8 && x < 1e-8 ? x - x * x / 2 : Math.log(1 + x);
-};
+ // 20.2.2.20 Math.log1p(x)
+ var _mathLog1p = Math.log1p || function log1p(x) {
+ return (x = +x) > -1e-8 && x < 1e-8 ? x - x * x / 2 : Math.log(1 + x);
+ };
-// 20.2.2.3 Math.acosh(x)
+ // 20.2.2.3 Math.acosh(x)
-var sqrt = Math.sqrt;
-var $acosh = Math.acosh;
+ var sqrt = Math.sqrt;
+ var $acosh = Math.acosh;
-_export(_export.S + _export.F * !($acosh
- // V8 bug: https://code.google.com/p/v8/issues/detail?id=3509
- && Math.floor($acosh(Number.MAX_VALUE)) == 710
- // Tor Browser bug: Math.acosh(Infinity) -> NaN
- && $acosh(Infinity) == Infinity
-), 'Math', {
- acosh: function acosh(x) {
- return (x = +x) < 1 ? NaN : x > 94906265.62425156
- ? Math.log(x) + Math.LN2
- : _mathLog1p(x - 1 + sqrt(x - 1) * sqrt(x + 1));
- }
-});
+ _export(_export.S + _export.F * !($acosh
+ // V8 bug: https://code.google.com/p/v8/issues/detail?id=3509
+ && Math.floor($acosh(Number.MAX_VALUE)) == 710
+ // Tor Browser bug: Math.acosh(Infinity) -> NaN
+ && $acosh(Infinity) == Infinity
+ ), 'Math', {
+ acosh: function acosh(x) {
+ return (x = +x) < 1 ? NaN : x > 94906265.62425156
+ ? Math.log(x) + Math.LN2
+ : _mathLog1p(x - 1 + sqrt(x - 1) * sqrt(x + 1));
+ }
+ });
-// 20.2.2.5 Math.asinh(x)
+ // 20.2.2.5 Math.asinh(x)
-var $asinh = Math.asinh;
+ var $asinh = Math.asinh;
-function asinh(x) {
- return !isFinite(x = +x) || x == 0 ? x : x < 0 ? -asinh(-x) : Math.log(x + Math.sqrt(x * x + 1));
-}
+ function asinh(x) {
+ return !isFinite(x = +x) || x == 0 ? x : x < 0 ? -asinh(-x) : Math.log(x + Math.sqrt(x * x + 1));
+ }
-// Tor Browser bug: Math.asinh(0) -> -0
-_export(_export.S + _export.F * !($asinh && 1 / $asinh(0) > 0), 'Math', { asinh: asinh });
+ // Tor Browser bug: Math.asinh(0) -> -0
+ _export(_export.S + _export.F * !($asinh && 1 / $asinh(0) > 0), 'Math', { asinh: asinh });
-// 20.2.2.7 Math.atanh(x)
+ // 20.2.2.7 Math.atanh(x)
-var $atanh = Math.atanh;
+ var $atanh = Math.atanh;
-// Tor Browser bug: Math.atanh(-0) -> 0
-_export(_export.S + _export.F * !($atanh && 1 / $atanh(-0) < 0), 'Math', {
- atanh: function atanh(x) {
- return (x = +x) == 0 ? x : Math.log((1 + x) / (1 - x)) / 2;
- }
-});
+ // Tor Browser bug: Math.atanh(-0) -> 0
+ _export(_export.S + _export.F * !($atanh && 1 / $atanh(-0) < 0), 'Math', {
+ atanh: function atanh(x) {
+ return (x = +x) == 0 ? x : Math.log((1 + x) / (1 - x)) / 2;
+ }
+ });
-// 20.2.2.28 Math.sign(x)
-var _mathSign = Math.sign || function sign(x) {
- // eslint-disable-next-line no-self-compare
- return (x = +x) == 0 || x != x ? x : x < 0 ? -1 : 1;
-};
+ // 20.2.2.28 Math.sign(x)
+ var _mathSign = Math.sign || function sign(x) {
+ // eslint-disable-next-line no-self-compare
+ return (x = +x) == 0 || x != x ? x : x < 0 ? -1 : 1;
+ };
-// 20.2.2.9 Math.cbrt(x)
+ // 20.2.2.9 Math.cbrt(x)
-_export(_export.S, 'Math', {
- cbrt: function cbrt(x) {
- return _mathSign(x = +x) * Math.pow(Math.abs(x), 1 / 3);
- }
-});
+ _export(_export.S, 'Math', {
+ cbrt: function cbrt(x) {
+ return _mathSign(x = +x) * Math.pow(Math.abs(x), 1 / 3);
+ }
+ });
-// 20.2.2.11 Math.clz32(x)
+ // 20.2.2.11 Math.clz32(x)
-_export(_export.S, 'Math', {
- clz32: function clz32(x) {
- return (x >>>= 0) ? 31 - Math.floor(Math.log(x + 0.5) * Math.LOG2E) : 32;
- }
-});
+ _export(_export.S, 'Math', {
+ clz32: function clz32(x) {
+ return (x >>>= 0) ? 31 - Math.floor(Math.log(x + 0.5) * Math.LOG2E) : 32;
+ }
+ });
-// 20.2.2.12 Math.cosh(x)
+ // 20.2.2.12 Math.cosh(x)
-var exp = Math.exp;
+ var exp = Math.exp;
-_export(_export.S, 'Math', {
- cosh: function cosh(x) {
- return (exp(x = +x) + exp(-x)) / 2;
- }
-});
+ _export(_export.S, 'Math', {
+ cosh: function cosh(x) {
+ return (exp(x = +x) + exp(-x)) / 2;
+ }
+ });
-// 20.2.2.14 Math.expm1(x)
-var $expm1 = Math.expm1;
-var _mathExpm1 = (!$expm1
- // Old FF bug
- || $expm1(10) > 22025.465794806719 || $expm1(10) < 22025.4657948067165168
- // Tor Browser bug
- || $expm1(-2e-17) != -2e-17
-) ? function expm1(x) {
- return (x = +x) == 0 ? x : x > -1e-6 && x < 1e-6 ? x + x * x / 2 : Math.exp(x) - 1;
-} : $expm1;
+ // 20.2.2.14 Math.expm1(x)
+ var $expm1 = Math.expm1;
+ var _mathExpm1 = (!$expm1
+ // Old FF bug
+ || $expm1(10) > 22025.465794806719 || $expm1(10) < 22025.4657948067165168
+ // Tor Browser bug
+ || $expm1(-2e-17) != -2e-17
+ ) ? function expm1(x) {
+ return (x = +x) == 0 ? x : x > -1e-6 && x < 1e-6 ? x + x * x / 2 : Math.exp(x) - 1;
+ } : $expm1;
-// 20.2.2.14 Math.expm1(x)
+ // 20.2.2.14 Math.expm1(x)
-_export(_export.S + _export.F * (_mathExpm1 != Math.expm1), 'Math', { expm1: _mathExpm1 });
+ _export(_export.S + _export.F * (_mathExpm1 != Math.expm1), 'Math', { expm1: _mathExpm1 });
-// 20.2.2.16 Math.fround(x)
+ // 20.2.2.16 Math.fround(x)
-var pow = Math.pow;
-var EPSILON = pow(2, -52);
-var EPSILON32 = pow(2, -23);
-var MAX32 = pow(2, 127) * (2 - EPSILON32);
-var MIN32 = pow(2, -126);
+ var pow = Math.pow;
+ var EPSILON = pow(2, -52);
+ var EPSILON32 = pow(2, -23);
+ var MAX32 = pow(2, 127) * (2 - EPSILON32);
+ var MIN32 = pow(2, -126);
-var roundTiesToEven = function (n) {
- return n + 1 / EPSILON - 1 / EPSILON;
-};
+ var roundTiesToEven = function (n) {
+ return n + 1 / EPSILON - 1 / EPSILON;
+ };
-var _mathFround = Math.fround || function fround(x) {
- var $abs = Math.abs(x);
- var $sign = _mathSign(x);
- var a, result;
- if ($abs < MIN32) return $sign * roundTiesToEven($abs / MIN32 / EPSILON32) * MIN32 * EPSILON32;
- a = (1 + EPSILON32 / EPSILON) * $abs;
- result = a - (a - $abs);
- // eslint-disable-next-line no-self-compare
- if (result > MAX32 || result != result) return $sign * Infinity;
- return $sign * result;
-};
+ var _mathFround = Math.fround || function fround(x) {
+ var $abs = Math.abs(x);
+ var $sign = _mathSign(x);
+ var a, result;
+ if ($abs < MIN32) return $sign * roundTiesToEven($abs / MIN32 / EPSILON32) * MIN32 * EPSILON32;
+ a = (1 + EPSILON32 / EPSILON) * $abs;
+ result = a - (a - $abs);
+ // eslint-disable-next-line no-self-compare
+ if (result > MAX32 || result != result) return $sign * Infinity;
+ return $sign * result;
+ };
-// 20.2.2.16 Math.fround(x)
+ // 20.2.2.16 Math.fround(x)
-_export(_export.S, 'Math', { fround: _mathFround });
+ _export(_export.S, 'Math', { fround: _mathFround });
-// 20.2.2.17 Math.hypot([value1[, value2[, … ]]])
+ // 20.2.2.17 Math.hypot([value1[, value2[, … ]]])
-var abs$1 = Math.abs;
+ var abs$1 = Math.abs;
-_export(_export.S, 'Math', {
- hypot: function hypot(value1, value2) { // eslint-disable-line no-unused-vars
- var sum = 0;
- var i = 0;
- var aLen = arguments.length;
- var larg = 0;
- var arg, div;
- while (i < aLen) {
- arg = abs$1(arguments[i++]);
- if (larg < arg) {
- div = larg / arg;
- sum = sum * div * div + 1;
- larg = arg;
- } else if (arg > 0) {
- div = arg / larg;
- sum += div * div;
- } else sum += arg;
- }
- return larg === Infinity ? Infinity : larg * Math.sqrt(sum);
- }
-});
+ _export(_export.S, 'Math', {
+ hypot: function hypot(value1, value2) { // eslint-disable-line no-unused-vars
+ var sum = 0;
+ var i = 0;
+ var aLen = arguments.length;
+ var larg = 0;
+ var arg, div;
+ while (i < aLen) {
+ arg = abs$1(arguments[i++]);
+ if (larg < arg) {
+ div = larg / arg;
+ sum = sum * div * div + 1;
+ larg = arg;
+ } else if (arg > 0) {
+ div = arg / larg;
+ sum += div * div;
+ } else sum += arg;
+ }
+ return larg === Infinity ? Infinity : larg * Math.sqrt(sum);
+ }
+ });
-// 20.2.2.18 Math.imul(x, y)
+ // 20.2.2.18 Math.imul(x, y)
-var $imul = Math.imul;
+ var $imul = Math.imul;
-// some WebKit versions fails with big numbers, some has wrong arity
-_export(_export.S + _export.F * _fails(function () {
- return $imul(0xffffffff, 5) != -5 || $imul.length != 2;
-}), 'Math', {
- imul: function imul(x, y) {
- var UINT16 = 0xffff;
- var xn = +x;
- var yn = +y;
- var xl = UINT16 & xn;
- var yl = UINT16 & yn;
- return 0 | xl * yl + ((UINT16 & xn >>> 16) * yl + xl * (UINT16 & yn >>> 16) << 16 >>> 0);
- }
-});
+ // some WebKit versions fails with big numbers, some has wrong arity
+ _export(_export.S + _export.F * _fails(function () {
+ return $imul(0xffffffff, 5) != -5 || $imul.length != 2;
+ }), 'Math', {
+ imul: function imul(x, y) {
+ var UINT16 = 0xffff;
+ var xn = +x;
+ var yn = +y;
+ var xl = UINT16 & xn;
+ var yl = UINT16 & yn;
+ return 0 | xl * yl + ((UINT16 & xn >>> 16) * yl + xl * (UINT16 & yn >>> 16) << 16 >>> 0);
+ }
+ });
-// 20.2.2.20 Math.log1p(x)
+ // 20.2.2.20 Math.log1p(x)
-_export(_export.S, 'Math', { log1p: _mathLog1p });
+ _export(_export.S, 'Math', { log1p: _mathLog1p });
-// 20.2.2.21 Math.log10(x)
+ // 20.2.2.21 Math.log10(x)
-_export(_export.S, 'Math', {
- log10: function log10(x) {
- return Math.log(x) * Math.LOG10E;
- }
-});
+ _export(_export.S, 'Math', {
+ log10: function log10(x) {
+ return Math.log(x) * Math.LOG10E;
+ }
+ });
-// 20.2.2.22 Math.log2(x)
+ // 20.2.2.22 Math.log2(x)
-_export(_export.S, 'Math', {
- log2: function log2(x) {
- return Math.log(x) / Math.LN2;
- }
-});
+ _export(_export.S, 'Math', {
+ log2: function log2(x) {
+ return Math.log(x) / Math.LN2;
+ }
+ });
-// 20.2.2.28 Math.sign(x)
+ // 20.2.2.28 Math.sign(x)
-_export(_export.S, 'Math', { sign: _mathSign });
+ _export(_export.S, 'Math', { sign: _mathSign });
-// 20.2.2.30 Math.sinh(x)
+ // 20.2.2.30 Math.sinh(x)
-var exp$1 = Math.exp;
+ var exp$1 = Math.exp;
-// V8 near Chromium 38 has a problem with very small numbers
-_export(_export.S + _export.F * _fails(function () {
- return !Math.sinh(-2e-17) != -2e-17;
-}), 'Math', {
- sinh: function sinh(x) {
- return Math.abs(x = +x) < 1
- ? (_mathExpm1(x) - _mathExpm1(-x)) / 2
- : (exp$1(x - 1) - exp$1(-x - 1)) * (Math.E / 2);
- }
-});
+ // V8 near Chromium 38 has a problem with very small numbers
+ _export(_export.S + _export.F * _fails(function () {
+ return !Math.sinh(-2e-17) != -2e-17;
+ }), 'Math', {
+ sinh: function sinh(x) {
+ return Math.abs(x = +x) < 1
+ ? (_mathExpm1(x) - _mathExpm1(-x)) / 2
+ : (exp$1(x - 1) - exp$1(-x - 1)) * (Math.E / 2);
+ }
+ });
-// 20.2.2.33 Math.tanh(x)
+ // 20.2.2.33 Math.tanh(x)
-var exp$2 = Math.exp;
+ var exp$2 = Math.exp;
-_export(_export.S, 'Math', {
- tanh: function tanh(x) {
- var a = _mathExpm1(x = +x);
- var b = _mathExpm1(-x);
- return a == Infinity ? 1 : b == Infinity ? -1 : (a - b) / (exp$2(x) + exp$2(-x));
- }
-});
+ _export(_export.S, 'Math', {
+ tanh: function tanh(x) {
+ var a = _mathExpm1(x = +x);
+ var b = _mathExpm1(-x);
+ return a == Infinity ? 1 : b == Infinity ? -1 : (a - b) / (exp$2(x) + exp$2(-x));
+ }
+ });
-// 20.2.2.34 Math.trunc(x)
+ // 20.2.2.34 Math.trunc(x)
-_export(_export.S, 'Math', {
- trunc: function trunc(it) {
- return (it > 0 ? Math.floor : Math.ceil)(it);
- }
-});
+ _export(_export.S, 'Math', {
+ trunc: function trunc(it) {
+ return (it > 0 ? Math.floor : Math.ceil)(it);
+ }
+ });
-// https://github.com/tc39/Array.prototype.includes
+ // https://github.com/tc39/Array.prototype.includes
-var $includes = _arrayIncludes(true);
+ var $includes = _arrayIncludes(true);
-_export(_export.P, 'Array', {
- includes: function includes(el /* , fromIndex = 0 */) {
- return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);
- }
-});
+ _export(_export.P, 'Array', {
+ includes: function includes(el /* , fromIndex = 0 */) {
+ return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);
+ }
+ });
-_addToUnscopables('includes');
+ _addToUnscopables('includes');
-var isEnum$1 = _objectPie.f;
-var _objectToArray = function (isEntries) {
- return function (it) {
- var O = _toIobject(it);
- var keys = _objectKeys(O);
- var length = keys.length;
- var i = 0;
- var result = [];
- var key;
- while (length > i) if (isEnum$1.call(O, key = keys[i++])) {
- result.push(isEntries ? [key, O[key]] : O[key]);
- } return result;
- };
-};
+ var isEnum$1 = _objectPie.f;
+ var _objectToArray = function (isEntries) {
+ return function (it) {
+ var O = _toIobject(it);
+ var keys = _objectKeys(O);
+ var length = keys.length;
+ var i = 0;
+ var result = [];
+ var key;
+ while (length > i) if (isEnum$1.call(O, key = keys[i++])) {
+ result.push(isEntries ? [key, O[key]] : O[key]);
+ } return result;
+ };
+ };
-// https://github.com/tc39/proposal-object-values-entries
+ // https://github.com/tc39/proposal-object-values-entries
-var $values = _objectToArray(false);
+ var $values = _objectToArray(false);
-_export(_export.S, 'Object', {
- values: function values(it) {
- return $values(it);
- }
-});
+ _export(_export.S, 'Object', {
+ values: function values(it) {
+ return $values(it);
+ }
+ });
-// https://github.com/tc39/proposal-object-values-entries
+ // https://github.com/tc39/proposal-object-values-entries
-var $entries = _objectToArray(true);
+ var $entries = _objectToArray(true);
-_export(_export.S, 'Object', {
- entries: function entries(it) {
- return $entries(it);
- }
-});
+ _export(_export.S, 'Object', {
+ entries: function entries(it) {
+ return $entries(it);
+ }
+ });
-// https://github.com/tc39/proposal-object-getownpropertydescriptors
+ // https://github.com/tc39/proposal-object-getownpropertydescriptors
-_export(_export.S, 'Object', {
- getOwnPropertyDescriptors: function getOwnPropertyDescriptors(object) {
- var O = _toIobject(object);
- var getDesc = _objectGopd.f;
- var keys = _ownKeys(O);
- var result = {};
- var i = 0;
- var key, desc;
- while (keys.length > i) {
- desc = getDesc(O, key = keys[i++]);
- if (desc !== undefined) _createProperty(result, key, desc);
- }
- return result;
- }
-});
-
-// https://github.com/tc39/proposal-string-pad-start-end
-
-
-
-
-var _stringPad = function (that, maxLength, fillString, left) {
- var S = String(_defined(that));
- var stringLength = S.length;
- var fillStr = fillString === undefined ? ' ' : String(fillString);
- var intMaxLength = _toLength(maxLength);
- if (intMaxLength <= stringLength || fillStr == '') return S;
- var fillLen = intMaxLength - stringLength;
- var stringFiller = _stringRepeat.call(fillStr, Math.ceil(fillLen / fillStr.length));
- if (stringFiller.length > fillLen) stringFiller = stringFiller.slice(0, fillLen);
- return left ? stringFiller + S : S + stringFiller;
-};
-
-var navigator$1 = _global.navigator;
-
-var _userAgent = navigator$1 && navigator$1.userAgent || '';
-
-// https://github.com/tc39/proposal-string-pad-start-end
-
-
-
-
-// https://github.com/zloirock/core-js/issues/280
-_export(_export.P + _export.F * /Version\/10\.\d+(\.\d+)? Safari\//.test(_userAgent), 'String', {
- padStart: function padStart(maxLength /* , fillString = ' ' */) {
- return _stringPad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, true);
- }
-});
-
-// https://github.com/tc39/proposal-string-pad-start-end
-
-
-
-
-// https://github.com/zloirock/core-js/issues/280
-_export(_export.P + _export.F * /Version\/10\.\d+(\.\d+)? Safari\//.test(_userAgent), 'String', {
- padEnd: function padEnd(maxLength /* , fillString = ' ' */) {
- return _stringPad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, false);
- }
-});
-
-// ie9- setTimeout & setInterval additional parameters fix
-
-
-
-var slice = [].slice;
-var MSIE = /MSIE .\./.test(_userAgent); // <- dirty ie9- check
-var wrap$1 = function (set) {
- return function (fn, time /* , ...args */) {
- var boundArgs = arguments.length > 2;
- var args = boundArgs ? slice.call(arguments, 2) : false;
- return set(boundArgs ? function () {
- // eslint-disable-next-line no-new-func
- (typeof fn == 'function' ? fn : Function(fn)).apply(this, args);
- } : fn, time);
- };
-};
-_export(_export.G + _export.B + _export.F * MSIE, {
- setTimeout: wrap$1(_global.setTimeout),
- setInterval: wrap$1(_global.setInterval)
-});
-
-_export(_export.G + _export.B, {
- setImmediate: _task.set,
- clearImmediate: _task.clear
-});
-
-var ITERATOR$4 = _wks('iterator');
-var TO_STRING_TAG = _wks('toStringTag');
-var ArrayValues = _iterators.Array;
-
-var DOMIterables = {
- CSSRuleList: true, // TODO: Not spec compliant, should be false.
- CSSStyleDeclaration: false,
- CSSValueList: false,
- ClientRectList: false,
- DOMRectList: false,
- DOMStringList: false,
- DOMTokenList: true,
- DataTransferItemList: false,
- FileList: false,
- HTMLAllCollection: false,
- HTMLCollection: false,
- HTMLFormElement: false,
- HTMLSelectElement: false,
- MediaList: true, // TODO: Not spec compliant, should be false.
- MimeTypeArray: false,
- NamedNodeMap: false,
- NodeList: true,
- PaintRequestList: false,
- Plugin: false,
- PluginArray: false,
- SVGLengthList: false,
- SVGNumberList: false,
- SVGPathSegList: false,
- SVGPointList: false,
- SVGStringList: false,
- SVGTransformList: false,
- SourceBufferList: false,
- StyleSheetList: true, // TODO: Not spec compliant, should be false.
- TextTrackCueList: false,
- TextTrackList: false,
- TouchList: false
-};
-
-for (var collections = _objectKeys(DOMIterables), i$1 = 0; i$1 < collections.length; i$1++) {
- var NAME$1 = collections[i$1];
- var explicit = DOMIterables[NAME$1];
- var Collection = _global[NAME$1];
- var proto = Collection && Collection.prototype;
- var key;
- if (proto) {
- if (!proto[ITERATOR$4]) _hide(proto, ITERATOR$4, ArrayValues);
- if (!proto[TO_STRING_TAG]) _hide(proto, TO_STRING_TAG, NAME$1);
- _iterators[NAME$1] = ArrayValues;
- if (explicit) for (key in es6_array_iterator) if (!proto[key]) _redefine(proto, key, es6_array_iterator[key], true);
- }
-}
-
-var runtime = createCommonjsModule(function (module) {
-/**
- * Copyright (c) 2014, Facebook, Inc.
- * All rights reserved.
- *
- * This source code is licensed under the BSD-style license found in the
- * https://raw.github.com/facebook/regenerator/master/LICENSE file. An
- * additional grant of patent rights can be found in the PATENTS file in
- * the same directory.
- */
-
-!(function(global) {
-
- var Op = Object.prototype;
- var hasOwn = Op.hasOwnProperty;
- var undefined; // More compressible than void 0.
- var $Symbol = typeof Symbol === "function" ? Symbol : {};
- var iteratorSymbol = $Symbol.iterator || "@@iterator";
- var asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator";
- var toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag";
-
- var inModule = 'object' === "object";
- var runtime = global.regeneratorRuntime;
- if (runtime) {
- if (inModule) {
- // If regeneratorRuntime is defined globally and we're in a module,
- // make the exports object identical to regeneratorRuntime.
- module.exports = runtime;
- }
- // Don't bother evaluating the rest of this file if the runtime was
- // already defined globally.
- return;
- }
-
- // Define the runtime globally (as expected by generated code) as either
- // module.exports (if we're in a module) or a new, empty object.
- runtime = global.regeneratorRuntime = inModule ? module.exports : {};
-
- function wrap(innerFn, outerFn, self, tryLocsList) {
- // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.
- var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;
- var generator = Object.create(protoGenerator.prototype);
- var context = new Context(tryLocsList || []);
-
- // The ._invoke method unifies the implementations of the .next,
- // .throw, and .return methods.
- generator._invoke = makeInvokeMethod(innerFn, self, context);
-
- return generator;
- }
- runtime.wrap = wrap;
-
- // Try/catch helper to minimize deoptimizations. Returns a completion
- // record like context.tryEntries[i].completion. This interface could
- // have been (and was previously) designed to take a closure to be
- // invoked without arguments, but in all the cases we care about we
- // already have an existing method we want to call, so there's no need
- // to create a new function object. We can even get away with assuming
- // the method takes exactly one argument, since that happens to be true
- // in every case, so we don't have to touch the arguments object. The
- // only additional allocation required is the completion record, which
- // has a stable shape and so hopefully should be cheap to allocate.
- function tryCatch(fn, obj, arg) {
- try {
- return { type: "normal", arg: fn.call(obj, arg) };
- } catch (err) {
- return { type: "throw", arg: err };
- }
- }
-
- var GenStateSuspendedStart = "suspendedStart";
- var GenStateSuspendedYield = "suspendedYield";
- var GenStateExecuting = "executing";
- var GenStateCompleted = "completed";
-
- // Returning this object from the innerFn has the same effect as
- // breaking out of the dispatch switch statement.
- var ContinueSentinel = {};
-
- // Dummy constructor functions that we use as the .constructor and
- // .constructor.prototype properties for functions that return Generator
- // objects. For full spec compliance, you may wish to configure your
- // minifier not to mangle the names of these two functions.
- function Generator() {}
- function GeneratorFunction() {}
- function GeneratorFunctionPrototype() {}
-
- // This is a polyfill for %IteratorPrototype% for environments that
- // don't natively support it.
- var IteratorPrototype = {};
- IteratorPrototype[iteratorSymbol] = function () {
- return this;
- };
-
- var getProto = Object.getPrototypeOf;
- var NativeIteratorPrototype = getProto && getProto(getProto(values([])));
- if (NativeIteratorPrototype &&
- NativeIteratorPrototype !== Op &&
- hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {
- // This environment has a native %IteratorPrototype%; use it instead
- // of the polyfill.
- IteratorPrototype = NativeIteratorPrototype;
- }
-
- var Gp = GeneratorFunctionPrototype.prototype =
- Generator.prototype = Object.create(IteratorPrototype);
- GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;
- GeneratorFunctionPrototype.constructor = GeneratorFunction;
- GeneratorFunctionPrototype[toStringTagSymbol] =
- GeneratorFunction.displayName = "GeneratorFunction";
-
- // Helper for defining the .next, .throw, and .return methods of the
- // Iterator interface in terms of a single ._invoke method.
- function defineIteratorMethods(prototype) {
- ["next", "throw", "return"].forEach(function(method) {
- prototype[method] = function(arg) {
- return this._invoke(method, arg);
- };
- });
- }
-
- runtime.isGeneratorFunction = function(genFun) {
- var ctor = typeof genFun === "function" && genFun.constructor;
- return ctor
- ? ctor === GeneratorFunction ||
- // For the native GeneratorFunction constructor, the best we can
- // do is to check its .name property.
- (ctor.displayName || ctor.name) === "GeneratorFunction"
- : false;
- };
-
- runtime.mark = function(genFun) {
- if (Object.setPrototypeOf) {
- Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);
- } else {
- genFun.__proto__ = GeneratorFunctionPrototype;
- if (!(toStringTagSymbol in genFun)) {
- genFun[toStringTagSymbol] = "GeneratorFunction";
- }
- }
- genFun.prototype = Object.create(Gp);
- return genFun;
- };
-
- // Within the body of any async function, `await x` is transformed to
- // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test
- // `hasOwn.call(value, "__await")` to determine if the yielded value is
- // meant to be awaited.
- runtime.awrap = function(arg) {
- return { __await: arg };
- };
-
- function AsyncIterator(generator) {
- function invoke(method, arg, resolve, reject) {
- var record = tryCatch(generator[method], generator, arg);
- if (record.type === "throw") {
- reject(record.arg);
- } else {
- var result = record.arg;
- var value = result.value;
- if (value &&
- typeof value === "object" &&
- hasOwn.call(value, "__await")) {
- return Promise.resolve(value.__await).then(function(value) {
- invoke("next", value, resolve, reject);
- }, function(err) {
- invoke("throw", err, resolve, reject);
- });
- }
-
- return Promise.resolve(value).then(function(unwrapped) {
- // When a yielded Promise is resolved, its final value becomes
- // the .value of the Promise<{value,done}> result for the
- // current iteration. If the Promise is rejected, however, the
- // result for this iteration will be rejected with the same
- // reason. Note that rejections of yielded Promises are not
- // thrown back into the generator function, as is the case
- // when an awaited Promise is rejected. This difference in
- // behavior between yield and await is important, because it
- // allows the consumer to decide what to do with the yielded
- // rejection (swallow it and continue, manually .throw it back
- // into the generator, abandon iteration, whatever). With
- // await, by contrast, there is no opportunity to examine the
- // rejection reason outside the generator function, so the
- // only option is to throw it from the await expression, and
- // let the generator function handle the exception.
- result.value = unwrapped;
- resolve(result);
- }, reject);
- }
- }
-
- if (typeof global.process === "object" && global.process.domain) {
- invoke = global.process.domain.bind(invoke);
- }
-
- var previousPromise;
-
- function enqueue(method, arg) {
- function callInvokeWithMethodAndArg() {
- return new Promise(function(resolve, reject) {
- invoke(method, arg, resolve, reject);
- });
- }
-
- return previousPromise =
- // If enqueue has been called before, then we want to wait until
- // all previous Promises have been resolved before calling invoke,
- // so that results are always delivered in the correct order. If
- // enqueue has not been called before, then it is important to
- // call invoke immediately, without waiting on a callback to fire,
- // so that the async generator function has the opportunity to do
- // any necessary setup in a predictable way. This predictability
- // is why the Promise constructor synchronously invokes its
- // executor callback, and why async functions synchronously
- // execute code before the first await. Since we implement simple
- // async functions in terms of async generators, it is especially
- // important to get this right, even though it requires care.
- previousPromise ? previousPromise.then(
- callInvokeWithMethodAndArg,
- // Avoid propagating failures to Promises returned by later
- // invocations of the iterator.
- callInvokeWithMethodAndArg
- ) : callInvokeWithMethodAndArg();
- }
-
- // Define the unified helper method that is used to implement .next,
- // .throw, and .return (see defineIteratorMethods).
- this._invoke = enqueue;
- }
-
- defineIteratorMethods(AsyncIterator.prototype);
- AsyncIterator.prototype[asyncIteratorSymbol] = function () {
- return this;
- };
- runtime.AsyncIterator = AsyncIterator;
-
- // Note that simple async functions are implemented on top of
- // AsyncIterator objects; they just return a Promise for the value of
- // the final result produced by the iterator.
- runtime.async = function(innerFn, outerFn, self, tryLocsList) {
- var iter = new AsyncIterator(
- wrap(innerFn, outerFn, self, tryLocsList)
- );
-
- return runtime.isGeneratorFunction(outerFn)
- ? iter // If outerFn is a generator, return the full iterator.
- : iter.next().then(function(result) {
- return result.done ? result.value : iter.next();
- });
- };
-
- function makeInvokeMethod(innerFn, self, context) {
- var state = GenStateSuspendedStart;
-
- return function invoke(method, arg) {
- if (state === GenStateExecuting) {
- throw new Error("Generator is already running");
- }
-
- if (state === GenStateCompleted) {
- if (method === "throw") {
- throw arg;
- }
-
- // Be forgiving, per 25.3.3.3.3 of the spec:
- // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume
- return doneResult();
- }
-
- context.method = method;
- context.arg = arg;
-
- while (true) {
- var delegate = context.delegate;
- if (delegate) {
- var delegateResult = maybeInvokeDelegate(delegate, context);
- if (delegateResult) {
- if (delegateResult === ContinueSentinel) continue;
- return delegateResult;
- }
- }
-
- if (context.method === "next") {
- // Setting context._sent for legacy support of Babel's
- // function.sent implementation.
- context.sent = context._sent = context.arg;
-
- } else if (context.method === "throw") {
- if (state === GenStateSuspendedStart) {
- state = GenStateCompleted;
- throw context.arg;
- }
-
- context.dispatchException(context.arg);
-
- } else if (context.method === "return") {
- context.abrupt("return", context.arg);
- }
-
- state = GenStateExecuting;
-
- var record = tryCatch(innerFn, self, context);
- if (record.type === "normal") {
- // If an exception is thrown from innerFn, we leave state ===
- // GenStateExecuting and loop back for another invocation.
- state = context.done
- ? GenStateCompleted
- : GenStateSuspendedYield;
-
- if (record.arg === ContinueSentinel) {
- continue;
- }
-
- return {
- value: record.arg,
- done: context.done
- };
-
- } else if (record.type === "throw") {
- state = GenStateCompleted;
- // Dispatch the exception by looping back around to the
- // context.dispatchException(context.arg) call above.
- context.method = "throw";
- context.arg = record.arg;
- }
- }
- };
- }
-
- // Call delegate.iterator[context.method](context.arg) and handle the
- // result, either by returning a { value, done } result from the
- // delegate iterator, or by modifying context.method and context.arg,
- // setting context.delegate to null, and returning the ContinueSentinel.
- function maybeInvokeDelegate(delegate, context) {
- var method = delegate.iterator[context.method];
- if (method === undefined) {
- // A .throw or .return when the delegate iterator has no .throw
- // method always terminates the yield* loop.
- context.delegate = null;
-
- if (context.method === "throw") {
- if (delegate.iterator.return) {
- // If the delegate iterator has a return method, give it a
- // chance to clean up.
- context.method = "return";
- context.arg = undefined;
- maybeInvokeDelegate(delegate, context);
-
- if (context.method === "throw") {
- // If maybeInvokeDelegate(context) changed context.method from
- // "return" to "throw", let that override the TypeError below.
- return ContinueSentinel;
- }
- }
-
- context.method = "throw";
- context.arg = new TypeError(
- "The iterator does not provide a 'throw' method");
- }
-
- return ContinueSentinel;
- }
-
- var record = tryCatch(method, delegate.iterator, context.arg);
-
- if (record.type === "throw") {
- context.method = "throw";
- context.arg = record.arg;
- context.delegate = null;
- return ContinueSentinel;
- }
-
- var info = record.arg;
-
- if (! info) {
- context.method = "throw";
- context.arg = new TypeError("iterator result is not an object");
- context.delegate = null;
- return ContinueSentinel;
- }
-
- if (info.done) {
- // Assign the result of the finished delegate to the temporary
- // variable specified by delegate.resultName (see delegateYield).
- context[delegate.resultName] = info.value;
-
- // Resume execution at the desired location (see delegateYield).
- context.next = delegate.nextLoc;
-
- // If context.method was "throw" but the delegate handled the
- // exception, let the outer generator proceed normally. If
- // context.method was "next", forget context.arg since it has been
- // "consumed" by the delegate iterator. If context.method was
- // "return", allow the original .return call to continue in the
- // outer generator.
- if (context.method !== "return") {
- context.method = "next";
- context.arg = undefined;
- }
-
- } else {
- // Re-yield the result returned by the delegate method.
- return info;
- }
-
- // The delegate iterator is finished, so forget it and continue with
- // the outer generator.
- context.delegate = null;
- return ContinueSentinel;
- }
-
- // Define Generator.prototype.{next,throw,return} in terms of the
- // unified ._invoke helper method.
- defineIteratorMethods(Gp);
-
- Gp[toStringTagSymbol] = "Generator";
-
- // A Generator should always return itself as the iterator object when the
- // @@iterator function is called on it. Some browsers' implementations of the
- // iterator prototype chain incorrectly implement this, causing the Generator
- // object to not be returned from this call. This ensures that doesn't happen.
- // See https://github.com/facebook/regenerator/issues/274 for more details.
- Gp[iteratorSymbol] = function() {
- return this;
- };
-
- Gp.toString = function() {
- return "[object Generator]";
- };
-
- function pushTryEntry(locs) {
- var entry = { tryLoc: locs[0] };
-
- if (1 in locs) {
- entry.catchLoc = locs[1];
- }
-
- if (2 in locs) {
- entry.finallyLoc = locs[2];
- entry.afterLoc = locs[3];
- }
-
- this.tryEntries.push(entry);
- }
-
- function resetTryEntry(entry) {
- var record = entry.completion || {};
- record.type = "normal";
- delete record.arg;
- entry.completion = record;
- }
-
- function Context(tryLocsList) {
- // The root entry object (effectively a try statement without a catch
- // or a finally block) gives us a place to store values thrown from
- // locations where there is no enclosing try statement.
- this.tryEntries = [{ tryLoc: "root" }];
- tryLocsList.forEach(pushTryEntry, this);
- this.reset(true);
- }
-
- runtime.keys = function(object) {
- var keys = [];
- for (var key in object) {
- keys.push(key);
- }
- keys.reverse();
-
- // Rather than returning an object with a next method, we keep
- // things simple and return the next function itself.
- return function next() {
- while (keys.length) {
- var key = keys.pop();
- if (key in object) {
- next.value = key;
- next.done = false;
- return next;
- }
- }
-
- // To avoid creating an additional object, we just hang the .value
- // and .done properties off the next function object itself. This
- // also ensures that the minifier will not anonymize the function.
- next.done = true;
- return next;
- };
- };
-
- function values(iterable) {
- if (iterable) {
- var iteratorMethod = iterable[iteratorSymbol];
- if (iteratorMethod) {
- return iteratorMethod.call(iterable);
- }
-
- if (typeof iterable.next === "function") {
- return iterable;
- }
-
- if (!isNaN(iterable.length)) {
- var i = -1, next = function next() {
- while (++i < iterable.length) {
- if (hasOwn.call(iterable, i)) {
- next.value = iterable[i];
- next.done = false;
- return next;
- }
- }
-
- next.value = undefined;
- next.done = true;
-
- return next;
- };
-
- return next.next = next;
- }
- }
-
- // Return an iterator with no values.
- return { next: doneResult };
- }
- runtime.values = values;
-
- function doneResult() {
- return { value: undefined, done: true };
- }
-
- Context.prototype = {
- constructor: Context,
-
- reset: function(skipTempReset) {
- this.prev = 0;
- this.next = 0;
- // Resetting context._sent for legacy support of Babel's
- // function.sent implementation.
- this.sent = this._sent = undefined;
- this.done = false;
- this.delegate = null;
-
- this.method = "next";
- this.arg = undefined;
-
- this.tryEntries.forEach(resetTryEntry);
-
- if (!skipTempReset) {
- for (var name in this) {
- // Not sure about the optimal order of these conditions:
- if (name.charAt(0) === "t" &&
- hasOwn.call(this, name) &&
- !isNaN(+name.slice(1))) {
- this[name] = undefined;
- }
- }
- }
- },
-
- stop: function() {
- this.done = true;
-
- var rootEntry = this.tryEntries[0];
- var rootRecord = rootEntry.completion;
- if (rootRecord.type === "throw") {
- throw rootRecord.arg;
- }
-
- return this.rval;
- },
-
- dispatchException: function(exception) {
- if (this.done) {
- throw exception;
- }
-
- var context = this;
- function handle(loc, caught) {
- record.type = "throw";
- record.arg = exception;
- context.next = loc;
-
- if (caught) {
- // If the dispatched exception was caught by a catch block,
- // then let that catch block handle the exception normally.
- context.method = "next";
- context.arg = undefined;
- }
-
- return !! caught;
- }
-
- for (var i = this.tryEntries.length - 1; i >= 0; --i) {
- var entry = this.tryEntries[i];
- var record = entry.completion;
-
- if (entry.tryLoc === "root") {
- // Exception thrown outside of any try block that could handle
- // it, so set the completion value of the entire function to
- // throw the exception.
- return handle("end");
- }
-
- if (entry.tryLoc <= this.prev) {
- var hasCatch = hasOwn.call(entry, "catchLoc");
- var hasFinally = hasOwn.call(entry, "finallyLoc");
-
- if (hasCatch && hasFinally) {
- if (this.prev < entry.catchLoc) {
- return handle(entry.catchLoc, true);
- } else if (this.prev < entry.finallyLoc) {
- return handle(entry.finallyLoc);
- }
-
- } else if (hasCatch) {
- if (this.prev < entry.catchLoc) {
- return handle(entry.catchLoc, true);
- }
-
- } else if (hasFinally) {
- if (this.prev < entry.finallyLoc) {
- return handle(entry.finallyLoc);
- }
-
- } else {
- throw new Error("try statement without catch or finally");
- }
- }
- }
- },
-
- abrupt: function(type, arg) {
- for (var i = this.tryEntries.length - 1; i >= 0; --i) {
- var entry = this.tryEntries[i];
- if (entry.tryLoc <= this.prev &&
- hasOwn.call(entry, "finallyLoc") &&
- this.prev < entry.finallyLoc) {
- var finallyEntry = entry;
- break;
- }
- }
-
- if (finallyEntry &&
- (type === "break" ||
- type === "continue") &&
- finallyEntry.tryLoc <= arg &&
- arg <= finallyEntry.finallyLoc) {
- // Ignore the finally entry if control is not jumping to a
- // location outside the try/catch block.
- finallyEntry = null;
- }
-
- var record = finallyEntry ? finallyEntry.completion : {};
- record.type = type;
- record.arg = arg;
-
- if (finallyEntry) {
- this.method = "next";
- this.next = finallyEntry.finallyLoc;
- return ContinueSentinel;
- }
-
- return this.complete(record);
- },
-
- complete: function(record, afterLoc) {
- if (record.type === "throw") {
- throw record.arg;
- }
-
- if (record.type === "break" ||
- record.type === "continue") {
- this.next = record.arg;
- } else if (record.type === "return") {
- this.rval = this.arg = record.arg;
- this.method = "return";
- this.next = "end";
- } else if (record.type === "normal" && afterLoc) {
- this.next = afterLoc;
- }
-
- return ContinueSentinel;
- },
-
- finish: function(finallyLoc) {
- for (var i = this.tryEntries.length - 1; i >= 0; --i) {
- var entry = this.tryEntries[i];
- if (entry.finallyLoc === finallyLoc) {
- this.complete(entry.completion, entry.afterLoc);
- resetTryEntry(entry);
- return ContinueSentinel;
- }
- }
- },
-
- "catch": function(tryLoc) {
- for (var i = this.tryEntries.length - 1; i >= 0; --i) {
- var entry = this.tryEntries[i];
- if (entry.tryLoc === tryLoc) {
- var record = entry.completion;
- if (record.type === "throw") {
- var thrown = record.arg;
- resetTryEntry(entry);
- }
- return thrown;
- }
- }
-
- // The context.catch method must only be called with a location
- // argument that corresponds to a known catch block.
- throw new Error("illegal catch attempt");
- },
-
- delegateYield: function(iterable, resultName, nextLoc) {
- this.delegate = {
- iterator: values(iterable),
- resultName: resultName,
- nextLoc: nextLoc
- };
-
- if (this.method === "next") {
- // Deliberately forget the last sent value so that we don't
- // accidentally pass it on to the delegate.
- this.arg = undefined;
- }
-
- return ContinueSentinel;
- }
- };
-})(
- // Among the various tricks for obtaining a reference to the global
- // object, this seems to be the most reliable technique that does not
- // use indirect eval (which violates Content Security Policy).
- typeof commonjsGlobal === "object" ? commonjsGlobal :
- typeof window === "object" ? window :
- typeof self === "object" ? self : commonjsGlobal
-);
-});
-
-// Polyfill for creating CustomEvents on IE9/10/11
-
-// code pulled from:
-// https://github.com/d4tocchini/customevent-polyfill
-// https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent#Polyfill
-
-try {
- var ce = new window.CustomEvent('test');
- ce.preventDefault();
- if (ce.defaultPrevented !== true) {
- // IE has problems with .preventDefault() on custom events
- // http://stackoverflow.com/questions/23349191
- throw new Error('Could not prevent default');
- }
-} catch(e) {
- var CustomEvent$1 = function(event, params) {
- var evt, origPrevent;
- params = params || {
- bubbles: false,
- cancelable: false,
- detail: undefined
- };
-
- evt = document.createEvent("CustomEvent");
- evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);
- origPrevent = evt.preventDefault;
- evt.preventDefault = function () {
- origPrevent.call(this);
- try {
- Object.defineProperty(this, 'defaultPrevented', {
- get: function () {
- return true;
- }
- });
- } catch(e) {
- this.defaultPrevented = true;
- }
- };
- return evt;
- };
-
- CustomEvent$1.prototype = window.Event.prototype;
- window.CustomEvent = CustomEvent$1; // expose definition to window
-}
-
-(function(global) {
- /**
- * Polyfill URLSearchParams
- *
- * Inspired from : https://github.com/WebReflection/url-search-params/blob/master/src/url-search-params.js
- */
+ _export(_export.S, 'Object', {
+ getOwnPropertyDescriptors: function getOwnPropertyDescriptors(object) {
+ var O = _toIobject(object);
+ var getDesc = _objectGopd.f;
+ var keys = _ownKeys(O);
+ var result = {};
+ var i = 0;
+ var key, desc;
+ while (keys.length > i) {
+ desc = getDesc(O, key = keys[i++]);
+ if (desc !== undefined) _createProperty(result, key, desc);
+ }
+ return result;
+ }
+ });
+
+ // https://github.com/tc39/proposal-string-pad-start-end
+
+
+
+
+ var _stringPad = function (that, maxLength, fillString, left) {
+ var S = String(_defined(that));
+ var stringLength = S.length;
+ var fillStr = fillString === undefined ? ' ' : String(fillString);
+ var intMaxLength = _toLength(maxLength);
+ if (intMaxLength <= stringLength || fillStr == '') return S;
+ var fillLen = intMaxLength - stringLength;
+ var stringFiller = _stringRepeat.call(fillStr, Math.ceil(fillLen / fillStr.length));
+ if (stringFiller.length > fillLen) stringFiller = stringFiller.slice(0, fillLen);
+ return left ? stringFiller + S : S + stringFiller;
+ };
+
+ var navigator$1 = _global.navigator;
+
+ var _userAgent = navigator$1 && navigator$1.userAgent || '';
+
+ // https://github.com/tc39/proposal-string-pad-start-end
+
+
+
+
+ // https://github.com/zloirock/core-js/issues/280
+ _export(_export.P + _export.F * /Version\/10\.\d+(\.\d+)? Safari\//.test(_userAgent), 'String', {
+ padStart: function padStart(maxLength /* , fillString = ' ' */) {
+ return _stringPad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, true);
+ }
+ });
+
+ // https://github.com/tc39/proposal-string-pad-start-end
+
+
+
+
+ // https://github.com/zloirock/core-js/issues/280
+ _export(_export.P + _export.F * /Version\/10\.\d+(\.\d+)? Safari\//.test(_userAgent), 'String', {
+ padEnd: function padEnd(maxLength /* , fillString = ' ' */) {
+ return _stringPad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, false);
+ }
+ });
+
+ // ie9- setTimeout & setInterval additional parameters fix
+
+
+
+ var slice = [].slice;
+ var MSIE = /MSIE .\./.test(_userAgent); // <- dirty ie9- check
+ var wrap$1 = function (set) {
+ return function (fn, time /* , ...args */) {
+ var boundArgs = arguments.length > 2;
+ var args = boundArgs ? slice.call(arguments, 2) : false;
+ return set(boundArgs ? function () {
+ // eslint-disable-next-line no-new-func
+ (typeof fn == 'function' ? fn : Function(fn)).apply(this, args);
+ } : fn, time);
+ };
+ };
+ _export(_export.G + _export.B + _export.F * MSIE, {
+ setTimeout: wrap$1(_global.setTimeout),
+ setInterval: wrap$1(_global.setInterval)
+ });
+
+ _export(_export.G + _export.B, {
+ setImmediate: _task.set,
+ clearImmediate: _task.clear
+ });
+
+ var ITERATOR$4 = _wks('iterator');
+ var TO_STRING_TAG = _wks('toStringTag');
+ var ArrayValues = _iterators.Array;
+
+ var DOMIterables = {
+ CSSRuleList: true, // TODO: Not spec compliant, should be false.
+ CSSStyleDeclaration: false,
+ CSSValueList: false,
+ ClientRectList: false,
+ DOMRectList: false,
+ DOMStringList: false,
+ DOMTokenList: true,
+ DataTransferItemList: false,
+ FileList: false,
+ HTMLAllCollection: false,
+ HTMLCollection: false,
+ HTMLFormElement: false,
+ HTMLSelectElement: false,
+ MediaList: true, // TODO: Not spec compliant, should be false.
+ MimeTypeArray: false,
+ NamedNodeMap: false,
+ NodeList: true,
+ PaintRequestList: false,
+ Plugin: false,
+ PluginArray: false,
+ SVGLengthList: false,
+ SVGNumberList: false,
+ SVGPathSegList: false,
+ SVGPointList: false,
+ SVGStringList: false,
+ SVGTransformList: false,
+ SourceBufferList: false,
+ StyleSheetList: true, // TODO: Not spec compliant, should be false.
+ TextTrackCueList: false,
+ TextTrackList: false,
+ TouchList: false
+ };
+
+ for (var collections = _objectKeys(DOMIterables), i$1 = 0; i$1 < collections.length; i$1++) {
+ var NAME$1 = collections[i$1];
+ var explicit = DOMIterables[NAME$1];
+ var Collection = _global[NAME$1];
+ var proto = Collection && Collection.prototype;
+ var key;
+ if (proto) {
+ if (!proto[ITERATOR$4]) _hide(proto, ITERATOR$4, ArrayValues);
+ if (!proto[TO_STRING_TAG]) _hide(proto, TO_STRING_TAG, NAME$1);
+ _iterators[NAME$1] = ArrayValues;
+ if (explicit) for (key in es6_array_iterator) if (!proto[key]) _redefine(proto, key, es6_array_iterator[key], true);
+ }
+ }
+
+ var runtime = createCommonjsModule(function (module) {
+ /**
+ * Copyright (c) 2014, Facebook, Inc.
+ * All rights reserved.
+ *
+ * This source code is licensed under the BSD-style license found in the
+ * https://raw.github.com/facebook/regenerator/master/LICENSE file. An
+ * additional grant of patent rights can be found in the PATENTS file in
+ * the same directory.
+ */
+
+ !(function(global) {
+
+ var Op = Object.prototype;
+ var hasOwn = Op.hasOwnProperty;
+ var undefined; // More compressible than void 0.
+ var $Symbol = typeof Symbol === "function" ? Symbol : {};
+ var iteratorSymbol = $Symbol.iterator || "@@iterator";
+ var asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator";
+ var toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag";
+ var runtime = global.regeneratorRuntime;
+ if (runtime) {
+ {
+ // If regeneratorRuntime is defined globally and we're in a module,
+ // make the exports object identical to regeneratorRuntime.
+ module.exports = runtime;
+ }
+ // Don't bother evaluating the rest of this file if the runtime was
+ // already defined globally.
+ return;
+ }
+
+ // Define the runtime globally (as expected by generated code) as either
+ // module.exports (if we're in a module) or a new, empty object.
+ runtime = global.regeneratorRuntime = module.exports;
+
+ function wrap(innerFn, outerFn, self, tryLocsList) {
+ // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.
+ var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;
+ var generator = Object.create(protoGenerator.prototype);
+ var context = new Context(tryLocsList || []);
+
+ // The ._invoke method unifies the implementations of the .next,
+ // .throw, and .return methods.
+ generator._invoke = makeInvokeMethod(innerFn, self, context);
+
+ return generator;
+ }
+ runtime.wrap = wrap;
+
+ // Try/catch helper to minimize deoptimizations. Returns a completion
+ // record like context.tryEntries[i].completion. This interface could
+ // have been (and was previously) designed to take a closure to be
+ // invoked without arguments, but in all the cases we care about we
+ // already have an existing method we want to call, so there's no need
+ // to create a new function object. We can even get away with assuming
+ // the method takes exactly one argument, since that happens to be true
+ // in every case, so we don't have to touch the arguments object. The
+ // only additional allocation required is the completion record, which
+ // has a stable shape and so hopefully should be cheap to allocate.
+ function tryCatch(fn, obj, arg) {
+ try {
+ return { type: "normal", arg: fn.call(obj, arg) };
+ } catch (err) {
+ return { type: "throw", arg: err };
+ }
+ }
+
+ var GenStateSuspendedStart = "suspendedStart";
+ var GenStateSuspendedYield = "suspendedYield";
+ var GenStateExecuting = "executing";
+ var GenStateCompleted = "completed";
+
+ // Returning this object from the innerFn has the same effect as
+ // breaking out of the dispatch switch statement.
+ var ContinueSentinel = {};
+
+ // Dummy constructor functions that we use as the .constructor and
+ // .constructor.prototype properties for functions that return Generator
+ // objects. For full spec compliance, you may wish to configure your
+ // minifier not to mangle the names of these two functions.
+ function Generator() {}
+ function GeneratorFunction() {}
+ function GeneratorFunctionPrototype() {}
+
+ // This is a polyfill for %IteratorPrototype% for environments that
+ // don't natively support it.
+ var IteratorPrototype = {};
+ IteratorPrototype[iteratorSymbol] = function () {
+ return this;
+ };
+
+ var getProto = Object.getPrototypeOf;
+ var NativeIteratorPrototype = getProto && getProto(getProto(values([])));
+ if (NativeIteratorPrototype &&
+ NativeIteratorPrototype !== Op &&
+ hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {
+ // This environment has a native %IteratorPrototype%; use it instead
+ // of the polyfill.
+ IteratorPrototype = NativeIteratorPrototype;
+ }
+
+ var Gp = GeneratorFunctionPrototype.prototype =
+ Generator.prototype = Object.create(IteratorPrototype);
+ GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;
+ GeneratorFunctionPrototype.constructor = GeneratorFunction;
+ GeneratorFunctionPrototype[toStringTagSymbol] =
+ GeneratorFunction.displayName = "GeneratorFunction";
+
+ // Helper for defining the .next, .throw, and .return methods of the
+ // Iterator interface in terms of a single ._invoke method.
+ function defineIteratorMethods(prototype) {
+ ["next", "throw", "return"].forEach(function(method) {
+ prototype[method] = function(arg) {
+ return this._invoke(method, arg);
+ };
+ });
+ }
+
+ runtime.isGeneratorFunction = function(genFun) {
+ var ctor = typeof genFun === "function" && genFun.constructor;
+ return ctor
+ ? ctor === GeneratorFunction ||
+ // For the native GeneratorFunction constructor, the best we can
+ // do is to check its .name property.
+ (ctor.displayName || ctor.name) === "GeneratorFunction"
+ : false;
+ };
+
+ runtime.mark = function(genFun) {
+ if (Object.setPrototypeOf) {
+ Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);
+ } else {
+ genFun.__proto__ = GeneratorFunctionPrototype;
+ if (!(toStringTagSymbol in genFun)) {
+ genFun[toStringTagSymbol] = "GeneratorFunction";
+ }
+ }
+ genFun.prototype = Object.create(Gp);
+ return genFun;
+ };
+
+ // Within the body of any async function, `await x` is transformed to
+ // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test
+ // `hasOwn.call(value, "__await")` to determine if the yielded value is
+ // meant to be awaited.
+ runtime.awrap = function(arg) {
+ return { __await: arg };
+ };
+
+ function AsyncIterator(generator) {
+ function invoke(method, arg, resolve, reject) {
+ var record = tryCatch(generator[method], generator, arg);
+ if (record.type === "throw") {
+ reject(record.arg);
+ } else {
+ var result = record.arg;
+ var value = result.value;
+ if (value &&
+ typeof value === "object" &&
+ hasOwn.call(value, "__await")) {
+ return Promise.resolve(value.__await).then(function(value) {
+ invoke("next", value, resolve, reject);
+ }, function(err) {
+ invoke("throw", err, resolve, reject);
+ });
+ }
+
+ return Promise.resolve(value).then(function(unwrapped) {
+ // When a yielded Promise is resolved, its final value becomes
+ // the .value of the Promise<{value,done}> result for the
+ // current iteration. If the Promise is rejected, however, the
+ // result for this iteration will be rejected with the same
+ // reason. Note that rejections of yielded Promises are not
+ // thrown back into the generator function, as is the case
+ // when an awaited Promise is rejected. This difference in
+ // behavior between yield and await is important, because it
+ // allows the consumer to decide what to do with the yielded
+ // rejection (swallow it and continue, manually .throw it back
+ // into the generator, abandon iteration, whatever). With
+ // await, by contrast, there is no opportunity to examine the
+ // rejection reason outside the generator function, so the
+ // only option is to throw it from the await expression, and
+ // let the generator function handle the exception.
+ result.value = unwrapped;
+ resolve(result);
+ }, reject);
+ }
+ }
+
+ if (typeof global.process === "object" && global.process.domain) {
+ invoke = global.process.domain.bind(invoke);
+ }
+
+ var previousPromise;
+
+ function enqueue(method, arg) {
+ function callInvokeWithMethodAndArg() {
+ return new Promise(function(resolve, reject) {
+ invoke(method, arg, resolve, reject);
+ });
+ }
+
+ return previousPromise =
+ // If enqueue has been called before, then we want to wait until
+ // all previous Promises have been resolved before calling invoke,
+ // so that results are always delivered in the correct order. If
+ // enqueue has not been called before, then it is important to
+ // call invoke immediately, without waiting on a callback to fire,
+ // so that the async generator function has the opportunity to do
+ // any necessary setup in a predictable way. This predictability
+ // is why the Promise constructor synchronously invokes its
+ // executor callback, and why async functions synchronously
+ // execute code before the first await. Since we implement simple
+ // async functions in terms of async generators, it is especially
+ // important to get this right, even though it requires care.
+ previousPromise ? previousPromise.then(
+ callInvokeWithMethodAndArg,
+ // Avoid propagating failures to Promises returned by later
+ // invocations of the iterator.
+ callInvokeWithMethodAndArg
+ ) : callInvokeWithMethodAndArg();
+ }
+
+ // Define the unified helper method that is used to implement .next,
+ // .throw, and .return (see defineIteratorMethods).
+ this._invoke = enqueue;
+ }
+
+ defineIteratorMethods(AsyncIterator.prototype);
+ AsyncIterator.prototype[asyncIteratorSymbol] = function () {
+ return this;
+ };
+ runtime.AsyncIterator = AsyncIterator;
+
+ // Note that simple async functions are implemented on top of
+ // AsyncIterator objects; they just return a Promise for the value of
+ // the final result produced by the iterator.
+ runtime.async = function(innerFn, outerFn, self, tryLocsList) {
+ var iter = new AsyncIterator(
+ wrap(innerFn, outerFn, self, tryLocsList)
+ );
+
+ return runtime.isGeneratorFunction(outerFn)
+ ? iter // If outerFn is a generator, return the full iterator.
+ : iter.next().then(function(result) {
+ return result.done ? result.value : iter.next();
+ });
+ };
+
+ function makeInvokeMethod(innerFn, self, context) {
+ var state = GenStateSuspendedStart;
+
+ return function invoke(method, arg) {
+ if (state === GenStateExecuting) {
+ throw new Error("Generator is already running");
+ }
+
+ if (state === GenStateCompleted) {
+ if (method === "throw") {
+ throw arg;
+ }
+
+ // Be forgiving, per 25.3.3.3.3 of the spec:
+ // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume
+ return doneResult();
+ }
+
+ context.method = method;
+ context.arg = arg;
+
+ while (true) {
+ var delegate = context.delegate;
+ if (delegate) {
+ var delegateResult = maybeInvokeDelegate(delegate, context);
+ if (delegateResult) {
+ if (delegateResult === ContinueSentinel) continue;
+ return delegateResult;
+ }
+ }
+
+ if (context.method === "next") {
+ // Setting context._sent for legacy support of Babel's
+ // function.sent implementation.
+ context.sent = context._sent = context.arg;
+
+ } else if (context.method === "throw") {
+ if (state === GenStateSuspendedStart) {
+ state = GenStateCompleted;
+ throw context.arg;
+ }
+
+ context.dispatchException(context.arg);
+
+ } else if (context.method === "return") {
+ context.abrupt("return", context.arg);
+ }
+
+ state = GenStateExecuting;
+
+ var record = tryCatch(innerFn, self, context);
+ if (record.type === "normal") {
+ // If an exception is thrown from innerFn, we leave state ===
+ // GenStateExecuting and loop back for another invocation.
+ state = context.done
+ ? GenStateCompleted
+ : GenStateSuspendedYield;
+
+ if (record.arg === ContinueSentinel) {
+ continue;
+ }
+
+ return {
+ value: record.arg,
+ done: context.done
+ };
+
+ } else if (record.type === "throw") {
+ state = GenStateCompleted;
+ // Dispatch the exception by looping back around to the
+ // context.dispatchException(context.arg) call above.
+ context.method = "throw";
+ context.arg = record.arg;
+ }
+ }
+ };
+ }
+
+ // Call delegate.iterator[context.method](context.arg) and handle the
+ // result, either by returning a { value, done } result from the
+ // delegate iterator, or by modifying context.method and context.arg,
+ // setting context.delegate to null, and returning the ContinueSentinel.
+ function maybeInvokeDelegate(delegate, context) {
+ var method = delegate.iterator[context.method];
+ if (method === undefined) {
+ // A .throw or .return when the delegate iterator has no .throw
+ // method always terminates the yield* loop.
+ context.delegate = null;
+
+ if (context.method === "throw") {
+ if (delegate.iterator.return) {
+ // If the delegate iterator has a return method, give it a
+ // chance to clean up.
+ context.method = "return";
+ context.arg = undefined;
+ maybeInvokeDelegate(delegate, context);
+
+ if (context.method === "throw") {
+ // If maybeInvokeDelegate(context) changed context.method from
+ // "return" to "throw", let that override the TypeError below.
+ return ContinueSentinel;
+ }
+ }
+
+ context.method = "throw";
+ context.arg = new TypeError(
+ "The iterator does not provide a 'throw' method");
+ }
+
+ return ContinueSentinel;
+ }
+
+ var record = tryCatch(method, delegate.iterator, context.arg);
+
+ if (record.type === "throw") {
+ context.method = "throw";
+ context.arg = record.arg;
+ context.delegate = null;
+ return ContinueSentinel;
+ }
+
+ var info = record.arg;
+
+ if (! info) {
+ context.method = "throw";
+ context.arg = new TypeError("iterator result is not an object");
+ context.delegate = null;
+ return ContinueSentinel;
+ }
+
+ if (info.done) {
+ // Assign the result of the finished delegate to the temporary
+ // variable specified by delegate.resultName (see delegateYield).
+ context[delegate.resultName] = info.value;
+
+ // Resume execution at the desired location (see delegateYield).
+ context.next = delegate.nextLoc;
+
+ // If context.method was "throw" but the delegate handled the
+ // exception, let the outer generator proceed normally. If
+ // context.method was "next", forget context.arg since it has been
+ // "consumed" by the delegate iterator. If context.method was
+ // "return", allow the original .return call to continue in the
+ // outer generator.
+ if (context.method !== "return") {
+ context.method = "next";
+ context.arg = undefined;
+ }
+
+ } else {
+ // Re-yield the result returned by the delegate method.
+ return info;
+ }
+
+ // The delegate iterator is finished, so forget it and continue with
+ // the outer generator.
+ context.delegate = null;
+ return ContinueSentinel;
+ }
+
+ // Define Generator.prototype.{next,throw,return} in terms of the
+ // unified ._invoke helper method.
+ defineIteratorMethods(Gp);
+
+ Gp[toStringTagSymbol] = "Generator";
+
+ // A Generator should always return itself as the iterator object when the
+ // @@iterator function is called on it. Some browsers' implementations of the
+ // iterator prototype chain incorrectly implement this, causing the Generator
+ // object to not be returned from this call. This ensures that doesn't happen.
+ // See https://github.com/facebook/regenerator/issues/274 for more details.
+ Gp[iteratorSymbol] = function() {
+ return this;
+ };
+
+ Gp.toString = function() {
+ return "[object Generator]";
+ };
+
+ function pushTryEntry(locs) {
+ var entry = { tryLoc: locs[0] };
+
+ if (1 in locs) {
+ entry.catchLoc = locs[1];
+ }
+
+ if (2 in locs) {
+ entry.finallyLoc = locs[2];
+ entry.afterLoc = locs[3];
+ }
+
+ this.tryEntries.push(entry);
+ }
+
+ function resetTryEntry(entry) {
+ var record = entry.completion || {};
+ record.type = "normal";
+ delete record.arg;
+ entry.completion = record;
+ }
+
+ function Context(tryLocsList) {
+ // The root entry object (effectively a try statement without a catch
+ // or a finally block) gives us a place to store values thrown from
+ // locations where there is no enclosing try statement.
+ this.tryEntries = [{ tryLoc: "root" }];
+ tryLocsList.forEach(pushTryEntry, this);
+ this.reset(true);
+ }
+
+ runtime.keys = function(object) {
+ var keys = [];
+ for (var key in object) {
+ keys.push(key);
+ }
+ keys.reverse();
+
+ // Rather than returning an object with a next method, we keep
+ // things simple and return the next function itself.
+ return function next() {
+ while (keys.length) {
+ var key = keys.pop();
+ if (key in object) {
+ next.value = key;
+ next.done = false;
+ return next;
+ }
+ }
+
+ // To avoid creating an additional object, we just hang the .value
+ // and .done properties off the next function object itself. This
+ // also ensures that the minifier will not anonymize the function.
+ next.done = true;
+ return next;
+ };
+ };
+
+ function values(iterable) {
+ if (iterable) {
+ var iteratorMethod = iterable[iteratorSymbol];
+ if (iteratorMethod) {
+ return iteratorMethod.call(iterable);
+ }
+
+ if (typeof iterable.next === "function") {
+ return iterable;
+ }
+
+ if (!isNaN(iterable.length)) {
+ var i = -1, next = function next() {
+ while (++i < iterable.length) {
+ if (hasOwn.call(iterable, i)) {
+ next.value = iterable[i];
+ next.done = false;
+ return next;
+ }
+ }
+
+ next.value = undefined;
+ next.done = true;
+
+ return next;
+ };
+
+ return next.next = next;
+ }
+ }
+
+ // Return an iterator with no values.
+ return { next: doneResult };
+ }
+ runtime.values = values;
+
+ function doneResult() {
+ return { value: undefined, done: true };
+ }
+
+ Context.prototype = {
+ constructor: Context,
+
+ reset: function(skipTempReset) {
+ this.prev = 0;
+ this.next = 0;
+ // Resetting context._sent for legacy support of Babel's
+ // function.sent implementation.
+ this.sent = this._sent = undefined;
+ this.done = false;
+ this.delegate = null;
+
+ this.method = "next";
+ this.arg = undefined;
+
+ this.tryEntries.forEach(resetTryEntry);
+
+ if (!skipTempReset) {
+ for (var name in this) {
+ // Not sure about the optimal order of these conditions:
+ if (name.charAt(0) === "t" &&
+ hasOwn.call(this, name) &&
+ !isNaN(+name.slice(1))) {
+ this[name] = undefined;
+ }
+ }
+ }
+ },
+
+ stop: function() {
+ this.done = true;
+
+ var rootEntry = this.tryEntries[0];
+ var rootRecord = rootEntry.completion;
+ if (rootRecord.type === "throw") {
+ throw rootRecord.arg;
+ }
+
+ return this.rval;
+ },
+
+ dispatchException: function(exception) {
+ if (this.done) {
+ throw exception;
+ }
+
+ var context = this;
+ function handle(loc, caught) {
+ record.type = "throw";
+ record.arg = exception;
+ context.next = loc;
+
+ if (caught) {
+ // If the dispatched exception was caught by a catch block,
+ // then let that catch block handle the exception normally.
+ context.method = "next";
+ context.arg = undefined;
+ }
+
+ return !! caught;
+ }
+
+ for (var i = this.tryEntries.length - 1; i >= 0; --i) {
+ var entry = this.tryEntries[i];
+ var record = entry.completion;
+
+ if (entry.tryLoc === "root") {
+ // Exception thrown outside of any try block that could handle
+ // it, so set the completion value of the entire function to
+ // throw the exception.
+ return handle("end");
+ }
+
+ if (entry.tryLoc <= this.prev) {
+ var hasCatch = hasOwn.call(entry, "catchLoc");
+ var hasFinally = hasOwn.call(entry, "finallyLoc");
+
+ if (hasCatch && hasFinally) {
+ if (this.prev < entry.catchLoc) {
+ return handle(entry.catchLoc, true);
+ } else if (this.prev < entry.finallyLoc) {
+ return handle(entry.finallyLoc);
+ }
+
+ } else if (hasCatch) {
+ if (this.prev < entry.catchLoc) {
+ return handle(entry.catchLoc, true);
+ }
+
+ } else if (hasFinally) {
+ if (this.prev < entry.finallyLoc) {
+ return handle(entry.finallyLoc);
+ }
+
+ } else {
+ throw new Error("try statement without catch or finally");
+ }
+ }
+ }
+ },
+
+ abrupt: function(type, arg) {
+ for (var i = this.tryEntries.length - 1; i >= 0; --i) {
+ var entry = this.tryEntries[i];
+ if (entry.tryLoc <= this.prev &&
+ hasOwn.call(entry, "finallyLoc") &&
+ this.prev < entry.finallyLoc) {
+ var finallyEntry = entry;
+ break;
+ }
+ }
+
+ if (finallyEntry &&
+ (type === "break" ||
+ type === "continue") &&
+ finallyEntry.tryLoc <= arg &&
+ arg <= finallyEntry.finallyLoc) {
+ // Ignore the finally entry if control is not jumping to a
+ // location outside the try/catch block.
+ finallyEntry = null;
+ }
+
+ var record = finallyEntry ? finallyEntry.completion : {};
+ record.type = type;
+ record.arg = arg;
+
+ if (finallyEntry) {
+ this.method = "next";
+ this.next = finallyEntry.finallyLoc;
+ return ContinueSentinel;
+ }
+
+ return this.complete(record);
+ },
+
+ complete: function(record, afterLoc) {
+ if (record.type === "throw") {
+ throw record.arg;
+ }
+
+ if (record.type === "break" ||
+ record.type === "continue") {
+ this.next = record.arg;
+ } else if (record.type === "return") {
+ this.rval = this.arg = record.arg;
+ this.method = "return";
+ this.next = "end";
+ } else if (record.type === "normal" && afterLoc) {
+ this.next = afterLoc;
+ }
+
+ return ContinueSentinel;
+ },
+
+ finish: function(finallyLoc) {
+ for (var i = this.tryEntries.length - 1; i >= 0; --i) {
+ var entry = this.tryEntries[i];
+ if (entry.finallyLoc === finallyLoc) {
+ this.complete(entry.completion, entry.afterLoc);
+ resetTryEntry(entry);
+ return ContinueSentinel;
+ }
+ }
+ },
+
+ "catch": function(tryLoc) {
+ for (var i = this.tryEntries.length - 1; i >= 0; --i) {
+ var entry = this.tryEntries[i];
+ if (entry.tryLoc === tryLoc) {
+ var record = entry.completion;
+ if (record.type === "throw") {
+ var thrown = record.arg;
+ resetTryEntry(entry);
+ }
+ return thrown;
+ }
+ }
+
+ // The context.catch method must only be called with a location
+ // argument that corresponds to a known catch block.
+ throw new Error("illegal catch attempt");
+ },
+
+ delegateYield: function(iterable, resultName, nextLoc) {
+ this.delegate = {
+ iterator: values(iterable),
+ resultName: resultName,
+ nextLoc: nextLoc
+ };
+
+ if (this.method === "next") {
+ // Deliberately forget the last sent value so that we don't
+ // accidentally pass it on to the delegate.
+ this.arg = undefined;
+ }
+
+ return ContinueSentinel;
+ }
+ };
+ })(
+ // Among the various tricks for obtaining a reference to the global
+ // object, this seems to be the most reliable technique that does not
+ // use indirect eval (which violates Content Security Policy).
+ typeof commonjsGlobal === "object" ? commonjsGlobal :
+ typeof window === "object" ? window :
+ typeof self === "object" ? self : commonjsGlobal
+ );
+ });
+
+ // Polyfill for creating CustomEvents on IE9/10/11
+
+ // code pulled from:
+ // https://github.com/d4tocchini/customevent-polyfill
+ // https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent#Polyfill
+
+ try {
+ var ce = new window.CustomEvent('test');
+ ce.preventDefault();
+ if (ce.defaultPrevented !== true) {
+ // IE has problems with .preventDefault() on custom events
+ // http://stackoverflow.com/questions/23349191
+ throw new Error('Could not prevent default');
+ }
+ } catch(e) {
+ var CustomEvent$1 = function(event, params) {
+ var evt, origPrevent;
+ params = params || {
+ bubbles: false,
+ cancelable: false,
+ detail: undefined
+ };
+
+ evt = document.createEvent("CustomEvent");
+ evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);
+ origPrevent = evt.preventDefault;
+ evt.preventDefault = function () {
+ origPrevent.call(this);
+ try {
+ Object.defineProperty(this, 'defaultPrevented', {
+ get: function () {
+ return true;
+ }
+ });
+ } catch(e) {
+ this.defaultPrevented = true;
+ }
+ };
+ return evt;
+ };
+
+ CustomEvent$1.prototype = window.Event.prototype;
+ window.CustomEvent = CustomEvent$1; // expose definition to window
+ }
+
+ (function(global) {
+ /**
+ * Polyfill URLSearchParams
+ *
+ * Inspired from : https://github.com/WebReflection/url-search-params/blob/master/src/url-search-params.js
+ */
- var checkIfIteratorIsSupported = function() {
- try {
- return !!Symbol.iterator;
- } catch(error) {
- return false;
- }
- };
+ var checkIfIteratorIsSupported = function() {
+ try {
+ return !!Symbol.iterator;
+ } catch(error) {
+ return false;
+ }
+ };
- var iteratorSupported = checkIfIteratorIsSupported();
+ var iteratorSupported = checkIfIteratorIsSupported();
- var createIterator = function(items) {
- var iterator = {
- next: function() {
- var value = items.shift();
- return { done: value === void 0, value: value };
- }
- };
+ var createIterator = function(items) {
+ var iterator = {
+ next: function() {
+ var value = items.shift();
+ return { done: value === void 0, value: value };
+ }
+ };
- if(iteratorSupported) {
- iterator[Symbol.iterator] = function() {
- return iterator;
- };
- }
+ if(iteratorSupported) {
+ iterator[Symbol.iterator] = function() {
+ return iterator;
+ };
+ }
- return iterator;
- };
+ return iterator;
+ };
- /**
- * Search param name and values should be encoded according to https://url.spec.whatwg.org/#urlencoded-serializing
- * encodeURIComponent() produces the same result except encoding spaces as `%20` instead of `+`.
- */
- var serializeParam = function(value) {
- return encodeURIComponent(value).replace(/%20/g, '+');
- };
+ /**
+ * Search param name and values should be encoded according to https://url.spec.whatwg.org/#urlencoded-serializing
+ * encodeURIComponent() produces the same result except encoding spaces as `%20` instead of `+`.
+ */
+ var serializeParam = function(value) {
+ return encodeURIComponent(value).replace(/%20/g, '+');
+ };
- var deserializeParam = function(value) {
- return decodeURIComponent(value).replace(/\+/g, ' ');
- };
+ var deserializeParam = function(value) {
+ return decodeURIComponent(value).replace(/\+/g, ' ');
+ };
- var polyfillURLSearchParams= function() {
+ var polyfillURLSearchParams= function() {
- var URLSearchParams = function(searchString) {
- Object.defineProperty(this, '_entries', { value: {} });
+ var URLSearchParams = function(searchString) {
+ Object.defineProperty(this, '_entries', { value: {} });
- if(typeof searchString === 'string') {
- if(searchString !== '') {
- searchString = searchString.replace(/^\?/, '');
- var attributes = searchString.split('&');
- var attribute;
- for(var i = 0; i < attributes.length; i++) {
- attribute = attributes[i].split('=');
- this.append(
- deserializeParam(attribute[0]),
- (attribute.length > 1) ? deserializeParam(attribute[1]) : ''
- );
- }
- }
- } else if(searchString instanceof URLSearchParams) {
- var _this = this;
- searchString.forEach(function(value, name) {
- _this.append(value, name);
- });
- }
- };
+ if(typeof searchString === 'string') {
+ if(searchString !== '') {
+ searchString = searchString.replace(/^\?/, '');
+ var attributes = searchString.split('&');
+ var attribute;
+ for(var i = 0; i < attributes.length; i++) {
+ attribute = attributes[i].split('=');
+ this.append(
+ deserializeParam(attribute[0]),
+ (attribute.length > 1) ? deserializeParam(attribute[1]) : ''
+ );
+ }
+ }
+ } else if(searchString instanceof URLSearchParams) {
+ var _this = this;
+ searchString.forEach(function(value, name) {
+ _this.append(value, name);
+ });
+ }
+ };
- var proto = URLSearchParams.prototype;
+ var proto = URLSearchParams.prototype;
- proto.append = function(name, value) {
- if(name in this._entries) {
- this._entries[name].push(value.toString());
- } else {
- this._entries[name] = [value.toString()];
- }
- };
+ proto.append = function(name, value) {
+ if(name in this._entries) {
+ this._entries[name].push(value.toString());
+ } else {
+ this._entries[name] = [value.toString()];
+ }
+ };
- proto.delete = function(name) {
- delete this._entries[name];
- };
+ proto.delete = function(name) {
+ delete this._entries[name];
+ };
- proto.get = function(name) {
- return (name in this._entries) ? this._entries[name][0] : null;
- };
+ proto.get = function(name) {
+ return (name in this._entries) ? this._entries[name][0] : null;
+ };
- proto.getAll = function(name) {
- return (name in this._entries) ? this._entries[name].slice(0) : [];
- };
+ proto.getAll = function(name) {
+ return (name in this._entries) ? this._entries[name].slice(0) : [];
+ };
- proto.has = function(name) {
- return (name in this._entries);
- };
+ proto.has = function(name) {
+ return (name in this._entries);
+ };
- proto.set = function(name, value) {
- this._entries[name] = [value.toString()];
- };
+ proto.set = function(name, value) {
+ this._entries[name] = [value.toString()];
+ };
- proto.forEach = function(callback, thisArg) {
- var entries;
- for(var name in this._entries) {
- if(this._entries.hasOwnProperty(name)) {
- entries = this._entries[name];
- for(var i = 0; i < entries.length; i++) {
- callback.call(thisArg, entries[i], name, this);
- }
- }
- }
- };
+ proto.forEach = function(callback, thisArg) {
+ var entries;
+ for(var name in this._entries) {
+ if(this._entries.hasOwnProperty(name)) {
+ entries = this._entries[name];
+ for(var i = 0; i < entries.length; i++) {
+ callback.call(thisArg, entries[i], name, this);
+ }
+ }
+ }
+ };
- proto.keys = function() {
- var items = [];
- this.forEach(function(value, name) { items.push(name); });
- return createIterator(items);
- };
+ proto.keys = function() {
+ var items = [];
+ this.forEach(function(value, name) { items.push(name); });
+ return createIterator(items);
+ };
- proto.values = function() {
- var items = [];
- this.forEach(function(value) { items.push(value); });
- return createIterator(items);
- };
+ proto.values = function() {
+ var items = [];
+ this.forEach(function(value) { items.push(value); });
+ return createIterator(items);
+ };
- proto.entries = function() {
- var items = [];
- this.forEach(function(value, name) { items.push([name, value]); });
- return createIterator(items);
- };
+ proto.entries = function() {
+ var items = [];
+ this.forEach(function(value, name) { items.push([name, value]); });
+ return createIterator(items);
+ };
- if(iteratorSupported) {
- proto[Symbol.iterator] = proto.entries;
- }
+ if(iteratorSupported) {
+ proto[Symbol.iterator] = proto.entries;
+ }
- proto.toString = function() {
- var searchString = '';
- this.forEach(function(value, name) {
- if(searchString.length > 0) searchString+= '&';
- searchString += serializeParam(name) + '=' + serializeParam(value);
- });
- return searchString;
- };
+ proto.toString = function() {
+ var searchString = '';
+ this.forEach(function(value, name) {
+ if(searchString.length > 0) searchString+= '&';
+ searchString += serializeParam(name) + '=' + serializeParam(value);
+ });
+ return searchString;
+ };
- global.URLSearchParams = URLSearchParams;
- };
+ global.URLSearchParams = URLSearchParams;
+ };
- if(!('URLSearchParams' in global) || (new URLSearchParams('?a=1').toString() !== 'a=1')) {
- polyfillURLSearchParams();
- }
+ if(!('URLSearchParams' in global) || (new URLSearchParams('?a=1').toString() !== 'a=1')) {
+ polyfillURLSearchParams();
+ }
- // HTMLAnchorElement
+ // HTMLAnchorElement
-})(
- (typeof commonjsGlobal !== 'undefined') ? commonjsGlobal
- : ((typeof window !== 'undefined') ? window
- : ((typeof self !== 'undefined') ? self : commonjsGlobal))
-);
+ })(
+ (typeof commonjsGlobal !== 'undefined') ? commonjsGlobal
+ : ((typeof window !== 'undefined') ? window
+ : ((typeof self !== 'undefined') ? self : commonjsGlobal))
+ );
-(function(global) {
- /**
- * Polyfill URL
- *
- * Inspired from : https://github.com/arv/DOM-URL-Polyfill/blob/master/src/url.js
- */
+ (function(global) {
+ /**
+ * Polyfill URL
+ *
+ * Inspired from : https://github.com/arv/DOM-URL-Polyfill/blob/master/src/url.js
+ */
- var checkIfURLIsSupported = function() {
- try {
- var u = new URL('b', 'http://a');
- u.pathname = 'c%20d';
- return (u.href === 'http://a/c%20d') && u.searchParams;
- } catch(e) {
- return false;
- }
- };
+ var checkIfURLIsSupported = function() {
+ try {
+ var u = new URL('b', 'http://a');
+ u.pathname = 'c%20d';
+ return (u.href === 'http://a/c%20d') && u.searchParams;
+ } catch(e) {
+ return false;
+ }
+ };
- var polyfillURL = function() {
- var _URL = global.URL;
+ var polyfillURL = function() {
+ var _URL = global.URL;
- var URL = function(url, base) {
- if(typeof url !== 'string') url = String(url);
+ var URL = function(url, base) {
+ if(typeof url !== 'string') url = String(url);
- var doc = document.implementation.createHTMLDocument('');
- window.doc = doc;
- if(base) {
- var baseElement = doc.createElement('base');
- baseElement.href = base;
- doc.head.appendChild(baseElement);
- }
+ var doc = document.implementation.createHTMLDocument('');
+ window.doc = doc;
+ if(base) {
+ var baseElement = doc.createElement('base');
+ baseElement.href = base;
+ doc.head.appendChild(baseElement);
+ }
- var anchorElement = doc.createElement('a');
- anchorElement.href = url;
- doc.body.appendChild(anchorElement);
- anchorElement.href = anchorElement.href; // force href to refresh
+ var anchorElement = doc.createElement('a');
+ anchorElement.href = url;
+ doc.body.appendChild(anchorElement);
+ anchorElement.href = anchorElement.href; // force href to refresh
- if(anchorElement.protocol === ':' || !/:/.test(anchorElement.href)) {
- throw new TypeError('Invalid URL');
- }
+ if(anchorElement.protocol === ':' || !/:/.test(anchorElement.href)) {
+ throw new TypeError('Invalid URL');
+ }
- Object.defineProperty(this, '_anchorElement', {
- value: anchorElement
- });
- };
+ Object.defineProperty(this, '_anchorElement', {
+ value: anchorElement
+ });
+ };
- var proto = URL.prototype;
+ var proto = URL.prototype;
- var linkURLWithAnchorAttribute = function(attributeName) {
- Object.defineProperty(proto, attributeName, {
- get: function() {
- return this._anchorElement[attributeName];
- },
- set: function(value) {
- this._anchorElement[attributeName] = value;
- },
- enumerable: true
- });
- };
+ var linkURLWithAnchorAttribute = function(attributeName) {
+ Object.defineProperty(proto, attributeName, {
+ get: function() {
+ return this._anchorElement[attributeName];
+ },
+ set: function(value) {
+ this._anchorElement[attributeName] = value;
+ },
+ enumerable: true
+ });
+ };
- ['hash', 'host', 'hostname', 'port', 'protocol', 'search']
- .forEach(function(attributeName) {
- linkURLWithAnchorAttribute(attributeName);
- });
+ ['hash', 'host', 'hostname', 'port', 'protocol', 'search']
+ .forEach(function(attributeName) {
+ linkURLWithAnchorAttribute(attributeName);
+ });
- Object.defineProperties(proto, {
+ Object.defineProperties(proto, {
- 'toString': {
- get: function() {
- var _this = this;
- return function() {
- return _this.href;
- };
- }
- },
+ 'toString': {
+ get: function() {
+ var _this = this;
+ return function() {
+ return _this.href;
+ };
+ }
+ },
- 'href' : {
- get: function() {
- return this._anchorElement.href.replace(/\?$/,'');
- },
- set: function(value) {
- this._anchorElement.href = value;
- },
- enumerable: true
- },
+ 'href' : {
+ get: function() {
+ return this._anchorElement.href.replace(/\?$/,'');
+ },
+ set: function(value) {
+ this._anchorElement.href = value;
+ },
+ enumerable: true
+ },
- 'pathname' : {
- get: function() {
- return this._anchorElement.pathname.replace(/(^\/?)/,'/');
- },
- set: function(value) {
- this._anchorElement.pathname = value;
- },
- enumerable: true
- },
+ 'pathname' : {
+ get: function() {
+ return this._anchorElement.pathname.replace(/(^\/?)/,'/');
+ },
+ set: function(value) {
+ this._anchorElement.pathname = value;
+ },
+ enumerable: true
+ },
- 'origin': {
- get: function() {
- // get expected port from protocol
- var expectedPort = {'http:': 80, 'https:': 443, 'ftp:': 21}[this._anchorElement.protocol];
- // add port to origin if, expected port is different than actual port
- // and it is not empty f.e http://foo:8080
- // 8080 != 80 && 8080 != ''
- var addPortToOrigin = this._anchorElement.port != expectedPort &&
- this._anchorElement.port !== '';
+ 'origin': {
+ get: function() {
+ // get expected port from protocol
+ var expectedPort = {'http:': 80, 'https:': 443, 'ftp:': 21}[this._anchorElement.protocol];
+ // add port to origin if, expected port is different than actual port
+ // and it is not empty f.e http://foo:8080
+ // 8080 != 80 && 8080 != ''
+ var addPortToOrigin = this._anchorElement.port != expectedPort &&
+ this._anchorElement.port !== '';
- return this._anchorElement.protocol +
- '//' +
- this._anchorElement.hostname +
- (addPortToOrigin ? (':' + this._anchorElement.port) : '');
- },
- enumerable: true
- },
+ return this._anchorElement.protocol +
+ '//' +
+ this._anchorElement.hostname +
+ (addPortToOrigin ? (':' + this._anchorElement.port) : '');
+ },
+ enumerable: true
+ },
- 'password': { // TODO
- get: function() {
- return '';
- },
- set: function(value) {
- },
- enumerable: true
- },
+ 'password': { // TODO
+ get: function() {
+ return '';
+ },
+ set: function(value) {
+ },
+ enumerable: true
+ },
- 'username': { // TODO
- get: function() {
- return '';
- },
- set: function(value) {
- },
- enumerable: true
- },
+ 'username': { // TODO
+ get: function() {
+ return '';
+ },
+ set: function(value) {
+ },
+ enumerable: true
+ },
- 'searchParams': {
- get: function() {
- var searchParams = new URLSearchParams(this.search);
- var _this = this;
- ['append', 'delete', 'set'].forEach(function(methodName) {
- var method = searchParams[methodName];
- searchParams[methodName] = function() {
- method.apply(searchParams, arguments);
- _this.search = searchParams.toString();
- };
- });
- return searchParams;
- },
- enumerable: true
- }
- });
+ 'searchParams': {
+ get: function() {
+ var searchParams = new URLSearchParams(this.search);
+ var _this = this;
+ ['append', 'delete', 'set'].forEach(function(methodName) {
+ var method = searchParams[methodName];
+ searchParams[methodName] = function() {
+ method.apply(searchParams, arguments);
+ _this.search = searchParams.toString();
+ };
+ });
+ return searchParams;
+ },
+ enumerable: true
+ }
+ });
- URL.createObjectURL = function(blob) {
- return _URL.createObjectURL.apply(_URL, arguments);
- };
+ URL.createObjectURL = function(blob) {
+ return _URL.createObjectURL.apply(_URL, arguments);
+ };
- URL.revokeObjectURL = function(url) {
- return _URL.revokeObjectURL.apply(_URL, arguments);
- };
+ URL.revokeObjectURL = function(url) {
+ return _URL.revokeObjectURL.apply(_URL, arguments);
+ };
- global.URL = URL;
+ global.URL = URL;
- };
+ };
- if(!checkIfURLIsSupported()) {
- polyfillURL();
- }
+ if(!checkIfURLIsSupported()) {
+ polyfillURL();
+ }
- if((global.location !== void 0) && !('origin' in global.location)) {
- var getOrigin = function() {
- return global.location.protocol + '//' + global.location.hostname + (global.location.port ? (':' + global.location.port) : '');
- };
+ if((global.location !== void 0) && !('origin' in global.location)) {
+ var getOrigin = function() {
+ return global.location.protocol + '//' + global.location.hostname + (global.location.port ? (':' + global.location.port) : '');
+ };
- try {
- Object.defineProperty(global.location, 'origin', {
- get: getOrigin,
- enumerable: true
- });
- } catch(e) {
- setInterval(function() {
- global.location.origin = getOrigin();
- }, 100);
- }
- }
+ try {
+ Object.defineProperty(global.location, 'origin', {
+ get: getOrigin,
+ enumerable: true
+ });
+ } catch(e) {
+ setInterval(function() {
+ global.location.origin = getOrigin();
+ }, 100);
+ }
+ }
-})(
- (typeof commonjsGlobal !== 'undefined') ? commonjsGlobal
- : ((typeof window !== 'undefined') ? window
- : ((typeof self !== 'undefined') ? self : commonjsGlobal))
-);
-
-var loadjs_umd = createCommonjsModule(function (module, exports) {
-(function(root, factory) {
- if (typeof undefined === 'function' && undefined.amd) {
- undefined([], factory);
- } else {
- module.exports = factory();
- }
-}(commonjsGlobal, function() {
-/**
- * Global dependencies.
- * @global {Object} document - DOM
- */
-
-var devnull = function() {},
- bundleIdCache = {},
- bundleResultCache = {},
- bundleCallbackQueue = {};
-
-
-/**
- * Subscribe to bundle load event.
- * @param {string[]} bundleIds - Bundle ids
- * @param {Function} callbackFn - The callback function
- */
-function subscribe(bundleIds, callbackFn) {
- // listify
- bundleIds = bundleIds.push ? bundleIds : [bundleIds];
-
- var depsNotFound = [],
- i = bundleIds.length,
- numWaiting = i,
- fn,
- bundleId,
- r,
- q;
-
- // define callback function
- fn = function (bundleId, pathsNotFound) {
- if (pathsNotFound.length) depsNotFound.push(bundleId);
-
- numWaiting--;
- if (!numWaiting) callbackFn(depsNotFound);
- };
-
- // register callback
- while (i--) {
- bundleId = bundleIds[i];
-
- // execute callback if in result cache
- r = bundleResultCache[bundleId];
- if (r) {
- fn(bundleId, r);
- continue;
- }
-
- // add to callback queue
- q = bundleCallbackQueue[bundleId] = bundleCallbackQueue[bundleId] || [];
- q.push(fn);
- }
-}
-
-
-/**
- * Publish bundle load event.
- * @param {string} bundleId - Bundle id
- * @param {string[]} pathsNotFound - List of files not found
- */
-function publish(bundleId, pathsNotFound) {
- // exit if id isn't defined
- if (!bundleId) return;
-
- var q = bundleCallbackQueue[bundleId];
-
- // cache result
- bundleResultCache[bundleId] = pathsNotFound;
-
- // exit if queue is empty
- if (!q) return;
-
- // empty callback queue
- while (q.length) {
- q[0](bundleId, pathsNotFound);
- q.splice(0, 1);
- }
-}
-
-
-/**
- * Execute callbacks.
- * @param {Object or Function} args - The callback args
- * @param {string[]} depsNotFound - List of dependencies not found
- */
-function executeCallbacks(args, depsNotFound) {
- // accept function as argument
- if (args.call) args = {success: args};
-
- // success and error callbacks
- if (depsNotFound.length) (args.error || devnull)(depsNotFound);
- else (args.success || devnull)(args);
-}
-
-
-/**
- * Load individual file.
- * @param {string} path - The file path
- * @param {Function} callbackFn - The callback function
- */
-function loadFile(path, callbackFn, args, numTries) {
- var doc = document,
- async = args.async,
- maxTries = (args.numRetries || 0) + 1,
- beforeCallbackFn = args.before || devnull,
- pathStripped = path.replace(/^(css|img)!/, ''),
- isCss,
- e;
-
- numTries = numTries || 0;
-
- if (/(^css!|\.css$)/.test(path)) {
- isCss = true;
-
- // css
- e = doc.createElement('link');
- e.rel = 'stylesheet';
- e.href = pathStripped; //.replace(/^css!/, ''); // remove "css!" prefix
- } else if (/(^img!|\.(png|gif|jpg|svg)$)/.test(path)) {
- // image
- e = doc.createElement('img');
- e.src = pathStripped;
- } else {
- // javascript
- e = doc.createElement('script');
- e.src = path;
- e.async = async === undefined ? true : async;
- }
-
- e.onload = e.onerror = e.onbeforeload = function (ev) {
- var result = ev.type[0];
-
- // Note: The following code isolates IE using `hideFocus` and treats empty
- // stylesheets as failures to get around lack of onerror support
- if (isCss && 'hideFocus' in e) {
- try {
- if (!e.sheet.cssText.length) result = 'e';
- } catch (x) {
- // sheets objects created from load errors don't allow access to
- // `cssText`
- result = 'e';
- }
- }
-
- // handle retries in case of load failure
- if (result == 'e') {
- // increment counter
- numTries += 1;
-
- // exit function and try again
- if (numTries < maxTries) {
- return loadFile(path, callbackFn, args, numTries);
- }
- }
-
- // execute callback
- callbackFn(path, result, ev.defaultPrevented);
- };
-
- // add to document (unless callback returns `false`)
- if (beforeCallbackFn(path, e) !== false) doc.head.appendChild(e);
-}
-
-
-/**
- * Load multiple files.
- * @param {string[]} paths - The file paths
- * @param {Function} callbackFn - The callback function
- */
-function loadFiles(paths, callbackFn, args) {
- // listify paths
- paths = paths.push ? paths : [paths];
-
- var numWaiting = paths.length,
- x = numWaiting,
- pathsNotFound = [],
- fn,
- i;
-
- // define callback function
- fn = function(path, result, defaultPrevented) {
- // handle error
- if (result == 'e') pathsNotFound.push(path);
-
- // handle beforeload event. If defaultPrevented then that means the load
- // will be blocked (ex. Ghostery/ABP on Safari)
- if (result == 'b') {
- if (defaultPrevented) pathsNotFound.push(path);
- else return;
- }
-
- numWaiting--;
- if (!numWaiting) callbackFn(pathsNotFound);
- };
-
- // load scripts
- for (i=0; i < x; i++) loadFile(paths[i], fn, args);
-}
-
-
-/**
- * Initiate script load and register bundle.
- * @param {(string|string[])} paths - The file paths
- * @param {(string|Function)} [arg1] - The bundleId or success callback
- * @param {Function} [arg2] - The success or error callback
- * @param {Function} [arg3] - The error callback
- */
-function loadjs(paths, arg1, arg2) {
- var bundleId,
- args;
-
- // bundleId (if string)
- if (arg1 && arg1.trim) bundleId = arg1;
-
- // args (default is {})
- args = (bundleId ? arg2 : arg1) || {};
-
- // throw error if bundle is already defined
- if (bundleId) {
- if (bundleId in bundleIdCache) {
- throw "LoadJS";
- } else {
- bundleIdCache[bundleId] = true;
- }
- }
-
- // load scripts
- loadFiles(paths, function (pathsNotFound) {
- // execute callbacks
- executeCallbacks(args, pathsNotFound);
-
- // publish bundle load event
- publish(bundleId, pathsNotFound);
- }, args);
-}
-
-
-/**
- * Execute callbacks when dependencies have been satisfied.
- * @param {(string|string[])} deps - List of bundle ids
- * @param {Object} args - success/error arguments
- */
-loadjs.ready = function ready(deps, args) {
- // subscribe to bundle load event
- subscribe(deps, function (depsNotFound) {
- // execute callbacks
- executeCallbacks(args, depsNotFound);
- });
-
- return loadjs;
-};
-
-
-/**
- * Manually satisfy bundle dependencies.
- * @param {string} bundleId - The bundle id
- */
-loadjs.done = function done(bundleId) {
- publish(bundleId, []);
-};
-
-
-/**
- * Reset loadjs dependencies statuses
- */
-loadjs.reset = function reset() {
- bundleIdCache = {};
- bundleResultCache = {};
- bundleCallbackQueue = {};
-};
-
-
-/**
- * Determine if bundle has already been defined
- * @param String} bundleId - The bundle id
- */
-loadjs.isDefined = function isDefined(bundleId) {
- return bundleId in bundleIdCache;
-};
-
-
-// export
-return loadjs;
-
-}));
-});
-
-var classCallCheck = function (instance, Constructor) {
- if (!(instance instanceof Constructor)) {
- throw new TypeError("Cannot call a class as a function");
- }
-};
-
-var 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;
- };
-}();
-
-var defineProperty$1 = function (obj, key, value) {
- if (key in obj) {
- Object.defineProperty(obj, key, {
- value: value,
- enumerable: true,
- configurable: true,
- writable: true
- });
- } else {
- obj[key] = value;
- }
-
- return obj;
-};
-
-var slicedToArray = function () {
- function sliceIterator(arr, i) {
- var _arr = [];
- var _n = true;
- var _d = false;
- var _e = undefined;
-
- try {
- for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {
- _arr.push(_s.value);
-
- if (i && _arr.length === i) break;
- }
- } catch (err) {
- _d = true;
- _e = err;
- } finally {
- try {
- if (!_n && _i["return"]) _i["return"]();
- } finally {
- if (_d) throw _e;
- }
- }
-
- return _arr;
- }
-
- return function (arr, i) {
- if (Array.isArray(arr)) {
- return arr;
- } else if (Symbol.iterator in Object(arr)) {
- return sliceIterator(arr, i);
- } else {
- throw new TypeError("Invalid attempt to destructure non-iterable instance");
- }
- };
-}();
-
-var toConsumableArray = function (arr) {
- if (Array.isArray(arr)) {
- for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];
-
- return arr2;
- } else {
- return Array.from(arr);
- }
-};
-
-// ==========================================================================
-
-var Storage = function () {
- function Storage(player) {
- classCallCheck(this, Storage);
-
- this.enabled = player.config.storage.enabled;
- this.key = player.config.storage.key;
- }
-
- // Check for actual support (see if we can use it)
-
-
- createClass(Storage, [{
- key: 'get',
- value: function get(key) {
- if (!Storage.supported || !this.enabled) {
- return null;
- }
-
- var store = window.localStorage.getItem(this.key);
-
- if (utils.is.empty(store)) {
- return null;
- }
-
- var json = JSON.parse(store);
-
- return utils.is.string(key) && key.length ? json[key] : json;
- }
- }, {
- key: 'set',
- value: function set(object) {
- // Bail if we don't have localStorage support or it's disabled
- if (!Storage.supported || !this.enabled) {
- return;
- }
-
- // Can only store objectst
- if (!utils.is.object(object)) {
- return;
- }
-
- // Get current storage
- var storage = this.get();
-
- // Default to empty object
- if (utils.is.empty(storage)) {
- storage = {};
- }
-
- // Update the working copy of the values
- utils.extend(storage, object);
-
- // Update storage
- window.localStorage.setItem(this.key, JSON.stringify(storage));
- }
- }], [{
- key: 'supported',
- get: function get() {
- try {
- if (!('localStorage' in window)) {
- return false;
- }
-
- var test = '___test';
-
- // Try to use it (it might be disabled, e.g. user is in private mode)
- // see: https://github.com/sampotts/plyr/issues/131
- window.localStorage.setItem(test, test);
- window.localStorage.removeItem(test);
-
- return true;
- } catch (e) {
- return false;
- }
- }
- }]);
- return Storage;
-}();
-
-// ==========================================================================
-// Plyr supported types and providers
-// ==========================================================================
-
-var providers = {
- html5: 'html5',
- youtube: 'youtube',
- vimeo: 'vimeo'
-};
-
-var types = {
- audio: 'audio',
- video: 'video'
-};
-
-// ==========================================================================
-
-var utils = {
- // Check variable types
- is: {
- object: function object(input) {
- return utils.getConstructor(input) === Object;
- },
- number: function number(input) {
- return utils.getConstructor(input) === Number && !Number.isNaN(input);
- },
- string: function string(input) {
- return utils.getConstructor(input) === String;
- },
- boolean: function boolean(input) {
- return utils.getConstructor(input) === Boolean;
- },
- function: function _function(input) {
- return utils.getConstructor(input) === Function;
- },
- array: function array(input) {
- return !utils.is.nullOrUndefined(input) && Array.isArray(input);
- },
- weakMap: function weakMap(input) {
- return utils.is.instanceof(input, WeakMap);
- },
- nodeList: function nodeList(input) {
- return utils.is.instanceof(input, NodeList);
- },
- element: function element(input) {
- return utils.is.instanceof(input, Element);
- },
- textNode: function textNode(input) {
- return utils.getConstructor(input) === Text;
- },
- event: function event(input) {
- return utils.is.instanceof(input, Event);
- },
- cue: function cue(input) {
- return utils.is.instanceof(input, window.TextTrackCue) || utils.is.instanceof(input, window.VTTCue);
- },
- track: function track(input) {
- return utils.is.instanceof(input, TextTrack) || !utils.is.nullOrUndefined(input) && utils.is.string(input.kind);
- },
- url: function url(input) {
- return !utils.is.nullOrUndefined(input) && /(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-/]))?/.test(input);
- },
- nullOrUndefined: function nullOrUndefined(input) {
- return input === null || typeof input === 'undefined';
- },
- empty: function empty(input) {
- return utils.is.nullOrUndefined(input) || (utils.is.string(input) || utils.is.array(input) || utils.is.nodeList(input)) && !input.length || utils.is.object(input) && !Object.keys(input).length;
- },
- instanceof: function _instanceof$$1(input, constructor) {
- return Boolean(input && constructor && input instanceof constructor);
- }
- },
-
- getConstructor: function getConstructor(input) {
- return !utils.is.nullOrUndefined(input) ? input.constructor : null;
- },
-
-
- // Unfortunately, due to mixed support, UA sniffing is required
- getBrowser: function getBrowser() {
- return {
- isIE: /* @cc_on!@ */false || !!document.documentMode,
- isWebkit: 'WebkitAppearance' in document.documentElement.style && !/Edge/.test(navigator.userAgent),
- isIPhone: /(iPhone|iPod)/gi.test(navigator.platform),
- isIos: /(iPad|iPhone|iPod)/gi.test(navigator.platform)
- };
- },
-
-
- // Fetch wrapper
- // Using XHR to avoid issues with older browsers
- fetch: function fetch(url) {
- var responseType = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'text';
-
- return new Promise(function (resolve, reject) {
- try {
- var request = new XMLHttpRequest();
-
- // Check for CORS support
- if (!('withCredentials' in request)) {
- return;
- }
-
- request.addEventListener('load', function () {
- if (responseType === 'text') {
- try {
- resolve(JSON.parse(request.responseText));
- } catch (e) {
- resolve(request.responseText);
- }
- } else {
- resolve(request.response);
- }
- });
-
- request.addEventListener('error', function () {
- throw new Error(request.statusText);
- });
-
- request.open('GET', url, true);
-
- // Set the required response type
- request.responseType = responseType;
-
- request.send();
- } catch (e) {
- reject(e);
- }
- });
- },
-
-
- // Load image avoiding xhr/fetch CORS issues
- // Server status can't be obtained this way unfortunately, so this uses "naturalWidth" to determine if the image has loaded.
- // By default it checks if it is at least 1px, but you can add a second argument to change this.
- loadImage: function loadImage(src) {
- var minWidth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
-
- return new Promise(function (resolve, reject) {
- var image = new Image();
- var handler = function handler() {
- delete image.onload;
- delete image.onerror;
- (image.naturalWidth >= minWidth ? resolve : reject)(image);
- };
- Object.assign(image, { onload: handler, onerror: handler, src: src });
- });
- },
-
-
- // Load an external script
- loadScript: function loadScript(url) {
- return new Promise(function (resolve, reject) {
- loadjs_umd(url, {
- success: resolve,
- error: reject
- });
- });
- },
-
-
- // Load an external SVG sprite
- loadSprite: function loadSprite(url, id) {
- if (!utils.is.string(url)) {
- return;
- }
-
- var prefix = 'cache';
- var hasId = utils.is.string(id);
- var isCached = false;
-
- var exists = function exists() {
- return document.getElementById(id) !== null;
- };
-
- var update = function update(container, data) {
- container.innerHTML = data;
-
- // Check again incase of race condition
- if (hasId && exists()) {
- return;
- }
-
- // Inject the SVG to the body
- document.body.insertAdjacentElement('afterbegin', container);
- };
-
- // Only load once if ID set
- if (!hasId || !exists()) {
- var useStorage = Storage.supported;
-
- // Create container
- var container = document.createElement('div');
- utils.toggleHidden(container, true);
-
- if (hasId) {
- container.setAttribute('id', id);
- }
-
- // Check in cache
- if (useStorage) {
- var cached = window.localStorage.getItem(prefix + '-' + id);
- isCached = cached !== null;
-
- if (isCached) {
- var data = JSON.parse(cached);
- update(container, data.content);
- }
- }
-
- // Get the sprite
- utils.fetch(url).then(function (result) {
- if (utils.is.empty(result)) {
- return;
- }
-
- if (useStorage) {
- window.localStorage.setItem(prefix + '-' + id, JSON.stringify({
- content: result
- }));
- }
-
- update(container, result);
- }).catch(function () {});
- }
- },
-
-
- // Generate a random ID
- generateId: function generateId(prefix) {
- return prefix + '-' + Math.floor(Math.random() * 10000);
- },
-
-
- // Wrap an element
- wrap: function wrap(elements, wrapper) {
- // Convert `elements` to an array, if necessary.
- var targets = elements.length ? elements : [elements];
-
- // Loops backwards to prevent having to clone the wrapper on the
- // first element (see `child` below).
- Array.from(targets).reverse().forEach(function (element, index) {
- var child = index > 0 ? wrapper.cloneNode(true) : wrapper;
-
- // Cache the current parent and sibling.
- var parent = element.parentNode;
- var sibling = element.nextSibling;
+ })(
+ (typeof commonjsGlobal !== 'undefined') ? commonjsGlobal
+ : ((typeof window !== 'undefined') ? window
+ : ((typeof self !== 'undefined') ? self : commonjsGlobal))
+ );
+
+ // ==========================================================================
+ // Type checking utils
+ // ==========================================================================
+
+ var getConstructor = function getConstructor(input) {
+ return input !== null && typeof input !== 'undefined' ? input.constructor : null;
+ };
+
+ var instanceOf = function instanceOf(input, constructor) {
+ return Boolean(input && constructor && input instanceof constructor);
+ };
+
+ var is$1 = {
+ object: function object(input) {
+ return getConstructor(input) === Object;
+ },
+ number: function number(input) {
+ return getConstructor(input) === Number && !Number.isNaN(input);
+ },
+ string: function string(input) {
+ return getConstructor(input) === String;
+ },
+ boolean: function boolean(input) {
+ return getConstructor(input) === Boolean;
+ },
+ function: function _function(input) {
+ return getConstructor(input) === Function;
+ },
+ array: function array(input) {
+ return !is$1.nullOrUndefined(input) && Array.isArray(input);
+ },
+ weakMap: function weakMap(input) {
+ return instanceOf(input, WeakMap);
+ },
+ nodeList: function nodeList(input) {
+ return instanceOf(input, NodeList);
+ },
+ element: function element(input) {
+ return instanceOf(input, Element);
+ },
+ textNode: function textNode(input) {
+ return getConstructor(input) === Text;
+ },
+ event: function event(input) {
+ return instanceOf(input, Event);
+ },
+ cue: function cue(input) {
+ return instanceOf(input, window.TextTrackCue) || instanceOf(input, window.VTTCue);
+ },
+ track: function track(input) {
+ return instanceOf(input, TextTrack) || !is$1.nullOrUndefined(input) && is$1.string(input.kind);
+ },
+ url: function url(input) {
+ return !is$1.nullOrUndefined(input) && /(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-/]))?/.test(input);
+ },
+ nullOrUndefined: function nullOrUndefined(input) {
+ return input === null || typeof input === 'undefined';
+ },
+ empty: function empty(input) {
+ return is$1.nullOrUndefined(input) || (is$1.string(input) || is$1.array(input) || is$1.nodeList(input)) && !input.length || is$1.object(input) && !Object.keys(input).length;
+ }
+ };
+
+ // ==========================================================================
+
+ // Check for passive event listener support
+ // https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md
+ // https://www.youtube.com/watch?v=NPM6172J22g
+ var supportsPassiveListeners = function () {
+ // Test via a getter in the options object to see if the passive property is accessed
+ var supported = false;
+ try {
+ var options = Object.defineProperty({}, 'passive', {
+ get: function get() {
+ supported = true;
+ return null;
+ }
+ });
+ window.addEventListener('test', null, options);
+ window.removeEventListener('test', null, options);
+ } catch (e) {
+ // Do nothing
+ }
+
+ return supported;
+ }();
+
+ // Toggle event listener
+ function toggleListener(element, event, callback) {
+ var toggle = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
+
+ var _this = this;
+
+ var passive = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;
+ var capture = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : false;
+
+ // Bail if no element, event, or callback
+ if (!element || !('addEventListener' in element) || is$1.empty(event) || !is$1.function(callback)) {
+ return;
+ }
+
+ // Allow multiple events
+ var events = event.split(' ');
+
+ // Build options
+ // Default to just the capture boolean for browsers with no passive listener support
+ var options = capture;
+
+ // If passive events listeners are supported
+ if (supportsPassiveListeners) {
+ options = {
+ // Whether the listener can be passive (i.e. default never prevented)
+ passive: passive,
+ // Whether the listener is a capturing listener or not
+ capture: capture
+ };
+ }
+
+ // If a single node is passed, bind the event listener
+ events.forEach(function (type) {
+ if (_this && _this.eventListeners && toggle) {
+ // Cache event listener
+ _this.eventListeners.push({ element: element, type: type, callback: callback, options: options });
+ }
+
+ element[toggle ? 'addEventListener' : 'removeEventListener'](type, callback, options);
+ });
+ }
+
+ // Bind event handler
+ function on(element) {
+ var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
+ var callback = arguments[2];
+ var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;
+ var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
+
+ toggleListener.call(this, element, events, callback, true, passive, capture);
+ }
+
+ // Unbind event handler
+ function off(element) {
+ var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
+ var callback = arguments[2];
+ var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;
+ var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
+
+ toggleListener.call(this, element, events, callback, false, passive, capture);
+ }
+
+ // Bind once-only event handler
+ function once(element) {
+ var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
+ var callback = arguments[2];
+ var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;
+ var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
+
+ function onceCallback() {
+ off(element, events, onceCallback, passive, capture);
+
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+ args[_key] = arguments[_key];
+ }
+
+ callback.apply(this, args);
+ }
+
+ toggleListener.call(this, element, events, onceCallback, true, passive, capture);
+ }
+
+ // Trigger event
+ function triggerEvent(element) {
+ var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
+ var bubbles = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
+ var detail = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
+
+ // Bail if no element
+ if (!is$1.element(element) || is$1.empty(type)) {
+ return;
+ }
+
+ // Create and dispatch the event
+ var event = new CustomEvent(type, {
+ bubbles: bubbles,
+ detail: Object.assign({}, detail, {
+ plyr: this
+ })
+ });
+
+ // Dispatch the event
+ element.dispatchEvent(event);
+ }
+
+ // Unbind all cached event listeners
+ function unbindListeners() {
+ if (this && this.eventListeners) {
+ this.eventListeners.forEach(function (item) {
+ var element = item.element,
+ type = item.type,
+ callback = item.callback,
+ options = item.options;
+
+ element.removeEventListener(type, callback, options);
+ });
+
+ this.eventListeners = [];
+ }
+ }
+
+ // Run method when / if player is ready
+ function ready() {
+ var _this2 = this;
+
+ return new Promise(function (resolve) {
+ return _this2.ready ? setTimeout(resolve, 0) : on.call(_this2, _this2.elements.container, 'ready', resolve);
+ }).then(function () {});
+ }
+
+ var classCallCheck = function (instance, Constructor) {
+ if (!(instance instanceof Constructor)) {
+ throw new TypeError("Cannot call a class as a function");
+ }
+ };
+
+ var 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;
+ };
+ }();
+
+ var defineProperty$1 = function (obj, key, value) {
+ if (key in obj) {
+ Object.defineProperty(obj, key, {
+ value: value,
+ enumerable: true,
+ configurable: true,
+ writable: true
+ });
+ } else {
+ obj[key] = value;
+ }
+
+ return obj;
+ };
+
+ var slicedToArray = function () {
+ function sliceIterator(arr, i) {
+ var _arr = [];
+ var _n = true;
+ var _d = false;
+ var _e = undefined;
+
+ try {
+ for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {
+ _arr.push(_s.value);
+
+ if (i && _arr.length === i) break;
+ }
+ } catch (err) {
+ _d = true;
+ _e = err;
+ } finally {
+ try {
+ if (!_n && _i["return"]) _i["return"]();
+ } finally {
+ if (_d) throw _e;
+ }
+ }
+
+ return _arr;
+ }
+
+ return function (arr, i) {
+ if (Array.isArray(arr)) {
+ return arr;
+ } else if (Symbol.iterator in Object(arr)) {
+ return sliceIterator(arr, i);
+ } else {
+ throw new TypeError("Invalid attempt to destructure non-iterable instance");
+ }
+ };
+ }();
+
+ var toConsumableArray = function (arr) {
+ if (Array.isArray(arr)) {
+ for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];
+
+ return arr2;
+ } else {
+ return Array.from(arr);
+ }
+ };
+
+ // ==========================================================================
+
+ // Wrap an element
+ function wrap$2(elements, wrapper) {
+ // Convert `elements` to an array, if necessary.
+ var targets = elements.length ? elements : [elements];
+
+ // Loops backwards to prevent having to clone the wrapper on the
+ // first element (see `child` below).
+ Array.from(targets).reverse().forEach(function (element, index) {
+ var child = index > 0 ? wrapper.cloneNode(true) : wrapper;
+
+ // Cache the current parent and sibling.
+ var parent = element.parentNode;
+ var sibling = element.nextSibling;
+
+ // Wrap the element (is automatically removed from its current
+ // parent).
+ child.appendChild(element);
+
+ // If the element had a sibling, insert the wrapper before
+ // the sibling to maintain the HTML structure; otherwise, just
+ // append it to the parent.
+ if (sibling) {
+ parent.insertBefore(child, sibling);
+ } else {
+ parent.appendChild(child);
+ }
+ });
+ }
+
+ // Set attributes
+ function setAttributes(element, attributes) {
+ if (!is$1.element(element) || is$1.empty(attributes)) {
+ return;
+ }
+
+ // Assume null and undefined attributes should be left out,
+ // Setting them would otherwise convert them to "null" and "undefined"
+ Object.entries(attributes).filter(function (_ref) {
+ var _ref2 = slicedToArray(_ref, 2),
+ value = _ref2[1];
+
+ return !is$1.nullOrUndefined(value);
+ }).forEach(function (_ref3) {
+ var _ref4 = slicedToArray(_ref3, 2),
+ key = _ref4[0],
+ value = _ref4[1];
+
+ return element.setAttribute(key, value);
+ });
+ }
+
+ // Create a DocumentFragment
+ function createElement(type, attributes, text) {
+ // Create a new <element>
+ var element = document.createElement(type);
+
+ // Set all passed attributes
+ if (is$1.object(attributes)) {
+ setAttributes(element, attributes);
+ }
+
+ // Add text node
+ if (is$1.string(text)) {
+ element.innerText = text;
+ }
+
+ // Return built element
+ return element;
+ }
+
+ // Inaert an element after another
+ function insertAfter(element, target) {
+ target.parentNode.insertBefore(element, target.nextSibling);
+ }
+
+ // Insert a DocumentFragment
+ function insertElement(type, parent, attributes, text) {
+ // Inject the new <element>
+ parent.appendChild(createElement(type, attributes, text));
+ }
+
+ // Remove element(s)
+ function removeElement(element) {
+ if (is$1.nodeList(element) || is$1.array(element)) {
+ Array.from(element).forEach(removeElement);
+ return;
+ }
+
+ if (!is$1.element(element) || !is$1.element(element.parentNode)) {
+ return;
+ }
+
+ element.parentNode.removeChild(element);
+ }
+
+ // Remove all child elements
+ function emptyElement(element) {
+ var length = element.childNodes.length;
+
+
+ while (length > 0) {
+ element.removeChild(element.lastChild);
+ length -= 1;
+ }
+ }
+
+ // Replace element
+ function replaceElement(newChild, oldChild) {
+ if (!is$1.element(oldChild) || !is$1.element(oldChild.parentNode) || !is$1.element(newChild)) {
+ return null;
+ }
+
+ oldChild.parentNode.replaceChild(newChild, oldChild);
+
+ return newChild;
+ }
+
+ // Get an attribute object from a string selector
+ function getAttributesFromSelector(sel, existingAttributes) {
+ // For example:
+ // '.test' to { class: 'test' }
+ // '#test' to { id: 'test' }
+ // '[data-test="test"]' to { 'data-test': 'test' }
+
+ if (!is$1.string(sel) || is$1.empty(sel)) {
+ return {};
+ }
+
+ var attributes = {};
+ var existing = existingAttributes;
+
+ sel.split(',').forEach(function (s) {
+ // Remove whitespace
+ var selector = s.trim();
+ var className = selector.replace('.', '');
+ var stripped = selector.replace(/[[\]]/g, '');
+
+ // Get the parts and value
+ var parts = stripped.split('=');
+ var key = parts[0];
+ var value = parts.length > 1 ? parts[1].replace(/["']/g, '') : '';
+
+ // Get the first character
+ var start = selector.charAt(0);
+
+ switch (start) {
+ case '.':
+ // Add to existing classname
+ if (is$1.object(existing) && is$1.string(existing.class)) {
+ existing.class += ' ' + className;
+ }
+
+ attributes.class = className;
+ break;
+
+ case '#':
+ // ID selector
+ attributes.id = selector.replace('#', '');
+ break;
+
+ case '[':
+ // Attribute selector
+ attributes[key] = value;
+
+ break;
+
+ default:
+ break;
+ }
+ });
+
+ return attributes;
+ }
+
+ // Toggle hidden
+ function toggleHidden(element, hidden) {
+ if (!is$1.element(element)) {
+ return;
+ }
+
+ var hide = hidden;
+
+ if (!is$1.boolean(hide)) {
+ hide = !element.hasAttribute('hidden');
+ }
+
+ if (hide) {
+ element.setAttribute('hidden', '');
+ } else {
+ element.removeAttribute('hidden');
+ }
+ }
+
+ // Mirror Element.classList.toggle, with IE compatibility for "force" argument
+ function toggleClass(element, className, force) {
+ if (is$1.element(element)) {
+ var method = 'toggle';
+ if (typeof force !== 'undefined') {
+ method = force ? 'add' : 'remove';
+ }
+
+ element.classList[method](className);
+ return element.classList.contains(className);
+ }
+
+ return null;
+ }
+
+ // Has class name
+ function hasClass(element, className) {
+ return is$1.element(element) && element.classList.contains(className);
+ }
+
+ // Element matches selector
+ function matches(element, selector) {
+ var prototype = { Element: Element };
+
+ function match() {
+ return Array.from(document.querySelectorAll(selector)).includes(this);
+ }
+
+ var matches = prototype.matches || prototype.webkitMatchesSelector || prototype.mozMatchesSelector || prototype.msMatchesSelector || match;
+
+ return matches.call(element, selector);
+ }
+
+ // Find all elements
+ function getElements(selector) {
+ return this.elements.container.querySelectorAll(selector);
+ }
+
+ // Find a single element
+ function getElement(selector) {
+ return this.elements.container.querySelector(selector);
+ }
+
+ // Get the focused element
+ function getFocusElement() {
+ var focused = document.activeElement;
+
+ if (!focused || focused === document.body) {
+ focused = null;
+ } else {
+ focused = document.querySelector(':focus');
+ }
+
+ return focused;
+ }
+
+ // Trap focus inside container
+ function trapFocus() {
+ var element = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
+ var toggle = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
+
+ if (!is$1.element(element)) {
+ return;
+ }
+
+ var focusable = getElements.call(this, 'button:not(:disabled), input:not(:disabled), [tabindex]');
+ var first = focusable[0];
+ var last = focusable[focusable.length - 1];
+
+ var trap = function trap(event) {
+ // Bail if not tab key or not fullscreen
+ if (event.key !== 'Tab' || event.keyCode !== 9) {
+ return;
+ }
+
+ // Get the current focused element
+ var focused = getFocusElement();
+
+ if (focused === last && !event.shiftKey) {
+ // Move focus to first element that can be tabbed if Shift isn't used
+ first.focus();
+ event.preventDefault();
+ } else if (focused === first && event.shiftKey) {
+ // Move focus to last element that can be tabbed if Shift is used
+ last.focus();
+ event.preventDefault();
+ }
+ };
+
+ toggleListener.call(this, this.elements.container, 'keydown', trap, toggle, false);
+ }
+
+ // ==========================================================================
+
+ var transitionEndEvent = function () {
+ var element = document.createElement('span');
+
+ var events = {
+ WebkitTransition: 'webkitTransitionEnd',
+ MozTransition: 'transitionend',
+ OTransition: 'oTransitionEnd otransitionend',
+ transition: 'transitionend'
+ };
+
+ var type = Object.keys(events).find(function (event) {
+ return element.style[event] !== undefined;
+ });
+
+ return is$1.string(type) ? events[type] : false;
+ }();
+
+ // Force repaint of element
+ function repaint(element) {
+ setTimeout(function () {
+ toggleHidden(element, true);
+ element.offsetHeight; // eslint-disable-line
+ toggleHidden(element, false);
+ }, 0);
+ }
+
+ // ==========================================================================
+ // Browser sniffing
+ // Unfortunately, due to mixed support, UA sniffing is required
+ // ==========================================================================
+
+ var browser = {
+ isIE: /* @cc_on!@ */!!document.documentMode,
+ isWebkit: 'WebkitAppearance' in document.documentElement.style && !/Edge/.test(navigator.userAgent),
+ isIPhone: /(iPhone|iPod)/gi.test(navigator.platform),
+ isIos: /(iPad|iPhone|iPod)/gi.test(navigator.platform)
+ };
+
+ // ==========================================================================
+
+ // Default codecs for checking mimetype support
+ var defaultCodecs = {
+ 'audio/ogg': 'vorbis',
+ 'audio/wav': '1',
+ 'video/webm': 'vp8, vorbis',
+ 'video/mp4': 'avc1.42E01E, mp4a.40.2',
+ 'video/ogg': 'theora'
+ };
+
+ // Check for feature support
+ var support = {
+ // Basic support
+ audio: 'canPlayType' in document.createElement('audio'),
+ video: 'canPlayType' in document.createElement('video'),
+
+ // Check for support
+ // Basic functionality vs full UI
+ check: function check(type, provider, playsinline) {
+ var canPlayInline = browser.isIPhone && playsinline && support.playsinline;
+ var api = support[type] || provider !== 'html5';
+ var ui = api && support.rangeInput && (type !== 'video' || !browser.isIPhone || canPlayInline);
+
+ return {
+ api: api,
+ ui: ui
+ };
+ },
+
+
+ // Picture-in-picture support
+ // Safari only currently
+ pip: function () {
+ return !browser.isIPhone && is$1.function(createElement('video').webkitSetPresentationMode);
+ }(),
+
+ // Airplay support
+ // Safari only currently
+ airplay: is$1.function(window.WebKitPlaybackTargetAvailabilityEvent),
+
+ // Inline playback support
+ // https://webkit.org/blog/6784/new-video-policies-for-ios/
+ playsinline: 'playsInline' in document.createElement('video'),
+
+ // Check for mime type support against a player instance
+ // Credits: http://diveintohtml5.info/everything.html
+ // Related: http://www.leanbackplayer.com/test/h5mt.html
+ mime: function mime(inputType) {
+ var _inputType$split = inputType.split('/'),
+ _inputType$split2 = slicedToArray(_inputType$split, 1),
+ mediaType = _inputType$split2[0];
+
+ if (!this.isHTML5 || mediaType !== this.type) {
+ return false;
+ }
+
+ var type = void 0;
+ if (inputType && inputType.includes('codecs=')) {
+ // Use input directly
+ type = inputType;
+ } else if (inputType === 'audio/mpeg') {
+ // Skip codec
+ type = 'audio/mpeg;';
+ } else if (inputType in defaultCodecs) {
+ // Use codec
+ type = inputType + '; codecs="' + defaultCodecs[inputType] + '"';
+ }
+
+ try {
+ return Boolean(type && this.media.canPlayType(type).replace(/no/, ''));
+ } catch (err) {
+ return false;
+ }
+ },
+
+
+ // Check for textTracks support
+ textTracks: 'textTracks' in document.createElement('video'),
+
+ // <input type="range"> Sliders
+ rangeInput: function () {
+ var range = document.createElement('input');
+ range.type = 'range';
+ return range.type === 'range';
+ }(),
+
+ // Touch
+ // NOTE: Remember a device can be mouse + touch enabled so we check on first touch event
+ touch: 'ontouchstart' in document.documentElement,
+
+ // Detect transitions support
+ transitions: transitionEndEvent !== false,
+
+ // Reduced motion iOS & MacOS setting
+ // https://webkit.org/blog/7551/responsive-design-for-motion/
+ reducedMotion: 'matchMedia' in window && window.matchMedia('(prefers-reduced-motion)').matches
+ };
+
+ // ==========================================================================
+
+ var html5 = {
+ getSources: function getSources() {
+ var _this = this;
+
+ if (!this.isHTML5) {
+ return [];
+ }
+
+ var sources = Array.from(this.media.querySelectorAll('source'));
+
+ // Filter out unsupported sources
+ return sources.filter(function (source) {
+ return support.mime.call(_this, source.getAttribute('type'));
+ });
+ },
+
+
+ // Get quality levels
+ getQualityOptions: function getQualityOptions() {
+ // Get sizes from <source> elements
+ return html5.getSources.call(this).map(function (source) {
+ return Number(source.getAttribute('size'));
+ }).filter(Boolean);
+ },
+ extend: function extend() {
+ if (!this.isHTML5) {
+ return;
+ }
+
+ var player = this;
+
+ // Quality
+ Object.defineProperty(player.media, 'quality', {
+ get: function get() {
+ // Get sources
+ var sources = html5.getSources.call(player);
+
+ var _sources$filter = sources.filter(function (source) {
+ return source.getAttribute('src') === player.source;
+ }),
+ _sources$filter2 = slicedToArray(_sources$filter, 1),
+ source = _sources$filter2[0];
+
+ // Return size, if match is found
+
+
+ return source && Number(source.getAttribute('size'));
+ },
+ set: function set(input) {
+ // Get sources
+ var sources = html5.getSources.call(player);
+
+ // Get first match for requested size
+ var source = sources.find(function (source) {
+ return Number(source.getAttribute('size')) === input;
+ });
+
+ // No matching source found
+ if (!source) {
+ return;
+ }
+
+ // Get current state
+ var currentTime = player.currentTime,
+ playing = player.playing;
+
+ // Set new source
+
+ player.media.src = source.getAttribute('src');
+
+ // Restore time
+ var onLoadedMetaData = function onLoadedMetaData() {
+ player.currentTime = currentTime;
+ };
+ player.once('loadedmetadata', onLoadedMetaData);
+
+ // Load new source
+ player.media.load();
+
+ // Resume playing
+ if (playing) {
+ player.play();
+ }
+
+ // Trigger change event
+ triggerEvent.call(player, player.media, 'qualitychange', false, {
+ quality: input
+ });
+ }
+ });
+ },
+
+
+ // Cancel current network requests
+ // See https://github.com/sampotts/plyr/issues/174
+ cancelRequests: function cancelRequests() {
+ if (!this.isHTML5) {
+ return;
+ }
+
+ // Remove child sources
+ removeElement(html5.getSources.call(this));
+
+ // Set blank video src attribute
+ // This is to prevent a MEDIA_ERR_SRC_NOT_SUPPORTED error
+ // Info: http://stackoverflow.com/questions/32231579/how-to-properly-dispose-of-an-html5-video-and-close-socket-or-connection
+ this.media.setAttribute('src', this.config.blankVideo);
+
+ // Load the new empty source
+ // This will cancel existing requests
+ // See https://github.com/sampotts/plyr/issues/174
+ this.media.load();
+
+ // Debugging
+ this.debug.log('Cancelled network requests');
+ }
+ };
+
+ // ==========================================================================
+
+ // Clone nested objects
+ function cloneDeep(object) {
+ return JSON.parse(JSON.stringify(object));
+ }
+
+ // Get a nested value in an object
+ function getDeep(object, path) {
+ return path.split('.').reduce(function (obj, key) {
+ return obj && obj[key];
+ }, object);
+ }
+
+ // Deep extend destination object with N more objects
+ function extend() {
+ var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
+
+ for (var _len = arguments.length, sources = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
+ sources[_key - 1] = arguments[_key];
+ }
+
+ if (!sources.length) {
+ return target;
+ }
+
+ var source = sources.shift();
+
+ if (!is$1.object(source)) {
+ return target;
+ }
+
+ Object.keys(source).forEach(function (key) {
+ if (is$1.object(source[key])) {
+ if (!Object.keys(target).includes(key)) {
+ Object.assign(target, defineProperty$1({}, key, {}));
+ }
+
+ extend(target[key], source[key]);
+ } else {
+ Object.assign(target, defineProperty$1({}, key, source[key]));
+ }
+ });
+
+ return extend.apply(undefined, [target].concat(sources));
+ }
+
+ // ==========================================================================
+
+ // Generate a random ID
+ function generateId(prefix) {
+ return prefix + '-' + Math.floor(Math.random() * 10000);
+ }
+
+ // Format string
+ function format(input) {
+ for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
+ args[_key - 1] = arguments[_key];
+ }
+
+ if (is$1.empty(input)) {
+ return input;
+ }
+
+ return input.toString().replace(/{(\d+)}/g, function (match, i) {
+ return args[i].toString();
+ });
+ }
+
+ // Get percentage
+ function getPercentage(current, max) {
+ if (current === 0 || max === 0 || Number.isNaN(current) || Number.isNaN(max)) {
+ return 0;
+ }
+
+ return (current / max * 100).toFixed(2);
+ }
+
+ // Replace all occurances of a string in a string
+ function replaceAll() {
+ var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
+ var find = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
+ var replace = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';
+
+ return input.replace(new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\]/\\])/g, '\\$1'), 'g'), replace.toString());
+ }
+
+ // Convert to title case
+ function toTitleCase() {
+ var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
+
+ return input.toString().replace(/\w\S*/g, function (text) {
+ return text.charAt(0).toUpperCase() + text.substr(1).toLowerCase();
+ });
+ }
+
+ // Convert string to pascalCase
+ function toPascalCase() {
+ var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
+
+ var string = input.toString();
+
+ // Convert kebab case
+ string = replaceAll(string, '-', ' ');
+
+ // Convert snake case
+ string = replaceAll(string, '_', ' ');
+
+ // Convert to title case
+ string = toTitleCase(string);
+
+ // Convert to pascal case
+ return replaceAll(string, ' ', '');
+ }
- // Wrap the element (is automatically removed from its current
- // parent).
- child.appendChild(element);
+ // Convert string to pascalCase
+ function toCamelCase() {
+ var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
+
+ var string = input.toString();
+
+ // Convert to pascal case
+ string = toPascalCase(string);
- // If the element had a sibling, insert the wrapper before
- // the sibling to maintain the HTML structure; otherwise, just
- // append it to the parent.
- if (sibling) {
- parent.insertBefore(child, sibling);
- } else {
- parent.appendChild(child);
- }
- });
- },
+ // Convert first character to lowercase
+ return string.charAt(0).toLowerCase() + string.slice(1);
+ }
+ // Remove HTML from a string
+ function stripHTML(source) {
+ var fragment = document.createDocumentFragment();
+ var element = document.createElement('div');
+ fragment.appendChild(element);
+ element.innerHTML = source;
+ return fragment.firstChild.innerText;
+ }
+
+ // Like outerHTML, but also works for DocumentFragment
+ function getHTML(element) {
+ var wrapper = document.createElement('div');
+ wrapper.appendChild(element);
+ return wrapper.innerHTML;
+ }
+
+ // ==========================================================================
+
+ var i18n = {
+ get: function get() {
+ var key = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
+ var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+
+ if (is$1.empty(key) || is$1.empty(config)) {
+ return '';
+ }
+
+ var string = getDeep(config.i18n, key);
+
+ if (is$1.empty(string)) {
+ return '';
+ }
+
+ var replace = {
+ '{seektime}': config.seekTime,
+ '{title}': config.title
+ };
+
+ Object.entries(replace).forEach(function (_ref) {
+ var _ref2 = slicedToArray(_ref, 2),
+ key = _ref2[0],
+ value = _ref2[1];
+
+ string = replaceAll(string, key, value);
+ });
+
+ return string;
+ }
+ };
+
+ // ==========================================================================
+
+ // Remove duplicates in an array
+ function dedupe(array) {
+ if (!is$1.array(array)) {
+ return array;
+ }
+
+ return array.filter(function (item, index) {
+ return array.indexOf(item) === index;
+ });
+ }
+
+ // Get the closest value in an array
+ function closest(array, value) {
+ if (!is$1.array(array) || !array.length) {
+ return null;
+ }
+
+ return array.reduce(function (prev, curr) {
+ return Math.abs(curr - value) < Math.abs(prev - value) ? curr : prev;
+ });
+ }
+
+ // ==========================================================================
+
+ var Storage = function () {
+ function Storage(player) {
+ classCallCheck(this, Storage);
+
+ this.enabled = player.config.storage.enabled;
+ this.key = player.config.storage.key;
+ }
+
+ // Check for actual support (see if we can use it)
+
+
+ createClass(Storage, [{
+ key: 'get',
+ value: function get(key) {
+ if (!Storage.supported || !this.enabled) {
+ return null;
+ }
+
+ var store = window.localStorage.getItem(this.key);
+
+ if (is$1.empty(store)) {
+ return null;
+ }
+
+ var json = JSON.parse(store);
+
+ return is$1.string(key) && key.length ? json[key] : json;
+ }
+ }, {
+ key: 'set',
+ value: function set(object) {
+ // Bail if we don't have localStorage support or it's disabled
+ if (!Storage.supported || !this.enabled) {
+ return;
+ }
+
+ // Can only store objectst
+ if (!is$1.object(object)) {
+ return;
+ }
+
+ // Get current storage
+ var storage = this.get();
+
+ // Default to empty object
+ if (is$1.empty(storage)) {
+ storage = {};
+ }
+
+ // Update the working copy of the values
+ extend(storage, object);
+
+ // Update storage
+ window.localStorage.setItem(this.key, JSON.stringify(storage));
+ }
+ }], [{
+ key: 'supported',
+ get: function get() {
+ try {
+ if (!('localStorage' in window)) {
+ return false;
+ }
+
+ var test = '___test';
+
+ // Try to use it (it might be disabled, e.g. user is in private mode)
+ // see: https://github.com/sampotts/plyr/issues/131
+ window.localStorage.setItem(test, test);
+ window.localStorage.removeItem(test);
+
+ return true;
+ } catch (e) {
+ return false;
+ }
+ }
+ }]);
+ return Storage;
+ }();
+
+ // ==========================================================================
+
+ // Load an external SVG sprite
+ function loadSprite(url, id) {
+ if (!is$1.string(url)) {
+ return;
+ }
+
+ var prefix = 'cache';
+ var hasId = is$1.string(id);
+ var isCached = false;
+
+ var exists = function exists() {
+ return document.getElementById(id) !== null;
+ };
+
+ var update = function update(container, data) {
+ container.innerHTML = data;
+
+ // Check again incase of race condition
+ if (hasId && exists()) {
+ return;
+ }
+
+ // Inject the SVG to the body
+ document.body.insertAdjacentElement('afterbegin', container);
+ };
+
+ // Only load once if ID set
+ if (!hasId || !exists()) {
+ var useStorage = Storage.supported;
+
+ // Create container
+ var container = document.createElement('div');
+ container.setAttribute('hidden', '');
+
+ if (hasId) {
+ container.setAttribute('id', id);
+ }
+
+ // Check in cache
+ if (useStorage) {
+ var cached = window.localStorage.getItem(prefix + '-' + id);
+ isCached = cached !== null;
+
+ if (isCached) {
+ var data = JSON.parse(cached);
+ update(container, data.content);
+ }
+ }
+
+ // Get the sprite
+ fetch(url).then(function (result) {
+ if (is$1.empty(result)) {
+ return;
+ }
+
+ if (useStorage) {
+ window.localStorage.setItem(prefix + '-' + id, JSON.stringify({
+ content: result
+ }));
+ }
+
+ update(container, result);
+ }).catch(function () {});
+ }
+ }
+
+ // ==========================================================================
+
+ // Time helpers
+ var getHours = function getHours(value) {
+ return parseInt(value / 60 / 60 % 60, 10);
+ };
+ var getMinutes = function getMinutes(value) {
+ return parseInt(value / 60 % 60, 10);
+ };
+ var getSeconds = function getSeconds(value) {
+ return parseInt(value % 60, 10);
+ };
+
+ // Format time to UI friendly string
+ function formatTime() {
+ var time = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
+ var displayHours = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
+ var inverted = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
+
+ // Bail if the value isn't a number
+ if (!is$1.number(time)) {
+ return formatTime(null, displayHours, inverted);
+ }
+
+ // Format time component to add leading zero
+ var format = function format(value) {
+ return ('0' + value).slice(-2);
+ };
+
+ // Breakdown to hours, mins, secs
+ var hours = getHours(time);
+ var mins = getMinutes(time);
+ var secs = getSeconds(time);
+
+ // Do we need to display hours?
+ if (displayHours || hours > 0) {
+ hours = hours + ':';
+ } else {
+ hours = '';
+ }
+
+ // Render
+ return '' + (inverted && time > 0 ? '-' : '') + hours + format(mins) + ':' + format(secs);
+ }
+
+ // ==========================================================================
+
+ // TODO: Don't export a massive object - break down and create class
+ var controls = {
+ // Get icon URL
+ getIconUrl: function getIconUrl() {
+ var url = new URL(this.config.iconUrl, window.location);
+ var cors = url.host !== window.location.host || browser.isIE && !window.svg4everybody;
+
+ return {
+ url: this.config.iconUrl,
+ cors: cors
+ };
+ },
+
+
+ // Find the UI controls
+ findElements: function findElements() {
+ try {
+ this.elements.controls = getElement.call(this, this.config.selectors.controls.wrapper);
+
+ // Buttons
+ this.elements.buttons = {
+ play: getElements.call(this, this.config.selectors.buttons.play),
+ pause: getElement.call(this, this.config.selectors.buttons.pause),
+ restart: getElement.call(this, this.config.selectors.buttons.restart),
+ rewind: getElement.call(this, this.config.selectors.buttons.rewind),
+ fastForward: getElement.call(this, this.config.selectors.buttons.fastForward),
+ mute: getElement.call(this, this.config.selectors.buttons.mute),
+ pip: getElement.call(this, this.config.selectors.buttons.pip),
+ airplay: getElement.call(this, this.config.selectors.buttons.airplay),
+ settings: getElement.call(this, this.config.selectors.buttons.settings),
+ captions: getElement.call(this, this.config.selectors.buttons.captions),
+ fullscreen: getElement.call(this, this.config.selectors.buttons.fullscreen)
+ };
+
+ // Progress
+ this.elements.progress = getElement.call(this, this.config.selectors.progress);
+
+ // Inputs
+ this.elements.inputs = {
+ seek: getElement.call(this, this.config.selectors.inputs.seek),
+ volume: getElement.call(this, this.config.selectors.inputs.volume)
+ };
+
+ // Display
+ this.elements.display = {
+ buffer: getElement.call(this, this.config.selectors.display.buffer),
+ currentTime: getElement.call(this, this.config.selectors.display.currentTime),
+ duration: getElement.call(this, this.config.selectors.display.duration)
+ };
+
+ // Seek tooltip
+ if (is$1.element(this.elements.progress)) {
+ this.elements.display.seekTooltip = this.elements.progress.querySelector('.' + this.config.classNames.tooltip);
+ }
+
+ return true;
+ } catch (error) {
+ // Log it
+ this.debug.warn('It looks like there is a problem with your custom controls HTML', error);
+
+ // Restore native video controls
+ this.toggleNativeControls(true);
+
+ return false;
+ }
+ },
+
+
+ // Create <svg> icon
+ createIcon: function createIcon(type, attributes) {
+ var namespace = 'http://www.w3.org/2000/svg';
+ var iconUrl = controls.getIconUrl.call(this);
+ var iconPath = (!iconUrl.cors ? iconUrl.url : '') + '#' + this.config.iconPrefix;
+
+ // Create <svg>
+ var icon = document.createElementNS(namespace, 'svg');
+ setAttributes(icon, extend(attributes, {
+ role: 'presentation',
+ focusable: 'false'
+ }));
+
+ // Create the <use> to reference sprite
+ var use = document.createElementNS(namespace, 'use');
+ var path = iconPath + '-' + type;
+
+ // Set `href` attributes
+ // https://github.com/sampotts/plyr/issues/460
+ // https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/xlink:href
+ if ('href' in use) {
+ use.setAttributeNS('http://www.w3.org/1999/xlink', 'href', path);
+ } else {
+ use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path);
+ }
+
+ // Add <use> to <svg>
+ icon.appendChild(use);
+
+ return icon;
+ },
+
+
+ // Create hidden text label
+ createLabel: function createLabel(type) {
+ var attr = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+
+ // Skip i18n for abbreviations and brand names
+ var universals = {
+ pip: 'PIP',
+ airplay: 'AirPlay'
+ };
+ var text = universals[type] || i18n.get(type, this.config);
+
+ var attributes = Object.assign({}, attr, {
+ class: [attr.class, this.config.classNames.hidden].filter(Boolean).join(' ')
+ });
+ return createElement('span', attributes, text);
+ },
+
+
+ // Create a badge
+ createBadge: function createBadge(text) {
+ if (is$1.empty(text)) {
+ return null;
+ }
+
+ var badge = createElement('span', {
+ class: this.config.classNames.menu.value
+ });
+
+ badge.appendChild(createElement('span', {
+ class: this.config.classNames.menu.badge
+ }, text));
+
+ return badge;
+ },
+
+
+ // Create a <button>
+ createButton: function createButton(buttonType, attr) {
+ var button = createElement('button');
+ var attributes = Object.assign({}, attr);
+ var type = toCamelCase(buttonType);
+
+ var toggle = false;
+ var label = void 0;
+ var icon = void 0;
+ var labelPressed = void 0;
+ var iconPressed = void 0;
+
+ if (!('type' in attributes)) {
+ attributes.type = 'button';
+ }
+
+ if ('class' in attributes) {
+ if (attributes.class.includes(this.config.classNames.control)) {
+ attributes.class += ' ' + this.config.classNames.control;
+ }
+ } else {
+ attributes.class = this.config.classNames.control;
+ }
+
+ // Large play button
+ switch (buttonType) {
+ case 'play':
+ toggle = true;
+ label = 'play';
+ labelPressed = 'pause';
+ icon = 'play';
+ iconPressed = 'pause';
+ break;
+
+ case 'mute':
+ toggle = true;
+ label = 'mute';
+ labelPressed = 'unmute';
+ icon = 'volume';
+ iconPressed = 'muted';
+ break;
+
+ case 'captions':
+ toggle = true;
+ label = 'enableCaptions';
+ labelPressed = 'disableCaptions';
+ icon = 'captions-off';
+ iconPressed = 'captions-on';
+ break;
+
+ case 'fullscreen':
+ toggle = true;
+ label = 'enterFullscreen';
+ labelPressed = 'exitFullscreen';
+ icon = 'enter-fullscreen';
+ iconPressed = 'exit-fullscreen';
+ break;
+
+ case 'play-large':
+ attributes.class += ' ' + this.config.classNames.control + '--overlaid';
+ type = 'play';
+ label = 'play';
+ icon = 'play';
+ break;
+
+ default:
+ label = type;
+ icon = buttonType;
+ }
+
+ // Setup toggle icon and labels
+ if (toggle) {
+ // Icon
+ button.appendChild(controls.createIcon.call(this, iconPressed, { class: 'icon--pressed' }));
+ button.appendChild(controls.createIcon.call(this, icon, { class: 'icon--not-pressed' }));
+
+ // Label/Tooltip
+ button.appendChild(controls.createLabel.call(this, labelPressed, { class: 'label--pressed' }));
+ button.appendChild(controls.createLabel.call(this, label, { class: 'label--not-pressed' }));
+ } else {
+ button.appendChild(controls.createIcon.call(this, icon));
+ button.appendChild(controls.createLabel.call(this, label));
+ }
+
+ // Merge attributes
+ extend(attributes, getAttributesFromSelector(this.config.selectors.buttons[type], attributes));
+
+ setAttributes(button, attributes);
+
+ // We have multiple play buttons
+ if (type === 'play') {
+ if (!is$1.array(this.elements.buttons[type])) {
+ this.elements.buttons[type] = [];
+ }
+
+ this.elements.buttons[type].push(button);
+ } else {
+ this.elements.buttons[type] = button;
+ }
+
+ // Toggle classname when pressed property is set
+ var className = this.config.classNames.controlPressed;
+ Object.defineProperty(button, 'pressed', {
+ enumerable: true,
+ get: function get() {
+ return hasClass(button, className);
+ },
+ set: function set() {
+ var pressed = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
+
+ toggleClass(button, className, pressed);
+ }
+ });
+
+ return button;
+ },
+
+
+ // Create an <input type='range'>
+ createRange: function createRange(type, attributes) {
+ // Seek input
+ var input = createElement('input', extend(getAttributesFromSelector(this.config.selectors.inputs[type]), {
+ type: 'range',
+ min: 0,
+ max: 100,
+ step: 0.01,
+ value: 0,
+ autocomplete: 'off',
+ // A11y fixes for https://github.com/sampotts/plyr/issues/905
+ role: 'slider',
+ 'aria-label': i18n.get(type, this.config),
+ 'aria-valuemin': 0,
+ 'aria-valuemax': 100,
+ 'aria-valuenow': 0
+ }, attributes));
+
+ this.elements.inputs[type] = input;
+
+ // Set the fill for webkit now
+ controls.updateRangeFill.call(this, input);
+
+ return input;
+ },
+
+
+ // Create a <progress>
+ createProgress: function createProgress(type, attributes) {
+ var progress = createElement('progress', extend(getAttributesFromSelector(this.config.selectors.display[type]), {
+ min: 0,
+ max: 100,
+ value: 0,
+ role: 'presentation',
+ 'aria-hidden': true
+ }, attributes));
+
+ // Create the label inside
+ if (type !== 'volume') {
+ progress.appendChild(createElement('span', null, '0'));
+
+ var suffixKey = {
+ played: 'played',
+ buffer: 'buffered'
+ }[type];
+ var suffix = suffixKey ? i18n.get(suffixKey, this.config) : '';
+
+ progress.innerText = '% ' + suffix.toLowerCase();
+ }
+
+ this.elements.display[type] = progress;
+
+ return progress;
+ },
+
+
+ // Create time display
+ createTime: function createTime(type) {
+ var attributes = getAttributesFromSelector(this.config.selectors.display[type]);
+
+ var container = createElement('div', extend(attributes, {
+ class: 'plyr__time ' + attributes.class,
+ 'aria-label': i18n.get(type, this.config)
+ }), '00:00');
+
+ // Reference for updates
+ this.elements.display[type] = container;
+
+ return container;
+ },
+
+
+ // Create a settings menu item
+ createMenuItem: function createMenuItem(_ref) {
+ var value = _ref.value,
+ list = _ref.list,
+ type = _ref.type,
+ title = _ref.title,
+ _ref$badge = _ref.badge,
+ badge = _ref$badge === undefined ? null : _ref$badge,
+ _ref$checked = _ref.checked,
+ checked = _ref$checked === undefined ? false : _ref$checked;
+
+ var item = createElement('li');
+
+ var label = createElement('label', {
+ class: this.config.classNames.control
+ });
- // Create a DocumentFragment
- createElement: function createElement(type, attributes, text) {
- // Create a new <element>
- var element = document.createElement(type);
+ var radio = createElement('input', extend(getAttributesFromSelector(this.config.selectors.inputs[type]), {
+ type: 'radio',
+ name: 'plyr-' + type,
+ value: value,
+ checked: checked,
+ class: 'plyr__sr-only'
+ }));
- // Set all passed attributes
- if (utils.is.object(attributes)) {
- utils.setAttributes(element, attributes);
- }
+ var faux = createElement('span', { hidden: '' });
- // Add text node
- if (utils.is.string(text)) {
- element.innerText = text;
- }
-
- // Return built element
- return element;
- },
-
-
- // Inaert an element after another
- insertAfter: function insertAfter(element, target) {
- target.parentNode.insertBefore(element, target.nextSibling);
- },
+ label.appendChild(radio);
+ label.appendChild(faux);
+ label.insertAdjacentHTML('beforeend', title);
+
+ if (is$1.element(badge)) {
+ label.appendChild(badge);
+ }
+ item.appendChild(label);
+ list.appendChild(item);
+ },
- // Insert a DocumentFragment
- insertElement: function insertElement(type, parent, attributes, text) {
- // Inject the new <element>
- parent.appendChild(utils.createElement(type, attributes, text));
- },
-
-
- // Remove element(s)
- removeElement: function removeElement(element) {
- if (utils.is.nodeList(element) || utils.is.array(element)) {
- Array.from(element).forEach(utils.removeElement);
- return;
- }
- if (!utils.is.element(element) || !utils.is.element(element.parentNode)) {
- return;
- }
+ // Format a time for display
+ formatTime: function formatTime$$1() {
+ var time = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
+ var inverted = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
- element.parentNode.removeChild(element);
- },
+ // Bail if the value isn't a number
+ if (!is$1.number(time)) {
+ return time;
+ }
+ // Always display hours if duration is over an hour
+ var forceHours = getHours(this.duration) > 0;
- // Remove all child elements
- emptyElement: function emptyElement(element) {
- var length = element.childNodes.length;
+ return formatTime(time, forceHours, inverted);
+ },
- while (length > 0) {
- element.removeChild(element.lastChild);
- length -= 1;
- }
- },
+ // Update the displayed time
+ updateTimeDisplay: function updateTimeDisplay() {
+ var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
+ var time = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
+ var inverted = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
+ // Bail if there's no element to display or the value isn't a number
+ if (!is$1.element(target) || !is$1.number(time)) {
+ return;
+ }
- // Replace element
- replaceElement: function replaceElement(newChild, oldChild) {
- if (!utils.is.element(oldChild) || !utils.is.element(oldChild.parentNode) || !utils.is.element(newChild)) {
- return null;
- }
+ // eslint-disable-next-line no-param-reassign
+ target.innerText = controls.formatTime(time, inverted);
+ },
- oldChild.parentNode.replaceChild(newChild, oldChild);
- return newChild;
- },
+ // Update volume UI and storage
+ updateVolume: function updateVolume() {
+ if (!this.supported.ui) {
+ return;
+ }
+ // Update range
+ if (is$1.element(this.elements.inputs.volume)) {
+ controls.setRange.call(this, this.elements.inputs.volume, this.muted ? 0 : this.volume);
+ }
+
+ // Update mute state
+ if (is$1.element(this.elements.buttons.mute)) {
+ this.elements.buttons.mute.pressed = this.muted || this.volume === 0;
+ }
+ },
+
+
+ // Update seek value and lower fill
+ setRange: function setRange(target) {
+ var value = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
+
+ if (!is$1.element(target)) {
+ return;
+ }
+
+ // eslint-disable-next-line
+ target.value = value;
+
+ // Webkit range fill
+ controls.updateRangeFill.call(this, target);
+ },
+
+
+ // Update <progress> elements
+ updateProgress: function updateProgress(event) {
+ var _this = this;
+
+ if (!this.supported.ui || !is$1.event(event)) {
+ return;
+ }
+
+ var value = 0;
+
+ var setProgress = function setProgress(target, input) {
+ var value = is$1.number(input) ? input : 0;
+ var progress = is$1.element(target) ? target : _this.elements.display.buffer;
+
+ // Update value and label
+ if (is$1.element(progress)) {
+ progress.value = value;
+
+ // Update text label inside
+ var label = progress.getElementsByTagName('span')[0];
+ if (is$1.element(label)) {
+ label.childNodes[0].nodeValue = value;
+ }
+ }
+ };
+
+ if (event) {
+ switch (event.type) {
+ // Video playing
+ case 'timeupdate':
+ case 'seeking':
+ case 'seeked':
+ value = getPercentage(this.currentTime, this.duration);
+
+ // Set seek range value only if it's a 'natural' time event
+ if (event.type === 'timeupdate') {
+ controls.setRange.call(this, this.elements.inputs.seek, value);
+ }
+
+ break;
+
+ // Check buffer status
+ case 'playing':
+ case 'progress':
+ setProgress(this.elements.display.buffer, this.buffered * 100);
+
+ break;
+
+ default:
+ break;
+ }
+ }
+ },
+
+
+ // Webkit polyfill for lower fill range
+ updateRangeFill: function updateRangeFill(target) {
+ // Get range from event if event passed
+ var range = is$1.event(target) ? target.target : target;
+
+ // Needs to be a valid <input type='range'>
+ if (!is$1.element(range) || range.getAttribute('type') !== 'range') {
+ return;
+ }
+
+ // Set aria values for https://github.com/sampotts/plyr/issues/905
+ if (matches(range, this.config.selectors.inputs.seek)) {
+ range.setAttribute('aria-valuenow', this.currentTime);
+ var currentTime = controls.formatTime(this.currentTime);
+ var duration = controls.formatTime(this.duration);
+ var format$$1 = i18n.get('seekLabel', this.config);
+ range.setAttribute('aria-valuetext', format$$1.replace('{currentTime}', currentTime).replace('{duration}', duration));
+ } else if (matches(range, this.config.selectors.inputs.volume)) {
+ var percent = range.value * 100;
+ range.setAttribute('aria-valuenow', percent);
+ range.setAttribute('aria-valuetext', percent + '%');
+ } else {
+ range.setAttribute('aria-valuenow', range.value);
+ }
+
+ // WebKit only
+ if (!browser.isWebkit) {
+ return;
+ }
+
+ // Set CSS custom property
+ range.style.setProperty('--value', range.value / range.max * 100 + '%');
+ },
+
+
+ // Update hover tooltip for seeking
+ updateSeekTooltip: function updateSeekTooltip(event) {
+ var _this2 = this;
+
+ // Bail if setting not true
+ if (!this.config.tooltips.seek || !is$1.element(this.elements.inputs.seek) || !is$1.element(this.elements.display.seekTooltip) || this.duration === 0) {
+ return;
+ }
+
+ // Calculate percentage
+ var percent = 0;
+ var clientRect = this.elements.progress.getBoundingClientRect();
+ var visible = this.config.classNames.tooltip + '--visible';
+
+ var toggle = function toggle(_toggle) {
+ toggleClass(_this2.elements.display.seekTooltip, visible, _toggle);
+ };
+
+ // Hide on touch
+ if (this.touch) {
+ toggle(false);
+ return;
+ }
+
+ // Determine percentage, if already visible
+ if (is$1.event(event)) {
+ percent = 100 / clientRect.width * (event.pageX - clientRect.left);
+ } else if (hasClass(this.elements.display.seekTooltip, visible)) {
+ percent = parseFloat(this.elements.display.seekTooltip.style.left, 10);
+ } else {
+ return;
+ }
+
+ // Set bounds
+ if (percent < 0) {
+ percent = 0;
+ } else if (percent > 100) {
+ percent = 100;
+ }
+
+ // Display the time a click would seek to
+ controls.updateTimeDisplay.call(this, this.elements.display.seekTooltip, this.duration / 100 * percent);
+
+ // Set position
+ this.elements.display.seekTooltip.style.left = percent + '%';
+
+ // Show/hide the tooltip
+ // If the event is a moues in/out and percentage is inside bounds
+ if (is$1.event(event) && ['mouseenter', 'mouseleave'].includes(event.type)) {
+ toggle(event.type === 'mouseenter');
+ }
+ },
+
+
+ // Handle time change event
+ timeUpdate: function timeUpdate(event) {
+ // Only invert if only one time element is displayed and used for both duration and currentTime
+ var invert = !is$1.element(this.elements.display.duration) && this.config.invertTime;
+
+ // Duration
+ controls.updateTimeDisplay.call(this, this.elements.display.currentTime, invert ? this.duration - this.currentTime : this.currentTime, invert);
+
+ // Ignore updates while seeking
+ if (event && event.type === 'timeupdate' && this.media.seeking) {
+ return;
+ }
+
+ // Playing progress
+ controls.updateProgress.call(this, event);
+ },
+
+
+ // Show the duration on metadataloaded or durationchange events
+ durationUpdate: function durationUpdate() {
+ // Bail if no UI or durationchange event triggered after playing/seek when invertTime is false
+ if (!this.supported.ui || !this.config.invertTime && this.currentTime) {
+ return;
+ }
+
+ // Update ARIA values
+ if (is$1.element(this.elements.inputs.seek)) {
+ this.elements.inputs.seek.setAttribute('aria-valuemax', this.duration);
+ }
+
+ // If there's a spot to display duration
+ var hasDuration = is$1.element(this.elements.display.duration);
+
+ // If there's only one time display, display duration there
+ if (!hasDuration && this.config.displayDuration && this.paused) {
+ controls.updateTimeDisplay.call(this, this.elements.display.currentTime, this.duration);
+ }
+
+ // If there's a duration element, update content
+ if (hasDuration) {
+ controls.updateTimeDisplay.call(this, this.elements.display.duration, this.duration);
+ }
+
+ // Update the tooltip (if visible)
+ controls.updateSeekTooltip.call(this);
+ },
+
+
+ // Hide/show a tab
+ toggleTab: function toggleTab(setting, toggle) {
+ toggleHidden(this.elements.settings.tabs[setting], !toggle);
+ },
+
+
+ // Set the quality menu
+ setQualityMenu: function setQualityMenu(options) {
+ var _this3 = this;
+
+ // Menu required
+ if (!is$1.element(this.elements.settings.panes.quality)) {
+ return;
+ }
+
+ var type = 'quality';
+ var list = this.elements.settings.panes.quality.querySelector('ul');
+
+ // Set options if passed and filter based on uniqueness and config
+ if (is$1.array(options)) {
+ this.options.quality = dedupe(options).filter(function (quality) {
+ return _this3.config.quality.options.includes(quality);
+ });
+ }
+
+ // Toggle the pane and tab
+ var toggle = !is$1.empty(this.options.quality) && this.options.quality.length > 1;
+ controls.toggleTab.call(this, type, toggle);
+
+ // Check if we need to toggle the parent
+ controls.checkMenu.call(this);
+
+ // If we're hiding, nothing more to do
+ if (!toggle) {
+ return;
+ }
+
+ // Empty the menu
+ emptyElement(list);
+
+ // Get the badge HTML for HD, 4K etc
+ var getBadge = function getBadge(quality) {
+ var label = i18n.get('qualityBadge.' + quality, _this3.config);
+
+ if (!label.length) {
+ return null;
+ }
+
+ return controls.createBadge.call(_this3, label);
+ };
+
+ // Sort options by the config and then render options
+ this.options.quality.sort(function (a, b) {
+ var sorting = _this3.config.quality.options;
+ return sorting.indexOf(a) > sorting.indexOf(b) ? 1 : -1;
+ }).forEach(function (quality) {
+ controls.createMenuItem.call(_this3, {
+ value: quality,
+ list: list,
+ type: type,
+ title: controls.getLabel.call(_this3, 'quality', quality),
+ badge: getBadge(quality)
+ });
+ });
+
+ controls.updateSetting.call(this, type, list);
+ },
+
+
+ // Translate a value into a nice label
+ getLabel: function getLabel(setting, value) {
+ switch (setting) {
+ case 'speed':
+ return value === 1 ? i18n.get('normal', this.config) : value + '&times;';
+
+ case 'quality':
+ if (is$1.number(value)) {
+ var label = i18n.get('qualityLabel.' + value, this.config);
+
+ if (!label.length) {
+ return value + 'p';
+ }
+
+ return label;
+ }
+
+ return toTitleCase(value);
+
+ case 'captions':
+ return captions.getLabel.call(this);
+
+ default:
+ return null;
+ }
+ },
+
+
+ // Update the selected setting
+ updateSetting: function updateSetting(setting, container, input) {
+ var pane = this.elements.settings.panes[setting];
+ var value = null;
+ var list = container;
+
+ if (setting === 'captions') {
+ value = this.currentTrack;
+ } else {
+ value = !is$1.empty(input) ? input : this[setting];
+
+ // Get default
+ if (is$1.empty(value)) {
+ value = this.config[setting].default;
+ }
+
+ // Unsupported value
+ if (!is$1.empty(this.options[setting]) && !this.options[setting].includes(value)) {
+ this.debug.warn('Unsupported value of \'' + value + '\' for ' + setting);
+ return;
+ }
+
+ // Disabled value
+ if (!this.config[setting].options.includes(value)) {
+ this.debug.warn('Disabled value of \'' + value + '\' for ' + setting);
+ return;
+ }
+ }
+
+ // Get the list if we need to
+ if (!is$1.element(list)) {
+ list = pane && pane.querySelector('ul');
+ }
+
+ // If there's no list it means it's not been rendered...
+ if (!is$1.element(list)) {
+ return;
+ }
+
+ // Update the label
+ var label = this.elements.settings.tabs[setting].querySelector('.' + this.config.classNames.menu.value);
+ label.innerHTML = controls.getLabel.call(this, setting, value);
+
+ // Find the radio option and check it
+ var target = list && list.querySelector('input[value="' + value + '"]');
+
+ if (is$1.element(target)) {
+ target.checked = true;
+ }
+ },
+
+
+ // Set the looping options
+ /* setLoopMenu() {
+ // Menu required
+ if (!is.element(this.elements.settings.panes.loop)) {
+ return;
+ }
+ const options = ['start', 'end', 'all', 'reset'];
+ const list = this.elements.settings.panes.loop.querySelector('ul');
+ // Show the pane and tab
+ toggleHidden(this.elements.settings.tabs.loop, false);
+ toggleHidden(this.elements.settings.panes.loop, false);
+ // Toggle the pane and tab
+ const toggle = !is.empty(this.loop.options);
+ controls.toggleTab.call(this, 'loop', toggle);
+ // Empty the menu
+ emptyElement(list);
+ options.forEach(option => {
+ const item = createElement('li');
+ const button = createElement(
+ 'button',
+ extend(getAttributesFromSelector(this.config.selectors.buttons.loop), {
+ type: 'button',
+ class: this.config.classNames.control,
+ 'data-plyr-loop-action': option,
+ }),
+ i18n.get(option, this.config)
+ );
+ if (['start', 'end'].includes(option)) {
+ const badge = controls.createBadge.call(this, '00:00');
+ button.appendChild(badge);
+ }
+ item.appendChild(button);
+ list.appendChild(item);
+ });
+ }, */
+
+ // Get current selected caption language
+ // TODO: rework this to user the getter in the API?
+
+ // Set a list of available captions languages
+ setCaptionsMenu: function setCaptionsMenu() {
+ var _this4 = this;
+
+ // TODO: Captions or language? Currently it's mixed
+ var type = 'captions';
+ var list = this.elements.settings.panes.captions.querySelector('ul');
+ var tracks = captions.getTracks.call(this);
+
+ // Toggle the pane and tab
+ controls.toggleTab.call(this, type, tracks.length);
+
+ // Empty the menu
+ emptyElement(list);
+
+ // Check if we need to toggle the parent
+ controls.checkMenu.call(this);
+
+ // If there's no captions, bail
+ if (!tracks.length) {
+ return;
+ }
+
+ // Generate options data
+ var options = tracks.map(function (track, value) {
+ return {
+ value: value,
+ checked: _this4.captions.toggled && _this4.currentTrack === value,
+ title: captions.getLabel.call(_this4, track),
+ badge: track.language && controls.createBadge.call(_this4, track.language.toUpperCase()),
+ list: list,
+ type: 'language'
+ };
+ });
+
+ // Add the "Disabled" option to turn off captions
+ options.unshift({
+ value: -1,
+ checked: !this.captions.toggled,
+ title: i18n.get('disabled', this.config),
+ list: list,
+ type: 'language'
+ });
+
+ // Generate options
+ options.forEach(controls.createMenuItem.bind(this));
+
+ controls.updateSetting.call(this, type, list);
+ },
+
+
+ // Set a list of available captions languages
+ setSpeedMenu: function setSpeedMenu(options) {
+ var _this5 = this;
+
+ // Do nothing if not selected
+ if (!this.config.controls.includes('settings') || !this.config.settings.includes('speed')) {
+ return;
+ }
+
+ // Menu required
+ if (!is$1.element(this.elements.settings.panes.speed)) {
+ return;
+ }
+
+ var type = 'speed';
+
+ // Set the speed options
+ if (is$1.array(options)) {
+ this.options.speed = options;
+ } else if (this.isHTML5 || this.isVimeo) {
+ this.options.speed = [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2];
+ }
+
+ // Set options if passed and filter based on config
+ this.options.speed = this.options.speed.filter(function (speed) {
+ return _this5.config.speed.options.includes(speed);
+ });
+
+ // Toggle the pane and tab
+ var toggle = !is$1.empty(this.options.speed) && this.options.speed.length > 1;
+ controls.toggleTab.call(this, type, toggle);
+
+ // Check if we need to toggle the parent
+ controls.checkMenu.call(this);
+
+ // If we're hiding, nothing more to do
+ if (!toggle) {
+ return;
+ }
+
+ // Get the list to populate
+ var list = this.elements.settings.panes.speed.querySelector('ul');
+
+ // Empty the menu
+ emptyElement(list);
+
+ // Create items
+ this.options.speed.forEach(function (speed) {
+ controls.createMenuItem.call(_this5, {
+ value: speed,
+ list: list,
+ type: type,
+ title: controls.getLabel.call(_this5, 'speed', speed)
+ });
+ });
+
+ controls.updateSetting.call(this, type, list);
+ },
+
+
+ // Check if we need to hide/show the settings menu
+ checkMenu: function checkMenu() {
+ var tabs = this.elements.settings.tabs;
+
+ var visible = !is$1.empty(tabs) && Object.values(tabs).some(function (tab) {
+ return !tab.hidden;
+ });
+
+ toggleHidden(this.elements.settings.menu, !visible);
+ },
+
+
+ // Show/hide menu
+ toggleMenu: function toggleMenu(event) {
+ var form = this.elements.settings.form;
+
+ var button = this.elements.buttons.settings;
+
+ // Menu and button are required
+ if (!is$1.element(form) || !is$1.element(button)) {
+ return;
+ }
+
+ var show = is$1.boolean(event) ? event : is$1.element(form) && form.hasAttribute('hidden');
+
+ if (is$1.event(event)) {
+ var isMenuItem = is$1.element(form) && form.contains(event.target);
+ var isButton = event.target === this.elements.buttons.settings;
+
+ // If the click was inside the form or if the click
+ // wasn't the button or menu item and we're trying to
+ // show the menu (a doc click shouldn't show the menu)
+ if (isMenuItem || !isMenuItem && !isButton && show) {
+ return;
+ }
+
+ // Prevent the toggle being caught by the doc listener
+ if (isButton) {
+ event.stopPropagation();
+ }
+ }
+
+ // Set form and button attributes
+ if (is$1.element(button)) {
+ button.setAttribute('aria-expanded', show);
+ }
+
+ if (is$1.element(form)) {
+ toggleHidden(form, !show);
+ toggleClass(this.elements.container, this.config.classNames.menu.open, show);
+
+ if (show) {
+ form.removeAttribute('tabindex');
+ } else {
+ form.setAttribute('tabindex', -1);
+ }
+ }
+ },
+
+
+ // Get the natural size of a tab
+ getTabSize: function getTabSize(tab) {
+ var clone = tab.cloneNode(true);
+ clone.style.position = 'absolute';
+ clone.style.opacity = 0;
+ clone.removeAttribute('hidden');
+
+ // Prevent input's being unchecked due to the name being identical
+ Array.from(clone.querySelectorAll('input[name]')).forEach(function (input) {
+ var name = input.getAttribute('name');
+ input.setAttribute('name', name + '-clone');
+ });
+
+ // Append to parent so we get the "real" size
+ tab.parentNode.appendChild(clone);
+
+ // Get the sizes before we remove
+ var width = clone.scrollWidth;
+ var height = clone.scrollHeight;
+
+ // Remove from the DOM
+ removeElement(clone);
+
+ return {
+ width: width,
+ height: height
+ };
+ },
+
+
+ // Toggle Menu
+ showTab: function showTab() {
+ var _this6 = this;
+
+ var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
+ var menu = this.elements.settings.menu;
+
+ var pane = document.getElementById(target);
+
+ // Nothing to show, bail
+ if (!is$1.element(pane)) {
+ return;
+ }
+
+ // Are we targeting a tab? If not, bail
+ var isTab = pane.getAttribute('role') === 'tabpanel';
+ if (!isTab) {
+ return;
+ }
+
+ // Hide all other tabs
+ // Get other tabs
+ var current = menu.querySelector('[role="tabpanel"]:not([hidden])');
+ var container = current.parentNode;
+
+ // Set other toggles to be expanded false
+ Array.from(menu.querySelectorAll('[aria-controls="' + current.getAttribute('id') + '"]')).forEach(function (toggle) {
+ toggle.setAttribute('aria-expanded', false);
+ });
+
+ // If we can do fancy animations, we'll animate the height/width
+ if (support.transitions && !support.reducedMotion) {
+ // Set the current width as a base
+ container.style.width = current.scrollWidth + 'px';
+ container.style.height = current.scrollHeight + 'px';
+
+ // Get potential sizes
+ var size = controls.getTabSize.call(this, pane);
+
+ // Restore auto height/width
+ var restore = function restore(e) {
+ // We're only bothered about height and width on the container
+ if (e.target !== container || !['width', 'height'].includes(e.propertyName)) {
+ return;
+ }
+
+ // Revert back to auto
+ container.style.width = '';
+ container.style.height = '';
+
+ // Only listen once
+ off.call(_this6, container, transitionEndEvent, restore);
+ };
+
+ // Listen for the transition finishing and restore auto height/width
+ on.call(this, container, transitionEndEvent, restore);
+
+ // Set dimensions to target
+ container.style.width = size.width + 'px';
+ container.style.height = size.height + 'px';
+ }
+
+ // Set attributes on current tab
+ toggleHidden(current, true);
+ current.setAttribute('tabindex', -1);
+
+ // Set attributes on target
+ toggleHidden(pane, false);
+
+ var tabs = getElements.call(this, '[aria-controls="' + target + '"]');
+ Array.from(tabs).forEach(function (tab) {
+ tab.setAttribute('aria-expanded', true);
+ });
+ pane.removeAttribute('tabindex');
+
+ // Focus the first item
+ pane.querySelectorAll('button:not(:disabled), input:not(:disabled), [tabindex]')[0].focus();
+ },
+
+
+ // Build the default HTML
+ // TODO: Set order based on order in the config.controls array?
+ create: function create(data) {
+ var _this7 = this;
+
+ // Do nothing if we want no controls
+ if (is$1.empty(this.config.controls)) {
+ return null;
+ }
+
+ // Create the container
+ var container = createElement('div', getAttributesFromSelector(this.config.selectors.controls.wrapper));
+
+ // Restart button
+ if (this.config.controls.includes('restart')) {
+ container.appendChild(controls.createButton.call(this, 'restart'));
+ }
+
+ // Rewind button
+ if (this.config.controls.includes('rewind')) {
+ container.appendChild(controls.createButton.call(this, 'rewind'));
+ }
+
+ // Play/Pause button
+ if (this.config.controls.includes('play')) {
+ container.appendChild(controls.createButton.call(this, 'play'));
+ }
+
+ // Fast forward button
+ if (this.config.controls.includes('fast-forward')) {
+ container.appendChild(controls.createButton.call(this, 'fast-forward'));
+ }
+
+ // Progress
+ if (this.config.controls.includes('progress')) {
+ var progress = createElement('div', getAttributesFromSelector(this.config.selectors.progress));
+
+ // Seek range slider
+ progress.appendChild(controls.createRange.call(this, 'seek', {
+ id: 'plyr-seek-' + data.id
+ }));
+
+ // Buffer progress
+ progress.appendChild(controls.createProgress.call(this, 'buffer'));
+
+ // TODO: Add loop display indicator
+
+ // Seek tooltip
+ if (this.config.tooltips.seek) {
+ var tooltip = createElement('span', {
+ class: this.config.classNames.tooltip
+ }, '00:00');
+
+ progress.appendChild(tooltip);
+ this.elements.display.seekTooltip = tooltip;
+ }
+
+ this.elements.progress = progress;
+ container.appendChild(this.elements.progress);
+ }
+
+ // Media current time display
+ if (this.config.controls.includes('current-time')) {
+ container.appendChild(controls.createTime.call(this, 'currentTime'));
+ }
+
+ // Media duration display
+ if (this.config.controls.includes('duration')) {
+ container.appendChild(controls.createTime.call(this, 'duration'));
+ }
+
+ // Toggle mute button
+ if (this.config.controls.includes('mute')) {
+ container.appendChild(controls.createButton.call(this, 'mute'));
+ }
+
+ // Volume range control
+ if (this.config.controls.includes('volume')) {
+ var volume = createElement('div', {
+ class: 'plyr__volume'
+ });
+
+ // Set the attributes
+ var attributes = {
+ max: 1,
+ step: 0.05,
+ value: this.config.volume
+ };
+
+ // Create the volume range slider
+ volume.appendChild(controls.createRange.call(this, 'volume', extend(attributes, {
+ id: 'plyr-volume-' + data.id
+ })));
+
+ this.elements.volume = volume;
+
+ container.appendChild(volume);
+ }
+
+ // Toggle captions button
+ if (this.config.controls.includes('captions')) {
+ container.appendChild(controls.createButton.call(this, 'captions'));
+ }
+
+ // Settings button / menu
+ if (this.config.controls.includes('settings') && !is$1.empty(this.config.settings)) {
+ var menu = createElement('div', {
+ class: 'plyr__menu',
+ hidden: ''
+ });
+
+ menu.appendChild(controls.createButton.call(this, 'settings', {
+ id: 'plyr-settings-toggle-' + data.id,
+ 'aria-haspopup': true,
+ 'aria-controls': 'plyr-settings-' + data.id,
+ 'aria-expanded': false
+ }));
+
+ var form = createElement('form', {
+ class: 'plyr__menu__container',
+ id: 'plyr-settings-' + data.id,
+ hidden: '',
+ 'aria-labelled-by': 'plyr-settings-toggle-' + data.id,
+ role: 'tablist',
+ tabindex: -1
+ });
+
+ var inner = createElement('div');
+
+ var home = createElement('div', {
+ id: 'plyr-settings-' + data.id + '-home',
+ 'aria-labelled-by': 'plyr-settings-toggle-' + data.id,
+ role: 'tabpanel'
+ });
+
+ // Create the tab list
+ var tabs = createElement('ul', {
+ role: 'tablist'
+ });
+
+ // Build the tabs
+ this.config.settings.forEach(function (type) {
+ var tab = createElement('li', {
+ role: 'tab',
+ hidden: ''
+ });
+
+ var button = createElement('button', extend(getAttributesFromSelector(_this7.config.selectors.buttons.settings), {
+ type: 'button',
+ class: _this7.config.classNames.control + ' ' + _this7.config.classNames.control + '--forward',
+ id: 'plyr-settings-' + data.id + '-' + type + '-tab',
+ 'aria-haspopup': true,
+ 'aria-controls': 'plyr-settings-' + data.id + '-' + type,
+ 'aria-expanded': false
+ }), i18n.get(type, _this7.config));
+
+ var value = createElement('span', {
+ class: _this7.config.classNames.menu.value
+ });
+
+ // Speed contains HTML entities
+ value.innerHTML = data[type];
+
+ button.appendChild(value);
+ tab.appendChild(button);
+ tabs.appendChild(tab);
+
+ _this7.elements.settings.tabs[type] = tab;
+ });
+
+ home.appendChild(tabs);
+ inner.appendChild(home);
+
+ // Build the panes
+ this.config.settings.forEach(function (type) {
+ var pane = createElement('div', {
+ id: 'plyr-settings-' + data.id + '-' + type,
+ hidden: '',
+ 'aria-labelled-by': 'plyr-settings-' + data.id + '-' + type + '-tab',
+ role: 'tabpanel',
+ tabindex: -1
+ });
+
+ var back = createElement('button', {
+ type: 'button',
+ class: _this7.config.classNames.control + ' ' + _this7.config.classNames.control + '--back',
+ 'aria-haspopup': true,
+ 'aria-controls': 'plyr-settings-' + data.id + '-home',
+ 'aria-expanded': false
+ }, i18n.get(type, _this7.config));
+
+ pane.appendChild(back);
+
+ var options = createElement('ul');
+
+ pane.appendChild(options);
+ inner.appendChild(pane);
+
+ _this7.elements.settings.panes[type] = pane;
+ });
+
+ form.appendChild(inner);
+ menu.appendChild(form);
+ container.appendChild(menu);
+
+ this.elements.settings.form = form;
+ this.elements.settings.menu = menu;
+ }
+
+ // Picture in picture button
+ if (this.config.controls.includes('pip') && support.pip) {
+ container.appendChild(controls.createButton.call(this, 'pip'));
+ }
+
+ // Airplay button
+ if (this.config.controls.includes('airplay') && support.airplay) {
+ container.appendChild(controls.createButton.call(this, 'airplay'));
+ }
+
+ // Toggle fullscreen button
+ if (this.config.controls.includes('fullscreen')) {
+ container.appendChild(controls.createButton.call(this, 'fullscreen'));
+ }
+
+ // Larger overlaid play button
+ if (this.config.controls.includes('play-large')) {
+ this.elements.container.appendChild(controls.createButton.call(this, 'play-large'));
+ }
+
+ this.elements.controls = container;
+
+ if (this.isHTML5) {
+ controls.setQualityMenu.call(this, html5.getQualityOptions.call(this));
+ }
+
+ controls.setSpeedMenu.call(this);
+
+ return container;
+ },
+
+
+ // Insert controls
+ inject: function inject() {
+ var _this8 = this;
+
+ // Sprite
+ if (this.config.loadSprite) {
+ var icon = controls.getIconUrl.call(this);
+
+ // Only load external sprite using AJAX
+ if (icon.cors) {
+ loadSprite(icon.url, 'sprite-plyr');
+ }
+ }
+
+ // Create a unique ID
+ this.id = Math.floor(Math.random() * 10000);
+
+ // Null by default
+ var container = null;
+ this.elements.controls = null;
+
+ // Set template properties
+ var props = {
+ id: this.id,
+ seektime: this.config.seekTime,
+ title: this.config.title
+ };
+ var update = true;
+
+ if (is$1.string(this.config.controls) || is$1.element(this.config.controls)) {
+ // String or HTMLElement passed as the option
+ container = this.config.controls;
+ } else if (is$1.function(this.config.controls)) {
+ // A custom function to build controls
+ // The function can return a HTMLElement or String
+ container = this.config.controls.call(this, props);
+ } else {
+ // Create controls
+ container = controls.create.call(this, {
+ id: this.id,
+ seektime: this.config.seekTime,
+ speed: this.speed,
+ quality: this.quality,
+ captions: captions.getLabel.call(this)
+ // TODO: Looping
+ // loop: 'None',
+ });
+ update = false;
+ }
+
+ // Replace props with their value
+ var replace = function replace(input) {
+ var result = input;
+
+ Object.entries(props).forEach(function (_ref2) {
+ var _ref3 = slicedToArray(_ref2, 2),
+ key = _ref3[0],
+ value = _ref3[1];
+
+ result = replaceAll(result, '{' + key + '}', value);
+ });
+
+ return result;
+ };
+
+ // Update markup
+ if (update) {
+ if (is$1.string(this.config.controls)) {
+ container = replace(container);
+ } else if (is$1.element(container)) {
+ container.innerHTML = replace(container.innerHTML);
+ }
+ }
+
+ // Controls container
+ var target = void 0;
+
+ // Inject to custom location
+ if (is$1.string(this.config.selectors.controls.container)) {
+ target = document.querySelector(this.config.selectors.controls.container);
+ }
+
+ // Inject into the container by default
+ if (!is$1.element(target)) {
+ target = this.elements.container;
+ }
+
+ // Inject controls HTML
+ if (is$1.element(container)) {
+ target.appendChild(container);
+ } else if (container) {
+ target.insertAdjacentHTML('beforeend', container);
+ }
+
+ // Find the elements if need be
+ if (!is$1.element(this.elements.controls)) {
+ controls.findElements.call(this);
+ }
+
+ // Edge sometimes doesn't finish the paint so force a redraw
+ if (window.navigator.userAgent.includes('Edge')) {
+ repaint(target);
+ }
+
+ // Setup tooltips
+ if (this.config.tooltips.controls) {
+ var _config = this.config,
+ classNames = _config.classNames,
+ selectors = _config.selectors;
+
+ var selector = selectors.controls.wrapper + ' ' + selectors.labels + ' .' + classNames.hidden;
+ var labels = getElements.call(this, selector);
+
+ Array.from(labels).forEach(function (label) {
+ toggleClass(label, _this8.config.classNames.hidden, false);
+ toggleClass(label, _this8.config.classNames.tooltip, true);
+ });
+ }
+ }
+ };
+
+ // ==========================================================================
+ // Fetch wrapper
+ // Using XHR to avoid issues with older browsers
+ // ==========================================================================
+
+ function fetch$1(url) {
+ var responseType = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'text';
+
+ return new Promise(function (resolve, reject) {
+ try {
+ var request = new XMLHttpRequest();
+
+ // Check for CORS support
+ if (!('withCredentials' in request)) {
+ return;
+ }
+
+ request.addEventListener('load', function () {
+ if (responseType === 'text') {
+ try {
+ resolve(JSON.parse(request.responseText));
+ } catch (e) {
+ resolve(request.responseText);
+ }
+ } else {
+ resolve(request.response);
+ }
+ });
+
+ request.addEventListener('error', function () {
+ throw new Error(request.statusText);
+ });
+
+ request.open('GET', url, true);
+
+ // Set the required response type
+ request.responseType = responseType;
+
+ request.send();
+ } catch (e) {
+ reject(e);
+ }
+ });
+ }
+
+ // ==========================================================================
+
+ /**
+ * Parse a string to a URL object
+ * @param {string} input - the URL to be parsed
+ * @param {boolean} safe - failsafe parsing
+ */
+ function parseUrl(input) {
+ var safe = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
+
+ var url = input;
+
+ if (safe) {
+ var parser = document.createElement('a');
+ parser.href = url;
+ url = parser.href;
+ }
+
+ try {
+ return new URL(url);
+ } catch (e) {
+ return null;
+ }
+ }
+
+ // Convert object to URLSearchParams
+ function buildUrlParams(input) {
+ var params = new URLSearchParams();
+
+ if (is$1.object(input)) {
+ Object.entries(input).forEach(function (_ref) {
+ var _ref2 = slicedToArray(_ref, 2),
+ key = _ref2[0],
+ value = _ref2[1];
+
+ params.set(key, value);
+ });
+ }
+
+ return params;
+ }
+
+ // ==========================================================================
+
+ var captions = {
+ // Setup captions
+ setup: function setup() {
+ // Requires UI support
+ if (!this.supported.ui) {
+ return;
+ }
+
+ // Only Vimeo and HTML5 video supported at this point
+ if (!this.isVideo || this.isYouTube || this.isHTML5 && !support.textTracks) {
+ // Clear menu and hide
+ if (is$1.array(this.config.controls) && this.config.controls.includes('settings') && this.config.settings.includes('captions')) {
+ controls.setCaptionsMenu.call(this);
+ }
+
+ return;
+ }
+
+ // Inject the container
+ if (!is$1.element(this.elements.captions)) {
+ this.elements.captions = createElement('div', getAttributesFromSelector(this.config.selectors.captions));
+
+ insertAfter(this.elements.captions, this.elements.wrapper);
+ }
+
+ // Fix IE captions if CORS is used
+ // Fetch captions and inject as blobs instead (data URIs not supported!)
+ if (browser.isIE && window.URL) {
+ var elements = this.media.querySelectorAll('track');
+
+ Array.from(elements).forEach(function (track) {
+ var src = track.getAttribute('src');
+ var url = parseUrl(src);
+
+ if (url !== null && url.hostname !== window.location.href.hostname && ['http:', 'https:'].includes(url.protocol)) {
+ fetch$1(src, 'blob').then(function (blob) {
+ track.setAttribute('src', window.URL.createObjectURL(blob));
+ }).catch(function () {
+ removeElement(track);
+ });
+ }
+ });
+ }
+
+ // Get and set initial data
+ // The "preferred" options are not realized unless / until the wanted language has a match
+ // * languages: Array of user's browser languages.
+ // * language: The language preferred by user settings or config
+ // * active: The state preferred by user settings or config
+ // * toggled: The real captions state
+
+ var languages = dedupe(Array.from(navigator.languages || navigator.userLanguage).map(function (language) {
+ return language.split('-')[0];
+ }));
+
+ var language = (this.storage.get('language') || this.config.captions.language || 'auto').toLowerCase();
+
+ // Use first browser language when language is 'auto'
+ if (language === 'auto') {
+ var _languages = slicedToArray(languages, 1);
+
+ language = _languages[0];
+ }
+
+ var active = this.storage.get('captions');
+ if (!is$1.boolean(active)) {
+ active = this.config.captions.active;
+ }
+
+ Object.assign(this.captions, {
+ toggled: false,
+ active: active,
+ language: language,
+ languages: languages
+ });
+
+ // Watch changes to textTracks and update captions menu
+ if (this.isHTML5) {
+ var trackEvents = this.config.captions.update ? 'addtrack removetrack' : 'removetrack';
+ on.call(this, this.media.textTracks, trackEvents, captions.update.bind(this));
+ }
+
+ // Update available languages in list next tick (the event must not be triggered before the listeners)
+ setTimeout(captions.update.bind(this), 0);
+ },
+
+
+ // Update available language options in settings based on tracks
+ update: function update() {
+ var _this = this;
+
+ var tracks = captions.getTracks.call(this, true);
+ // Get the wanted language
+ var _captions = this.captions,
+ active = _captions.active,
+ language = _captions.language,
+ meta = _captions.meta,
+ currentTrackNode = _captions.currentTrackNode;
+
+ var languageExists = Boolean(tracks.find(function (track) {
+ return track.language === language;
+ }));
+
+ // Handle tracks (add event listener and "pseudo"-default)
+ if (this.isHTML5 && this.isVideo) {
+ tracks.filter(function (track) {
+ return !meta.get(track);
+ }).forEach(function (track) {
+ _this.debug.log('Track added', track);
+ // Attempt to store if the original dom element was "default"
+ meta.set(track, {
+ default: track.mode === 'showing'
+ });
+
+ // Turn off native caption rendering to avoid double captions
+ track.mode = 'hidden';
+
+ // Add event listener for cue changes
+ on.call(_this, track, 'cuechange', function () {
+ return captions.updateCues.call(_this);
+ });
+ });
+ }
+
+ // Update language first time it matches, or if the previous matching track was removed
+ if (languageExists && this.language !== language || !tracks.includes(currentTrackNode)) {
+ captions.setLanguage.call(this, language);
+ captions.toggle.call(this, active && languageExists);
+ }
+
+ // Enable or disable captions based on track length
+ toggleClass(this.elements.container, this.config.classNames.captions.enabled, !is$1.empty(tracks));
+
+ // Update available languages in list
+ if ((this.config.controls || []).includes('settings') && this.config.settings.includes('captions')) {
+ controls.setCaptionsMenu.call(this);
+ }
+ },
+
+
+ // Toggle captions display
+ // Used internally for the toggleCaptions method, with the passive option forced to false
+ toggle: function toggle(input) {
+ var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
+
+ // If there's no full support
+ if (!this.supported.ui) {
+ return;
+ }
+
+ var toggled = this.captions.toggled; // Current state
+
+ var activeClass = this.config.classNames.captions.active;
+
+ // Get the next state
+ // If the method is called without parameter, toggle based on current value
+ var active = is$1.nullOrUndefined(input) ? !toggled : input;
+
+ // Update state and trigger event
+ if (active !== toggled) {
+ // When passive, don't override user preferences
+ if (!passive) {
+ this.captions.active = active;
+ this.storage.set({ captions: active });
+ }
+
+ // Force language if the call isn't passive and there is no matching language to toggle to
+ if (!this.language && active && !passive) {
+ var tracks = captions.getTracks.call(this);
+ var track = captions.findTrack.call(this, [this.captions.language].concat(toConsumableArray(this.captions.languages)), true);
+
+ // Override user preferences to avoid switching languages if a matching track is added
+ this.captions.language = track.language;
+
+ // Set caption, but don't store in localStorage as user preference
+ captions.set.call(this, tracks.indexOf(track));
+ return;
+ }
+
+ // Toggle state
+ this.elements.buttons.captions.pressed = active;
+
+ // Add class hook
+ toggleClass(this.elements.container, activeClass, active);
+
+ this.captions.toggled = active;
+
+ // Update settings menu
+ controls.updateSetting.call(this, 'captions');
+
+ // Trigger event (not used internally)
+ triggerEvent.call(this, this.media, active ? 'captionsenabled' : 'captionsdisabled');
+ }
+ },
+
+
+ // Set captions by track index
+ // Used internally for the currentTrack setter with the passive option forced to false
+ set: function set(index) {
+ var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
+
+ var tracks = captions.getTracks.call(this);
+
+ // Disable captions if setting to -1
+ if (index === -1) {
+ captions.toggle.call(this, false, passive);
+ return;
+ }
+
+ if (!is$1.number(index)) {
+ this.debug.warn('Invalid caption argument', index);
+ return;
+ }
+
+ if (!(index in tracks)) {
+ this.debug.warn('Track not found', index);
+ return;
+ }
+
+ if (this.captions.currentTrack !== index) {
+ this.captions.currentTrack = index;
+ var track = tracks[index];
+
+ var _ref = track || {},
+ language = _ref.language;
+
+ // Store reference to node for invalidation on remove
+
+
+ this.captions.currentTrackNode = track;
+
+ // Update settings menu
+ controls.updateSetting.call(this, 'captions');
+
+ // When passive, don't override user preferences
+ if (!passive) {
+ this.captions.language = language;
+ this.storage.set({ language: language });
+ }
+
+ // Handle Vimeo captions
+ if (this.isVimeo) {
+ this.embed.enableTextTrack(language);
+ }
+
+ // Trigger event
+ triggerEvent.call(this, this.media, 'languagechange');
+ }
+
+ // Show captions
+ captions.toggle.call(this, true, passive);
+
+ if (this.isHTML5 && this.isVideo) {
+ // If we change the active track while a cue is already displayed we need to update it
+ captions.updateCues.call(this);
+ }
+ },
+
+
+ // Set captions by language
+ // Used internally for the language setter with the passive option forced to false
+ setLanguage: function setLanguage(input) {
+ var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
+
+ if (!is$1.string(input)) {
+ this.debug.warn('Invalid language argument', input);
+ return;
+ }
+ // Normalize
+ var language = input.toLowerCase();
+ this.captions.language = language;
+
+ // Set currentTrack
+ var tracks = captions.getTracks.call(this);
+ var track = captions.findTrack.call(this, [language]);
+ captions.set.call(this, tracks.indexOf(track), passive);
+ },
+
+
+ // Get current valid caption tracks
+ // If update is false it will also ignore tracks without metadata
+ // This is used to "freeze" the language options when captions.update is false
+ getTracks: function getTracks() {
+ var _this2 = this;
+
+ var update = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
+
+ // Handle media or textTracks missing or null
+ var tracks = Array.from((this.media || {}).textTracks || []);
+ // For HTML5, use cache instead of current tracks when it exists (if captions.update is false)
+ // Filter out removed tracks and tracks that aren't captions/subtitles (for example metadata)
+ return tracks.filter(function (track) {
+ return !_this2.isHTML5 || update || _this2.captions.meta.has(track);
+ }).filter(function (track) {
+ return ['captions', 'subtitles'].includes(track.kind);
+ });
+ },
+
+
+ // Match tracks based on languages and get the first
+ findTrack: function findTrack(languages) {
+ var _this3 = this;
+
+ var force = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
+
+ var tracks = captions.getTracks.call(this);
+ var sortIsDefault = function sortIsDefault(track) {
+ return Number((_this3.captions.meta.get(track) || {}).default);
+ };
+ var sorted = Array.from(tracks).sort(function (a, b) {
+ return sortIsDefault(b) - sortIsDefault(a);
+ });
+ var track = void 0;
+ languages.every(function (language) {
+ track = sorted.find(function (track) {
+ return track.language === language;
+ });
+ return !track; // Break iteration if there is a match
+ });
+ // If no match is found but is required, get first
+ return track || (force ? sorted[0] : undefined);
+ },
+
+
+ // Get the current track
+ getCurrentTrack: function getCurrentTrack() {
+ return captions.getTracks.call(this)[this.currentTrack];
+ },
+
+
+ // Get UI label for track
+ getLabel: function getLabel(track) {
+ var currentTrack = track;
+
+ if (!is$1.track(currentTrack) && support.textTracks && this.captions.toggled) {
+ currentTrack = captions.getCurrentTrack.call(this);
+ }
+
+ if (is$1.track(currentTrack)) {
+ if (!is$1.empty(currentTrack.label)) {
+ return currentTrack.label;
+ }
+
+ if (!is$1.empty(currentTrack.language)) {
+ return track.language.toUpperCase();
+ }
+
+ return i18n.get('enabled', this.config);
+ }
+
+ return i18n.get('disabled', this.config);
+ },
+
+
+ // Update captions using current track's active cues
+ // Also optional array argument in case there isn't any track (ex: vimeo)
+ updateCues: function updateCues(input) {
+ // Requires UI
+ if (!this.supported.ui) {
+ return;
+ }
+
+ if (!is$1.element(this.elements.captions)) {
+ this.debug.warn('No captions element to render to');
+ return;
+ }
+
+ // Only accept array or empty input
+ if (!is$1.nullOrUndefined(input) && !Array.isArray(input)) {
+ this.debug.warn('updateCues: Invalid input', input);
+ return;
+ }
+
+ var cues = input;
+
+ // Get cues from track
+ if (!cues) {
+ var track = captions.getCurrentTrack.call(this);
+ cues = Array.from((track || {}).activeCues || []).map(function (cue) {
+ return cue.getCueAsHTML();
+ }).map(getHTML);
+ }
+
+ // Set new caption text
+ var content = cues.map(function (cueText) {
+ return cueText.trim();
+ }).join('\n');
+ var changed = content !== this.elements.captions.innerHTML;
+
+ if (changed) {
+ // Empty the container and create a new child element
+ emptyElement(this.elements.captions);
+ var caption = createElement('span', getAttributesFromSelector(this.config.selectors.caption));
+ caption.innerHTML = content;
+ this.elements.captions.appendChild(caption);
+
+ // Trigger event
+ triggerEvent.call(this, this.media, 'cuechange');
+ }
+ }
+ };
+
+ // ==========================================================================
+ // Plyr default config
+ // ==========================================================================
+
+ var defaults$1 = {
+ // Disable
+ enabled: true,
+
+ // Custom media title
+ title: '',
+
+ // Logging to console
+ debug: false,
+
+ // Auto play (if supported)
+ autoplay: false,
+
+ // Only allow one media playing at once (vimeo only)
+ autopause: true,
+
+ // Allow inline playback on iOS (this effects YouTube/Vimeo - HTML5 requires the attribute present)
+ // TODO: Remove iosNative fullscreen option in favour of this (logic needs work)
+ playsinline: true,
+
+ // Default time to skip when rewind/fast forward
+ seekTime: 10,
+
+ // Default volume
+ volume: 1,
+ muted: false,
+
+ // Pass a custom duration
+ duration: null,
+
+ // Display the media duration on load in the current time position
+ // If you have opted to display both duration and currentTime, this is ignored
+ displayDuration: true,
+
+ // Invert the current time to be a countdown
+ invertTime: true,
+
+ // Clicking the currentTime inverts it's value to show time left rather than elapsed
+ toggleInvert: true,
+
+ // Aspect ratio (for embeds)
+ ratio: '16:9',
+
+ // Click video container to play/pause
+ clickToPlay: true,
+
+ // Auto hide the controls
+ hideControls: true,
+
+ // Reset to start when playback ended
+ resetOnEnd: false,
+
+ // Disable the standard context menu
+ disableContextMenu: true,
+
+ // Sprite (for icons)
+ loadSprite: true,
+ iconPrefix: 'plyr',
+ iconUrl: 'https://cdn.plyr.io/3.3.12/plyr.svg',
+
+ // Blank video (used to prevent errors on source change)
+ blankVideo: 'https://cdn.plyr.io/static/blank.mp4',
+
+ // Quality default
+ quality: {
+ default: 576,
+ options: [4320, 2880, 2160, 1440, 1080, 720, 576, 480, 360, 240, 'default']
+ },
+
+ // Set loops
+ loop: {
+ active: false
+ // start: null,
+ // end: null,
+ },
+
+ // Speed default and options to display
+ speed: {
+ selected: 1,
+ options: [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2]
+ },
+
+ // Keyboard shortcut settings
+ keyboard: {
+ focused: true,
+ global: false
+ },
+
+ // Display tooltips
+ tooltips: {
+ controls: false,
+ seek: true
+ },
+
+ // Captions settings
+ captions: {
+ active: false,
+ language: 'auto',
+ // Listen to new tracks added after Plyr is initialized.
+ // This is needed for streaming captions, but may result in unselectable options
+ update: false
+ },
+
+ // Fullscreen settings
+ fullscreen: {
+ enabled: true, // Allow fullscreen?
+ fallback: true, // Fallback for vintage browsers
+ iosNative: false // Use the native fullscreen in iOS (disables custom controls)
+ },
+
+ // Local storage
+ storage: {
+ enabled: true,
+ key: 'plyr'
+ },
+
+ // Default controls
+ controls: ['play-large',
+ // 'restart',
+ // 'rewind',
+ 'play',
+ // 'fast-forward',
+ 'progress', 'current-time', 'mute', 'volume', 'captions', 'settings', 'pip', 'airplay', 'fullscreen'],
+ settings: ['captions', 'quality', 'speed'],
+
+ // Localisation
+ i18n: {
+ restart: 'Restart',
+ rewind: 'Rewind {seektime}s',
+ play: 'Play',
+ pause: 'Pause',
+ fastForward: 'Forward {seektime}s',
+ seek: 'Seek',
+ seekLabel: '{currentTime} of {duration}',
+ played: 'Played',
+ buffered: 'Buffered',
+ currentTime: 'Current time',
+ duration: 'Duration',
+ volume: 'Volume',
+ mute: 'Mute',
+ unmute: 'Unmute',
+ enableCaptions: 'Enable captions',
+ disableCaptions: 'Disable captions',
+ enterFullscreen: 'Enter fullscreen',
+ exitFullscreen: 'Exit fullscreen',
+ frameTitle: 'Player for {title}',
+ captions: 'Captions',
+ settings: 'Settings',
+ menuBack: 'Go back to previous menu',
+ speed: 'Speed',
+ normal: 'Normal',
+ quality: 'Quality',
+ loop: 'Loop',
+ start: 'Start',
+ end: 'End',
+ all: 'All',
+ reset: 'Reset',
+ disabled: 'Disabled',
+ enabled: 'Enabled',
+ advertisement: 'Ad',
+ qualityBadge: {
+ 2160: '4K',
+ 1440: 'HD',
+ 1080: 'HD',
+ 720: 'HD',
+ 576: 'SD',
+ 480: 'SD'
+ }
+ },
+
+ // URLs
+ urls: {
+ vimeo: {
+ sdk: 'https://player.vimeo.com/api/player.js',
+ iframe: 'https://player.vimeo.com/video/{0}?{1}',
+ api: 'https://vimeo.com/api/v2/video/{0}.json'
+ },
+ youtube: {
+ sdk: 'https://www.youtube.com/iframe_api',
+ api: 'https://www.googleapis.com/youtube/v3/videos?id={0}&key={1}&fields=items(snippet(title))&part=snippet'
+ },
+ googleIMA: {
+ sdk: 'https://imasdk.googleapis.com/js/sdkloader/ima3.js'
+ }
+ },
+
+ // Custom control listeners
+ listeners: {
+ seek: null,
+ play: null,
+ pause: null,
+ restart: null,
+ rewind: null,
+ fastForward: null,
+ mute: null,
+ volume: null,
+ captions: null,
+ fullscreen: null,
+ pip: null,
+ airplay: null,
+ speed: null,
+ quality: null,
+ loop: null,
+ language: null
+ },
+
+ // Events to watch and bubble
+ events: [
+ // Events to watch on HTML5 media elements and bubble
+ // https://developer.mozilla.org/en/docs/Web/Guide/Events/Media_events
+ 'ended', 'progress', 'stalled', 'playing', 'waiting', 'canplay', 'canplaythrough', 'loadstart', 'loadeddata', 'loadedmetadata', 'timeupdate', 'volumechange', 'play', 'pause', 'error', 'seeking', 'seeked', 'emptied', 'ratechange', 'cuechange',
+
+ // Custom events
+ 'enterfullscreen', 'exitfullscreen', 'captionsenabled', 'captionsdisabled', 'languagechange', 'controlshidden', 'controlsshown', 'ready',
+
+ // YouTube
+ 'statechange', 'qualitychange', 'qualityrequested',
+
+ // Ads
+ 'adsloaded', 'adscontentpause', 'adscontentresume', 'adstarted', 'adsmidpoint', 'adscomplete', 'adsallcomplete', 'adsimpression', 'adsclick'],
+
+ // Selectors
+ // Change these to match your template if using custom HTML
+ selectors: {
+ editable: 'input, textarea, select, [contenteditable]',
+ container: '.plyr',
+ controls: {
+ container: null,
+ wrapper: '.plyr__controls'
+ },
+ labels: '[data-plyr]',
+ buttons: {
+ play: '[data-plyr="play"]',
+ pause: '[data-plyr="pause"]',
+ restart: '[data-plyr="restart"]',
+ rewind: '[data-plyr="rewind"]',
+ fastForward: '[data-plyr="fast-forward"]',
+ mute: '[data-plyr="mute"]',
+ captions: '[data-plyr="captions"]',
+ fullscreen: '[data-plyr="fullscreen"]',
+ pip: '[data-plyr="pip"]',
+ airplay: '[data-plyr="airplay"]',
+ settings: '[data-plyr="settings"]',
+ loop: '[data-plyr="loop"]'
+ },
+ inputs: {
+ seek: '[data-plyr="seek"]',
+ volume: '[data-plyr="volume"]',
+ speed: '[data-plyr="speed"]',
+ language: '[data-plyr="language"]',
+ quality: '[data-plyr="quality"]'
+ },
+ display: {
+ currentTime: '.plyr__time--current',
+ duration: '.plyr__time--duration',
+ buffer: '.plyr__progress__buffer',
+ loop: '.plyr__progress__loop', // Used later
+ volume: '.plyr__volume--display'
+ },
+ progress: '.plyr__progress',
+ captions: '.plyr__captions',
+ caption: '.plyr__caption',
+ menu: {
+ quality: '.js-plyr__menu__list--quality'
+ }
+ },
+
+ // Class hooks added to the player in different states
+ classNames: {
+ type: 'plyr--{0}',
+ provider: 'plyr--{0}',
+ video: 'plyr__video-wrapper',
+ embed: 'plyr__video-embed',
+ embedContainer: 'plyr__video-embed__container',
+ poster: 'plyr__poster',
+ posterEnabled: 'plyr__poster-enabled',
+ ads: 'plyr__ads',
+ control: 'plyr__control',
+ controlPressed: 'plyr__control--pressed',
+ playing: 'plyr--playing',
+ paused: 'plyr--paused',
+ stopped: 'plyr--stopped',
+ loading: 'plyr--loading',
+ hover: 'plyr--hover',
+ tooltip: 'plyr__tooltip',
+ cues: 'plyr__cues',
+ hidden: 'plyr__sr-only',
+ hideControls: 'plyr--hide-controls',
+ isIos: 'plyr--is-ios',
+ isTouch: 'plyr--is-touch',
+ uiSupported: 'plyr--full-ui',
+ noTransition: 'plyr--no-transition',
+ menu: {
+ value: 'plyr__menu__value',
+ badge: 'plyr__badge',
+ open: 'plyr--menu-open'
+ },
+ captions: {
+ enabled: 'plyr--captions-enabled',
+ active: 'plyr--captions-active'
+ },
+ fullscreen: {
+ enabled: 'plyr--fullscreen-enabled',
+ fallback: 'plyr--fullscreen-fallback'
+ },
+ pip: {
+ supported: 'plyr--pip-supported',
+ active: 'plyr--pip-active'
+ },
+ airplay: {
+ supported: 'plyr--airplay-supported',
+ active: 'plyr--airplay-active'
+ },
+ tabFocus: 'plyr__tab-focus'
+ },
+
+ // Embed attributes
+ attributes: {
+ embed: {
+ provider: 'data-plyr-provider',
+ id: 'data-plyr-embed-id'
+ }
+ },
+
+ // API keys
+ keys: {
+ google: null
+ },
+
+ // Advertisements plugin
+ // Register for an account here: http://vi.ai/publisher-video-monetization/?aid=plyrio
+ ads: {
+ enabled: false,
+ publisherId: ''
+ }
+ };
+
+ // ==========================================================================
+ // Plyr supported types and providers
+ // ==========================================================================
+
+ var providers = {
+ html5: 'html5',
+ youtube: 'youtube',
+ vimeo: 'vimeo'
+ };
+
+ var types = {
+ audio: 'audio',
+ video: 'video'
+ };
+
+ /**
+ * Get provider by URL
+ * @param {string} url
+ */
+ function getProviderByUrl(url) {
+ // YouTube
+ if (/^(https?:\/\/)?(www\.)?(youtube\.com|youtu\.?be)\/.+$/.test(url)) {
+ return providers.youtube;
+ }
+
+ // Vimeo
+ if (/^https?:\/\/player.vimeo.com\/video\/\d{0,9}(?=\b|\/)/.test(url)) {
+ return providers.vimeo;
+ }
+
+ return null;
+ }
+
+ // ==========================================================================
+ // Console wrapper
+ // ==========================================================================
+
+ var noop = function noop() {};
+
+ var Console = function () {
+ function Console() {
+ var enabled = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
+ classCallCheck(this, Console);
+
+ this.enabled = window.console && enabled;
+
+ if (this.enabled) {
+ this.log('Debugging enabled');
+ }
+ }
+
+ createClass(Console, [{
+ key: 'log',
+ get: function get() {
+ // eslint-disable-next-line no-console
+ return this.enabled ? Function.prototype.bind.call(console.log, console) : noop;
+ }
+ }, {
+ key: 'warn',
+ get: function get() {
+ // eslint-disable-next-line no-console
+ return this.enabled ? Function.prototype.bind.call(console.warn, console) : noop;
+ }
+ }, {
+ key: 'error',
+ get: function get() {
+ // eslint-disable-next-line no-console
+ return this.enabled ? Function.prototype.bind.call(console.error, console) : noop;
+ }
+ }]);
+ return Console;
+ }();
+
+ // ==========================================================================
+
+ function onChange() {
+ if (!this.enabled) {
+ return;
+ }
+
+ // Update toggle button
+ var button = this.player.elements.buttons.fullscreen;
+ if (is$1.element(button)) {
+ button.pressed = this.active;
+ }
+
+ // Trigger an event
+ triggerEvent.call(this.player, this.target, this.active ? 'enterfullscreen' : 'exitfullscreen', true);
+
+ // Trap focus in container
+ if (!browser.isIos) {
+ trapFocus.call(this.player, this.target, this.active);
+ }
+ }
+
+ function toggleFallback() {
+ var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
+
+ // Store or restore scroll position
+ if (toggle) {
+ this.scrollPosition = {
+ x: window.scrollX || 0,
+ y: window.scrollY || 0
+ };
+ } else {
+ window.scrollTo(this.scrollPosition.x, this.scrollPosition.y);
+ }
+
+ // Toggle scroll
+ document.body.style.overflow = toggle ? 'hidden' : '';
+
+ // Toggle class hook
+ toggleClass(this.target, this.player.config.classNames.fullscreen.fallback, toggle);
+
+ // Toggle button and fire events
+ onChange.call(this);
+ }
+
+ var Fullscreen = function () {
+ function Fullscreen(player) {
+ var _this = this;
+
+ classCallCheck(this, Fullscreen);
+
+ // Keep reference to parent
+ this.player = player;
+
+ // Get prefix
+ this.prefix = Fullscreen.prefix;
+ this.property = Fullscreen.property;
+
+ // Scroll position
+ this.scrollPosition = { x: 0, y: 0 };
+
+ // Register event listeners
+ // Handle event (incase user presses escape etc)
+ on.call(this.player, document, this.prefix === 'ms' ? 'MSFullscreenChange' : this.prefix + 'fullscreenchange', function () {
+ // TODO: Filter for target??
+ onChange.call(_this);
+ });
+
+ // Fullscreen toggle on double click
+ on.call(this.player, this.player.elements.container, 'dblclick', function (event) {
+ // Ignore double click in controls
+ if (is$1.element(_this.player.elements.controls) && _this.player.elements.controls.contains(event.target)) {
+ return;
+ }
+
+ _this.toggle();
+ });
+
+ // Update the UI
+ this.update();
+ }
+
+ // Determine if native supported
+
+
+ createClass(Fullscreen, [{
+ key: 'update',
+
+
+ // Update UI
+ value: function update() {
+ if (this.enabled) {
+ this.player.debug.log((Fullscreen.native ? 'Native' : 'Fallback') + ' fullscreen enabled');
+ } else {
+ this.player.debug.log('Fullscreen not supported and fallback disabled');
+ }
+
+ // Add styling hook to show button
+ toggleClass(this.player.elements.container, this.player.config.classNames.fullscreen.enabled, this.enabled);
+ }
+
+ // Make an element fullscreen
+
+ }, {
+ key: 'enter',
+ value: function enter() {
+ if (!this.enabled) {
+ return;
+ }
+
+ // iOS native fullscreen doesn't need the request step
+ if (browser.isIos && this.player.config.fullscreen.iosNative) {
+ if (this.player.playing) {
+ this.target.webkitEnterFullscreen();
+ }
+ } else if (!Fullscreen.native) {
+ toggleFallback.call(this, true);
+ } else if (!this.prefix) {
+ this.target.requestFullscreen();
+ } else if (!is$1.empty(this.prefix)) {
+ this.target[this.prefix + 'Request' + this.property]();
+ }
+ }
+
+ // Bail from fullscreen
+
+ }, {
+ key: 'exit',
+ value: function exit() {
+ if (!this.enabled) {
+ return;
+ }
+
+ // iOS native fullscreen
+ if (browser.isIos && this.player.config.fullscreen.iosNative) {
+ this.target.webkitExitFullscreen();
+ this.player.play();
+ } else if (!Fullscreen.native) {
+ toggleFallback.call(this, false);
+ } else if (!this.prefix) {
+ (document.cancelFullScreen || document.exitFullscreen).call(document);
+ } else if (!is$1.empty(this.prefix)) {
+ var action = this.prefix === 'moz' ? 'Cancel' : 'Exit';
+ document['' + this.prefix + action + this.property]();
+ }
+ }
+
+ // Toggle state
+
+ }, {
+ key: 'toggle',
+ value: function toggle() {
+ if (!this.active) {
+ this.enter();
+ } else {
+ this.exit();
+ }
+ }
+ }, {
+ key: 'enabled',
+
+
+ // Determine if fullscreen is enabled
+ get: function get() {
+ return (Fullscreen.native || this.player.config.fullscreen.fallback) && this.player.config.fullscreen.enabled && this.player.supported.ui && this.player.isVideo;
+ }
+
+ // Get active state
+
+ }, {
+ key: 'active',
+ get: function get() {
+ if (!this.enabled) {
+ return false;
+ }
+
+ // Fallback using classname
+ if (!Fullscreen.native) {
+ return hasClass(this.target, this.player.config.classNames.fullscreen.fallback);
+ }
+
+ var element = !this.prefix ? document.fullscreenElement : document['' + this.prefix + this.property + 'Element'];
+
+ return element === this.target;
+ }
+
+ // Get target element
+
+ }, {
+ key: 'target',
+ get: function get() {
+ return browser.isIos && this.player.config.fullscreen.iosNative ? this.player.media : this.player.elements.container;
+ }
+ }], [{
+ key: 'native',
+ get: function get() {
+ return !!(document.fullscreenEnabled || document.webkitFullscreenEnabled || document.mozFullScreenEnabled || document.msFullscreenEnabled);
+ }
+
+ // Get the prefix for handlers
+
+ }, {
+ key: 'prefix',
+ get: function get() {
+ // No prefix
+ if (is$1.function(document.exitFullscreen)) {
+ return '';
+ }
+
+ // Check for fullscreen support by vendor prefix
+ var value = '';
+ var prefixes = ['webkit', 'moz', 'ms'];
+
+ prefixes.some(function (pre) {
+ if (is$1.function(document[pre + 'ExitFullscreen']) || is$1.function(document[pre + 'CancelFullScreen'])) {
+ value = pre;
+ return true;
+ }
+
+ return false;
+ });
+
+ return value;
+ }
+ }, {
+ key: 'property',
+ get: function get() {
+ return this.prefix === 'moz' ? 'FullScreen' : 'Fullscreen';
+ }
+ }]);
+ return Fullscreen;
+ }();
+
+ // ==========================================================================
+ // Load image avoiding xhr/fetch CORS issues
+ // Server status can't be obtained this way unfortunately, so this uses "naturalWidth" to determine if the image has loaded
+ // By default it checks if it is at least 1px, but you can add a second argument to change this
+ // ==========================================================================
+
+ function loadImage(src) {
+ var minWidth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
+
+ return new Promise(function (resolve, reject) {
+ var image = new Image();
+
+ var handler = function handler() {
+ delete image.onload;
+ delete image.onerror;
+ (image.naturalWidth >= minWidth ? resolve : reject)(image);
+ };
+
+ Object.assign(image, { onload: handler, onerror: handler, src: src });
+ });
+ }
+
+ // ==========================================================================
+
+ var ui = {
+ addStyleHook: function addStyleHook() {
+ toggleClass(this.elements.container, this.config.selectors.container.replace('.', ''), true);
+ toggleClass(this.elements.container, this.config.classNames.uiSupported, this.supported.ui);
+ },
- // Set attributes
- setAttributes: function setAttributes(element, attributes) {
- if (!utils.is.element(element) || utils.is.empty(attributes)) {
- return;
- }
- Object.entries(attributes).forEach(function (_ref) {
- var _ref2 = slicedToArray(_ref, 2),
- key = _ref2[0],
- value = _ref2[1];
+ // Toggle native HTML5 media controls
+ toggleNativeControls: function toggleNativeControls() {
+ var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
+
+ if (toggle && this.isHTML5) {
+ this.media.setAttribute('controls', '');
+ } else {
+ this.media.removeAttribute('controls');
+ }
+ },
- element.setAttribute(key, value);
- });
- },
+ // Setup the UI
+ build: function build() {
+ var _this = this;
- // Get an attribute object from a string selector
- getAttributesFromSelector: function getAttributesFromSelector(sel, existingAttributes) {
- // For example:
- // '.test' to { class: 'test' }
- // '#test' to { id: 'test' }
- // '[data-test="test"]' to { 'data-test': 'test' }
+ // Re-attach media element listeners
+ // TODO: Use event bubbling?
+ this.listeners.media();
+
+ // Don't setup interface if no support
+ if (!this.supported.ui) {
+ this.debug.warn('Basic support only for ' + this.provider + ' ' + this.type);
+
+ // Restore native controls
+ ui.toggleNativeControls.call(this, true);
+
+ // Bail
+ return;
+ }
+
+ // Inject custom controls if not present
+ if (!is$1.element(this.elements.controls)) {
+ // Inject custom controls
+ controls.inject.call(this);
+
+ // Re-attach control listeners
+ this.listeners.controls();
+ }
+
+ // Remove native controls
+ ui.toggleNativeControls.call(this);
- if (!utils.is.string(sel) || utils.is.empty(sel)) {
- return {};
- }
+ // Setup captions for HTML5
+ if (this.isHTML5) {
+ captions.setup.call(this);
+ }
- var attributes = {};
- var existing = existingAttributes;
+ // Reset volume
+ this.volume = null;
- sel.split(',').forEach(function (s) {
- // Remove whitespace
- var selector = s.trim();
- var className = selector.replace('.', '');
- var stripped = selector.replace(/[[\]]/g, '');
+ // Reset mute state
+ this.muted = null;
- // Get the parts and value
- var parts = stripped.split('=');
- var key = parts[0];
- var value = parts.length > 1 ? parts[1].replace(/["']/g, '') : '';
+ // Reset speed
+ this.speed = null;
- // Get the first character
- var start = selector.charAt(0);
+ // Reset loop state
+ this.loop = null;
- switch (start) {
- case '.':
- // Add to existing classname
- if (utils.is.object(existing) && utils.is.string(existing.class)) {
- existing.class += ' ' + className;
- }
+ // Reset quality setting
+ this.quality = null;
- attributes.class = className;
- break;
+ // Reset volume display
+ controls.updateVolume.call(this);
- case '#':
- // ID selector
- attributes.id = selector.replace('#', '');
- break;
+ // Reset time display
+ controls.timeUpdate.call(this);
- case '[':
- // Attribute selector
- attributes[key] = value;
+ // Update the UI
+ ui.checkPlaying.call(this);
- break;
+ // Check for picture-in-picture support
+ toggleClass(this.elements.container, this.config.classNames.pip.supported, support.pip && this.isHTML5 && this.isVideo);
- default:
- break;
- }
- });
+ // Check for airplay support
+ toggleClass(this.elements.container, this.config.classNames.airplay.supported, support.airplay && this.isHTML5);
- return attributes;
- },
+ // Add iOS class
+ toggleClass(this.elements.container, this.config.classNames.isIos, browser.isIos);
+ // Add touch class
+ toggleClass(this.elements.container, this.config.classNames.isTouch, this.touch);
+
+ // Ready for API calls
+ this.ready = true;
+
+ // Ready event at end of execution stack
+ setTimeout(function () {
+ triggerEvent.call(_this, _this.media, 'ready');
+ }, 0);
+
+ // Set the title
+ ui.setTitle.call(this);
+
+ // Assure the poster image is set, if the property was added before the element was created
+ if (this.poster) {
+ ui.setPoster.call(this, this.poster, false).catch(function () {});
+ }
+
+ // Manually set the duration if user has overridden it.
+ // The event listeners for it doesn't get called if preload is disabled (#701)
+ if (this.config.duration) {
+ controls.durationUpdate.call(this);
+ }
+ },
+
+
+ // Setup aria attribute for play and iframe title
+ setTitle: function setTitle() {
+ // Find the current text
+ var label = i18n.get('play', this.config);
+
+ // If there's a media title set, use that for the label
+ if (is$1.string(this.config.title) && !is$1.empty(this.config.title)) {
+ label += ', ' + this.config.title;
+ }
+
+ // If there's a play button, set label
+ if (is$1.nodeList(this.elements.buttons.play)) {
+ Array.from(this.elements.buttons.play).forEach(function (button) {
+ button.setAttribute('aria-label', label);
+ });
+ }
+
+ // Set iframe title
+ // https://github.com/sampotts/plyr/issues/124
+ if (this.isEmbed) {
+ var iframe = getElement.call(this, 'iframe');
+
+ if (!is$1.element(iframe)) {
+ return;
+ }
+
+ // Default to media type
+ var title = !is$1.empty(this.config.title) ? this.config.title : 'video';
+ var format = i18n.get('frameTitle', this.config);
+
+ iframe.setAttribute('title', format.replace('{title}', title));
+ }
+ },
- // Toggle hidden
- toggleHidden: function toggleHidden(element, hidden) {
- if (!utils.is.element(element)) {
- return;
- }
- var hide = hidden;
-
- if (!utils.is.boolean(hide)) {
- hide = !element.hasAttribute('hidden');
- }
-
- if (hide) {
- element.setAttribute('hidden', '');
- } else {
- element.removeAttribute('hidden');
- }
- },
-
-
- // Mirror Element.classList.toggle, with IE compatibility for "force" argument
- toggleClass: function toggleClass(element, className, force) {
- if (utils.is.element(element)) {
- var method = 'toggle';
- if (typeof force !== 'undefined') {
- method = force ? 'add' : 'remove';
- }
-
- element.classList[method](className);
- return element.classList.contains(className);
- }
-
- return null;
- },
-
-
- // Has class name
- hasClass: function hasClass(element, className) {
- return utils.is.element(element) && element.classList.contains(className);
- },
-
-
- // Element matches selector
- matches: function matches(element, selector) {
- var prototype = { Element: Element };
-
- function match() {
- return Array.from(document.querySelectorAll(selector)).includes(this);
- }
-
- var matches = prototype.matches || prototype.webkitMatchesSelector || prototype.mozMatchesSelector || prototype.msMatchesSelector || match;
-
- return matches.call(element, selector);
- },
-
-
- // Find all elements
- getElements: function getElements(selector) {
- return this.elements.container.querySelectorAll(selector);
- },
-
-
- // Find a single element
- getElement: function getElement(selector) {
- return this.elements.container.querySelector(selector);
- },
-
-
- // Get the focused element
- getFocusElement: function getFocusElement() {
- var focused = document.activeElement;
-
- if (!focused || focused === document.body) {
- focused = null;
- } else {
- focused = document.querySelector(':focus');
- }
-
- return focused;
- },
-
-
- // Trap focus inside container
- trapFocus: function trapFocus() {
- var element = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
- var toggle = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
-
- if (!utils.is.element(element)) {
- return;
- }
-
- var focusable = utils.getElements.call(this, 'button:not(:disabled), input:not(:disabled), [tabindex]');
- var first = focusable[0];
- var last = focusable[focusable.length - 1];
-
- var trap = function trap(event) {
- // Bail if not tab key or not fullscreen
- if (event.key !== 'Tab' || event.keyCode !== 9) {
- return;
- }
-
- // Get the current focused element
- var focused = utils.getFocusElement();
-
- if (focused === last && !event.shiftKey) {
- // Move focus to first element that can be tabbed if Shift isn't used
- first.focus();
- event.preventDefault();
- } else if (focused === first && event.shiftKey) {
- // Move focus to last element that can be tabbed if Shift is used
- last.focus();
- event.preventDefault();
- }
- };
-
- if (toggle) {
- utils.on(this.elements.container, 'keydown', trap, false);
- } else {
- utils.off(this.elements.container, 'keydown', trap, false);
- }
- },
-
-
- // Toggle event listener
- toggleListener: function toggleListener(elements, event, callback) {
- var toggle = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
- var passive = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;
- var capture = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : false;
-
- // Bail if no elemetns, event, or callback
- if (utils.is.empty(elements) || utils.is.empty(event) || !utils.is.function(callback)) {
- return;
- }
-
- // If a nodelist is passed, call itself on each node
- if (utils.is.nodeList(elements) || utils.is.array(elements)) {
- // Create listener for each node
- Array.from(elements).forEach(function (element) {
- if (element instanceof Node) {
- utils.toggleListener.call(null, element, event, callback, toggle, passive, capture);
- }
- });
-
- return;
- }
-
- // Allow multiple events
- var events = event.split(' ');
-
- // Build options
- // Default to just the capture boolean for browsers with no passive listener support
- var options = capture;
-
- // If passive events listeners are supported
- if (support.passiveListeners) {
- options = {
- // Whether the listener can be passive (i.e. default never prevented)
- passive: passive,
- // Whether the listener is a capturing listener or not
- capture: capture
- };
- }
-
- // If a single node is passed, bind the event listener
- events.forEach(function (type) {
- elements[toggle ? 'addEventListener' : 'removeEventListener'](type, callback, options);
- });
- },
-
-
- // Bind event handler
- on: function on(element) {
- var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
- var callback = arguments[2];
- var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;
- var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
-
- utils.toggleListener(element, events, callback, true, passive, capture);
- },
-
-
- // Unbind event handler
- off: function off(element) {
- var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
- var callback = arguments[2];
- var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;
- var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
-
- utils.toggleListener(element, events, callback, false, passive, capture);
- },
-
-
- // Trigger event
- dispatchEvent: function dispatchEvent(element) {
- var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
- var bubbles = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
- var detail = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
-
- // Bail if no element
- if (!utils.is.element(element) || utils.is.empty(type)) {
- return;
- }
-
- // Create and dispatch the event
- var event = new CustomEvent(type, {
- bubbles: bubbles,
- detail: Object.assign({}, detail, {
- plyr: this
- })
- });
-
- // Dispatch the event
- element.dispatchEvent(event);
- },
-
-
- // Format string
- format: function format(input) {
- for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
- args[_key - 1] = arguments[_key];
- }
-
- if (utils.is.empty(input)) {
- return input;
- }
-
- return input.toString().replace(/{(\d+)}/g, function (match, i) {
- return utils.is.string(args[i]) ? args[i] : '';
- });
- },
-
-
- // Get percentage
- getPercentage: function getPercentage(current, max) {
- if (current === 0 || max === 0 || Number.isNaN(current) || Number.isNaN(max)) {
- return 0;
- }
-
- return (current / max * 100).toFixed(2);
- },
-
-
- // Time helpers
- getHours: function getHours(value) {
- return parseInt(value / 60 / 60 % 60, 10);
- },
- getMinutes: function getMinutes(value) {
- return parseInt(value / 60 % 60, 10);
- },
- getSeconds: function getSeconds(value) {
- return parseInt(value % 60, 10);
- },
-
-
- // Format time to UI friendly string
- formatTime: function formatTime() {
- var time = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
- var displayHours = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
- var inverted = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
-
- // Bail if the value isn't a number
- if (!utils.is.number(time)) {
- return utils.formatTime(null, displayHours, inverted);
- }
-
- // Format time component to add leading zero
- var format = function format(value) {
- return ('0' + value).slice(-2);
- };
-
- // Breakdown to hours, mins, secs
- var hours = utils.getHours(time);
- var mins = utils.getMinutes(time);
- var secs = utils.getSeconds(time);
-
- // Do we need to display hours?
- if (displayHours || hours > 0) {
- hours = hours + ':';
- } else {
- hours = '';
- }
-
- // Render
- return '' + (inverted ? '-' : '') + hours + format(mins) + ':' + format(secs);
- },
-
-
- // Replace all occurances of a string in a string
- replaceAll: function replaceAll() {
- var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
- var find = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
- var replace = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';
-
- return input.replace(new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\]/\\])/g, '\\$1'), 'g'), replace.toString());
- },
-
-
- // Convert to title case
- toTitleCase: function toTitleCase() {
- var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
-
- return input.toString().replace(/\w\S*/g, function (text) {
- return text.charAt(0).toUpperCase() + text.substr(1).toLowerCase();
- });
- },
-
-
- // Convert string to pascalCase
- toPascalCase: function toPascalCase() {
- var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
-
- var string = input.toString();
-
- // Convert kebab case
- string = utils.replaceAll(string, '-', ' ');
-
- // Convert snake case
- string = utils.replaceAll(string, '_', ' ');
-
- // Convert to title case
- string = utils.toTitleCase(string);
-
- // Convert to pascal case
- return utils.replaceAll(string, ' ', '');
- },
-
-
- // Convert string to pascalCase
- toCamelCase: function toCamelCase() {
- var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
-
- var string = input.toString();
-
- // Convert to pascal case
- string = utils.toPascalCase(string);
-
- // Convert first character to lowercase
- return string.charAt(0).toLowerCase() + string.slice(1);
- },
-
-
- // Deep extend destination object with N more objects
- extend: function extend() {
- var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
-
- for (var _len2 = arguments.length, sources = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
- sources[_key2 - 1] = arguments[_key2];
- }
-
- if (!sources.length) {
- return target;
- }
-
- var source = sources.shift();
-
- if (!utils.is.object(source)) {
- return target;
- }
-
- Object.keys(source).forEach(function (key) {
- if (utils.is.object(source[key])) {
- if (!Object.keys(target).includes(key)) {
- Object.assign(target, defineProperty$1({}, key, {}));
- }
-
- utils.extend(target[key], source[key]);
- } else {
- Object.assign(target, defineProperty$1({}, key, source[key]));
- }
- });
-
- return utils.extend.apply(utils, [target].concat(toConsumableArray(sources)));
- },
-
-
- // Remove duplicates in an array
- dedupe: function dedupe(array) {
- if (!utils.is.array(array)) {
- return array;
- }
-
- return array.filter(function (item, index) {
- return array.indexOf(item) === index;
- });
- },
-
-
- // Clone nested objects
- cloneDeep: function cloneDeep(object) {
- return JSON.parse(JSON.stringify(object));
- },
-
-
- // Get a nested value in an object
- getDeep: function getDeep(object, path) {
- return path.split('.').reduce(function (obj, key) {
- return obj && obj[key];
- }, object);
- },
-
-
- // Get the closest value in an array
- closest: function closest(array, value) {
- if (!utils.is.array(array) || !array.length) {
- return null;
- }
-
- return array.reduce(function (prev, curr) {
- return Math.abs(curr - value) < Math.abs(prev - value) ? curr : prev;
- });
- },
-
-
- // Get the provider for a given URL
- getProviderByUrl: function getProviderByUrl(url) {
- // YouTube
- if (/^(https?:\/\/)?(www\.)?(youtube\.com|youtu\.?be)\/.+$/.test(url)) {
- return providers.youtube;
- }
-
- // Vimeo
- if (/^https?:\/\/player.vimeo.com\/video\/\d{0,9}(?=\b|\/)/.test(url)) {
- return providers.vimeo;
- }
-
- return null;
- },
-
-
- // Parse YouTube ID from URL
- parseYouTubeId: function parseYouTubeId(url) {
- if (utils.is.empty(url)) {
- return null;
- }
-
- var regex = /^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|&v=)([^#&?]*).*/;
- return url.match(regex) ? RegExp.$2 : url;
- },
-
-
- // Parse Vimeo ID from URL
- parseVimeoId: function parseVimeoId(url) {
- if (utils.is.empty(url)) {
- return null;
- }
-
- if (utils.is.number(Number(url))) {
- return url;
- }
-
- var regex = /^.*(vimeo.com\/|video\/)(\d+).*/;
- return url.match(regex) ? RegExp.$2 : url;
- },
-
-
- // Convert a URL to a location object
- parseUrl: function parseUrl(url) {
- var parser = document.createElement('a');
- parser.href = url;
- return parser;
- },
-
-
- // Get URL query parameters
- getUrlParams: function getUrlParams(input) {
- var search = input;
-
- // Parse URL if needed
- if (input.startsWith('http://') || input.startsWith('https://')) {
- var _utils$parseUrl = utils.parseUrl(input);
-
- search = _utils$parseUrl.search;
- }
-
- if (utils.is.empty(search)) {
- return null;
- }
-
- var hashes = search.slice(search.indexOf('?') + 1).split('&');
-
- return hashes.reduce(function (params, hash) {
- var _hash$split = hash.split('='),
- _hash$split2 = slicedToArray(_hash$split, 2),
- key = _hash$split2[0],
- val = _hash$split2[1];
-
- return Object.assign(params, defineProperty$1({}, key, decodeURIComponent(val)));
- }, {});
- },
-
-
- // Convert object to URL parameters
- buildUrlParams: function buildUrlParams(input) {
- if (!utils.is.object(input)) {
- return '';
- }
-
- return Object.keys(input).map(function (key) {
- return encodeURIComponent(key) + '=' + encodeURIComponent(input[key]);
- }).join('&');
- },
-
-
- // Remove HTML from a string
- stripHTML: function stripHTML(source) {
- var fragment = document.createDocumentFragment();
- var element = document.createElement('div');
- fragment.appendChild(element);
- element.innerHTML = source;
- return fragment.firstChild.innerText;
- },
-
-
- // Like outerHTML, but also works for DocumentFragment
- getHTML: function getHTML(element) {
- var wrapper = document.createElement('div');
- wrapper.appendChild(element);
- return wrapper.innerHTML;
- },
-
-
- // Get aspect ratio for dimensions
- getAspectRatio: function getAspectRatio(width, height) {
- var getRatio = function getRatio(w, h) {
- return h === 0 ? w : getRatio(h, w % h);
- };
- var ratio = getRatio(width, height);
- return width / ratio + ':' + height / ratio;
- },
-
-
- // Get the transition end event
- get transitionEndEvent() {
- var element = document.createElement('span');
-
- var events = {
- WebkitTransition: 'webkitTransitionEnd',
- MozTransition: 'transitionend',
- OTransition: 'oTransitionEnd otransitionend',
- transition: 'transitionend'
- };
-
- var type = Object.keys(events).find(function (event) {
- return element.style[event] !== undefined;
- });
-
- return utils.is.string(type) ? events[type] : false;
- },
-
- // Force repaint of element
- repaint: function repaint(element) {
- setTimeout(function () {
- utils.toggleHidden(element, true);
- element.offsetHeight; // eslint-disable-line
- utils.toggleHidden(element, false);
- }, 0);
- }
-};
-
-// ==========================================================================
-
-// Check for feature support
-var support = {
- // Basic support
- audio: 'canPlayType' in document.createElement('audio'),
- video: 'canPlayType' in document.createElement('video'),
-
- // Check for support
- // Basic functionality vs full UI
- check: function check(type, provider, playsinline) {
- var api = false;
- var ui = false;
- var browser = utils.getBrowser();
- var canPlayInline = browser.isIPhone && playsinline && support.playsinline;
-
- switch (provider + ':' + type) {
- case 'html5:video':
- api = support.video;
- ui = api && support.rangeInput && (!browser.isIPhone || canPlayInline);
- break;
-
- case 'html5:audio':
- api = support.audio;
- ui = api && support.rangeInput;
- break;
-
- case 'youtube:video':
- case 'vimeo:video':
- api = true;
- ui = support.rangeInput && (!browser.isIPhone || canPlayInline);
- break;
-
- default:
- api = support.audio && support.video;
- ui = api && support.rangeInput;
- }
-
- return {
- api: api,
- ui: ui
- };
- },
-
-
- // Picture-in-picture support
- // Safari only currently
- pip: function () {
- var browser = utils.getBrowser();
- return !browser.isIPhone && utils.is.function(utils.createElement('video').webkitSetPresentationMode);
- }(),
-
- // Airplay support
- // Safari only currently
- airplay: utils.is.function(window.WebKitPlaybackTargetAvailabilityEvent),
-
- // Inline playback support
- // https://webkit.org/blog/6784/new-video-policies-for-ios/
- playsinline: 'playsInline' in document.createElement('video'),
-
- // Check for mime type support against a player instance
- // Credits: http://diveintohtml5.info/everything.html
- // Related: http://www.leanbackplayer.com/test/h5mt.html
- mime: function mime(type) {
- var media = this.media;
-
-
- try {
- // Bail if no checking function
- if (!this.isHTML5 || !utils.is.function(media.canPlayType)) {
- return false;
- }
-
- // Check directly if codecs specified
- if (type.includes('codecs=')) {
- return media.canPlayType(type).replace(/no/, '');
- }
-
- // Type specific checks
- if (this.isVideo) {
- switch (type) {
- case 'video/webm':
- return media.canPlayType('video/webm; codecs="vp8, vorbis"').replace(/no/, '');
-
- case 'video/mp4':
- return media.canPlayType('video/mp4; codecs="avc1.42E01E, mp4a.40.2"').replace(/no/, '');
-
- case 'video/ogg':
- return media.canPlayType('video/ogg; codecs="theora"').replace(/no/, '');
-
- default:
- return false;
- }
- } else if (this.isAudio) {
- switch (type) {
- case 'audio/mpeg':
- return media.canPlayType('audio/mpeg;').replace(/no/, '');
-
- case 'audio/ogg':
- return media.canPlayType('audio/ogg; codecs="vorbis"').replace(/no/, '');
-
- case 'audio/wav':
- return media.canPlayType('audio/wav; codecs="1"').replace(/no/, '');
-
- default:
- return false;
- }
- }
- } catch (e) {
- return false;
- }
-
- // If we got this far, we're stuffed
- return false;
- },
-
-
- // Check for textTracks support
- textTracks: 'textTracks' in document.createElement('video'),
-
- // Check for passive event listener support
- // https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md
- // https://www.youtube.com/watch?v=NPM6172J22g
- passiveListeners: function () {
- // Test via a getter in the options object to see if the passive property is accessed
- var supported = false;
- try {
- var options = Object.defineProperty({}, 'passive', {
- get: function get() {
- supported = true;
- return null;
- }
- });
- window.addEventListener('test', null, options);
- window.removeEventListener('test', null, options);
- } catch (e) {
- // Do nothing
- }
-
- return supported;
- }(),
-
- // <input type="range"> Sliders
- rangeInput: function () {
- var range = document.createElement('input');
- range.type = 'range';
- return range.type === 'range';
- }(),
-
- // Touch
- // NOTE: Remember a device can be mouse + touch enabled so we check on first touch event
- touch: 'ontouchstart' in document.documentElement,
-
- // Detect transitions support
- transitions: utils.transitionEndEvent !== false,
-
- // Reduced motion iOS & MacOS setting
- // https://webkit.org/blog/7551/responsive-design-for-motion/
- reducedMotion: 'matchMedia' in window && window.matchMedia('(prefers-reduced-motion)').matches
-};
-
-// ==========================================================================
-
-var html5 = {
- getSources: function getSources() {
- if (!this.isHTML5) {
- return null;
- }
-
- return this.media.querySelectorAll('source');
- },
-
-
- // Get quality levels
- getQualityOptions: function getQualityOptions() {
- if (!this.isHTML5) {
- return null;
- }
-
- // Get sources
- var sources = html5.getSources.call(this);
-
- if (utils.is.empty(sources)) {
- return null;
- }
-
- // Get <source> with size attribute
- var sizes = Array.from(sources).filter(function (source) {
- return !utils.is.empty(source.getAttribute('size'));
- });
-
- // If none, bail
- if (utils.is.empty(sizes)) {
- return null;
- }
-
- // Reduce to unique list
- return utils.dedupe(sizes.map(function (source) {
- return Number(source.getAttribute('size'));
- }));
- },
- extend: function extend() {
- if (!this.isHTML5) {
- return;
- }
-
- var player = this;
-
- // Quality
- Object.defineProperty(player.media, 'quality', {
- get: function get() {
- // Get sources
- var sources = html5.getSources.call(player);
-
- if (utils.is.empty(sources)) {
- return null;
- }
-
- var matches = Array.from(sources).filter(function (source) {
- return source.getAttribute('src') === player.source;
- });
-
- if (utils.is.empty(matches)) {
- return null;
- }
-
- return Number(matches[0].getAttribute('size'));
- },
- set: function set(input) {
- // Get sources
- var sources = html5.getSources.call(player);
-
- if (utils.is.empty(sources)) {
- return;
- }
-
- // Get matches for requested size
- var matches = Array.from(sources).filter(function (source) {
- return Number(source.getAttribute('size')) === input;
- });
-
- // No matches for requested size
- if (utils.is.empty(matches)) {
- return;
- }
-
- // Get supported sources
- var supported = matches.filter(function (source) {
- return support.mime.call(player, source.getAttribute('type'));
- });
-
- // No supported sources
- if (utils.is.empty(supported)) {
- return;
- }
-
- // Trigger change event
- utils.dispatchEvent.call(player, player.media, 'qualityrequested', false, {
- quality: input
- });
-
- // Get current state
- var currentTime = player.currentTime,
- playing = player.playing;
-
- // Set new source
-
- player.media.src = supported[0].getAttribute('src');
-
- // Restore time
- var onLoadedMetaData = function onLoadedMetaData() {
- player.currentTime = currentTime;
- player.off('loadedmetadata', onLoadedMetaData);
- };
- player.on('loadedmetadata', onLoadedMetaData);
-
- // Load new source
- player.media.load();
-
- // Resume playing
- if (playing) {
- player.play();
- }
-
- // Trigger change event
- utils.dispatchEvent.call(player, player.media, 'qualitychange', false, {
- quality: input
- });
- }
- });
- },
-
-
- // Cancel current network requests
- // See https://github.com/sampotts/plyr/issues/174
- cancelRequests: function cancelRequests() {
- if (!this.isHTML5) {
- return;
- }
-
- // Remove child sources
- utils.removeElement(html5.getSources());
-
- // Set blank video src attribute
- // This is to prevent a MEDIA_ERR_SRC_NOT_SUPPORTED error
- // Info: http://stackoverflow.com/questions/32231579/how-to-properly-dispose-of-an-html5-video-and-close-socket-or-connection
- this.media.setAttribute('src', this.config.blankVideo);
-
- // Load the new empty source
- // This will cancel existing requests
- // See https://github.com/sampotts/plyr/issues/174
- this.media.load();
-
- // Debugging
- this.debug.log('Cancelled network requests');
- }
-};
-
-// ==========================================================================
-
-var i18n = {
- get: function get() {
- var key = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
- var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
-
- if (utils.is.empty(key) || utils.is.empty(config)) {
- return '';
- }
-
- var string = utils.getDeep(config.i18n, key);
-
- if (utils.is.empty(string)) {
- return '';
- }
-
- var replace = {
- '{seektime}': config.seekTime,
- '{title}': config.title
- };
-
- Object.entries(replace).forEach(function (_ref) {
- var _ref2 = slicedToArray(_ref, 2),
- key = _ref2[0],
- value = _ref2[1];
-
- string = utils.replaceAll(string, key, value);
- });
-
- return string;
- }
-};
-
-// ==========================================================================
-
-// Sniff out the browser
-var browser = utils.getBrowser();
-
-var controls = {
- // Get icon URL
- getIconUrl: function getIconUrl() {
- var url = new URL(this.config.iconUrl, window.location);
- var cors = url.host !== window.location.host || browser.isIE && !window.svg4everybody;
-
- return {
- url: this.config.iconUrl,
- cors: cors
- };
- },
-
-
- // Find the UI controls and store references in custom controls
- // TODO: Allow settings menus with custom controls
- findElements: function findElements() {
- try {
- this.elements.controls = utils.getElement.call(this, this.config.selectors.controls.wrapper);
-
- // Buttons
- this.elements.buttons = {
- play: utils.getElements.call(this, this.config.selectors.buttons.play),
- pause: utils.getElement.call(this, this.config.selectors.buttons.pause),
- restart: utils.getElement.call(this, this.config.selectors.buttons.restart),
- rewind: utils.getElement.call(this, this.config.selectors.buttons.rewind),
- fastForward: utils.getElement.call(this, this.config.selectors.buttons.fastForward),
- mute: utils.getElement.call(this, this.config.selectors.buttons.mute),
- pip: utils.getElement.call(this, this.config.selectors.buttons.pip),
- airplay: utils.getElement.call(this, this.config.selectors.buttons.airplay),
- settings: utils.getElement.call(this, this.config.selectors.buttons.settings),
- captions: utils.getElement.call(this, this.config.selectors.buttons.captions),
- fullscreen: utils.getElement.call(this, this.config.selectors.buttons.fullscreen)
- };
-
- // Progress
- this.elements.progress = utils.getElement.call(this, this.config.selectors.progress);
-
- // Inputs
- this.elements.inputs = {
- seek: utils.getElement.call(this, this.config.selectors.inputs.seek),
- volume: utils.getElement.call(this, this.config.selectors.inputs.volume)
- };
-
- // Display
- this.elements.display = {
- buffer: utils.getElement.call(this, this.config.selectors.display.buffer),
- currentTime: utils.getElement.call(this, this.config.selectors.display.currentTime),
- duration: utils.getElement.call(this, this.config.selectors.display.duration)
- };
-
- // Seek tooltip
- if (utils.is.element(this.elements.progress)) {
- this.elements.display.seekTooltip = this.elements.progress.querySelector('.' + this.config.classNames.tooltip);
- }
-
- return true;
- } catch (error) {
- // Log it
- this.debug.warn('It looks like there is a problem with your custom controls HTML', error);
-
- // Restore native video controls
- this.toggleNativeControls(true);
-
- return false;
- }
- },
-
-
- // Create <svg> icon
- createIcon: function createIcon(type, attributes) {
- var namespace = 'http://www.w3.org/2000/svg';
- var iconUrl = controls.getIconUrl.call(this);
- var iconPath = (!iconUrl.cors ? iconUrl.url : '') + '#' + this.config.iconPrefix;
-
- // Create <svg>
- var icon = document.createElementNS(namespace, 'svg');
- utils.setAttributes(icon, utils.extend(attributes, {
- role: 'presentation',
- focusable: 'false'
- }));
-
- // Create the <use> to reference sprite
- var use = document.createElementNS(namespace, 'use');
- var path = iconPath + '-' + type;
-
- // Set `href` attributes
- // https://github.com/sampotts/plyr/issues/460
- // https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/xlink:href
- if ('href' in use) {
- use.setAttributeNS('http://www.w3.org/1999/xlink', 'href', path);
- } else {
- use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path);
- }
-
- // Add <use> to <svg>
- icon.appendChild(use);
-
- return icon;
- },
-
-
- // Create hidden text label
- createLabel: function createLabel(type, attr) {
- var text = i18n.get(type, this.config);
- var attributes = Object.assign({}, attr);
-
- switch (type) {
- case 'pip':
- text = 'PIP';
- break;
-
- case 'airplay':
- text = 'AirPlay';
- break;
-
- default:
- break;
- }
-
- if ('class' in attributes) {
- attributes.class += ' ' + this.config.classNames.hidden;
- } else {
- attributes.class = this.config.classNames.hidden;
- }
-
- return utils.createElement('span', attributes, text);
- },
-
-
- // Create a badge
- createBadge: function createBadge(text) {
- if (utils.is.empty(text)) {
- return null;
- }
-
- var badge = utils.createElement('span', {
- class: this.config.classNames.menu.value
- });
-
- badge.appendChild(utils.createElement('span', {
- class: this.config.classNames.menu.badge
- }, text));
-
- return badge;
- },
-
-
- // Create a <button>
- createButton: function createButton(buttonType, attr) {
- var button = utils.createElement('button');
- var attributes = Object.assign({}, attr);
- var type = utils.toCamelCase(buttonType);
-
- var toggle = false;
- var label = void 0;
- var icon = void 0;
- var labelPressed = void 0;
- var iconPressed = void 0;
-
- if (!('type' in attributes)) {
- attributes.type = 'button';
- }
-
- if ('class' in attributes) {
- if (attributes.class.includes(this.config.classNames.control)) {
- attributes.class += ' ' + this.config.classNames.control;
- }
- } else {
- attributes.class = this.config.classNames.control;
- }
-
- // Large play button
- switch (buttonType) {
- case 'play':
- toggle = true;
- label = 'play';
- labelPressed = 'pause';
- icon = 'play';
- iconPressed = 'pause';
- break;
-
- case 'mute':
- toggle = true;
- label = 'mute';
- labelPressed = 'unmute';
- icon = 'volume';
- iconPressed = 'muted';
- break;
-
- case 'captions':
- toggle = true;
- label = 'enableCaptions';
- labelPressed = 'disableCaptions';
- icon = 'captions-off';
- iconPressed = 'captions-on';
- break;
-
- case 'fullscreen':
- toggle = true;
- label = 'enterFullscreen';
- labelPressed = 'exitFullscreen';
- icon = 'enter-fullscreen';
- iconPressed = 'exit-fullscreen';
- break;
-
- case 'play-large':
- attributes.class += ' ' + this.config.classNames.control + '--overlaid';
- type = 'play';
- label = 'play';
- icon = 'play';
- break;
-
- default:
- label = type;
- icon = buttonType;
- }
-
- // Setup toggle icon and labels
- if (toggle) {
- // Icon
- button.appendChild(controls.createIcon.call(this, iconPressed, { class: 'icon--pressed' }));
- button.appendChild(controls.createIcon.call(this, icon, { class: 'icon--not-pressed' }));
-
- // Label/Tooltip
- button.appendChild(controls.createLabel.call(this, labelPressed, { class: 'label--pressed' }));
- button.appendChild(controls.createLabel.call(this, label, { class: 'label--not-pressed' }));
- } else {
- button.appendChild(controls.createIcon.call(this, icon));
- button.appendChild(controls.createLabel.call(this, label));
- }
-
- // Merge attributes
- utils.extend(attributes, utils.getAttributesFromSelector(this.config.selectors.buttons[type], attributes));
-
- utils.setAttributes(button, attributes);
-
- // We have multiple play buttons
- if (type === 'play') {
- if (!utils.is.array(this.elements.buttons[type])) {
- this.elements.buttons[type] = [];
- }
-
- this.elements.buttons[type].push(button);
- } else {
- this.elements.buttons[type] = button;
- }
-
- // Toggle classname when pressed property is set
- var className = this.config.classNames.controlPressed;
- Object.defineProperty(button, 'pressed', {
- enumerable: true,
- get: function get() {
- return utils.hasClass(button, className);
- },
- set: function set() {
- var pressed = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
-
- utils.toggleClass(button, className, pressed);
- }
- });
-
- return button;
- },
-
-
- // Create an <input type='range'>
- createRange: function createRange(type, attributes) {
- // Seek input
- var input = utils.createElement('input', utils.extend(utils.getAttributesFromSelector(this.config.selectors.inputs[type]), {
- type: 'range',
- min: 0,
- max: 100,
- step: 0.01,
- value: 0,
- autocomplete: 'off',
- // A11y fixes for https://github.com/sampotts/plyr/issues/905
- role: 'slider',
- 'aria-label': i18n.get(type, this.config),
- 'aria-valuemin': 0,
- 'aria-valuemax': 100,
- 'aria-valuenow': 0
- }, attributes));
-
- this.elements.inputs[type] = input;
-
- // Set the fill for webkit now
- controls.updateRangeFill.call(this, input);
-
- return input;
- },
-
-
- // Create a <progress>
- createProgress: function createProgress(type, attributes) {
- var progress = utils.createElement('progress', utils.extend(utils.getAttributesFromSelector(this.config.selectors.display[type]), {
- min: 0,
- max: 100,
- value: 0,
- role: 'presentation',
- 'aria-hidden': true
- }, attributes));
-
- // Create the label inside
- if (type !== 'volume') {
- progress.appendChild(utils.createElement('span', null, '0'));
-
- var suffix = '';
- switch (type) {
- case 'played':
- suffix = i18n.get('played', this.config);
- break;
-
- case 'buffer':
- suffix = i18n.get('buffered', this.config);
- break;
-
- default:
- break;
- }
-
- progress.innerText = '% ' + suffix.toLowerCase();
- }
-
- this.elements.display[type] = progress;
-
- return progress;
- },
-
-
- // Create time display
- createTime: function createTime(type) {
- var attributes = utils.getAttributesFromSelector(this.config.selectors.display[type]);
-
- var container = utils.createElement('div', utils.extend(attributes, {
- class: 'plyr__time ' + attributes.class,
- 'aria-label': i18n.get(type, this.config)
- }), '00:00');
-
- // Reference for updates
- this.elements.display[type] = container;
-
- return container;
- },
-
-
- // Create a settings menu item
- createMenuItem: function createMenuItem(_ref) {
- var value = _ref.value,
- list = _ref.list,
- type = _ref.type,
- title = _ref.title,
- _ref$badge = _ref.badge,
- badge = _ref$badge === undefined ? null : _ref$badge,
- _ref$checked = _ref.checked,
- checked = _ref$checked === undefined ? false : _ref$checked;
-
- var item = utils.createElement('li');
-
- var label = utils.createElement('label', {
- class: this.config.classNames.control
- });
-
- var radio = utils.createElement('input', utils.extend(utils.getAttributesFromSelector(this.config.selectors.inputs[type]), {
- type: 'radio',
- name: 'plyr-' + type,
- value: value,
- checked: checked,
- class: 'plyr__sr-only'
- }));
-
- var faux = utils.createElement('span', { hidden: '' });
-
- label.appendChild(radio);
- label.appendChild(faux);
- label.insertAdjacentHTML('beforeend', title);
-
- if (utils.is.element(badge)) {
- label.appendChild(badge);
- }
-
- item.appendChild(label);
- list.appendChild(item);
- },
-
-
- // Format a time for display
- formatTime: function formatTime() {
- var time = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
- var inverted = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
-
- // Bail if the value isn't a number
- if (!utils.is.number(time)) {
- return time;
- }
-
- // Always display hours if duration is over an hour
- var forceHours = utils.getHours(this.duration) > 0;
-
- return utils.formatTime(time, forceHours, inverted);
- },
-
-
- // Update the displayed time
- updateTimeDisplay: function updateTimeDisplay() {
- var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
- var time = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
- var inverted = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
-
- // Bail if there's no element to display or the value isn't a number
- if (!utils.is.element(target) || !utils.is.number(time)) {
- return;
- }
-
- // eslint-disable-next-line no-param-reassign
- target.innerText = controls.formatTime(time, inverted);
- },
-
-
- // Update volume UI and storage
- updateVolume: function updateVolume() {
- if (!this.supported.ui) {
- return;
- }
-
- // Update range
- if (utils.is.element(this.elements.inputs.volume)) {
- controls.setRange.call(this, this.elements.inputs.volume, this.muted ? 0 : this.volume);
- }
-
- // Update mute state
- if (utils.is.element(this.elements.buttons.mute)) {
- this.elements.buttons.mute.pressed = this.muted || this.volume === 0;
- }
- },
-
-
- // Update seek value and lower fill
- setRange: function setRange(target) {
- var value = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
-
- if (!utils.is.element(target)) {
- return;
- }
-
- // eslint-disable-next-line
- target.value = value;
-
- // Webkit range fill
- controls.updateRangeFill.call(this, target);
- },
-
-
- // Update <progress> elements
- updateProgress: function updateProgress(event) {
- var _this = this;
-
- if (!this.supported.ui || !utils.is.event(event)) {
- return;
- }
-
- var value = 0;
-
- var setProgress = function setProgress(target, input) {
- var value = utils.is.number(input) ? input : 0;
- var progress = utils.is.element(target) ? target : _this.elements.display.buffer;
-
- // Update value and label
- if (utils.is.element(progress)) {
- progress.value = value;
-
- // Update text label inside
- var label = progress.getElementsByTagName('span')[0];
- if (utils.is.element(label)) {
- label.childNodes[0].nodeValue = value;
- }
- }
- };
-
- if (event) {
- switch (event.type) {
- // Video playing
- case 'timeupdate':
- case 'seeking':
- case 'seeked':
- value = utils.getPercentage(this.currentTime, this.duration);
-
- // Set seek range value only if it's a 'natural' time event
- if (event.type === 'timeupdate') {
- controls.setRange.call(this, this.elements.inputs.seek, value);
- }
-
- break;
-
- // Check buffer status
- case 'playing':
- case 'progress':
- setProgress(this.elements.display.buffer, this.buffered * 100);
-
- break;
-
- default:
- break;
- }
- }
- },
-
-
- // Webkit polyfill for lower fill range
- updateRangeFill: function updateRangeFill(target) {
- // Get range from event if event passed
- var range = utils.is.event(target) ? target.target : target;
-
- // Needs to be a valid <input type='range'>
- if (!utils.is.element(range) || range.getAttribute('type') !== 'range') {
- return;
- }
-
- // Set aria values for https://github.com/sampotts/plyr/issues/905
- if (utils.matches(range, this.config.selectors.inputs.seek)) {
- range.setAttribute('aria-valuenow', this.currentTime);
- var currentTime = controls.formatTime(this.currentTime);
- var duration = controls.formatTime(this.duration);
- var format = i18n.get('seekLabel', this.config);
- range.setAttribute('aria-valuetext', format.replace('{currentTime}', currentTime).replace('{duration}', duration));
- } else if (utils.matches(range, this.config.selectors.inputs.volume)) {
- var percent = range.value * 100;
- range.setAttribute('aria-valuenow', percent);
- range.setAttribute('aria-valuetext', percent + '%');
- } else {
- range.setAttribute('aria-valuenow', range.value);
- }
-
- // WebKit only
- if (!browser.isWebkit) {
- return;
- }
-
- // Set CSS custom property
- range.style.setProperty('--value', range.value / range.max * 100 + '%');
- },
-
-
- // Update hover tooltip for seeking
- updateSeekTooltip: function updateSeekTooltip(event) {
- var _this2 = this;
-
- // Bail if setting not true
- if (!this.config.tooltips.seek || !utils.is.element(this.elements.inputs.seek) || !utils.is.element(this.elements.display.seekTooltip) || this.duration === 0) {
- return;
- }
-
- // Calculate percentage
- var percent = 0;
- var clientRect = this.elements.progress.getBoundingClientRect();
- var visible = this.config.classNames.tooltip + '--visible';
-
- var toggle = function toggle(_toggle) {
- utils.toggleClass(_this2.elements.display.seekTooltip, visible, _toggle);
- };
-
- // Hide on touch
- if (this.touch) {
- toggle(false);
- return;
- }
-
- // Determine percentage, if already visible
- if (utils.is.event(event)) {
- percent = 100 / clientRect.width * (event.pageX - clientRect.left);
- } else if (utils.hasClass(this.elements.display.seekTooltip, visible)) {
- percent = parseFloat(this.elements.display.seekTooltip.style.left, 10);
- } else {
- return;
- }
-
- // Set bounds
- if (percent < 0) {
- percent = 0;
- } else if (percent > 100) {
- percent = 100;
- }
-
- // Display the time a click would seek to
- controls.updateTimeDisplay.call(this, this.elements.display.seekTooltip, this.duration / 100 * percent);
-
- // Set position
- this.elements.display.seekTooltip.style.left = percent + '%';
-
- // Show/hide the tooltip
- // If the event is a moues in/out and percentage is inside bounds
- if (utils.is.event(event) && ['mouseenter', 'mouseleave'].includes(event.type)) {
- toggle(event.type === 'mouseenter');
- }
- },
-
-
- // Handle time change event
- timeUpdate: function timeUpdate(event) {
- // Only invert if only one time element is displayed and used for both duration and currentTime
- var invert = !utils.is.element(this.elements.display.duration) && this.config.invertTime;
-
- // Duration
- controls.updateTimeDisplay.call(this, this.elements.display.currentTime, invert ? this.duration - this.currentTime : this.currentTime, invert);
-
- // Ignore updates while seeking
- if (event && event.type === 'timeupdate' && this.media.seeking) {
- return;
- }
-
- // Playing progress
- controls.updateProgress.call(this, event);
- },
-
-
- // Show the duration on metadataloaded or durationchange events
- durationUpdate: function durationUpdate() {
- // Bail if no UI or durationchange event triggered after playing/seek when invertTime is false
- if (!this.supported.ui || !this.config.invertTime && this.currentTime) {
- return;
- }
-
- // Update ARIA values
- if (utils.is.element(this.elements.inputs.seek)) {
- this.elements.inputs.seek.setAttribute('aria-valuemax', this.duration);
- }
-
- // If there's a spot to display duration
- var hasDuration = utils.is.element(this.elements.display.duration);
-
- // If there's only one time display, display duration there
- if (!hasDuration && this.config.displayDuration && this.paused) {
- controls.updateTimeDisplay.call(this, this.elements.display.currentTime, this.duration);
- }
-
- // If there's a duration element, update content
- if (hasDuration) {
- controls.updateTimeDisplay.call(this, this.elements.display.duration, this.duration);
- }
-
- // Update the tooltip (if visible)
- controls.updateSeekTooltip.call(this);
- },
-
-
- // Hide/show a tab
- toggleTab: function toggleTab(setting, toggle) {
- utils.toggleHidden(this.elements.settings.tabs[setting], !toggle);
- },
-
-
- // Set the quality menu
- // TODO: Vimeo support
- setQualityMenu: function setQualityMenu(options) {
- var _this3 = this;
-
- // Menu required
- if (!utils.is.element(this.elements.settings.panes.quality)) {
- return;
- }
-
- var type = 'quality';
- var list = this.elements.settings.panes.quality.querySelector('ul');
-
- // Set options if passed and filter based on config
- if (utils.is.array(options)) {
- this.options.quality = options.filter(function (quality) {
- return _this3.config.quality.options.includes(quality);
- });
- }
-
- // Toggle the pane and tab
- var toggle = !utils.is.empty(this.options.quality) && this.options.quality.length > 1;
- controls.toggleTab.call(this, type, toggle);
-
- // Check if we need to toggle the parent
- controls.checkMenu.call(this);
-
- // If we're hiding, nothing more to do
- if (!toggle) {
- return;
- }
-
- // Empty the menu
- utils.emptyElement(list);
-
- // Get the badge HTML for HD, 4K etc
- var getBadge = function getBadge(quality) {
- var label = i18n.get('qualityBadge.' + quality, _this3.config);
-
- if (!label.length) {
- return null;
- }
-
- return controls.createBadge.call(_this3, label);
- };
-
- // Sort options by the config and then render options
- this.options.quality.sort(function (a, b) {
- var sorting = _this3.config.quality.options;
- return sorting.indexOf(a) > sorting.indexOf(b) ? 1 : -1;
- }).forEach(function (quality) {
- controls.createMenuItem.call(_this3, {
- value: quality,
- list: list,
- type: type,
- title: controls.getLabel.call(_this3, 'quality', quality),
- badge: getBadge(quality)
- });
- });
-
- controls.updateSetting.call(this, type, list);
- },
-
-
- // Translate a value into a nice label
- getLabel: function getLabel(setting, value) {
- switch (setting) {
- case 'speed':
- return value === 1 ? i18n.get('normal', this.config) : value + '&times;';
-
- case 'quality':
- if (utils.is.number(value)) {
- var label = i18n.get('qualityLabel.' + value, this.config);
-
- if (!label.length) {
- return value + 'p';
- }
-
- return label;
- }
-
- return utils.toTitleCase(value);
-
- case 'captions':
- return captions.getLabel.call(this);
-
- default:
- return null;
- }
- },
-
-
- // Update the selected setting
- updateSetting: function updateSetting(setting, container, input) {
- var pane = this.elements.settings.panes[setting];
- var value = null;
- var list = container;
-
- switch (setting) {
- case 'captions':
- value = this.currentTrack;
- break;
-
- default:
- value = !utils.is.empty(input) ? input : this[setting];
-
- // Get default
- if (utils.is.empty(value)) {
- value = this.config[setting].default;
- }
-
- // Unsupported value
- if (!utils.is.empty(this.options[setting]) && !this.options[setting].includes(value)) {
- this.debug.warn('Unsupported value of \'' + value + '\' for ' + setting);
- return;
- }
-
- // Disabled value
- if (!this.config[setting].options.includes(value)) {
- this.debug.warn('Disabled value of \'' + value + '\' for ' + setting);
- return;
- }
-
- break;
- }
-
- // Get the list if we need to
- if (!utils.is.element(list)) {
- list = pane && pane.querySelector('ul');
- }
-
- // If there's no list it means it's not been rendered...
- if (!utils.is.element(list)) {
- return;
- }
-
- // Update the label
- var label = this.elements.settings.tabs[setting].querySelector('.' + this.config.classNames.menu.value);
- label.innerHTML = controls.getLabel.call(this, setting, value);
-
- // Find the radio option and check it
- var target = list && list.querySelector('input[value="' + value + '"]');
-
- if (utils.is.element(target)) {
- target.checked = true;
- }
- },
-
-
- // Set the looping options
- /* setLoopMenu() {
- // Menu required
- if (!utils.is.element(this.elements.settings.panes.loop)) {
- return;
- }
- const options = ['start', 'end', 'all', 'reset'];
- const list = this.elements.settings.panes.loop.querySelector('ul');
- // Show the pane and tab
- utils.toggleHidden(this.elements.settings.tabs.loop, false);
- utils.toggleHidden(this.elements.settings.panes.loop, false);
- // Toggle the pane and tab
- const toggle = !utils.is.empty(this.loop.options);
- controls.toggleTab.call(this, 'loop', toggle);
- // Empty the menu
- utils.emptyElement(list);
- options.forEach(option => {
- const item = utils.createElement('li');
- const button = utils.createElement(
- 'button',
- utils.extend(utils.getAttributesFromSelector(this.config.selectors.buttons.loop), {
- type: 'button',
- class: this.config.classNames.control,
- 'data-plyr-loop-action': option,
- }),
- i18n.get(option, this.config)
- );
- if (['start', 'end'].includes(option)) {
- const badge = controls.createBadge.call(this, '00:00');
- button.appendChild(badge);
- }
- item.appendChild(button);
- list.appendChild(item);
- });
- }, */
-
- // Get current selected caption language
- // TODO: rework this to user the getter in the API?
-
- // Set a list of available captions languages
- setCaptionsMenu: function setCaptionsMenu() {
- var _this4 = this;
-
- // TODO: Captions or language? Currently it's mixed
- var type = 'captions';
- var list = this.elements.settings.panes.captions.querySelector('ul');
- var tracks = captions.getTracks.call(this);
-
- // Toggle the pane and tab
- controls.toggleTab.call(this, type, tracks.length);
-
- // Empty the menu
- utils.emptyElement(list);
-
- // Check if we need to toggle the parent
- controls.checkMenu.call(this);
-
- // If there's no captions, bail
- if (!tracks.length) {
- return;
- }
-
- // Generate options data
- var options = tracks.map(function (track, value) {
- return {
- value: value,
- checked: _this4.captions.active && _this4.currentTrack === value,
- title: captions.getLabel.call(_this4, track),
- badge: track.language && controls.createBadge.call(_this4, track.language.toUpperCase()),
- list: list,
- type: 'language'
- };
- });
-
- // Add the "Disabled" option to turn off captions
- options.unshift({
- value: -1,
- checked: !this.captions.active,
- title: i18n.get('disabled', this.config),
- list: list,
- type: 'language'
- });
-
- // Generate options
- options.forEach(controls.createMenuItem.bind(this));
-
- controls.updateSetting.call(this, type, list);
- },
-
-
- // Set a list of available captions languages
- setSpeedMenu: function setSpeedMenu(options) {
- var _this5 = this;
-
- // Do nothing if not selected
- if (!this.config.controls.includes('settings') || !this.config.settings.includes('speed')) {
- return;
- }
-
- // Menu required
- if (!utils.is.element(this.elements.settings.panes.speed)) {
- return;
- }
-
- var type = 'speed';
-
- // Set the speed options
- if (utils.is.array(options)) {
- this.options.speed = options;
- } else if (this.isHTML5 || this.isVimeo) {
- this.options.speed = [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2];
- }
-
- // Set options if passed and filter based on config
- this.options.speed = this.options.speed.filter(function (speed) {
- return _this5.config.speed.options.includes(speed);
- });
-
- // Toggle the pane and tab
- var toggle = !utils.is.empty(this.options.speed) && this.options.speed.length > 1;
- controls.toggleTab.call(this, type, toggle);
-
- // Check if we need to toggle the parent
- controls.checkMenu.call(this);
-
- // If we're hiding, nothing more to do
- if (!toggle) {
- return;
- }
-
- // Get the list to populate
- var list = this.elements.settings.panes.speed.querySelector('ul');
-
- // Empty the menu
- utils.emptyElement(list);
-
- // Create items
- this.options.speed.forEach(function (speed) {
- controls.createMenuItem.call(_this5, {
- value: speed,
- list: list,
- type: type,
- title: controls.getLabel.call(_this5, 'speed', speed)
- });
- });
-
- controls.updateSetting.call(this, type, list);
- },
-
-
- // Check if we need to hide/show the settings menu
- checkMenu: function checkMenu() {
- var tabs = this.elements.settings.tabs;
-
- var visible = !utils.is.empty(tabs) && Object.values(tabs).some(function (tab) {
- return !tab.hidden;
- });
-
- utils.toggleHidden(this.elements.settings.menu, !visible);
- },
-
-
- // Show/hide menu
- toggleMenu: function toggleMenu(event) {
- var form = this.elements.settings.form;
-
- var button = this.elements.buttons.settings;
-
- // Menu and button are required
- if (!utils.is.element(form) || !utils.is.element(button)) {
- return;
- }
-
- var show = utils.is.boolean(event) ? event : utils.is.element(form) && form.hasAttribute('hidden');
-
- if (utils.is.event(event)) {
- var isMenuItem = utils.is.element(form) && form.contains(event.target);
- var isButton = event.target === this.elements.buttons.settings;
-
- // If the click was inside the form or if the click
- // wasn't the button or menu item and we're trying to
- // show the menu (a doc click shouldn't show the menu)
- if (isMenuItem || !isMenuItem && !isButton && show) {
- return;
- }
-
- // Prevent the toggle being caught by the doc listener
- if (isButton) {
- event.stopPropagation();
- }
- }
-
- // Set form and button attributes
- if (utils.is.element(button)) {
- button.setAttribute('aria-expanded', show);
- }
-
- if (utils.is.element(form)) {
- utils.toggleHidden(form, !show);
- utils.toggleClass(this.elements.container, this.config.classNames.menu.open, show);
-
- if (show) {
- form.removeAttribute('tabindex');
- } else {
- form.setAttribute('tabindex', -1);
- }
- }
- },
-
-
- // Get the natural size of a tab
- getTabSize: function getTabSize(tab) {
- var clone = tab.cloneNode(true);
- clone.style.position = 'absolute';
- clone.style.opacity = 0;
- clone.removeAttribute('hidden');
-
- // Prevent input's being unchecked due to the name being identical
- Array.from(clone.querySelectorAll('input[name]')).forEach(function (input) {
- var name = input.getAttribute('name');
- input.setAttribute('name', name + '-clone');
- });
-
- // Append to parent so we get the "real" size
- tab.parentNode.appendChild(clone);
-
- // Get the sizes before we remove
- var width = clone.scrollWidth;
- var height = clone.scrollHeight;
-
- // Remove from the DOM
- utils.removeElement(clone);
-
- return {
- width: width,
- height: height
- };
- },
-
-
- // Toggle Menu
- showTab: function showTab() {
- var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
- var menu = this.elements.settings.menu;
-
- var pane = document.getElementById(target);
-
- // Nothing to show, bail
- if (!utils.is.element(pane)) {
- return;
- }
-
- // Are we targetting a tab? If not, bail
- var isTab = pane.getAttribute('role') === 'tabpanel';
- if (!isTab) {
- return;
- }
-
- // Hide all other tabs
- // Get other tabs
- var current = menu.querySelector('[role="tabpanel"]:not([hidden])');
- var container = current.parentNode;
-
- // Set other toggles to be expanded false
- Array.from(menu.querySelectorAll('[aria-controls="' + current.getAttribute('id') + '"]')).forEach(function (toggle) {
- toggle.setAttribute('aria-expanded', false);
- });
-
- // If we can do fancy animations, we'll animate the height/width
- if (support.transitions && !support.reducedMotion) {
- // Set the current width as a base
- container.style.width = current.scrollWidth + 'px';
- container.style.height = current.scrollHeight + 'px';
-
- // Get potential sizes
- var size = controls.getTabSize.call(this, pane);
-
- // Restore auto height/width
- var restore = function restore(e) {
- // We're only bothered about height and width on the container
- if (e.target !== container || !['width', 'height'].includes(e.propertyName)) {
- return;
- }
-
- // Revert back to auto
- container.style.width = '';
- container.style.height = '';
-
- // Only listen once
- utils.off(container, utils.transitionEndEvent, restore);
- };
-
- // Listen for the transition finishing and restore auto height/width
- utils.on(container, utils.transitionEndEvent, restore);
-
- // Set dimensions to target
- container.style.width = size.width + 'px';
- container.style.height = size.height + 'px';
- }
-
- // Set attributes on current tab
- utils.toggleHidden(current, true);
- current.setAttribute('tabindex', -1);
-
- // Set attributes on target
- utils.toggleHidden(pane, false);
-
- var tabs = utils.getElements.call(this, '[aria-controls="' + target + '"]');
- Array.from(tabs).forEach(function (tab) {
- tab.setAttribute('aria-expanded', true);
- });
- pane.removeAttribute('tabindex');
-
- // Focus the first item
- pane.querySelectorAll('button:not(:disabled), input:not(:disabled), [tabindex]')[0].focus();
- },
-
-
- // Build the default HTML
- // TODO: Set order based on order in the config.controls array?
- create: function create(data) {
- var _this6 = this;
-
- // Do nothing if we want no controls
- if (utils.is.empty(this.config.controls)) {
- return null;
- }
-
- // Create the container
- var container = utils.createElement('div', utils.getAttributesFromSelector(this.config.selectors.controls.wrapper));
-
- // Restart button
- if (this.config.controls.includes('restart')) {
- container.appendChild(controls.createButton.call(this, 'restart'));
- }
-
- // Rewind button
- if (this.config.controls.includes('rewind')) {
- container.appendChild(controls.createButton.call(this, 'rewind'));
- }
-
- // Play/Pause button
- if (this.config.controls.includes('play')) {
- container.appendChild(controls.createButton.call(this, 'play'));
- }
-
- // Fast forward button
- if (this.config.controls.includes('fast-forward')) {
- container.appendChild(controls.createButton.call(this, 'fast-forward'));
- }
-
- // Progress
- if (this.config.controls.includes('progress')) {
- var progress = utils.createElement('div', utils.getAttributesFromSelector(this.config.selectors.progress));
-
- // Seek range slider
- progress.appendChild(controls.createRange.call(this, 'seek', {
- id: 'plyr-seek-' + data.id
- }));
-
- // Buffer progress
- progress.appendChild(controls.createProgress.call(this, 'buffer'));
-
- // TODO: Add loop display indicator
-
- // Seek tooltip
- if (this.config.tooltips.seek) {
- var tooltip = utils.createElement('span', {
- class: this.config.classNames.tooltip
- }, '00:00');
-
- progress.appendChild(tooltip);
- this.elements.display.seekTooltip = tooltip;
- }
-
- this.elements.progress = progress;
- container.appendChild(this.elements.progress);
- }
-
- // Media current time display
- if (this.config.controls.includes('current-time')) {
- container.appendChild(controls.createTime.call(this, 'currentTime'));
- }
-
- // Media duration display
- if (this.config.controls.includes('duration')) {
- container.appendChild(controls.createTime.call(this, 'duration'));
- }
-
- // Toggle mute button
- if (this.config.controls.includes('mute')) {
- container.appendChild(controls.createButton.call(this, 'mute'));
- }
-
- // Volume range control
- if (this.config.controls.includes('volume')) {
- var volume = utils.createElement('div', {
- class: 'plyr__volume'
- });
-
- // Set the attributes
- var attributes = {
- max: 1,
- step: 0.05,
- value: this.config.volume
- };
-
- // Create the volume range slider
- volume.appendChild(controls.createRange.call(this, 'volume', utils.extend(attributes, {
- id: 'plyr-volume-' + data.id
- })));
-
- this.elements.volume = volume;
-
- container.appendChild(volume);
- }
-
- // Toggle captions button
- if (this.config.controls.includes('captions')) {
- container.appendChild(controls.createButton.call(this, 'captions'));
- }
-
- // Settings button / menu
- if (this.config.controls.includes('settings') && !utils.is.empty(this.config.settings)) {
- var menu = utils.createElement('div', {
- class: 'plyr__menu',
- hidden: ''
- });
-
- menu.appendChild(controls.createButton.call(this, 'settings', {
- id: 'plyr-settings-toggle-' + data.id,
- 'aria-haspopup': true,
- 'aria-controls': 'plyr-settings-' + data.id,
- 'aria-expanded': false
- }));
-
- var form = utils.createElement('form', {
- class: 'plyr__menu__container',
- id: 'plyr-settings-' + data.id,
- hidden: '',
- 'aria-labelled-by': 'plyr-settings-toggle-' + data.id,
- role: 'tablist',
- tabindex: -1
- });
-
- var inner = utils.createElement('div');
-
- var home = utils.createElement('div', {
- id: 'plyr-settings-' + data.id + '-home',
- 'aria-labelled-by': 'plyr-settings-toggle-' + data.id,
- role: 'tabpanel'
- });
-
- // Create the tab list
- var tabs = utils.createElement('ul', {
- role: 'tablist'
- });
-
- // Build the tabs
- this.config.settings.forEach(function (type) {
- var tab = utils.createElement('li', {
- role: 'tab',
- hidden: ''
- });
-
- var button = utils.createElement('button', utils.extend(utils.getAttributesFromSelector(_this6.config.selectors.buttons.settings), {
- type: 'button',
- class: _this6.config.classNames.control + ' ' + _this6.config.classNames.control + '--forward',
- id: 'plyr-settings-' + data.id + '-' + type + '-tab',
- 'aria-haspopup': true,
- 'aria-controls': 'plyr-settings-' + data.id + '-' + type,
- 'aria-expanded': false
- }), i18n.get(type, _this6.config));
-
- var value = utils.createElement('span', {
- class: _this6.config.classNames.menu.value
- });
-
- // Speed contains HTML entities
- value.innerHTML = data[type];
-
- button.appendChild(value);
- tab.appendChild(button);
- tabs.appendChild(tab);
-
- _this6.elements.settings.tabs[type] = tab;
- });
-
- home.appendChild(tabs);
- inner.appendChild(home);
-
- // Build the panes
- this.config.settings.forEach(function (type) {
- var pane = utils.createElement('div', {
- id: 'plyr-settings-' + data.id + '-' + type,
- hidden: '',
- 'aria-labelled-by': 'plyr-settings-' + data.id + '-' + type + '-tab',
- role: 'tabpanel',
- tabindex: -1
- });
-
- var back = utils.createElement('button', {
- type: 'button',
- class: _this6.config.classNames.control + ' ' + _this6.config.classNames.control + '--back',
- 'aria-haspopup': true,
- 'aria-controls': 'plyr-settings-' + data.id + '-home',
- 'aria-expanded': false
- }, i18n.get(type, _this6.config));
-
- pane.appendChild(back);
-
- var options = utils.createElement('ul');
-
- pane.appendChild(options);
- inner.appendChild(pane);
-
- _this6.elements.settings.panes[type] = pane;
- });
-
- form.appendChild(inner);
- menu.appendChild(form);
- container.appendChild(menu);
-
- this.elements.settings.form = form;
- this.elements.settings.menu = menu;
- }
-
- // Picture in picture button
- if (this.config.controls.includes('pip') && support.pip) {
- container.appendChild(controls.createButton.call(this, 'pip'));
- }
-
- // Airplay button
- if (this.config.controls.includes('airplay') && support.airplay) {
- container.appendChild(controls.createButton.call(this, 'airplay'));
- }
-
- // Toggle fullscreen button
- if (this.config.controls.includes('fullscreen')) {
- container.appendChild(controls.createButton.call(this, 'fullscreen'));
- }
-
- // Larger overlaid play button
- if (this.config.controls.includes('play-large')) {
- this.elements.container.appendChild(controls.createButton.call(this, 'play-large'));
- }
-
- this.elements.controls = container;
-
- if (this.isHTML5) {
- controls.setQualityMenu.call(this, html5.getQualityOptions.call(this));
- }
-
- controls.setSpeedMenu.call(this);
-
- return container;
- },
-
-
- // Insert controls
- inject: function inject() {
- var _this7 = this;
-
- // Sprite
- if (this.config.loadSprite) {
- var icon = controls.getIconUrl.call(this);
-
- // Only load external sprite using AJAX
- if (icon.cors) {
- utils.loadSprite(icon.url, 'sprite-plyr');
- }
- }
-
- // Create a unique ID
- this.id = Math.floor(Math.random() * 10000);
-
- // Null by default
- var container = null;
- this.elements.controls = null;
-
- // Set template properties
- var props = {
- id: this.id,
- seektime: this.config.seekTime,
- title: this.config.title
- };
- var update = true;
-
- if (utils.is.string(this.config.controls) || utils.is.element(this.config.controls)) {
- // String or HTMLElement passed as the option
- container = this.config.controls;
- } else if (utils.is.function(this.config.controls)) {
- // A custom function to build controls
- // The function can return a HTMLElement or String
- container = this.config.controls.call(this, props);
- } else {
- // Create controls
- container = controls.create.call(this, {
- id: this.id,
- seektime: this.config.seekTime,
- speed: this.speed,
- quality: this.quality,
- captions: captions.getLabel.call(this)
- // TODO: Looping
- // loop: 'None',
- });
- update = false;
- }
-
- // Replace props with their value
- var replace = function replace(input) {
- var result = input;
-
- Object.entries(props).forEach(function (_ref2) {
- var _ref3 = slicedToArray(_ref2, 2),
- key = _ref3[0],
- value = _ref3[1];
-
- result = utils.replaceAll(result, '{' + key + '}', value);
- });
-
- return result;
- };
-
- // Update markup
- if (update) {
- if (utils.is.string(this.config.controls)) {
- container = replace(container);
- } else if (utils.is.element(container)) {
- container.innerHTML = replace(container.innerHTML);
- }
- }
-
- // Controls container
- var target = void 0;
-
- // Inject to custom location
- if (utils.is.string(this.config.selectors.controls.container)) {
- target = document.querySelector(this.config.selectors.controls.container);
- }
-
- // Inject into the container by default
- if (!utils.is.element(target)) {
- target = this.elements.container;
- }
-
- // Inject controls HTML
- if (utils.is.element(container)) {
- target.appendChild(container);
- } else if (container) {
- target.insertAdjacentHTML('beforeend', container);
- }
-
- // Find the elements if need be
- if (!utils.is.element(this.elements.controls)) {
- controls.findElements.call(this);
- }
-
- // Edge sometimes doesn't finish the paint so force a redraw
- if (window.navigator.userAgent.includes('Edge')) {
- utils.repaint(target);
- }
-
- // Setup tooltips
- if (this.config.tooltips.controls) {
- var labels = utils.getElements.call(this, [this.config.selectors.controls.wrapper, ' ', this.config.selectors.labels, ' .', this.config.classNames.hidden].join(''));
-
- Array.from(labels).forEach(function (label) {
- utils.toggleClass(label, _this7.config.classNames.hidden, false);
- utils.toggleClass(label, _this7.config.classNames.tooltip, true);
- });
- }
- }
-};
-
-// ==========================================================================
-
-var captions = {
- // Setup captions
- setup: function setup() {
- // Requires UI support
- if (!this.supported.ui) {
- return;
- }
-
- // Only Vimeo and HTML5 video supported at this point
- if (!this.isVideo || this.isYouTube || this.isHTML5 && !support.textTracks) {
- // Clear menu and hide
- if (utils.is.array(this.config.controls) && this.config.controls.includes('settings') && this.config.settings.includes('captions')) {
- controls.setCaptionsMenu.call(this);
- }
-
- return;
- }
-
- // Inject the container
- if (!utils.is.element(this.elements.captions)) {
- this.elements.captions = utils.createElement('div', utils.getAttributesFromSelector(this.config.selectors.captions));
-
- utils.insertAfter(this.elements.captions, this.elements.wrapper);
- }
-
- // Get browser info
- var browser = utils.getBrowser();
-
- // Fix IE captions if CORS is used
- // Fetch captions and inject as blobs instead (data URIs not supported!)
- if (browser.isIE && window.URL) {
- var elements = this.media.querySelectorAll('track');
-
- Array.from(elements).forEach(function (track) {
- var src = track.getAttribute('src');
- var href = utils.parseUrl(src);
-
- if (href.hostname !== window.location.href.hostname && ['http:', 'https:'].includes(href.protocol)) {
- utils.fetch(src, 'blob').then(function (blob) {
- track.setAttribute('src', window.URL.createObjectURL(blob));
- }).catch(function () {
- utils.removeElement(track);
- });
- }
- });
- }
-
- // Try to load the value from storage
- var active = this.storage.get('captions');
-
- // Otherwise fall back to the default config
- if (!utils.is.boolean(active)) {
- active = this.config.captions.active;
- }
-
- // Get language from storage, fallback to config
- var language = this.storage.get('language') || this.config.captions.language;
- if (language === 'auto') {
- var _split = (navigator.language || navigator.userLanguage).split('-');
-
- var _split2 = slicedToArray(_split, 1);
-
- language = _split2[0];
- }
- // Set language and show if active
- captions.setLanguage.call(this, language, active);
-
- // Watch changes to textTracks and update captions menu
- if (this.isHTML5) {
- var trackEvents = this.config.captions.update ? 'addtrack removetrack' : 'removetrack';
- utils.on(this.media.textTracks, trackEvents, captions.update.bind(this));
- }
-
- // Update available languages in list next tick (the event must not be triggered before the listeners)
- setTimeout(captions.update.bind(this), 0);
- },
- update: function update() {
- var _this = this;
-
- var tracks = captions.getTracks.call(this, true);
- // Get the wanted language
- var _captions = this.captions,
- language = _captions.language,
- meta = _captions.meta;
-
- // Handle tracks (add event listener and "pseudo"-default)
-
- if (this.isHTML5 && this.isVideo) {
- tracks.filter(function (track) {
- return !meta.get(track);
- }).forEach(function (track) {
- _this.debug.log('Track added', track);
- // Attempt to store if the original dom element was "default"
- meta.set(track, {
- default: track.mode === 'showing'
- });
-
- // Turn off native caption rendering to avoid double captions
- track.mode = 'hidden';
-
- // Add event listener for cue changes
- utils.on(track, 'cuechange', function () {
- return captions.updateCues.call(_this);
- });
- });
- }
-
- var trackRemoved = !tracks.find(function (track) {
- return track === _this.captions.currentTrackNode;
- });
- var firstMatch = this.language !== language && tracks.find(function (track) {
- return track.language === language;
- });
-
- // Update language if removed or first matching track added
- if (trackRemoved || firstMatch) {
- captions.setLanguage.call(this, language, this.config.captions.active);
- }
-
- // Enable or disable captions based on track length
- utils.toggleClass(this.elements.container, this.config.classNames.captions.enabled, !utils.is.empty(tracks));
-
- // Update available languages in list
- if ((this.config.controls || []).includes('settings') && this.config.settings.includes('captions')) {
- controls.setCaptionsMenu.call(this);
- }
- },
- set: function set(index) {
- var setLanguage = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
- var show = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
-
- var tracks = captions.getTracks.call(this);
-
- // Disable captions if setting to -1
- if (index === -1) {
- this.toggleCaptions(false);
- return;
- }
-
- if (!utils.is.number(index)) {
- this.debug.warn('Invalid caption argument', index);
- return;
- }
-
- if (!(index in tracks)) {
- this.debug.warn('Track not found', index);
- return;
- }
-
- if (this.captions.currentTrack !== index) {
- this.captions.currentTrack = index;
- var track = captions.getCurrentTrack.call(this);
-
- var _ref = track || {},
- language = _ref.language;
-
- // Store reference to node for invalidation on remove
-
-
- this.captions.currentTrackNode = track;
-
- // Prevent setting language in some cases, since it can violate user's intentions
- if (setLanguage) {
- this.captions.language = language;
- }
-
- // Handle Vimeo captions
- if (this.isVimeo) {
- this.embed.enableTextTrack(language);
- }
-
- // Trigger event
- utils.dispatchEvent.call(this, this.media, 'languagechange');
- }
-
- if (this.isHTML5 && this.isVideo) {
- // If we change the active track while a cue is already displayed we need to update it
- captions.updateCues.call(this);
- }
-
- // Show captions
- if (show) {
- this.toggleCaptions(true);
- }
- },
- setLanguage: function setLanguage(language) {
- var show = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
-
- if (!utils.is.string(language)) {
- this.debug.warn('Invalid language argument', language);
- return;
- }
- // Normalize
- this.captions.language = language.toLowerCase();
-
- // Set currentTrack
- var tracks = captions.getTracks.call(this);
- var track = captions.getCurrentTrack.call(this, true);
- captions.set.call(this, tracks.indexOf(track), false, show);
- },
-
-
- // Get current valid caption tracks
- // If update is false it will also ignore tracks without metadata
- // This is used to "freeze" the language options when captions.update is false
- getTracks: function getTracks() {
- var _this2 = this;
-
- var update = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
-
- // Handle media or textTracks missing or null
- var tracks = Array.from((this.media || {}).textTracks || []);
- // For HTML5, use cache instead of current tracks when it exists (if captions.update is false)
- // Filter out removed tracks and tracks that aren't captions/subtitles (for example metadata)
- return tracks.filter(function (track) {
- return !_this2.isHTML5 || update || _this2.captions.meta.has(track);
- }).filter(function (track) {
- return ['captions', 'subtitles'].includes(track.kind);
- });
- },
-
-
- // Get the current track for the current language
- getCurrentTrack: function getCurrentTrack() {
- var _this3 = this;
-
- var fromLanguage = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
-
- var tracks = captions.getTracks.call(this);
- var sortIsDefault = function sortIsDefault(track) {
- return Number((_this3.captions.meta.get(track) || {}).default);
- };
- var sorted = Array.from(tracks).sort(function (a, b) {
- return sortIsDefault(b) - sortIsDefault(a);
- });
- return !fromLanguage && tracks[this.currentTrack] || sorted.find(function (track) {
- return track.language === _this3.captions.language;
- }) || sorted[0];
- },
-
-
- // Get UI label for track
- getLabel: function getLabel(track) {
- var currentTrack = track;
-
- if (!utils.is.track(currentTrack) && support.textTracks && this.captions.active) {
- currentTrack = captions.getCurrentTrack.call(this);
- }
-
- if (utils.is.track(currentTrack)) {
- if (!utils.is.empty(currentTrack.label)) {
- return currentTrack.label;
- }
-
- if (!utils.is.empty(currentTrack.language)) {
- return track.language.toUpperCase();
- }
-
- return i18n.get('enabled', this.config);
- }
-
- return i18n.get('disabled', this.config);
- },
-
-
- // Update captions using current track's active cues
- // Also optional array argument in case there isn't any track (ex: vimeo)
- updateCues: function updateCues(input) {
- // Requires UI
- if (!this.supported.ui) {
- return;
- }
-
- if (!utils.is.element(this.elements.captions)) {
- this.debug.warn('No captions element to render to');
- return;
- }
-
- // Only accept array or empty input
- if (!utils.is.nullOrUndefined(input) && !Array.isArray(input)) {
- this.debug.warn('updateCues: Invalid input', input);
- return;
- }
-
- var cues = input;
-
- // Get cues from track
- if (!cues) {
- var track = captions.getCurrentTrack.call(this);
- cues = Array.from((track || {}).activeCues || []).map(function (cue) {
- return cue.getCueAsHTML();
- }).map(utils.getHTML);
- }
-
- // Set new caption text
- var content = cues.map(function (cueText) {
- return cueText.trim();
- }).join('\n');
- var changed = content !== this.elements.captions.innerHTML;
-
- if (changed) {
- // Empty the container and create a new child element
- utils.emptyElement(this.elements.captions);
- var caption = utils.createElement('span', utils.getAttributesFromSelector(this.config.selectors.caption));
- caption.innerHTML = content;
- this.elements.captions.appendChild(caption);
-
- // Trigger event
- utils.dispatchEvent.call(this, this.media, 'cuechange');
- }
- }
-};
-
-// ==========================================================================
-// Console wrapper
-// ==========================================================================
-
-var noop = function noop() {};
-
-var Console = function () {
- function Console() {
- var enabled = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
- classCallCheck(this, Console);
-
- this.enabled = window.console && enabled;
-
- if (this.enabled) {
- this.log('Debugging enabled');
- }
- }
-
- createClass(Console, [{
- key: 'log',
- get: function get() {
- // eslint-disable-next-line no-console
- return this.enabled ? Function.prototype.bind.call(console.log, console) : noop;
- }
- }, {
- key: 'warn',
- get: function get() {
- // eslint-disable-next-line no-console
- return this.enabled ? Function.prototype.bind.call(console.warn, console) : noop;
- }
- }, {
- key: 'error',
- get: function get() {
- // eslint-disable-next-line no-console
- return this.enabled ? Function.prototype.bind.call(console.error, console) : noop;
- }
- }]);
- return Console;
-}();
-
-// ==========================================================================
-// Plyr default config
-// ==========================================================================
-
-var defaults$1 = {
- // Disable
- enabled: true,
-
- // Custom media title
- title: '',
-
- // Logging to console
- debug: false,
-
- // Auto play (if supported)
- autoplay: false,
-
- // Only allow one media playing at once (vimeo only)
- autopause: true,
-
- // Allow inline playback on iOS (this effects YouTube/Vimeo - HTML5 requires the attribute present)
- // TODO: Remove iosNative fullscreen option in favour of this (logic needs work)
- playsinline: true,
-
- // Default time to skip when rewind/fast forward
- seekTime: 10,
-
- // Default volume
- volume: 1,
- muted: false,
-
- // Pass a custom duration
- duration: null,
-
- // Display the media duration on load in the current time position
- // If you have opted to display both duration and currentTime, this is ignored
- displayDuration: true,
-
- // Invert the current time to be a countdown
- invertTime: true,
-
- // Clicking the currentTime inverts it's value to show time left rather than elapsed
- toggleInvert: true,
-
- // Aspect ratio (for embeds)
- ratio: '16:9',
-
- // Click video container to play/pause
- clickToPlay: true,
-
- // Auto hide the controls
- hideControls: true,
-
- // Reset to start when playback ended
- resetOnEnd: false,
-
- // Disable the standard context menu
- disableContextMenu: true,
-
- // Sprite (for icons)
- loadSprite: true,
- iconPrefix: 'plyr',
- iconUrl: 'https://cdn.plyr.io/3.3.12/plyr.svg',
-
- // Blank video (used to prevent errors on source change)
- blankVideo: 'https://cdn.plyr.io/static/blank.mp4',
-
- // Quality default
- quality: {
- default: 576,
- options: [4320, 2880, 2160, 1440, 1080, 720, 576, 480, 360, 240, 'default']
- },
-
- // Set loops
- loop: {
- active: false
- // start: null,
- // end: null,
- },
-
- // Speed default and options to display
- speed: {
- selected: 1,
- options: [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2]
- },
-
- // Keyboard shortcut settings
- keyboard: {
- focused: true,
- global: false
- },
-
- // Display tooltips
- tooltips: {
- controls: false,
- seek: true
- },
-
- // Captions settings
- captions: {
- active: false,
- language: 'auto',
- // Listen to new tracks added after Plyr is initialized.
- // This is needed for streaming captions, but may result in unselectable options
- update: false
- },
-
- // Fullscreen settings
- fullscreen: {
- enabled: true, // Allow fullscreen?
- fallback: true, // Fallback for vintage browsers
- iosNative: false // Use the native fullscreen in iOS (disables custom controls)
- },
-
- // Local storage
- storage: {
- enabled: true,
- key: 'plyr'
- },
-
- // Default controls
- controls: ['play-large',
- // 'restart',
- // 'rewind',
- 'play',
- // 'fast-forward',
- 'progress', 'current-time', 'mute', 'volume', 'captions', 'settings', 'pip', 'airplay', 'fullscreen'],
- settings: ['captions', 'quality', 'speed'],
-
- // Localisation
- i18n: {
- restart: 'Restart',
- rewind: 'Rewind {seektime}s',
- play: 'Play',
- pause: 'Pause',
- fastForward: 'Forward {seektime}s',
- seek: 'Seek',
- seekLabel: '{currentTime} of {duration}',
- played: 'Played',
- buffered: 'Buffered',
- currentTime: 'Current time',
- duration: 'Duration',
- volume: 'Volume',
- mute: 'Mute',
- unmute: 'Unmute',
- enableCaptions: 'Enable captions',
- disableCaptions: 'Disable captions',
- enterFullscreen: 'Enter fullscreen',
- exitFullscreen: 'Exit fullscreen',
- frameTitle: 'Player for {title}',
- captions: 'Captions',
- settings: 'Settings',
- menuBack: 'Go back to previous menu',
- speed: 'Speed',
- normal: 'Normal',
- quality: 'Quality',
- loop: 'Loop',
- start: 'Start',
- end: 'End',
- all: 'All',
- reset: 'Reset',
- disabled: 'Disabled',
- enabled: 'Enabled',
- advertisement: 'Ad',
- qualityBadge: {
- 2160: '4K',
- 1440: 'HD',
- 1080: 'HD',
- 720: 'HD',
- 576: 'SD',
- 480: 'SD'
- }
- },
-
- // URLs
- urls: {
- vimeo: {
- sdk: 'https://player.vimeo.com/api/player.js',
- iframe: 'https://player.vimeo.com/video/{0}?{1}',
- api: 'https://vimeo.com/api/v2/video/{0}.json'
- },
- youtube: {
- sdk: 'https://www.youtube.com/iframe_api',
- api: 'https://www.googleapis.com/youtube/v3/videos?id={0}&key={1}&fields=items(snippet(title))&part=snippet'
- },
- googleIMA: {
- sdk: 'https://imasdk.googleapis.com/js/sdkloader/ima3.js'
- }
- },
-
- // Custom control listeners
- listeners: {
- seek: null,
- play: null,
- pause: null,
- restart: null,
- rewind: null,
- fastForward: null,
- mute: null,
- volume: null,
- captions: null,
- fullscreen: null,
- pip: null,
- airplay: null,
- speed: null,
- quality: null,
- loop: null,
- language: null
- },
-
- // Events to watch and bubble
- events: [
- // Events to watch on HTML5 media elements and bubble
- // https://developer.mozilla.org/en/docs/Web/Guide/Events/Media_events
- 'ended', 'progress', 'stalled', 'playing', 'waiting', 'canplay', 'canplaythrough', 'loadstart', 'loadeddata', 'loadedmetadata', 'timeupdate', 'volumechange', 'play', 'pause', 'error', 'seeking', 'seeked', 'emptied', 'ratechange', 'cuechange',
-
- // Custom events
- 'enterfullscreen', 'exitfullscreen', 'captionsenabled', 'captionsdisabled', 'languagechange', 'controlshidden', 'controlsshown', 'ready',
-
- // YouTube
- 'statechange', 'qualitychange', 'qualityrequested',
-
- // Ads
- 'adsloaded', 'adscontentpause', 'adscontentresume', 'adstarted', 'adsmidpoint', 'adscomplete', 'adsallcomplete', 'adsimpression', 'adsclick'],
-
- // Selectors
- // Change these to match your template if using custom HTML
- selectors: {
- editable: 'input, textarea, select, [contenteditable]',
- container: '.plyr',
- controls: {
- container: null,
- wrapper: '.plyr__controls'
- },
- labels: '[data-plyr]',
- buttons: {
- play: '[data-plyr="play"]',
- pause: '[data-plyr="pause"]',
- restart: '[data-plyr="restart"]',
- rewind: '[data-plyr="rewind"]',
- fastForward: '[data-plyr="fast-forward"]',
- mute: '[data-plyr="mute"]',
- captions: '[data-plyr="captions"]',
- fullscreen: '[data-plyr="fullscreen"]',
- pip: '[data-plyr="pip"]',
- airplay: '[data-plyr="airplay"]',
- settings: '[data-plyr="settings"]',
- loop: '[data-plyr="loop"]'
- },
- inputs: {
- seek: '[data-plyr="seek"]',
- volume: '[data-plyr="volume"]',
- speed: '[data-plyr="speed"]',
- language: '[data-plyr="language"]',
- quality: '[data-plyr="quality"]'
- },
- display: {
- currentTime: '.plyr__time--current',
- duration: '.plyr__time--duration',
- buffer: '.plyr__progress__buffer',
- loop: '.plyr__progress__loop', // Used later
- volume: '.plyr__volume--display'
- },
- progress: '.plyr__progress',
- captions: '.plyr__captions',
- caption: '.plyr__caption',
- menu: {
- quality: '.js-plyr__menu__list--quality'
- }
- },
-
- // Class hooks added to the player in different states
- classNames: {
- type: 'plyr--{0}',
- provider: 'plyr--{0}',
- video: 'plyr__video-wrapper',
- embed: 'plyr__video-embed',
- embedContainer: 'plyr__video-embed__container',
- poster: 'plyr__poster',
- posterEnabled: 'plyr__poster-enabled',
- ads: 'plyr__ads',
- control: 'plyr__control',
- controlPressed: 'plyr__control--pressed',
- playing: 'plyr--playing',
- paused: 'plyr--paused',
- stopped: 'plyr--stopped',
- loading: 'plyr--loading',
- hover: 'plyr--hover',
- tooltip: 'plyr__tooltip',
- cues: 'plyr__cues',
- hidden: 'plyr__sr-only',
- hideControls: 'plyr--hide-controls',
- isIos: 'plyr--is-ios',
- isTouch: 'plyr--is-touch',
- uiSupported: 'plyr--full-ui',
- noTransition: 'plyr--no-transition',
- menu: {
- value: 'plyr__menu__value',
- badge: 'plyr__badge',
- open: 'plyr--menu-open'
- },
- captions: {
- enabled: 'plyr--captions-enabled',
- active: 'plyr--captions-active'
- },
- fullscreen: {
- enabled: 'plyr--fullscreen-enabled',
- fallback: 'plyr--fullscreen-fallback'
- },
- pip: {
- supported: 'plyr--pip-supported',
- active: 'plyr--pip-active'
- },
- airplay: {
- supported: 'plyr--airplay-supported',
- active: 'plyr--airplay-active'
- },
- tabFocus: 'plyr__tab-focus'
- },
-
- // Embed attributes
- attributes: {
- embed: {
- provider: 'data-plyr-provider',
- id: 'data-plyr-embed-id'
- }
- },
-
- // API keys
- keys: {
- google: null
- },
-
- // Advertisements plugin
- // Register for an account here: http://vi.ai/publisher-video-monetization/?aid=plyrio
- ads: {
- enabled: false,
- publisherId: ''
- }
-};
-
-// ==========================================================================
-
-var browser$1 = utils.getBrowser();
-
-function onChange() {
- if (!this.enabled) {
- return;
- }
-
- // Update toggle button
- var button = this.player.elements.buttons.fullscreen;
- if (utils.is.element(button)) {
- button.pressed = this.active;
- }
-
- // Trigger an event
- utils.dispatchEvent.call(this.player, this.target, this.active ? 'enterfullscreen' : 'exitfullscreen', true);
-
- // Trap focus in container
- if (!browser$1.isIos) {
- utils.trapFocus.call(this.player, this.target, this.active);
- }
-}
-
-function toggleFallback() {
- var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
-
- // Store or restore scroll position
- if (toggle) {
- this.scrollPosition = {
- x: window.scrollX || 0,
- y: window.scrollY || 0
- };
- } else {
- window.scrollTo(this.scrollPosition.x, this.scrollPosition.y);
- }
-
- // Toggle scroll
- document.body.style.overflow = toggle ? 'hidden' : '';
-
- // Toggle class hook
- utils.toggleClass(this.target, this.player.config.classNames.fullscreen.fallback, toggle);
-
- // Toggle button and fire events
- onChange.call(this);
-}
-
-var Fullscreen = function () {
- function Fullscreen(player) {
- var _this = this;
-
- classCallCheck(this, Fullscreen);
-
- // Keep reference to parent
- this.player = player;
-
- // Get prefix
- this.prefix = Fullscreen.prefix;
- this.property = Fullscreen.property;
-
- // Scroll position
- this.scrollPosition = { x: 0, y: 0 };
-
- // Register event listeners
- // Handle event (incase user presses escape etc)
- utils.on(document, this.prefix === 'ms' ? 'MSFullscreenChange' : this.prefix + 'fullscreenchange', function () {
- // TODO: Filter for target??
- onChange.call(_this);
- });
-
- // Fullscreen toggle on double click
- utils.on(this.player.elements.container, 'dblclick', function (event) {
- // Ignore double click in controls
- if (utils.is.element(_this.player.elements.controls) && _this.player.elements.controls.contains(event.target)) {
- return;
- }
-
- _this.toggle();
- });
-
- // Update the UI
- this.update();
- }
-
- // Determine if native supported
-
-
- createClass(Fullscreen, [{
- key: 'update',
-
-
- // Update UI
- value: function update() {
- if (this.enabled) {
- this.player.debug.log((Fullscreen.native ? 'Native' : 'Fallback') + ' fullscreen enabled');
- } else {
- this.player.debug.log('Fullscreen not supported and fallback disabled');
- }
-
- // Add styling hook to show button
- utils.toggleClass(this.player.elements.container, this.player.config.classNames.fullscreen.enabled, this.enabled);
- }
-
- // Make an element fullscreen
-
- }, {
- key: 'enter',
- value: function enter() {
- if (!this.enabled) {
- return;
- }
-
- // iOS native fullscreen doesn't need the request step
- if (browser$1.isIos && this.player.config.fullscreen.iosNative) {
- if (this.player.playing) {
- this.target.webkitEnterFullscreen();
- }
- } else if (!Fullscreen.native) {
- toggleFallback.call(this, true);
- } else if (!this.prefix) {
- this.target.requestFullscreen();
- } else if (!utils.is.empty(this.prefix)) {
- this.target[this.prefix + 'Request' + this.property]();
- }
- }
-
- // Bail from fullscreen
-
- }, {
- key: 'exit',
- value: function exit() {
- if (!this.enabled) {
- return;
- }
-
- // iOS native fullscreen
- if (browser$1.isIos && this.player.config.fullscreen.iosNative) {
- this.target.webkitExitFullscreen();
- this.player.play();
- } else if (!Fullscreen.native) {
- toggleFallback.call(this, false);
- } else if (!this.prefix) {
- (document.cancelFullScreen || document.exitFullscreen).call(document);
- } else if (!utils.is.empty(this.prefix)) {
- var action = this.prefix === 'moz' ? 'Cancel' : 'Exit';
- document['' + this.prefix + action + this.property]();
- }
- }
-
- // Toggle state
-
- }, {
- key: 'toggle',
- value: function toggle() {
- if (!this.active) {
- this.enter();
- } else {
- this.exit();
- }
- }
- }, {
- key: 'enabled',
-
-
- // Determine if fullscreen is enabled
- get: function get() {
- return (Fullscreen.native || this.player.config.fullscreen.fallback) && this.player.config.fullscreen.enabled && this.player.supported.ui && this.player.isVideo;
- }
-
- // Get active state
-
- }, {
- key: 'active',
- get: function get() {
- if (!this.enabled) {
- return false;
- }
-
- // Fallback using classname
- if (!Fullscreen.native) {
- return utils.hasClass(this.target, this.player.config.classNames.fullscreen.fallback);
- }
-
- var element = !this.prefix ? document.fullscreenElement : document['' + this.prefix + this.property + 'Element'];
-
- return element === this.target;
- }
-
- // Get target element
-
- }, {
- key: 'target',
- get: function get() {
- return browser$1.isIos && this.player.config.fullscreen.iosNative ? this.player.media : this.player.elements.container;
- }
- }], [{
- key: 'native',
- get: function get() {
- return !!(document.fullscreenEnabled || document.webkitFullscreenEnabled || document.mozFullScreenEnabled || document.msFullscreenEnabled);
- }
-
- // Get the prefix for handlers
-
- }, {
- key: 'prefix',
- get: function get() {
- // No prefix
- if (utils.is.function(document.exitFullscreen)) {
- return '';
- }
-
- // Check for fullscreen support by vendor prefix
- var value = '';
- var prefixes = ['webkit', 'moz', 'ms'];
-
- prefixes.some(function (pre) {
- if (utils.is.function(document[pre + 'ExitFullscreen']) || utils.is.function(document[pre + 'CancelFullScreen'])) {
- value = pre;
- return true;
- }
-
- return false;
- });
-
- return value;
- }
- }, {
- key: 'property',
- get: function get() {
- return this.prefix === 'moz' ? 'FullScreen' : 'Fullscreen';
- }
- }]);
- return Fullscreen;
-}();
-
-// ==========================================================================
-
-// Sniff out the browser
-var browser$2 = utils.getBrowser();
-
-var ui = {
- addStyleHook: function addStyleHook() {
- utils.toggleClass(this.elements.container, this.config.selectors.container.replace('.', ''), true);
- utils.toggleClass(this.elements.container, this.config.classNames.uiSupported, this.supported.ui);
- },
-
-
- // Toggle native HTML5 media controls
- toggleNativeControls: function toggleNativeControls() {
- var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
-
- if (toggle && this.isHTML5) {
- this.media.setAttribute('controls', '');
- } else {
- this.media.removeAttribute('controls');
- }
- },
-
-
- // Setup the UI
- build: function build() {
- var _this = this;
-
- // Re-attach media element listeners
- // TODO: Use event bubbling?
- this.listeners.media();
-
- // Don't setup interface if no support
- if (!this.supported.ui) {
- this.debug.warn('Basic support only for ' + this.provider + ' ' + this.type);
-
- // Restore native controls
- ui.toggleNativeControls.call(this, true);
-
- // Bail
- return;
- }
-
- // Inject custom controls if not present
- if (!utils.is.element(this.elements.controls)) {
- // Inject custom controls
- controls.inject.call(this);
-
- // Re-attach control listeners
- this.listeners.controls();
- }
-
- // Remove native controls
- ui.toggleNativeControls.call(this);
-
- // Setup captions for HTML5
- if (this.isHTML5) {
- captions.setup.call(this);
- }
-
- // Reset volume
- this.volume = null;
-
- // Reset mute state
- this.muted = null;
-
- // Reset speed
- this.speed = null;
-
- // Reset loop state
- this.loop = null;
-
- // Reset quality setting
- this.quality = null;
-
- // Reset volume display
- controls.updateVolume.call(this);
-
- // Reset time display
- controls.timeUpdate.call(this);
-
- // Update the UI
- ui.checkPlaying.call(this);
-
- // Check for picture-in-picture support
- utils.toggleClass(this.elements.container, this.config.classNames.pip.supported, support.pip && this.isHTML5 && this.isVideo);
-
- // Check for airplay support
- utils.toggleClass(this.elements.container, this.config.classNames.airplay.supported, support.airplay && this.isHTML5);
-
- // Add iOS class
- utils.toggleClass(this.elements.container, this.config.classNames.isIos, browser$2.isIos);
-
- // Add touch class
- utils.toggleClass(this.elements.container, this.config.classNames.isTouch, this.touch);
-
- // Ready for API calls
- this.ready = true;
-
- // Ready event at end of execution stack
- setTimeout(function () {
- utils.dispatchEvent.call(_this, _this.media, 'ready');
- }, 0);
-
- // Set the title
- ui.setTitle.call(this);
-
- // Assure the poster image is set, if the property was added before the element was created
- if (this.poster && this.elements.poster && !this.elements.poster.style.backgroundImage) {
- ui.setPoster.call(this, this.poster);
- }
-
- // Manually set the duration if user has overridden it.
- // The event listeners for it doesn't get called if preload is disabled (#701)
- if (this.config.duration) {
- controls.durationUpdate.call(this);
- }
- },
-
-
- // Setup aria attribute for play and iframe title
- setTitle: function setTitle() {
- // Find the current text
- var label = i18n.get('play', this.config);
-
- // If there's a media title set, use that for the label
- if (utils.is.string(this.config.title) && !utils.is.empty(this.config.title)) {
- label += ', ' + this.config.title;
- }
-
- // If there's a play button, set label
- if (utils.is.nodeList(this.elements.buttons.play)) {
- Array.from(this.elements.buttons.play).forEach(function (button) {
- button.setAttribute('aria-label', label);
- });
- }
-
- // Set iframe title
- // https://github.com/sampotts/plyr/issues/124
- if (this.isEmbed) {
- var iframe = utils.getElement.call(this, 'iframe');
-
- if (!utils.is.element(iframe)) {
- return;
- }
-
- // Default to media type
- var title = !utils.is.empty(this.config.title) ? this.config.title : 'video';
- var format = i18n.get('frameTitle', this.config);
-
- iframe.setAttribute('title', format.replace('{title}', title));
- }
- },
-
-
- // Toggle poster
- togglePoster: function togglePoster(enable) {
- utils.toggleClass(this.elements.container, this.config.classNames.posterEnabled, enable);
- },
-
-
- // Set the poster image (async)
- setPoster: function setPoster(poster) {
- var _this2 = this;
-
- // Set property regardless of validity
- this.media.setAttribute('poster', poster);
-
- // Bail if element is missing
- if (!utils.is.element(this.elements.poster)) {
- return Promise.reject();
- }
-
- // Load the image, and set poster if successful
- var loadPromise = utils.loadImage(poster).then(function () {
- _this2.elements.poster.style.backgroundImage = 'url(\'' + poster + '\')';
- Object.assign(_this2.elements.poster.style, {
- backgroundImage: 'url(\'' + poster + '\')',
- // Reset backgroundSize as well (since it can be set to "cover" for padded thumbnails for youtube)
- backgroundSize: ''
- });
- ui.togglePoster.call(_this2, true);
- return poster;
- });
-
- // Hide the element if the poster can't be loaded (otherwise it will just be a black element covering the video)
- loadPromise.catch(function () {
- return ui.togglePoster.call(_this2, false);
- });
-
- // Return the promise so the caller can use it as well
- return loadPromise;
- },
-
-
- // Check playing state
- checkPlaying: function checkPlaying(event) {
- var _this3 = this;
-
- // Class hooks
- utils.toggleClass(this.elements.container, this.config.classNames.playing, this.playing);
- utils.toggleClass(this.elements.container, this.config.classNames.paused, this.paused);
- utils.toggleClass(this.elements.container, this.config.classNames.stopped, this.stopped);
-
- // Set state
- Array.from(this.elements.buttons.play).forEach(function (target) {
- target.pressed = _this3.playing;
- });
-
- // Only update controls on non timeupdate events
- if (utils.is.event(event) && event.type === 'timeupdate') {
- return;
- }
-
- // Toggle controls
- ui.toggleControls.call(this);
- },
-
-
- // Check if media is loading
- checkLoading: function checkLoading(event) {
- var _this4 = this;
-
- this.loading = ['stalled', 'waiting'].includes(event.type);
-
- // Clear timer
- clearTimeout(this.timers.loading);
-
- // Timer to prevent flicker when seeking
- this.timers.loading = setTimeout(function () {
- // Update progress bar loading class state
- utils.toggleClass(_this4.elements.container, _this4.config.classNames.loading, _this4.loading);
-
- // Update controls visibility
- ui.toggleControls.call(_this4);
- }, this.loading ? 250 : 0);
- },
-
-
- // Toggle controls based on state and `force` argument
- toggleControls: function toggleControls(force) {
- var controls$$1 = this.elements.controls;
-
-
- if (controls$$1 && this.config.hideControls) {
- // Show controls if force, loading, paused, or button interaction, otherwise hide
- this.toggleControls(Boolean(force || this.loading || this.paused || controls$$1.pressed || controls$$1.hover));
- }
- }
-};
-
-// ==========================================================================
-
-// Sniff out the browser
-var browser$3 = utils.getBrowser();
-
-var Listeners = function () {
- function Listeners(player) {
- classCallCheck(this, Listeners);
-
- this.player = player;
- this.lastKey = null;
-
- this.handleKey = this.handleKey.bind(this);
- this.toggleMenu = this.toggleMenu.bind(this);
- this.firstTouch = this.firstTouch.bind(this);
- }
-
- // Handle key presses
-
-
- createClass(Listeners, [{
- key: 'handleKey',
- value: function handleKey(event) {
- var _this = this;
-
- var code = event.keyCode ? event.keyCode : event.which;
- var pressed = event.type === 'keydown';
- var repeat = pressed && code === this.lastKey;
-
- // Bail if a modifier key is set
- if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) {
- return;
- }
-
- // If the event is bubbled from the media element
- // Firefox doesn't get the keycode for whatever reason
- if (!utils.is.number(code)) {
- return;
- }
-
- // Seek by the number keys
- var seekByKey = function seekByKey() {
- // Divide the max duration into 10th's and times by the number value
- _this.player.currentTime = _this.player.duration / 10 * (code - 48);
- };
-
- // Handle the key on keydown
- // Reset on keyup
- if (pressed) {
- // Which keycodes should we prevent default
- var preventDefault = [48, 49, 50, 51, 52, 53, 54, 56, 57, 32, 75, 38, 40, 77, 39, 37, 70, 67, 73, 76, 79];
-
- // Check focused element
- // and if the focused element is not editable (e.g. text input)
- // and any that accept key input http://webaim.org/techniques/keyboard/
- var focused = utils.getFocusElement();
- if (utils.is.element(focused) && focused !== this.player.elements.inputs.seek && utils.matches(focused, this.player.config.selectors.editable)) {
- return;
- }
-
- // If the code is found prevent default (e.g. prevent scrolling for arrows)
- if (preventDefault.includes(code)) {
- event.preventDefault();
- event.stopPropagation();
- }
-
- switch (code) {
- case 48:
- case 49:
- case 50:
- case 51:
- case 52:
- case 53:
- case 54:
- case 55:
- case 56:
- case 57:
- // 0-9
- if (!repeat) {
- seekByKey();
- }
- break;
-
- case 32:
- case 75:
- // Space and K key
- if (!repeat) {
- this.player.togglePlay();
- }
- break;
-
- case 38:
- // Arrow up
- this.player.increaseVolume(0.1);
- break;
-
- case 40:
- // Arrow down
- this.player.decreaseVolume(0.1);
- break;
-
- case 77:
- // M key
- if (!repeat) {
- this.player.muted = !this.player.muted;
- }
- break;
-
- case 39:
- // Arrow forward
- this.player.forward();
- break;
-
- case 37:
- // Arrow back
- this.player.rewind();
- break;
-
- case 70:
- // F key
- this.player.fullscreen.toggle();
- break;
-
- case 67:
- // C key
- if (!repeat) {
- this.player.toggleCaptions();
- }
- break;
-
- case 76:
- // L key
- this.player.loop = !this.player.loop;
- break;
-
- /* case 73:
- this.setLoop('start');
- break;
- case 76:
- this.setLoop();
- break;
- case 79:
- this.setLoop('end');
- break; */
-
- default:
- break;
- }
-
- // Escape is handle natively when in full screen
- // So we only need to worry about non native
- if (!this.player.fullscreen.enabled && this.player.fullscreen.active && code === 27) {
- this.player.fullscreen.toggle();
- }
-
- // Store last code for next cycle
- this.lastKey = code;
- } else {
- this.lastKey = null;
- }
- }
-
- // Toggle menu
-
- }, {
- key: 'toggleMenu',
- value: function toggleMenu(event) {
- controls.toggleMenu.call(this.player, event);
- }
-
- // Device is touch enabled
-
- }, {
- key: 'firstTouch',
- value: function firstTouch() {
- this.player.touch = true;
-
- // Add touch class
- utils.toggleClass(this.player.elements.container, this.player.config.classNames.isTouch, true);
-
- // Clean up
- utils.off(document.body, 'touchstart', this.firstTouch);
- }
-
- // Global window & document listeners
-
- }, {
- key: 'global',
- value: function global() {
- var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
-
- // Keyboard shortcuts
- if (this.player.config.keyboard.global) {
- utils.toggleListener(window, 'keydown keyup', this.handleKey, toggle, false);
- }
-
- // Click anywhere closes menu
- utils.toggleListener(document.body, 'click', this.toggleMenu, toggle);
-
- // Detect touch by events
- utils.on(document.body, 'touchstart', this.firstTouch);
- }
-
- // Container listeners
-
- }, {
- key: 'container',
- value: function container() {
- var _this2 = this;
-
- // Keyboard shortcuts
- if (!this.player.config.keyboard.global && this.player.config.keyboard.focused) {
- utils.on(this.player.elements.container, 'keydown keyup', this.handleKey, false);
- }
-
- // Detect tab focus
- // Remove class on blur/focusout
- utils.on(this.player.elements.container, 'focusout', function (event) {
- utils.toggleClass(event.target, _this2.player.config.classNames.tabFocus, false);
- });
-
- // Add classname to tabbed elements
- utils.on(this.player.elements.container, 'keydown', function (event) {
- if (event.keyCode !== 9) {
- return;
- }
-
- // Delay the adding of classname until the focus has changed
- // This event fires before the focusin event
- setTimeout(function () {
- utils.toggleClass(utils.getFocusElement(), _this2.player.config.classNames.tabFocus, true);
- }, 0);
- });
-
- // Toggle controls on mouse events and entering fullscreen
- utils.on(this.player.elements.container, 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen', function (event) {
- var controls$$1 = _this2.player.elements.controls;
-
- // Remove button states for fullscreen
-
- if (event.type === 'enterfullscreen') {
- controls$$1.pressed = false;
- controls$$1.hover = false;
- }
-
- // Show, then hide after a timeout unless another control event occurs
- var show = ['touchstart', 'touchmove', 'mousemove'].includes(event.type);
-
- var delay = 0;
-
- if (show) {
- ui.toggleControls.call(_this2.player, true);
- // Use longer timeout for touch devices
- delay = _this2.player.touch ? 3000 : 2000;
- }
-
- // Clear timer
- clearTimeout(_this2.player.timers.controls);
- // Timer to prevent flicker when seeking
- _this2.player.timers.controls = setTimeout(function () {
- return ui.toggleControls.call(_this2.player, false);
- }, delay);
- });
- }
-
- // Listen for media events
-
- }, {
- key: 'media',
- value: function media() {
- var _this3 = this;
-
- // Time change on media
- utils.on(this.player.media, 'timeupdate seeking seeked', function (event) {
- return controls.timeUpdate.call(_this3.player, event);
- });
-
- // Display duration
- utils.on(this.player.media, 'durationchange loadeddata loadedmetadata', function (event) {
- return controls.durationUpdate.call(_this3.player, event);
- });
-
- // Check for audio tracks on load
- // We can't use `loadedmetadata` as it doesn't seem to have audio tracks at that point
- utils.on(this.player.media, 'loadeddata', function () {
- utils.toggleHidden(_this3.player.elements.volume, !_this3.player.hasAudio);
- utils.toggleHidden(_this3.player.elements.buttons.mute, !_this3.player.hasAudio);
- });
-
- // Handle the media finishing
- utils.on(this.player.media, 'ended', function () {
- // Show poster on end
- if (_this3.player.isHTML5 && _this3.player.isVideo && _this3.player.config.resetOnEnd) {
- // Restart
- _this3.player.restart();
- }
- });
-
- // Check for buffer progress
- utils.on(this.player.media, 'progress playing seeking seeked', function (event) {
- return controls.updateProgress.call(_this3.player, event);
- });
-
- // Handle volume changes
- utils.on(this.player.media, 'volumechange', function (event) {
- return controls.updateVolume.call(_this3.player, event);
- });
-
- // Handle play/pause
- utils.on(this.player.media, 'playing play pause ended emptied timeupdate', function (event) {
- return ui.checkPlaying.call(_this3.player, event);
- });
-
- // Loading state
- utils.on(this.player.media, 'waiting canplay seeked playing', function (event) {
- return ui.checkLoading.call(_this3.player, event);
- });
-
- // If autoplay, then load advertisement if required
- // TODO: Show some sort of loading state while the ad manager loads else there's a delay before ad shows
- utils.on(this.player.media, 'playing', function () {
- if (!_this3.player.ads) {
- return;
- }
-
- // If ads are enabled, wait for them first
- if (_this3.player.ads.enabled && !_this3.player.ads.initialized) {
- // Wait for manager response
- _this3.player.ads.managerPromise.then(function () {
- return _this3.player.ads.play();
- }).catch(function () {
- return _this3.player.play();
- });
- }
- });
-
- // Click video
- if (this.player.supported.ui && this.player.config.clickToPlay && !this.player.isAudio) {
- // Re-fetch the wrapper
- var wrapper = utils.getElement.call(this.player, '.' + this.player.config.classNames.video);
-
- // Bail if there's no wrapper (this should never happen)
- if (!utils.is.element(wrapper)) {
- return;
- }
-
- // On click play, pause ore restart
- utils.on(wrapper, 'click', function () {
- // Touch devices will just show controls (if we're hiding controls)
- if (_this3.player.config.hideControls && _this3.player.touch && !_this3.player.paused) {
- return;
- }
-
- if (_this3.player.paused) {
- _this3.player.play();
- } else if (_this3.player.ended) {
- _this3.player.restart();
- _this3.player.play();
- } else {
- _this3.player.pause();
- }
- });
- }
-
- // Disable right click
- if (this.player.supported.ui && this.player.config.disableContextMenu) {
- utils.on(this.player.elements.wrapper, 'contextmenu', function (event) {
- event.preventDefault();
- }, false);
- }
-
- // Volume change
- utils.on(this.player.media, 'volumechange', function () {
- // Save to storage
- _this3.player.storage.set({ volume: _this3.player.volume, muted: _this3.player.muted });
- });
-
- // Speed change
- utils.on(this.player.media, 'ratechange', function () {
- // Update UI
- controls.updateSetting.call(_this3.player, 'speed');
-
- // Save to storage
- _this3.player.storage.set({ speed: _this3.player.speed });
- });
-
- // Quality request
- utils.on(this.player.media, 'qualityrequested', function (event) {
- // Save to storage
- _this3.player.storage.set({ quality: event.detail.quality });
- });
-
- // Quality change
- utils.on(this.player.media, 'qualitychange', function (event) {
- // Update UI
- controls.updateSetting.call(_this3.player, 'quality', null, event.detail.quality);
- });
-
- // Caption language change
- utils.on(this.player.media, 'languagechange', function () {
- // Update UI
- controls.updateSetting.call(_this3.player, 'captions');
-
- // Save to storage
- _this3.player.storage.set({ language: _this3.player.language });
- });
-
- // Captions toggle
- utils.on(this.player.media, 'captionsenabled captionsdisabled', function () {
- // Update UI
- controls.updateSetting.call(_this3.player, 'captions');
-
- // Save to storage
- _this3.player.storage.set({ captions: _this3.player.captions.active });
- });
-
- // Proxy events to container
- // Bubble up key events for Edge
- utils.on(this.player.media, this.player.config.events.concat(['keyup', 'keydown']).join(' '), function (event) {
- var _event$detail = event.detail,
- detail = _event$detail === undefined ? {} : _event$detail;
-
- // Get error details from media
-
- if (event.type === 'error') {
- detail = _this3.player.media.error;
- }
-
- utils.dispatchEvent.call(_this3.player, _this3.player.elements.container, event.type, true, detail);
- });
- }
-
- // Listen for control events
-
- }, {
- key: 'controls',
- value: function controls$$1() {
- var _this4 = this;
-
- // IE doesn't support input event, so we fallback to change
- var inputEvent = browser$3.isIE ? 'change' : 'input';
-
- // Run default and custom handlers
- var proxy = function proxy(event, defaultHandler, customHandlerKey) {
- var customHandler = _this4.player.config.listeners[customHandlerKey];
- var hasCustomHandler = utils.is.function(customHandler);
- var returned = true;
-
- // Execute custom handler
- if (hasCustomHandler) {
- returned = customHandler.call(_this4.player, event);
- }
-
- // Only call default handler if not prevented in custom handler
- if (returned && utils.is.function(defaultHandler)) {
- defaultHandler.call(_this4.player, event);
- }
- };
-
- // Trigger custom and default handlers
- var on = function on(element, type, defaultHandler, customHandlerKey) {
- var passive = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;
-
- var customHandler = _this4.player.config.listeners[customHandlerKey];
- var hasCustomHandler = utils.is.function(customHandler);
-
- utils.on(element, type, function (event) {
- return proxy(event, defaultHandler, customHandlerKey);
- }, passive && !hasCustomHandler);
- };
-
- // Play/pause toggle
- on(this.player.elements.buttons.play, 'click', this.player.togglePlay, 'play');
-
- // Pause
- on(this.player.elements.buttons.restart, 'click', this.player.restart, 'restart');
-
- // Rewind
- on(this.player.elements.buttons.rewind, 'click', this.player.rewind, 'rewind');
-
- // Rewind
- on(this.player.elements.buttons.fastForward, 'click', this.player.forward, 'fastForward');
-
- // Mute toggle
- on(this.player.elements.buttons.mute, 'click', function () {
- _this4.player.muted = !_this4.player.muted;
- }, 'mute');
-
- // Captions toggle
- on(this.player.elements.buttons.captions, 'click', this.player.toggleCaptions);
-
- // Fullscreen toggle
- on(this.player.elements.buttons.fullscreen, 'click', function () {
- _this4.player.fullscreen.toggle();
- }, 'fullscreen');
-
- // Picture-in-Picture
- on(this.player.elements.buttons.pip, 'click', function () {
- _this4.player.pip = 'toggle';
- }, 'pip');
-
- // Airplay
- on(this.player.elements.buttons.airplay, 'click', this.player.airplay, 'airplay');
-
- // Settings menu
- on(this.player.elements.buttons.settings, 'click', function (event) {
- controls.toggleMenu.call(_this4.player, event);
- });
-
- // Settings menu
- on(this.player.elements.settings.form, 'click', function (event) {
- event.stopPropagation();
-
- // Go back to home tab on click
- var showHomeTab = function showHomeTab() {
- var id = 'plyr-settings-' + _this4.player.id + '-home';
- controls.showTab.call(_this4.player, id);
- };
-
- // Settings menu items - use event delegation as items are added/removed
- if (utils.matches(event.target, _this4.player.config.selectors.inputs.language)) {
- proxy(event, function () {
- _this4.player.currentTrack = Number(event.target.value);
- showHomeTab();
- }, 'language');
- } else if (utils.matches(event.target, _this4.player.config.selectors.inputs.quality)) {
- proxy(event, function () {
- _this4.player.quality = event.target.value;
- showHomeTab();
- }, 'quality');
- } else if (utils.matches(event.target, _this4.player.config.selectors.inputs.speed)) {
- proxy(event, function () {
- _this4.player.speed = parseFloat(event.target.value);
- showHomeTab();
- }, 'speed');
- } else {
- var tab = event.target;
- controls.showTab.call(_this4.player, tab.getAttribute('aria-controls'));
- }
- });
-
- // Set range input alternative "value", which matches the tooltip time (#954)
- on(this.player.elements.inputs.seek, 'mousedown mousemove', function (event) {
- var clientRect = _this4.player.elements.progress.getBoundingClientRect();
- var percent = 100 / clientRect.width * (event.pageX - clientRect.left);
- event.currentTarget.setAttribute('seek-value', percent);
- });
-
- // Pause while seeking
- on(this.player.elements.inputs.seek, 'mousedown mouseup keydown keyup touchstart touchend', function (event) {
- var seek = event.currentTarget;
-
- var code = event.keyCode ? event.keyCode : event.which;
- var eventType = event.type;
-
- if ((eventType === 'keydown' || eventType === 'keyup') && code !== 39 && code !== 37) {
- return;
- }
- // Was playing before?
- var play = seek.hasAttribute('play-on-seeked');
-
- // Done seeking
- var done = ['mouseup', 'touchend', 'keyup'].includes(event.type);
-
- // If we're done seeking and it was playing, resume playback
- if (play && done) {
- seek.removeAttribute('play-on-seeked');
- _this4.player.play();
- } else if (!done && _this4.player.playing) {
- seek.setAttribute('play-on-seeked', '');
- _this4.player.pause();
- }
- });
-
- // Seek
- on(this.player.elements.inputs.seek, inputEvent, function (event) {
- var seek = event.currentTarget;
-
- // If it exists, use seek-value instead of "value" for consistency with tooltip time (#954)
- var seekTo = seek.getAttribute('seek-value');
-
- if (utils.is.empty(seekTo)) {
- seekTo = seek.value;
- }
-
- seek.removeAttribute('seek-value');
-
- _this4.player.currentTime = seekTo / seek.max * _this4.player.duration;
- }, 'seek');
-
- // Current time invert
- // Only if one time element is used for both currentTime and duration
- if (this.player.config.toggleInvert && !utils.is.element(this.player.elements.display.duration)) {
- on(this.player.elements.display.currentTime, 'click', function () {
- // Do nothing if we're at the start
- if (_this4.player.currentTime === 0) {
- return;
- }
-
- _this4.player.config.invertTime = !_this4.player.config.invertTime;
-
- controls.timeUpdate.call(_this4.player);
- });
- }
-
- // Volume
- on(this.player.elements.inputs.volume, inputEvent, function (event) {
- _this4.player.volume = event.target.value;
- }, 'volume');
-
- // Polyfill for lower fill in <input type="range"> for webkit
- if (browser$3.isWebkit) {
- on(utils.getElements.call(this.player, 'input[type="range"]'), 'input', function (event) {
- controls.updateRangeFill.call(_this4.player, event.target);
- });
- }
-
- // Seek tooltip
- on(this.player.elements.progress, 'mouseenter mouseleave mousemove', function (event) {
- return controls.updateSeekTooltip.call(_this4.player, event);
- });
-
- // Update controls.hover state (used for ui.toggleControls to avoid hiding when interacting)
- on(this.player.elements.controls, 'mouseenter mouseleave', function (event) {
- _this4.player.elements.controls.hover = !_this4.player.touch && event.type === 'mouseenter';
- });
-
- // Update controls.pressed state (used for ui.toggleControls to avoid hiding when interacting)
- on(this.player.elements.controls, 'mousedown mouseup touchstart touchend touchcancel', function (event) {
- _this4.player.elements.controls.pressed = ['mousedown', 'touchstart'].includes(event.type);
- });
-
- // Focus in/out on controls
- on(this.player.elements.controls, 'focusin focusout', function (event) {
- var _player = _this4.player,
- config = _player.config,
- elements = _player.elements,
- timers = _player.timers;
-
- // Skip transition to prevent focus from scrolling the parent element
-
- utils.toggleClass(elements.controls, config.classNames.noTransition, event.type === 'focusin');
-
- // Toggle
- ui.toggleControls.call(_this4.player, event.type === 'focusin');
-
- // If focusin, hide again after delay
- if (event.type === 'focusin') {
- // Restore transition
- setTimeout(function () {
- utils.toggleClass(elements.controls, config.classNames.noTransition, false);
- }, 0);
-
- // Delay a little more for keyboard users
- var delay = _this4.touch ? 3000 : 4000;
-
- // Clear timer
- clearTimeout(timers.controls);
- // Hide
- timers.controls = setTimeout(function () {
- return ui.toggleControls.call(_this4.player, false);
- }, delay);
- }
- });
-
- // Mouse wheel for volume
- on(this.player.elements.inputs.volume, 'wheel', function (event) {
- // Detect "natural" scroll - suppored on OS X Safari only
- // Other browsers on OS X will be inverted until support improves
- var inverted = event.webkitDirectionInvertedFromDevice;
- var step = 1 / 50;
- var direction = 0;
-
- // Scroll down (or up on natural) to decrease
- if (event.deltaY < 0 || event.deltaX > 0) {
- if (inverted) {
- _this4.player.decreaseVolume(step);
- direction = -1;
- } else {
- _this4.player.increaseVolume(step);
- direction = 1;
- }
- }
-
- // Scroll up (or down on natural) to increase
- if (event.deltaY > 0 || event.deltaX < 0) {
- if (inverted) {
- _this4.player.increaseVolume(step);
- direction = 1;
- } else {
- _this4.player.decreaseVolume(step);
- direction = -1;
- }
- }
-
- // Don't break page scrolling at max and min
- if (direction === 1 && _this4.player.media.volume < 1 || direction === -1 && _this4.player.media.volume > 0) {
- event.preventDefault();
- }
- }, 'volume', false);
- }
-
- // Reset on destroy
-
- }, {
- key: 'clear',
- value: function clear() {
- this.global(false);
- }
- }]);
- return Listeners;
-}();
-
-// ==========================================================================
-
-// Set playback state and trigger change (only on actual change)
-function assurePlaybackState(play) {
- if (play && !this.embed.hasPlayed) {
- this.embed.hasPlayed = true;
- }
- if (this.media.paused === play) {
- this.media.paused = !play;
- utils.dispatchEvent.call(this, this.media, play ? 'play' : 'pause');
- }
-}
-
-var vimeo = {
- setup: function setup() {
- var _this = this;
-
- // Add embed class for responsive
- utils.toggleClass(this.elements.wrapper, this.config.classNames.embed, true);
-
- // Set intial ratio
- vimeo.setAspectRatio.call(this);
-
- // Load the API if not already
- if (!utils.is.object(window.Vimeo)) {
- utils.loadScript(this.config.urls.vimeo.sdk).then(function () {
- vimeo.ready.call(_this);
- }).catch(function (error) {
- _this.debug.warn('Vimeo API failed to load', error);
- });
- } else {
- vimeo.ready.call(this);
- }
- },
-
-
- // Set aspect ratio
- // For Vimeo we have an extra 300% height <div> to hide the standard controls and UI
- setAspectRatio: function setAspectRatio(input) {
- var ratio = utils.is.string(input) ? input.split(':') : this.config.ratio.split(':');
- var padding = 100 / ratio[0] * ratio[1];
- this.elements.wrapper.style.paddingBottom = padding + '%';
-
- if (this.supported.ui) {
- var height = 240;
- var offset = (height - padding) / (height / 50);
-
- this.media.style.transform = 'translateY(-' + offset + '%)';
- }
- },
-
-
- // API Ready
- ready: function ready() {
- var _this2 = this;
-
- var player = this;
-
- // Get Vimeo params for the iframe
- var options = {
- loop: player.config.loop.active,
- autoplay: player.autoplay,
- // muted: player.muted,
- byline: false,
- portrait: false,
- title: false,
- speed: true,
- transparent: 0,
- gesture: 'media',
- playsinline: !this.config.fullscreen.iosNative
- };
- var params = utils.buildUrlParams(options);
-
- // Get the source URL or ID
- var source = player.media.getAttribute('src');
-
- // Get from <div> if needed
- if (utils.is.empty(source)) {
- source = player.media.getAttribute(player.config.attributes.embed.id);
- }
-
- var id = utils.parseVimeoId(source);
-
- // Build an iframe
- var iframe = utils.createElement('iframe');
- var src = utils.format(player.config.urls.vimeo.iframe, id, params);
- iframe.setAttribute('src', src);
- iframe.setAttribute('allowfullscreen', '');
- iframe.setAttribute('allowtransparency', '');
- iframe.setAttribute('allow', 'autoplay');
-
- // Inject the package
- var wrapper = utils.createElement('div', { class: player.config.classNames.embedContainer });
- wrapper.appendChild(iframe);
- player.media = utils.replaceElement(wrapper, player.media);
-
- // Get poster image
- utils.fetch(utils.format(player.config.urls.vimeo.api, id), 'json').then(function (response) {
- if (utils.is.empty(response)) {
- return;
- }
-
- // Get the URL for thumbnail
- var url = new URL(response[0].thumbnail_large);
-
- // Get original image
- url.pathname = url.pathname.split('_')[0] + '.jpg';
-
- // Set and show poster
- ui.setPoster.call(player, url.href);
- });
-
- // Setup instance
- // https://github.com/vimeo/player.js
- player.embed = new window.Vimeo.Player(iframe, {
- autopause: player.config.autopause,
- muted: player.muted
- });
-
- player.media.paused = true;
- player.media.currentTime = 0;
-
- // Disable native text track rendering
- if (player.supported.ui) {
- player.embed.disableTextTrack();
- }
-
- // Create a faux HTML5 API using the Vimeo API
- player.media.play = function () {
- assurePlaybackState.call(player, true);
- return player.embed.play();
- };
-
- player.media.pause = function () {
- assurePlaybackState.call(player, false);
- return player.embed.pause();
- };
-
- player.media.stop = function () {
- player.pause();
- player.currentTime = 0;
- };
-
- // Seeking
- var currentTime = player.media.currentTime;
-
- Object.defineProperty(player.media, 'currentTime', {
- get: function get() {
- return currentTime;
- },
- set: function set(time) {
- // Vimeo will automatically play on seek if the video hasn't been played before
-
- // Get current paused state and volume etc
- var embed = player.embed,
- media = player.media,
- paused = player.paused,
- volume = player.volume;
-
- var restorePause = paused && !embed.hasPlayed;
-
- // Set seeking state and trigger event
- media.seeking = true;
- utils.dispatchEvent.call(player, media, 'seeking');
-
- // If paused, mute until seek is complete
- Promise.resolve(restorePause && embed.setVolume(0))
- // Seek
- .then(function () {
- return embed.setCurrentTime(time);
- })
- // Restore paused
- .then(function () {
- return restorePause && embed.pause();
- })
- // Restore volume
- .then(function () {
- return restorePause && embed.setVolume(volume);
- }).catch(function () {
- // Do nothing
- });
- }
- });
-
- // Playback speed
- var speed = player.config.speed.selected;
- Object.defineProperty(player.media, 'playbackRate', {
- get: function get() {
- return speed;
- },
- set: function set(input) {
- player.embed.setPlaybackRate(input).then(function () {
- speed = input;
- utils.dispatchEvent.call(player, player.media, 'ratechange');
- }).catch(function (error) {
- // Hide menu item (and menu if empty)
- if (error.name === 'Error') {
- controls.setSpeedMenu.call(player, []);
- }
- });
- }
- });
-
- // Volume
- var volume = player.config.volume;
-
- Object.defineProperty(player.media, 'volume', {
- get: function get() {
- return volume;
- },
- set: function set(input) {
- player.embed.setVolume(input).then(function () {
- volume = input;
- utils.dispatchEvent.call(player, player.media, 'volumechange');
- });
- }
- });
-
- // Muted
- var muted = player.config.muted;
-
- Object.defineProperty(player.media, 'muted', {
- get: function get() {
- return muted;
- },
- set: function set(input) {
- var toggle = utils.is.boolean(input) ? input : false;
-
- player.embed.setVolume(toggle ? 0 : player.config.volume).then(function () {
- muted = toggle;
- utils.dispatchEvent.call(player, player.media, 'volumechange');
- });
- }
- });
-
- // Loop
- var loop = player.config.loop;
-
- Object.defineProperty(player.media, 'loop', {
- get: function get() {
- return loop;
- },
- set: function set(input) {
- var toggle = utils.is.boolean(input) ? input : player.config.loop.active;
-
- player.embed.setLoop(toggle).then(function () {
- loop = toggle;
- });
- }
- });
-
- // Source
- var currentSrc = void 0;
- player.embed.getVideoUrl().then(function (value) {
- currentSrc = value;
- }).catch(function (error) {
- _this2.debug.warn(error);
- });
-
- Object.defineProperty(player.media, 'currentSrc', {
- get: function get() {
- return currentSrc;
- }
- });
-
- // Ended
- Object.defineProperty(player.media, 'ended', {
- get: function get() {
- return player.currentTime === player.duration;
- }
- });
-
- // Set aspect ratio based on video size
- Promise.all([player.embed.getVideoWidth(), player.embed.getVideoHeight()]).then(function (dimensions) {
- var ratio = utils.getAspectRatio(dimensions[0], dimensions[1]);
- vimeo.setAspectRatio.call(_this2, ratio);
- });
-
- // Set autopause
- player.embed.setAutopause(player.config.autopause).then(function (state) {
- player.config.autopause = state;
- });
-
- // Get title
- player.embed.getVideoTitle().then(function (title) {
- player.config.title = title;
- ui.setTitle.call(_this2);
- });
-
- // Get current time
- player.embed.getCurrentTime().then(function (value) {
- currentTime = value;
- utils.dispatchEvent.call(player, player.media, 'timeupdate');
- });
-
- // Get duration
- player.embed.getDuration().then(function (value) {
- player.media.duration = value;
- utils.dispatchEvent.call(player, player.media, 'durationchange');
- });
-
- // Get captions
- player.embed.getTextTracks().then(function (tracks) {
- player.media.textTracks = tracks;
- captions.setup.call(player);
- });
-
- player.embed.on('cuechange', function (_ref) {
- var _ref$cues = _ref.cues,
- cues = _ref$cues === undefined ? [] : _ref$cues;
-
- var strippedCues = cues.map(function (cue) {
- return utils.stripHTML(cue.text);
- });
- captions.updateCues.call(player, strippedCues);
- });
-
- player.embed.on('loaded', function () {
- // Assure state and events are updated on autoplay
- player.embed.getPaused().then(function (paused) {
- assurePlaybackState.call(player, !paused);
- if (!paused) {
- utils.dispatchEvent.call(player, player.media, 'playing');
- }
- });
-
- if (utils.is.element(player.embed.element) && player.supported.ui) {
- var frame = player.embed.element;
-
- // Fix keyboard focus issues
- // https://github.com/sampotts/plyr/issues/317
- frame.setAttribute('tabindex', -1);
- }
- });
-
- player.embed.on('play', function () {
- assurePlaybackState.call(player, true);
- utils.dispatchEvent.call(player, player.media, 'playing');
- });
-
- player.embed.on('pause', function () {
- assurePlaybackState.call(player, false);
- });
-
- player.embed.on('timeupdate', function (data) {
- player.media.seeking = false;
- currentTime = data.seconds;
- utils.dispatchEvent.call(player, player.media, 'timeupdate');
- });
-
- player.embed.on('progress', function (data) {
- player.media.buffered = data.percent;
- utils.dispatchEvent.call(player, player.media, 'progress');
-
- // Check all loaded
- if (parseInt(data.percent, 10) === 1) {
- utils.dispatchEvent.call(player, player.media, 'canplaythrough');
- }
-
- // Get duration as if we do it before load, it gives an incorrect value
- // https://github.com/sampotts/plyr/issues/891
- player.embed.getDuration().then(function (value) {
- if (value !== player.media.duration) {
- player.media.duration = value;
- utils.dispatchEvent.call(player, player.media, 'durationchange');
- }
- });
- });
-
- player.embed.on('seeked', function () {
- player.media.seeking = false;
- utils.dispatchEvent.call(player, player.media, 'seeked');
- });
-
- player.embed.on('ended', function () {
- player.media.paused = true;
- utils.dispatchEvent.call(player, player.media, 'ended');
- });
-
- player.embed.on('error', function (detail) {
- player.media.error = detail;
- utils.dispatchEvent.call(player, player.media, 'error');
- });
-
- // Rebuild UI
- setTimeout(function () {
- return ui.build.call(player);
- }, 0);
- }
-};
-
-// ==========================================================================
-
-// Standardise YouTube quality unit
-function mapQualityUnit(input) {
- switch (input) {
- case 'hd2160':
- return 2160;
-
- case 2160:
- return 'hd2160';
-
- case 'hd1440':
- return 1440;
-
- case 1440:
- return 'hd1440';
-
- case 'hd1080':
- return 1080;
-
- case 1080:
- return 'hd1080';
-
- case 'hd720':
- return 720;
-
- case 720:
- return 'hd720';
-
- case 'large':
- return 480;
-
- case 480:
- return 'large';
-
- case 'medium':
- return 360;
-
- case 360:
- return 'medium';
-
- case 'small':
- return 240;
-
- case 240:
- return 'small';
-
- default:
- return 'default';
- }
-}
-
-function mapQualityUnits(levels) {
- if (utils.is.empty(levels)) {
- return levels;
- }
-
- return utils.dedupe(levels.map(function (level) {
- return mapQualityUnit(level);
- }));
-}
-
-// Set playback state and trigger change (only on actual change)
-function assurePlaybackState$1(play) {
- if (play && !this.embed.hasPlayed) {
- this.embed.hasPlayed = true;
- }
- if (this.media.paused === play) {
- this.media.paused = !play;
- utils.dispatchEvent.call(this, this.media, play ? 'play' : 'pause');
- }
-}
-
-var youtube = {
- setup: function setup() {
- var _this = this;
-
- // Add embed class for responsive
- utils.toggleClass(this.elements.wrapper, this.config.classNames.embed, true);
-
- // Set aspect ratio
- youtube.setAspectRatio.call(this);
-
- // Setup API
- if (utils.is.object(window.YT) && utils.is.function(window.YT.Player)) {
- youtube.ready.call(this);
- } else {
- // Load the API
- utils.loadScript(this.config.urls.youtube.sdk).catch(function (error) {
- _this.debug.warn('YouTube API failed to load', error);
- });
-
- // Setup callback for the API
- // YouTube has it's own system of course...
- window.onYouTubeReadyCallbacks = window.onYouTubeReadyCallbacks || [];
-
- // Add to queue
- window.onYouTubeReadyCallbacks.push(function () {
- youtube.ready.call(_this);
- });
-
- // Set callback to process queue
- window.onYouTubeIframeAPIReady = function () {
- window.onYouTubeReadyCallbacks.forEach(function (callback) {
- callback();
- });
- };
- }
- },
-
-
- // Get the media title
- getTitle: function getTitle(videoId) {
- var _this2 = this;
-
- // Try via undocumented API method first
- // This method disappears now and then though...
- // https://github.com/sampotts/plyr/issues/709
- if (utils.is.function(this.embed.getVideoData)) {
- var _embed$getVideoData = this.embed.getVideoData(),
- title = _embed$getVideoData.title;
-
- if (utils.is.empty(title)) {
- this.config.title = title;
- ui.setTitle.call(this);
- return;
- }
- }
-
- // Or via Google API
- var key = this.config.keys.google;
- if (utils.is.string(key) && !utils.is.empty(key)) {
- var url = utils.format(this.config.urls.youtube.api, videoId, key);
-
- utils.fetch(url).then(function (result) {
- if (utils.is.object(result)) {
- _this2.config.title = result.items[0].snippet.title;
- ui.setTitle.call(_this2);
- }
- }).catch(function () {});
- }
- },
-
-
- // Set aspect ratio
- setAspectRatio: function setAspectRatio() {
- var ratio = this.config.ratio.split(':');
- this.elements.wrapper.style.paddingBottom = 100 / ratio[0] * ratio[1] + '%';
- },
-
-
- // API ready
- ready: function ready() {
- var player = this;
-
- // Ignore already setup (race condition)
- var currentId = player.media.getAttribute('id');
- if (!utils.is.empty(currentId) && currentId.startsWith('youtube-')) {
- return;
- }
-
- // Get the source URL or ID
- var source = player.media.getAttribute('src');
-
- // Get from <div> if needed
- if (utils.is.empty(source)) {
- source = player.media.getAttribute(this.config.attributes.embed.id);
- }
-
- // Replace the <iframe> with a <div> due to YouTube API issues
- var videoId = utils.parseYouTubeId(source);
- var id = utils.generateId(player.provider);
- var container = utils.createElement('div', { id: id });
- player.media = utils.replaceElement(container, player.media);
-
- // Set poster image
- var posterSrc = function posterSrc(format) {
- return 'https://img.youtube.com/vi/' + videoId + '/' + format + 'default.jpg';
- };
-
- // Check thumbnail images in order of quality, but reject fallback thumbnails (120px wide)
- utils.loadImage(posterSrc('maxres'), 121) // Higest quality and unpadded
- .catch(function () {
- return utils.loadImage(posterSrc('sd'), 121);
- }) // 480p padded 4:3
- .catch(function () {
- return utils.loadImage(posterSrc('hq'));
- }) // 360p padded 4:3. Always exists
- .then(function (image) {
- return ui.setPoster.call(player, image.src);
- }).then(function (posterSrc) {
- // If the image is padded, use background-size "cover" instead (like youtube does too with their posters)
- if (!posterSrc.includes('maxres')) {
- player.elements.poster.style.backgroundSize = 'cover';
- }
- });
-
- // Setup instance
- // https://developers.google.com/youtube/iframe_api_reference
- player.embed = new window.YT.Player(id, {
- videoId: videoId,
- playerVars: {
- autoplay: player.config.autoplay ? 1 : 0, // Autoplay
- controls: player.supported.ui ? 0 : 1, // Only show controls if not fully supported
- rel: 0, // No related vids
- showinfo: 0, // Hide info
- iv_load_policy: 3, // Hide annotations
- modestbranding: 1, // Hide logos as much as possible (they still show one in the corner when paused)
- disablekb: 1, // Disable keyboard as we handle it
- playsinline: 1, // Allow iOS inline playback
-
- // Tracking for stats
- // origin: window ? `${window.location.protocol}//${window.location.host}` : null,
- widget_referrer: window ? window.location.href : null,
-
- // Captions are flaky on YouTube
- cc_load_policy: player.captions.active ? 1 : 0,
- cc_lang_pref: player.config.captions.language
- },
- events: {
- onError: function onError(event) {
- // If we've already fired an error, don't do it again
- // YouTube fires onError twice
- if (utils.is.object(player.media.error)) {
- return;
- }
-
- var detail = {
- code: event.data
- };
-
- // Messages copied from https://developers.google.com/youtube/iframe_api_reference#onError
- switch (event.data) {
- case 2:
- detail.message = 'The request contains an invalid parameter value. For example, this error occurs if you specify a video ID that does not have 11 characters, or if the video ID contains invalid characters, such as exclamation points or asterisks.';
- break;
-
- case 5:
- detail.message = 'The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.';
- break;
-
- case 100:
- detail.message = 'The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.';
- break;
-
- case 101:
- case 150:
- detail.message = 'The owner of the requested video does not allow it to be played in embedded players.';
- break;
-
- default:
- detail.message = 'An unknown error occured';
- break;
- }
-
- player.media.error = detail;
-
- utils.dispatchEvent.call(player, player.media, 'error');
- },
- onPlaybackQualityChange: function onPlaybackQualityChange() {
- utils.dispatchEvent.call(player, player.media, 'qualitychange', false, {
- quality: player.media.quality
- });
- },
- onPlaybackRateChange: function onPlaybackRateChange(event) {
- // Get the instance
- var instance = event.target;
-
- // Get current speed
- player.media.playbackRate = instance.getPlaybackRate();
-
- utils.dispatchEvent.call(player, player.media, 'ratechange');
- },
- onReady: function onReady(event) {
- // Get the instance
- var instance = event.target;
-
- // Get the title
- youtube.getTitle.call(player, videoId);
-
- // Create a faux HTML5 API using the YouTube API
- player.media.play = function () {
- assurePlaybackState$1.call(player, true);
- instance.playVideo();
- };
-
- player.media.pause = function () {
- assurePlaybackState$1.call(player, false);
- instance.pauseVideo();
- };
-
- player.media.stop = function () {
- instance.stopVideo();
- };
-
- player.media.duration = instance.getDuration();
- player.media.paused = true;
-
- // Seeking
- player.media.currentTime = 0;
- Object.defineProperty(player.media, 'currentTime', {
- get: function get() {
- return Number(instance.getCurrentTime());
- },
- set: function set(time) {
- // If paused, mute audio preventively (YouTube starts playing on seek if the video hasn't been played yet).
- if (player.paused) {
- player.embed.mute();
- }
-
- // Set seeking state and trigger event
- player.media.seeking = true;
- utils.dispatchEvent.call(player, player.media, 'seeking');
-
- // Seek after events sent
- instance.seekTo(time);
- }
- });
-
- // Playback speed
- Object.defineProperty(player.media, 'playbackRate', {
- get: function get() {
- return instance.getPlaybackRate();
- },
- set: function set(input) {
- instance.setPlaybackRate(input);
- }
- });
-
- // Quality
- Object.defineProperty(player.media, 'quality', {
- get: function get() {
- return mapQualityUnit(instance.getPlaybackQuality());
- },
- set: function set(input) {
- var quality = input;
-
- // Set via API
- instance.setPlaybackQuality(mapQualityUnit(quality));
-
- // Trigger request event
- utils.dispatchEvent.call(player, player.media, 'qualityrequested', false, {
- quality: quality
- });
- }
- });
-
- // Volume
- var volume = player.config.volume;
-
- Object.defineProperty(player.media, 'volume', {
- get: function get() {
- return volume;
- },
- set: function set(input) {
- volume = input;
- instance.setVolume(volume * 100);
- utils.dispatchEvent.call(player, player.media, 'volumechange');
- }
- });
-
- // Muted
- var muted = player.config.muted;
-
- Object.defineProperty(player.media, 'muted', {
- get: function get() {
- return muted;
- },
- set: function set(input) {
- var toggle = utils.is.boolean(input) ? input : muted;
- muted = toggle;
- instance[toggle ? 'mute' : 'unMute']();
- utils.dispatchEvent.call(player, player.media, 'volumechange');
- }
- });
-
- // Source
- Object.defineProperty(player.media, 'currentSrc', {
- get: function get() {
- return instance.getVideoUrl();
- }
- });
-
- // Ended
- Object.defineProperty(player.media, 'ended', {
- get: function get() {
- return player.currentTime === player.duration;
- }
- });
-
- // Get available speeds
- player.options.speed = instance.getAvailablePlaybackRates();
-
- // Set the tabindex to avoid focus entering iframe
- if (player.supported.ui) {
- player.media.setAttribute('tabindex', -1);
- }
-
- utils.dispatchEvent.call(player, player.media, 'timeupdate');
- utils.dispatchEvent.call(player, player.media, 'durationchange');
-
- // Reset timer
- clearInterval(player.timers.buffering);
-
- // Setup buffering
- player.timers.buffering = setInterval(function () {
- // Get loaded % from YouTube
- player.media.buffered = instance.getVideoLoadedFraction();
-
- // Trigger progress only when we actually buffer something
- if (player.media.lastBuffered === null || player.media.lastBuffered < player.media.buffered) {
- utils.dispatchEvent.call(player, player.media, 'progress');
- }
-
- // Set last buffer point
- player.media.lastBuffered = player.media.buffered;
-
- // Bail if we're at 100%
- if (player.media.buffered === 1) {
- clearInterval(player.timers.buffering);
-
- // Trigger event
- utils.dispatchEvent.call(player, player.media, 'canplaythrough');
- }
- }, 200);
-
- // Rebuild UI
- setTimeout(function () {
- return ui.build.call(player);
- }, 50);
- },
- onStateChange: function onStateChange(event) {
- // Get the instance
- var instance = event.target;
-
- // Reset timer
- clearInterval(player.timers.playing);
-
- var seeked = player.media.seeking && [1, 2].includes(event.data);
-
- if (seeked) {
- // Unset seeking and fire seeked event
- player.media.seeking = false;
- utils.dispatchEvent.call(player, player.media, 'seeked');
- }
-
- // Handle events
- // -1 Unstarted
- // 0 Ended
- // 1 Playing
- // 2 Paused
- // 3 Buffering
- // 5 Video cued
- switch (event.data) {
- case -1:
- // Update scrubber
- utils.dispatchEvent.call(player, player.media, 'timeupdate');
-
- // Get loaded % from YouTube
- player.media.buffered = instance.getVideoLoadedFraction();
- utils.dispatchEvent.call(player, player.media, 'progress');
-
- break;
-
- case 0:
- assurePlaybackState$1.call(player, false);
-
- // YouTube doesn't support loop for a single video, so mimick it.
- if (player.media.loop) {
- // YouTube needs a call to `stopVideo` before playing again
- instance.stopVideo();
- instance.playVideo();
- } else {
- utils.dispatchEvent.call(player, player.media, 'ended');
- }
-
- break;
-
- case 1:
- // Restore paused state (YouTube starts playing on seek if the video hasn't been played yet)
- if (player.media.paused && !player.embed.hasPlayed) {
- player.media.pause();
- } else {
- assurePlaybackState$1.call(player, true);
-
- utils.dispatchEvent.call(player, player.media, 'playing');
-
- // Poll to get playback progress
- player.timers.playing = setInterval(function () {
- utils.dispatchEvent.call(player, player.media, 'timeupdate');
- }, 50);
-
- // Check duration again due to YouTube bug
- // https://github.com/sampotts/plyr/issues/374
- // https://code.google.com/p/gdata-issues/issues/detail?id=8690
- if (player.media.duration !== instance.getDuration()) {
- player.media.duration = instance.getDuration();
- utils.dispatchEvent.call(player, player.media, 'durationchange');
- }
-
- // Get quality
- controls.setQualityMenu.call(player, mapQualityUnits(instance.getAvailableQualityLevels()));
- }
-
- break;
-
- case 2:
- // Restore audio (YouTube starts playing on seek if the video hasn't been played yet)
- if (!player.muted) {
- player.embed.unMute();
- }
- assurePlaybackState$1.call(player, false);
-
- break;
-
- default:
- break;
- }
-
- utils.dispatchEvent.call(player, player.elements.container, 'statechange', false, {
- code: event.data
- });
- }
- }
- });
- }
-};
-
-// ==========================================================================
-
-var media = {
- // Setup media
- setup: function setup() {
- // If there's no media, bail
- if (!this.media) {
- this.debug.warn('No media element found!');
- return;
- }
-
- // Add type class
- utils.toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', this.type), true);
-
- // Add provider class
- utils.toggleClass(this.elements.container, this.config.classNames.provider.replace('{0}', this.provider), true);
-
- // Add video class for embeds
- // This will require changes if audio embeds are added
- if (this.isEmbed) {
- utils.toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', 'video'), true);
- }
-
- // Inject the player wrapper
- if (this.isVideo) {
- // Create the wrapper div
- this.elements.wrapper = utils.createElement('div', {
- class: this.config.classNames.video
- });
-
- // Wrap the video in a container
- utils.wrap(this.media, this.elements.wrapper);
-
- // Faux poster container
- this.elements.poster = utils.createElement('div', {
- class: this.config.classNames.poster
- });
-
- this.elements.wrapper.appendChild(this.elements.poster);
- }
-
- if (this.isEmbed) {
- switch (this.provider) {
- case 'youtube':
- youtube.setup.call(this);
- break;
-
- case 'vimeo':
- vimeo.setup.call(this);
- break;
-
- default:
- break;
- }
- } else if (this.isHTML5) {
- html5.extend.call(this);
- }
- }
-};
-
-// ==========================================================================
-
-var Ads = function () {
- /**
- * Ads constructor.
- * @param {object} player
- * @return {Ads}
- */
- function Ads(player) {
- var _this = this;
-
- classCallCheck(this, Ads);
-
- this.player = player;
- this.publisherId = player.config.ads.publisherId;
- this.playing = false;
- this.initialized = false;
- this.elements = {
- container: null,
- displayContainer: null
- };
- this.manager = null;
- this.loader = null;
- this.cuePoints = null;
- this.events = {};
- this.safetyTimer = null;
- this.countdownTimer = null;
-
- // Setup a promise to resolve when the IMA manager is ready
- this.managerPromise = new Promise(function (resolve, reject) {
- // The ad is loaded and ready
- _this.on('loaded', resolve);
-
- // Ads failed
- _this.on('error', reject);
- });
-
- this.load();
- }
-
- createClass(Ads, [{
- key: 'load',
-
-
- /**
- * Load the IMA SDK
- */
- value: function load() {
- var _this2 = this;
-
- if (this.enabled) {
- // Check if the Google IMA3 SDK is loaded or load it ourselves
- if (!utils.is.object(window.google) || !utils.is.object(window.google.ima)) {
- utils.loadScript(this.player.config.urls.googleIMA.sdk).then(function () {
- _this2.ready();
- }).catch(function () {
- // Script failed to load or is blocked
- _this2.trigger('error', new Error('Google IMA SDK failed to load'));
- });
- } else {
- this.ready();
- }
- }
- }
-
- /**
- * Get the ads instance ready
- */
-
- }, {
- key: 'ready',
- value: function ready() {
- var _this3 = this;
-
- // Start ticking our safety timer. If the whole advertisement
- // thing doesn't resolve within our set time; we bail
- this.startSafetyTimer(12000, 'ready()');
-
- // Clear the safety timer
- this.managerPromise.then(function () {
- _this3.clearSafetyTimer('onAdsManagerLoaded()');
- });
-
- // Set listeners on the Plyr instance
- this.listeners();
-
- // Setup the IMA SDK
- this.setupIMA();
- }
-
- // Build the default tag URL
-
- }, {
- key: 'setupIMA',
-
-
- /**
- * In order for the SDK to display ads for our video, we need to tell it where to put them,
- * so here we define our ad container. This div is set up to render on top of the video player.
- * Using the code below, we tell the SDK to render ads within that div. We also provide a
- * handle to the content video player - the SDK will poll the current time of our player to
- * properly place mid-rolls. After we create the ad display container, we initialize it. On
- * mobile devices, this initialization is done as the result of a user action.
- */
- value: function setupIMA() {
- // Create the container for our advertisements
- this.elements.container = utils.createElement('div', {
- class: this.player.config.classNames.ads
- });
- this.player.elements.container.appendChild(this.elements.container);
-
- // So we can run VPAID2
- google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED);
-
- // Set language
- google.ima.settings.setLocale(this.player.config.ads.language);
-
- // We assume the adContainer is the video container of the plyr element
- // that will house the ads
- this.elements.displayContainer = new google.ima.AdDisplayContainer(this.elements.container);
-
- // Request video ads to be pre-loaded
- this.requestAds();
- }
-
- /**
- * Request advertisements
- */
-
- }, {
- key: 'requestAds',
- value: function requestAds() {
- var _this4 = this;
-
- var container = this.player.elements.container;
-
-
- try {
- // Create ads loader
- this.loader = new google.ima.AdsLoader(this.elements.displayContainer);
-
- // Listen and respond to ads loaded and error events
- this.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, function (event) {
- return _this4.onAdsManagerLoaded(event);
- }, false);
- this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) {
- return _this4.onAdError(error);
- }, false);
-
- // Request video ads
- var request = new google.ima.AdsRequest();
- request.adTagUrl = this.tagUrl;
-
- // Specify the linear and nonlinear slot sizes. This helps the SDK
- // to select the correct creative if multiple are returned
- request.linearAdSlotWidth = container.offsetWidth;
- request.linearAdSlotHeight = container.offsetHeight;
- request.nonLinearAdSlotWidth = container.offsetWidth;
- request.nonLinearAdSlotHeight = container.offsetHeight;
-
- // We only overlay ads as we only support video.
- request.forceNonLinearFullSlot = false;
-
- // Mute based on current state
- request.setAdWillPlayMuted(!this.player.muted);
-
- this.loader.requestAds(request);
- } catch (e) {
- this.onAdError(e);
- }
- }
-
- /**
- * Update the ad countdown
- * @param {boolean} start
- */
-
- }, {
- key: 'pollCountdown',
- value: function pollCountdown() {
- var _this5 = this;
-
- var start = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
-
- if (!start) {
- clearInterval(this.countdownTimer);
- this.elements.container.removeAttribute('data-badge-text');
- return;
- }
-
- var update = function update() {
- var time = utils.formatTime(Math.max(_this5.manager.getRemainingTime(), 0));
- var label = i18n.get('advertisement', _this5.player.config) + ' - ' + time;
- _this5.elements.container.setAttribute('data-badge-text', label);
- };
-
- this.countdownTimer = setInterval(update, 100);
- }
-
- /**
- * This method is called whenever the ads are ready inside the AdDisplayContainer
- * @param {Event} adsManagerLoadedEvent
- */
-
- }, {
- key: 'onAdsManagerLoaded',
- value: function onAdsManagerLoaded(event) {
- var _this6 = this;
-
- // Get the ads manager
- var settings = new google.ima.AdsRenderingSettings();
-
- // Tell the SDK to save and restore content video state on our behalf
- settings.restoreCustomPlaybackStateOnAdBreakComplete = true;
- settings.enablePreloading = true;
-
- // The SDK is polling currentTime on the contentPlayback. And needs a duration
- // so it can determine when to start the mid- and post-roll
- this.manager = event.getAdsManager(this.player, settings);
-
- // Get the cue points for any mid-rolls by filtering out the pre- and post-roll
- this.cuePoints = this.manager.getCuePoints();
-
- // Add advertisement cue's within the time line if available
- if (!utils.is.empty(this.cuePoints)) {
- this.cuePoints.forEach(function (cuePoint) {
- if (cuePoint !== 0 && cuePoint !== -1 && cuePoint < _this6.player.duration) {
- var seekElement = _this6.player.elements.progress;
-
- if (utils.is.element(seekElement)) {
- var cuePercentage = 100 / _this6.player.duration * cuePoint;
- var cue = utils.createElement('span', {
- class: _this6.player.config.classNames.cues
- });
-
- cue.style.left = cuePercentage.toString() + '%';
- seekElement.appendChild(cue);
- }
- }
- });
- }
-
- // Get skippable state
- // TODO: Skip button
- // this.player.debug.warn(this.manager.getAdSkippableState());
-
- // Set volume to match player
- this.manager.setVolume(this.player.volume);
-
- // Add listeners to the required events
- // Advertisement error events
- this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) {
- return _this6.onAdError(error);
- });
-
- // Advertisement regular events
- Object.keys(google.ima.AdEvent.Type).forEach(function (type) {
- _this6.manager.addEventListener(google.ima.AdEvent.Type[type], function (event) {
- return _this6.onAdEvent(event);
- });
- });
-
- // Resolve our adsManager
- this.trigger('loaded');
- }
-
- /**
- * This is where all the event handling takes place. Retrieve the ad from the event. Some
- * events (e.g. ALL_ADS_COMPLETED) don't have the ad object associated
- * https://developers.google.com/interactive-media-ads/docs/sdks/html5/v3/apis#ima.AdEvent.Type
- * @param {Event} event
- */
-
- }, {
- key: 'onAdEvent',
- value: function onAdEvent(event) {
- var _this7 = this;
-
- var container = this.player.elements.container;
-
- // Retrieve the ad from the event. Some events (e.g. ALL_ADS_COMPLETED)
- // don't have ad object associated
-
- var ad = event.getAd();
-
- // Proxy event
- var dispatchEvent = function dispatchEvent(type) {
- var event = 'ads' + type.replace(/_/g, '').toLowerCase();
- utils.dispatchEvent.call(_this7.player, _this7.player.media, event);
- };
-
- switch (event.type) {
- case google.ima.AdEvent.Type.LOADED:
- // This is the first event sent for an ad - it is possible to determine whether the
- // ad is a video ad or an overlay
- this.trigger('loaded');
-
- // Bubble event
- dispatchEvent(event.type);
-
- // Start countdown
- this.pollCountdown(true);
-
- if (!ad.isLinear()) {
- // Position AdDisplayContainer correctly for overlay
- ad.width = container.offsetWidth;
- ad.height = container.offsetHeight;
- }
-
- // console.info('Ad type: ' + event.getAd().getAdPodInfo().getPodIndex());
- // console.info('Ad time: ' + event.getAd().getAdPodInfo().getTimeOffset());
- break;
-
- case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:
- // All ads for the current videos are done. We can now request new advertisements
- // in case the video is re-played
-
- // Fire event
- dispatchEvent(event.type);
-
- // TODO: Example for what happens when a next video in a playlist would be loaded.
- // So here we load a new video when all ads are done.
- // Then we load new ads within a new adsManager. When the video
- // Is started - after - the ads are loaded, then we get ads.
- // You can also easily test cancelling and reloading by running
- // player.ads.cancel() and player.ads.play from the console I guess.
- // this.player.source = {
- // type: 'video',
- // title: 'View From A Blue Moon',
- // sources: [{
- // src:
- // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.mp4', type:
- // 'video/mp4', }], poster:
- // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg', tracks:
- // [ { kind: 'captions', label: 'English', srclang: 'en', src:
- // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt',
- // default: true, }, { kind: 'captions', label: 'French', srclang: 'fr', src:
- // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt', }, ],
- // };
-
- // TODO: So there is still this thing where a video should only be allowed to start
- // playing when the IMA SDK is ready or has failed
-
- this.loadAds();
- break;
-
- case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:
- // This event indicates the ad has started - the video player can adjust the UI,
- // for example display a pause button and remaining time. Fired when content should
- // be paused. This usually happens right before an ad is about to cover the content
-
- dispatchEvent(event.type);
-
- this.pauseContent();
-
- break;
-
- case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:
- // This event indicates the ad has finished - the video player can perform
- // appropriate UI actions, such as removing the timer for remaining time detection.
- // Fired when content should be resumed. This usually happens when an ad finishes
- // or collapses
-
- dispatchEvent(event.type);
-
- this.pollCountdown();
-
- this.resumeContent();
-
- break;
-
- case google.ima.AdEvent.Type.STARTED:
- case google.ima.AdEvent.Type.MIDPOINT:
- case google.ima.AdEvent.Type.COMPLETE:
- case google.ima.AdEvent.Type.IMPRESSION:
- case google.ima.AdEvent.Type.CLICK:
- dispatchEvent(event.type);
- break;
-
- default:
- break;
- }
- }
-
- /**
- * Any ad error handling comes through here
- * @param {Event} event
- */
-
- }, {
- key: 'onAdError',
- value: function onAdError(event) {
- this.cancel();
- this.player.debug.warn('Ads error', event);
- }
-
- /**
- * Setup hooks for Plyr and window events. This ensures
- * the mid- and post-roll launch at the correct time. And
- * resize the advertisement when the player resizes
- */
-
- }, {
- key: 'listeners',
- value: function listeners() {
- var _this8 = this;
-
- var container = this.player.elements.container;
-
- var time = void 0;
-
- // Add listeners to the required events
- this.player.on('ended', function () {
- _this8.loader.contentComplete();
- });
-
- this.player.on('seeking', function () {
- time = _this8.player.currentTime;
- return time;
- });
-
- this.player.on('seeked', function () {
- var seekedTime = _this8.player.currentTime;
-
- if (utils.is.empty(_this8.cuePoints)) {
- return;
- }
-
- _this8.cuePoints.forEach(function (cuePoint, index) {
- if (time < cuePoint && cuePoint < seekedTime) {
- _this8.manager.discardAdBreak();
- _this8.cuePoints.splice(index, 1);
- }
- });
- });
-
- // Listen to the resizing of the window. And resize ad accordingly
- // TODO: eventually implement ResizeObserver
- window.addEventListener('resize', function () {
- if (_this8.manager) {
- _this8.manager.resize(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);
- }
- });
- }
-
- /**
- * Initialize the adsManager and start playing advertisements
- */
-
- }, {
- key: 'play',
- value: function play() {
- var _this9 = this;
-
- var container = this.player.elements.container;
-
-
- if (!this.managerPromise) {
- this.resumeContent();
- }
-
- // Play the requested advertisement whenever the adsManager is ready
- this.managerPromise.then(function () {
- // Initialize the container. Must be done via a user action on mobile devices
- _this9.elements.displayContainer.initialize();
-
- try {
- if (!_this9.initialized) {
- // Initialize the ads manager. Ad rules playlist will start at this time
- _this9.manager.init(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);
-
- // Call play to start showing the ad. Single video and overlay ads will
- // start at this time; the call will be ignored for ad rules
- _this9.manager.start();
- }
-
- _this9.initialized = true;
- } catch (adError) {
- // An error may be thrown if there was a problem with the
- // VAST response
- _this9.onAdError(adError);
- }
- }).catch(function () {});
- }
-
- /**
- * Resume our video
- */
-
- }, {
- key: 'resumeContent',
- value: function resumeContent() {
- // Hide the advertisement container
- this.elements.container.style.zIndex = '';
-
- // Ad is stopped
- this.playing = false;
-
- // Play our video
- if (this.player.currentTime < this.player.duration) {
- this.player.play();
- }
- }
-
- /**
- * Pause our video
- */
-
- }, {
- key: 'pauseContent',
- value: function pauseContent() {
- // Show the advertisement container
- this.elements.container.style.zIndex = 3;
-
- // Ad is playing.
- this.playing = true;
-
- // Pause our video.
- this.player.pause();
- }
-
- /**
- * Destroy the adsManager so we can grab new ads after this. If we don't then we're not
- * allowed to call new ads based on google policies, as they interpret this as an accidental
- * video requests. https://developers.google.com/interactive-
- * media-ads/docs/sdks/android/faq#8
- */
-
- }, {
- key: 'cancel',
- value: function cancel() {
- // Pause our video
- if (this.initialized) {
- this.resumeContent();
- }
-
- // Tell our instance that we're done for now
- this.trigger('error');
-
- // Re-create our adsManager
- this.loadAds();
- }
-
- /**
- * Re-create our adsManager
- */
-
- }, {
- key: 'loadAds',
- value: function loadAds() {
- var _this10 = this;
-
- // Tell our adsManager to go bye bye
- this.managerPromise.then(function () {
- // Destroy our adsManager
- if (_this10.manager) {
- _this10.manager.destroy();
- }
-
- // Re-set our adsManager promises
- _this10.managerPromise = new Promise(function (resolve) {
- _this10.on('loaded', resolve);
- _this10.player.debug.log(_this10.manager);
- });
-
- // Now request some new advertisements
- _this10.requestAds();
- }).catch(function () {});
- }
-
- /**
- * Handles callbacks after an ad event was invoked
- * @param {string} event - Event type
- */
-
- }, {
- key: 'trigger',
- value: function trigger(event) {
- var _this11 = this;
-
- for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
- args[_key - 1] = arguments[_key];
- }
-
- var handlers = this.events[event];
-
- if (utils.is.array(handlers)) {
- handlers.forEach(function (handler) {
- if (utils.is.function(handler)) {
- handler.apply(_this11, args);
- }
- });
- }
- }
-
- /**
- * Add event listeners
- * @param {string} event - Event type
- * @param {function} callback - Callback for when event occurs
- * @return {Ads}
- */
-
- }, {
- key: 'on',
- value: function on(event, callback) {
- if (!utils.is.array(this.events[event])) {
- this.events[event] = [];
- }
-
- this.events[event].push(callback);
-
- return this;
- }
-
- /**
- * Setup a safety timer for when the ad network doesn't respond for whatever reason.
- * The advertisement has 12 seconds to get its things together. We stop this timer when the
- * advertisement is playing, or when a user action is required to start, then we clear the
- * timer on ad ready
- * @param {number} time
- * @param {string} from
- */
-
- }, {
- key: 'startSafetyTimer',
- value: function startSafetyTimer(time, from) {
- var _this12 = this;
-
- this.player.debug.log('Safety timer invoked from: ' + from);
-
- this.safetyTimer = setTimeout(function () {
- _this12.cancel();
- _this12.clearSafetyTimer('startSafetyTimer()');
- }, time);
- }
-
- /**
- * Clear our safety timer(s)
- * @param {string} from
- */
-
- }, {
- key: 'clearSafetyTimer',
- value: function clearSafetyTimer(from) {
- if (!utils.is.nullOrUndefined(this.safetyTimer)) {
- this.player.debug.log('Safety timer cleared from: ' + from);
-
- clearTimeout(this.safetyTimer);
- this.safetyTimer = null;
- }
- }
- }, {
- key: 'enabled',
- get: function get() {
- return this.player.isVideo && this.player.config.ads.enabled && !utils.is.empty(this.publisherId);
- }
- }, {
- key: 'tagUrl',
- get: function get() {
- var params = {
- AV_PUBLISHERID: '58c25bb0073ef448b1087ad6',
- AV_CHANNELID: '5a0458dc28a06145e4519d21',
- AV_URL: location.hostname,
- cb: Date.now(),
- AV_WIDTH: 640,
- AV_HEIGHT: 480,
- AV_CDIM2: this.publisherId
- };
-
- var base = 'https://go.aniview.com/api/adserver6/vast/';
-
- return base + '?' + utils.buildUrlParams(params);
- }
- }]);
- return Ads;
-}();
-
-// ==========================================================================
-
-var source = {
- // Add elements to HTML5 media (source, tracks, etc)
- insertElements: function insertElements(type, attributes) {
- var _this = this;
-
- if (utils.is.string(attributes)) {
- utils.insertElement(type, this.media, {
- src: attributes
- });
- } else if (utils.is.array(attributes)) {
- attributes.forEach(function (attribute) {
- utils.insertElement(type, _this.media, attribute);
- });
- }
- },
-
-
- // Update source
- // Sources are not checked for support so be careful
- change: function change(input) {
- var _this2 = this;
-
- if (!utils.is.object(input) || !('sources' in input) || !input.sources.length) {
- this.debug.warn('Invalid source format');
- return;
- }
-
- // Cancel current network requests
- html5.cancelRequests.call(this);
-
- // Destroy instance and re-setup
- this.destroy.call(this, function () {
- // Reset quality options
- _this2.options.quality = [];
-
- // Remove elements
- utils.removeElement(_this2.media);
- _this2.media = null;
-
- // Reset class name
- if (utils.is.element(_this2.elements.container)) {
- _this2.elements.container.removeAttribute('class');
- }
-
- // Set the type and provider
- _this2.type = input.type;
- _this2.provider = !utils.is.empty(input.sources[0].provider) ? input.sources[0].provider : providers.html5;
-
- // Check for support
- _this2.supported = support.check(_this2.type, _this2.provider, _this2.config.playsinline);
-
- // Create new markup
- switch (_this2.provider + ':' + _this2.type) {
- case 'html5:video':
- _this2.media = utils.createElement('video');
- break;
-
- case 'html5:audio':
- _this2.media = utils.createElement('audio');
- break;
-
- case 'youtube:video':
- case 'vimeo:video':
- _this2.media = utils.createElement('div', {
- src: input.sources[0].src
- });
- break;
-
- default:
- break;
- }
-
- // Inject the new element
- _this2.elements.container.appendChild(_this2.media);
-
- // Autoplay the new source?
- if (utils.is.boolean(input.autoplay)) {
- _this2.config.autoplay = input.autoplay;
- }
-
- // Set attributes for audio and video
- if (_this2.isHTML5) {
- if (_this2.config.crossorigin) {
- _this2.media.setAttribute('crossorigin', '');
- }
- if (_this2.config.autoplay) {
- _this2.media.setAttribute('autoplay', '');
- }
- if (!utils.is.empty(input.poster)) {
- _this2.poster = input.poster;
- }
- if (_this2.config.loop.active) {
- _this2.media.setAttribute('loop', '');
- }
- if (_this2.config.muted) {
- _this2.media.setAttribute('muted', '');
- }
- if (_this2.config.playsinline) {
- _this2.media.setAttribute('playsinline', '');
- }
- }
-
- // Restore class hook
- ui.addStyleHook.call(_this2);
-
- // Set new sources for html5
- if (_this2.isHTML5) {
- source.insertElements.call(_this2, 'source', input.sources);
- }
-
- // Set video title
- _this2.config.title = input.title;
-
- // Set up from scratch
- media.setup.call(_this2);
-
- // HTML5 stuff
- if (_this2.isHTML5) {
- // Setup captions
- if ('tracks' in input) {
- source.insertElements.call(_this2, 'track', input.tracks);
- }
-
- // Load HTML5 sources
- _this2.media.load();
- }
-
- // If HTML5 or embed but not fully supported, setupInterface and call ready now
- if (_this2.isHTML5 || _this2.isEmbed && !_this2.supported.ui) {
- // Setup interface
- ui.build.call(_this2);
- }
-
- // Update the fullscreen support
- _this2.fullscreen.update();
- }, true);
- }
-};
-
-// ==========================================================================
-
-// Private properties
-// TODO: Use a WeakMap for private globals
-// const globals = new WeakMap();
-
-// Plyr instance
-
-var Plyr = function () {
- function Plyr(target, options) {
- var _this = this;
-
- classCallCheck(this, Plyr);
-
- this.timers = {};
-
- // State
- this.ready = false;
- this.loading = false;
- this.failed = false;
-
- // Touch device
- this.touch = support.touch;
-
- // Set the media element
- this.media = target;
-
- // String selector passed
- if (utils.is.string(this.media)) {
- this.media = document.querySelectorAll(this.media);
- }
-
- // jQuery, NodeList or Array passed, use first element
- if (window.jQuery && this.media instanceof jQuery || utils.is.nodeList(this.media) || utils.is.array(this.media)) {
- // eslint-disable-next-line
- this.media = this.media[0];
- }
-
- // Set config
- this.config = utils.extend({}, defaults$1, Plyr.defaults, options || {}, function () {
- try {
- return JSON.parse(_this.media.getAttribute('data-plyr-config'));
- } catch (e) {
- return {};
- }
- }());
-
- // Elements cache
- this.elements = {
- container: null,
- buttons: {},
- display: {},
- progress: {},
- inputs: {},
- settings: {
- menu: null,
- panes: {},
- tabs: {}
- },
- captions: null
- };
-
- // Captions
- this.captions = {
- active: null,
- currentTrack: -1,
- meta: new WeakMap()
- };
-
- // Fullscreen
- this.fullscreen = {
- active: false
- };
-
- // Options
- this.options = {
- speed: [],
- quality: []
- };
-
- // Debugging
- // TODO: move to globals
- this.debug = new Console(this.config.debug);
-
- // Log config options and support
- this.debug.log('Config', this.config);
- this.debug.log('Support', support);
-
- // We need an element to setup
- if (utils.is.nullOrUndefined(this.media) || !utils.is.element(this.media)) {
- this.debug.error('Setup failed: no suitable element passed');
- return;
- }
-
- // Bail if the element is initialized
- if (this.media.plyr) {
- this.debug.warn('Target already setup');
- return;
- }
-
- // Bail if not enabled
- if (!this.config.enabled) {
- this.debug.error('Setup failed: disabled by config');
- return;
- }
-
- // Bail if disabled or no basic support
- // You may want to disable certain UAs etc
- if (!support.check().api) {
- this.debug.error('Setup failed: no support');
- return;
- }
-
- // Cache original element state for .destroy()
- var clone = this.media.cloneNode(true);
- clone.autoplay = false;
- this.elements.original = clone;
-
- // Set media type based on tag or data attribute
- // Supported: video, audio, vimeo, youtube
- var type = this.media.tagName.toLowerCase();
-
- // Embed properties
- var iframe = null;
- var url = null;
- var params = null;
-
- // Different setup based on type
- switch (type) {
- case 'div':
- // Find the frame
- iframe = this.media.querySelector('iframe');
-
- // <iframe> type
- if (utils.is.element(iframe)) {
- // Detect provider
- url = iframe.getAttribute('src');
- this.provider = utils.getProviderByUrl(url);
-
- // Rework elements
- this.elements.container = this.media;
- this.media = iframe;
-
- // Reset classname
- this.elements.container.className = '';
-
- // Get attributes from URL and set config
- params = utils.getUrlParams(url);
- if (!utils.is.empty(params)) {
- var truthy = ['1', 'true'];
-
- if (truthy.includes(params.autoplay)) {
- this.config.autoplay = true;
- }
- if (truthy.includes(params.loop)) {
- this.config.loop.active = true;
- }
-
- // TODO: replace fullscreen.iosNative with this playsinline config option
- // YouTube requires the playsinline in the URL
- if (this.isYouTube) {
- this.config.playsinline = truthy.includes(params.playsinline);
- } else {
- this.config.playsinline = true;
- }
- }
- } else {
- // <div> with attributes
- this.provider = this.media.getAttribute(this.config.attributes.embed.provider);
-
- // Remove attribute
- this.media.removeAttribute(this.config.attributes.embed.provider);
- }
-
- // Unsupported or missing provider
- if (utils.is.empty(this.provider) || !Object.keys(providers).includes(this.provider)) {
- this.debug.error('Setup failed: Invalid provider');
- return;
- }
-
- // Audio will come later for external providers
- this.type = types.video;
-
- break;
-
- case 'video':
- case 'audio':
- this.type = type;
- this.provider = providers.html5;
-
- // Get config from attributes
- if (this.media.hasAttribute('crossorigin')) {
- this.config.crossorigin = true;
- }
- if (this.media.hasAttribute('autoplay')) {
- this.config.autoplay = true;
- }
- if (this.media.hasAttribute('playsinline')) {
- this.config.playsinline = true;
- }
- if (this.media.hasAttribute('muted')) {
- this.config.muted = true;
- }
- if (this.media.hasAttribute('loop')) {
- this.config.loop.active = true;
- }
-
- break;
-
- default:
- this.debug.error('Setup failed: unsupported type');
- return;
- }
-
- // Check for support again but with type
- this.supported = support.check(this.type, this.provider, this.config.playsinline);
-
- // If no support for even API, bail
- if (!this.supported.api) {
- this.debug.error('Setup failed: no support');
- return;
- }
-
- // Create listeners
- this.listeners = new Listeners(this);
-
- // Setup local storage for user settings
- this.storage = new Storage(this);
-
- // Store reference
- this.media.plyr = this;
-
- // Wrap media
- if (!utils.is.element(this.elements.container)) {
- this.elements.container = utils.createElement('div');
- utils.wrap(this.media, this.elements.container);
- }
-
- // Add style hook
- ui.addStyleHook.call(this);
-
- // Setup media
- media.setup.call(this);
-
- // Listen for events if debugging
- if (this.config.debug) {
- utils.on(this.elements.container, this.config.events.join(' '), function (event) {
- _this.debug.log('event: ' + event.type);
- });
- }
-
- // Setup interface
- // If embed but not fully supported, build interface now to avoid flash of controls
- if (this.isHTML5 || this.isEmbed && !this.supported.ui) {
- ui.build.call(this);
- }
-
- // Container listeners
- this.listeners.container();
-
- // Global listeners
- this.listeners.global();
-
- // Setup fullscreen
- this.fullscreen = new Fullscreen(this);
-
- // Setup ads if provided
- this.ads = new Ads(this);
-
- // Autoplay if required
- if (this.config.autoplay) {
- this.play();
- }
- }
-
- // ---------------------------------------
- // API
- // ---------------------------------------
-
- /**
- * Types and provider helpers
- */
-
-
- createClass(Plyr, [{
- key: 'play',
-
-
- /**
- * Play the media, or play the advertisement (if they are not blocked)
- */
- value: function play() {
- if (!utils.is.function(this.media.play)) {
- return null;
- }
-
- // Return the promise (for HTML5)
- return this.media.play();
- }
-
- /**
- * Pause the media
- */
-
- }, {
- key: 'pause',
- value: function pause() {
- if (!this.playing || !utils.is.function(this.media.pause)) {
- return;
- }
-
- this.media.pause();
- }
-
- /**
- * Get playing state
- */
-
- }, {
- key: 'togglePlay',
-
-
- /**
- * Toggle playback based on current status
- * @param {boolean} input
- */
- value: function togglePlay(input) {
- // Toggle based on current state if nothing passed
- var toggle = utils.is.boolean(input) ? input : !this.playing;
-
- if (toggle) {
- this.play();
- } else {
- this.pause();
- }
- }
-
- /**
- * Stop playback
- */
-
- }, {
- key: 'stop',
- value: function stop() {
- if (this.isHTML5) {
- this.pause();
- this.restart();
- } else if (utils.is.function(this.media.stop)) {
- this.media.stop();
- }
- }
-
- /**
- * Restart playback
- */
-
- }, {
- key: 'restart',
- value: function restart() {
- this.currentTime = 0;
- }
-
- /**
- * Rewind
- * @param {number} seekTime - how far to rewind in seconds. Defaults to the config.seekTime
- */
-
- }, {
- key: 'rewind',
- value: function rewind(seekTime) {
- this.currentTime = this.currentTime - (utils.is.number(seekTime) ? seekTime : this.config.seekTime);
- }
-
- /**
- * Fast forward
- * @param {number} seekTime - how far to fast forward in seconds. Defaults to the config.seekTime
- */
-
- }, {
- key: 'forward',
- value: function forward(seekTime) {
- this.currentTime = this.currentTime + (utils.is.number(seekTime) ? seekTime : this.config.seekTime);
- }
-
- /**
- * Seek to a time
- * @param {number} input - where to seek to in seconds. Defaults to 0 (the start)
- */
-
- }, {
- key: 'increaseVolume',
-
-
- /**
- * Increase volume
- * @param {boolean} step - How much to decrease by (between 0 and 1)
- */
- value: function increaseVolume(step) {
- var volume = this.media.muted ? 0 : this.volume;
- this.volume = volume + (utils.is.number(step) ? step : 1);
- }
-
- /**
- * Decrease volume
- * @param {boolean} step - How much to decrease by (between 0 and 1)
- */
-
- }, {
- key: 'decreaseVolume',
- value: function decreaseVolume(step) {
- var volume = this.media.muted ? 0 : this.volume;
- this.volume = volume - (utils.is.number(step) ? step : 1);
- }
-
- /**
- * Set muted state
- * @param {boolean} mute
- */
-
- }, {
- key: 'toggleCaptions',
-
-
- /**
- * Toggle captions
- * @param {boolean} input - Whether to enable captions
- */
- value: function toggleCaptions(input) {
- // If there's no full support
- if (!this.supported.ui) {
- return;
- }
-
- // If the method is called without parameter, toggle based on current value
- var active = utils.is.boolean(input) ? input : !this.elements.container.classList.contains(this.config.classNames.captions.active);
-
- // Toggle state
- this.elements.buttons.captions.pressed = active;
-
- // Add class hook
- utils.toggleClass(this.elements.container, this.config.classNames.captions.active, active);
-
- // Update state and trigger event
- if (active !== this.captions.active) {
- this.captions.active = active;
- utils.dispatchEvent.call(this, this.media, this.captions.active ? 'captionsenabled' : 'captionsdisabled');
- }
- }
-
- /**
- * Set the caption track by index
- * @param {number} - Caption index
- */
-
- }, {
- key: 'airplay',
-
-
- /**
- * Trigger the airplay dialog
- * TODO: update player with state, support, enabled
- */
- value: function airplay() {
- // Show dialog if supported
- if (support.airplay) {
- this.media.webkitShowPlaybackTargetPicker();
- }
- }
-
- /**
- * Toggle the player controls
- * @param {boolean} [toggle] - Whether to show the controls
- */
-
- }, {
- key: 'toggleControls',
- value: function toggleControls(toggle) {
- // Don't toggle if missing UI support or if it's audio
- if (this.supported.ui && !this.isAudio) {
- // Get state before change
- var isHidden = utils.hasClass(this.elements.container, this.config.classNames.hideControls);
-
- // Negate the argument if not undefined since adding the class to hides the controls
- var force = typeof toggle === 'undefined' ? undefined : !toggle;
-
- // Apply and get updated state
- var hiding = utils.toggleClass(this.elements.container, this.config.classNames.hideControls, force);
-
- // Close menu
- if (hiding && this.config.controls.includes('settings') && !utils.is.empty(this.config.settings)) {
- controls.toggleMenu.call(this, false);
- }
- // Trigger event on change
- if (hiding !== isHidden) {
- var eventName = hiding ? 'controlshidden' : 'controlsshown';
- utils.dispatchEvent.call(this, this.media, eventName);
- }
- return !hiding;
- }
- return false;
- }
-
- /**
- * Add event listeners
- * @param {string} event - Event type
- * @param {function} callback - Callback for when event occurs
- */
-
- }, {
- key: 'on',
- value: function on(event, callback) {
- utils.on(this.elements.container, event, callback);
- }
-
- /**
- * Remove event listeners
- * @param {string} event - Event type
- * @param {function} callback - Callback for when event occurs
- */
-
- }, {
- key: 'off',
- value: function off(event, callback) {
- utils.off(this.elements.container, event, callback);
- }
-
- /**
- * Destroy an instance
- * Event listeners are removed when elements are removed
- * http://stackoverflow.com/questions/12528049/if-a-dom-element-is-removed-are-its-listeners-also-removed-from-memory
- * @param {function} callback - Callback for when destroy is complete
- * @param {boolean} soft - Whether it's a soft destroy (for source changes etc)
- */
-
- }, {
- key: 'destroy',
- value: function destroy(callback) {
- var _this2 = this;
-
- var soft = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
-
- if (!this.ready) {
- return;
- }
-
- var done = function done() {
- // Reset overflow (incase destroyed while in fullscreen)
- document.body.style.overflow = '';
-
- // GC for embed
- _this2.embed = null;
-
- // If it's a soft destroy, make minimal changes
- if (soft) {
- if (Object.keys(_this2.elements).length) {
- // Remove elements
- utils.removeElement(_this2.elements.buttons.play);
- utils.removeElement(_this2.elements.captions);
- utils.removeElement(_this2.elements.controls);
- utils.removeElement(_this2.elements.wrapper);
-
- // Clear for GC
- _this2.elements.buttons.play = null;
- _this2.elements.captions = null;
- _this2.elements.controls = null;
- _this2.elements.wrapper = null;
- }
-
- // Callback
- if (utils.is.function(callback)) {
- callback();
- }
- } else {
- // Unbind listeners
- _this2.listeners.clear();
-
- // Replace the container with the original element provided
- utils.replaceElement(_this2.elements.original, _this2.elements.container);
-
- // Event
- utils.dispatchEvent.call(_this2, _this2.elements.original, 'destroyed', true);
-
- // Callback
- if (utils.is.function(callback)) {
- callback.call(_this2.elements.original);
- }
-
- // Reset state
- _this2.ready = false;
-
- // Clear for garbage collection
- setTimeout(function () {
- _this2.elements = null;
- _this2.media = null;
- }, 200);
- }
- };
-
- // Stop playback
- this.stop();
-
- // Type specific stuff
- switch (this.provider + ':' + this.type) {
- case 'html5:video':
- case 'html5:audio':
- // Clear timeout
- clearTimeout(this.timers.loading);
-
- // Restore native video controls
- ui.toggleNativeControls.call(this, true);
-
- // Clean up
- done();
-
- break;
-
- case 'youtube:video':
- // Clear timers
- clearInterval(this.timers.buffering);
- clearInterval(this.timers.playing);
-
- // Destroy YouTube API
- if (this.embed !== null && utils.is.function(this.embed.destroy)) {
- this.embed.destroy();
- }
-
- // Clean up
- done();
-
- break;
-
- case 'vimeo:video':
- // Destroy Vimeo API
- // then clean up (wait, to prevent postmessage errors)
- if (this.embed !== null) {
- this.embed.unload().then(done);
- }
-
- // Vimeo does not always return
- setTimeout(done, 200);
-
- break;
-
- default:
- break;
- }
- }
-
- /**
- * Check for support for a mime type (HTML5 only)
- * @param {string} type - Mime type
- */
-
- }, {
- key: 'supports',
- value: function supports(type) {
- return support.mime.call(this, type);
- }
-
- /**
- * Check for support
- * @param {string} type - Player type (audio/video)
- * @param {string} provider - Provider (html5/youtube/vimeo)
- * @param {bool} inline - Where player has `playsinline` sttribute
- */
-
- }, {
- key: 'isHTML5',
- get: function get() {
- return Boolean(this.provider === providers.html5);
- }
- }, {
- key: 'isEmbed',
- get: function get() {
- return Boolean(this.isYouTube || this.isVimeo);
- }
- }, {
- key: 'isYouTube',
- get: function get() {
- return Boolean(this.provider === providers.youtube);
- }
- }, {
- key: 'isVimeo',
- get: function get() {
- return Boolean(this.provider === providers.vimeo);
- }
- }, {
- key: 'isVideo',
- get: function get() {
- return Boolean(this.type === types.video);
- }
- }, {
- key: 'isAudio',
- get: function get() {
- return Boolean(this.type === types.audio);
- }
- }, {
- key: 'playing',
- get: function get() {
- return Boolean(this.ready && !this.paused && !this.ended);
- }
-
- /**
- * Get paused state
- */
-
- }, {
- key: 'paused',
- get: function get() {
- return Boolean(this.media.paused);
- }
-
- /**
- * Get stopped state
- */
-
- }, {
- key: 'stopped',
- get: function get() {
- return Boolean(this.paused && this.currentTime === 0);
- }
-
- /**
- * Get ended state
- */
-
- }, {
- key: 'ended',
- get: function get() {
- return Boolean(this.media.ended);
- }
- }, {
- key: 'currentTime',
- set: function set(input) {
- // Bail if media duration isn't available yet
- if (!this.duration) {
- return;
- }
-
- // Validate input
- var inputIsValid = utils.is.number(input) && input > 0;
-
- // Set
- this.media.currentTime = inputIsValid ? Math.min(input, this.duration) : 0;
-
- // Logging
- this.debug.log('Seeking to ' + this.currentTime + ' seconds');
- }
-
- /**
- * Get current time
- */
- ,
- get: function get() {
- return Number(this.media.currentTime);
- }
-
- /**
- * Get buffered
- */
-
- }, {
- key: 'buffered',
- get: function get() {
- var buffered = this.media.buffered;
-
- // YouTube / Vimeo return a float between 0-1
-
- if (utils.is.number(buffered)) {
- return buffered;
- }
-
- // HTML5
- // TODO: Handle buffered chunks of the media
- // (i.e. seek to another section buffers only that section)
- if (buffered && buffered.length && this.duration > 0) {
- return buffered.end(0) / this.duration;
- }
-
- return 0;
- }
-
- /**
- * Get seeking status
- */
-
- }, {
- key: 'seeking',
- get: function get() {
- return Boolean(this.media.seeking);
- }
-
- /**
- * Get the duration of the current media
- */
-
- }, {
- key: 'duration',
- get: function get() {
- // Faux duration set via config
- var fauxDuration = parseFloat(this.config.duration);
-
- // Media duration can be NaN before the media has loaded
- var duration = (this.media || {}).duration || 0;
-
- // If config duration is funky, use regular duration
- return fauxDuration || duration;
- }
-
- /**
- * Set the player volume
- * @param {number} value - must be between 0 and 1. Defaults to the value from local storage and config.volume if not set in storage
- */
-
- }, {
- key: 'volume',
- set: function set(value) {
- var volume = value;
- var max = 1;
- var min = 0;
-
- if (utils.is.string(volume)) {
- volume = Number(volume);
- }
-
- // Load volume from storage if no value specified
- if (!utils.is.number(volume)) {
- volume = this.storage.get('volume');
- }
-
- // Use config if all else fails
- if (!utils.is.number(volume)) {
- volume = this.config.volume;
- }
-
- // Maximum is volumeMax
- if (volume > max) {
- volume = max;
- }
- // Minimum is volumeMin
- if (volume < min) {
- volume = min;
- }
-
- // Update config
- this.config.volume = volume;
-
- // Set the player volume
- this.media.volume = volume;
-
- // If muted, and we're increasing volume manually, reset muted state
- if (!utils.is.empty(value) && this.muted && volume > 0) {
- this.muted = false;
- }
- }
-
- /**
- * Get the current player volume
- */
- ,
- get: function get() {
- return Number(this.media.volume);
- }
- }, {
- key: 'muted',
- set: function set(mute) {
- var toggle = mute;
-
- // Load muted state from storage
- if (!utils.is.boolean(toggle)) {
- toggle = this.storage.get('muted');
- }
-
- // Use config if all else fails
- if (!utils.is.boolean(toggle)) {
- toggle = this.config.muted;
- }
-
- // Update config
- this.config.muted = toggle;
-
- // Set mute on the player
- this.media.muted = toggle;
- }
-
- /**
- * Get current muted state
- */
- ,
- get: function get() {
- return Boolean(this.media.muted);
- }
-
- /**
- * Check if the media has audio
- */
-
- }, {
- key: 'hasAudio',
- get: function get() {
- // Assume yes for all non HTML5 (as we can't tell...)
- if (!this.isHTML5) {
- return true;
- }
-
- if (this.isAudio) {
- return true;
- }
-
- // Get audio tracks
- return Boolean(this.media.mozHasAudio) || Boolean(this.media.webkitAudioDecodedByteCount) || Boolean(this.media.audioTracks && this.media.audioTracks.length);
- }
-
- /**
- * Set playback speed
- * @param {number} speed - the speed of playback (0.5-2.0)
- */
-
- }, {
- key: 'speed',
- set: function set(input) {
- var speed = null;
-
- if (utils.is.number(input)) {
- speed = input;
- }
-
- if (!utils.is.number(speed)) {
- speed = this.storage.get('speed');
- }
-
- if (!utils.is.number(speed)) {
- speed = this.config.speed.selected;
- }
-
- // Set min/max
- if (speed < 0.1) {
- speed = 0.1;
- }
- if (speed > 2.0) {
- speed = 2.0;
- }
-
- if (!this.config.speed.options.includes(speed)) {
- this.debug.warn('Unsupported speed (' + speed + ')');
- return;
- }
-
- // Update config
- this.config.speed.selected = speed;
-
- // Set media speed
- this.media.playbackRate = speed;
- }
-
- /**
- * Get current playback speed
- */
- ,
- get: function get() {
- return Number(this.media.playbackRate);
- }
-
- /**
- * Set playback quality
- * Currently HTML5 & YouTube only
- * @param {number} input - Quality level
- */
-
- }, {
- key: 'quality',
- set: function set(input) {
- var quality = null;
-
- if (!utils.is.empty(input)) {
- quality = Number(input);
- }
-
- if (!utils.is.number(quality)) {
- quality = this.storage.get('quality');
- }
-
- if (!utils.is.number(quality)) {
- quality = this.config.quality.selected;
- }
-
- if (!utils.is.number(quality)) {
- quality = this.config.quality.default;
- }
-
- if (!this.options.quality.length) {
- return;
- }
-
- if (!this.options.quality.includes(quality)) {
- var closest = utils.closest(this.options.quality, quality);
- this.debug.warn('Unsupported quality option: ' + quality + ', using ' + closest + ' instead');
- quality = closest;
- }
-
- // Update config
- this.config.quality.selected = quality;
-
- // Set quality
- this.media.quality = quality;
- }
-
- /**
- * Get current quality level
- */
- ,
- get: function get() {
- return this.media.quality;
- }
-
- /**
- * Toggle loop
- * TODO: Finish fancy new logic. Set the indicator on load as user may pass loop as config
- * @param {boolean} input - Whether to loop or not
- */
-
- }, {
- key: 'loop',
- set: function set(input) {
- var toggle = utils.is.boolean(input) ? input : this.config.loop.active;
- this.config.loop.active = toggle;
- this.media.loop = toggle;
-
- // Set default to be a true toggle
- /* const type = ['start', 'end', 'all', 'none', 'toggle'].includes(input) ? input : 'toggle';
- switch (type) {
- case 'start':
- if (this.config.loop.end && this.config.loop.end <= this.currentTime) {
- this.config.loop.end = null;
- }
- this.config.loop.start = this.currentTime;
- // this.config.loop.indicator.start = this.elements.display.played.value;
- break;
- case 'end':
- if (this.config.loop.start >= this.currentTime) {
- return this;
- }
- this.config.loop.end = this.currentTime;
- // this.config.loop.indicator.end = this.elements.display.played.value;
- break;
- case 'all':
- this.config.loop.start = 0;
- this.config.loop.end = this.duration - 2;
- this.config.loop.indicator.start = 0;
- this.config.loop.indicator.end = 100;
- break;
- case 'toggle':
- if (this.config.loop.active) {
- this.config.loop.start = 0;
- this.config.loop.end = null;
- } else {
- this.config.loop.start = 0;
- this.config.loop.end = this.duration - 2;
- }
- break;
- default:
- this.config.loop.start = 0;
- this.config.loop.end = null;
- break;
- } */
- }
-
- /**
- * Get current loop state
- */
- ,
- get: function get() {
- return Boolean(this.media.loop);
- }
-
- /**
- * Set new media source
- * @param {object} input - The new source object (see docs)
- */
-
- }, {
- key: 'source',
- set: function set(input) {
- source.change.call(this, input);
- }
-
- /**
- * Get current source
- */
- ,
- get: function get() {
- return this.media.currentSrc;
- }
-
- /**
- * Set the poster image for a video
- * @param {input} - the URL for the new poster image
- */
-
- }, {
- key: 'poster',
- set: function set(input) {
- if (!this.isVideo) {
- this.debug.warn('Poster can only be set for video');
- return;
- }
-
- ui.setPoster.call(this, input);
- }
-
- /**
- * Get the current poster image
- */
- ,
- get: function get() {
- if (!this.isVideo) {
- return null;
- }
-
- return this.media.getAttribute('poster');
- }
-
- /**
- * Set the autoplay state
- * @param {boolean} input - Whether to autoplay or not
- */
-
- }, {
- key: 'autoplay',
- set: function set(input) {
- var toggle = utils.is.boolean(input) ? input : this.config.autoplay;
- this.config.autoplay = toggle;
- }
-
- /**
- * Get the current autoplay state
- */
- ,
- get: function get() {
- return Boolean(this.config.autoplay);
- }
- }, {
- key: 'currentTrack',
- set: function set(input) {
- captions.set.call(this, input);
- }
-
- /**
- * Get the current caption track index (-1 if disabled)
- */
- ,
- get: function get() {
- var _captions = this.captions,
- active = _captions.active,
- currentTrack = _captions.currentTrack;
-
- return active ? currentTrack : -1;
- }
-
- /**
- * Set the wanted language for captions
- * Since tracks can be added later it won't update the actual caption track until there is a matching track
- * @param {string} - Two character ISO language code (e.g. EN, FR, PT, etc)
- */
-
- }, {
- key: 'language',
- set: function set(input) {
- captions.setLanguage.call(this, input);
- }
-
- /**
- * Get the current track's language
- */
- ,
- get: function get() {
- return (captions.getCurrentTrack.call(this) || {}).language;
- }
-
- /**
- * Toggle picture-in-picture playback on WebKit/MacOS
- * TODO: update player with state, support, enabled
- * TODO: detect outside changes
- */
-
- }, {
- key: 'pip',
- set: function set(input) {
- var states = {
- pip: 'picture-in-picture',
- inline: 'inline'
- };
-
- // Bail if no support
- if (!support.pip) {
- return;
- }
-
- // Toggle based on current state if not passed
- var toggle = utils.is.boolean(input) ? input : this.pip === states.inline;
-
- // Toggle based on current state
- this.media.webkitSetPresentationMode(toggle ? states.pip : states.inline);
- }
-
- /**
- * Get the current picture-in-picture state
- */
- ,
- get: function get() {
- if (!support.pip) {
- return null;
- }
-
- return this.media.webkitPresentationMode;
- }
- }], [{
- key: 'supported',
- value: function supported(type, provider, inline) {
- return support.check(type, provider, inline);
- }
-
- /**
- * Load an SVG sprite into the page
- * @param {string} url - URL for the SVG sprite
- * @param {string} [id] - Unique ID
- */
-
- }, {
- key: 'loadSprite',
- value: function loadSprite(url, id) {
- return utils.loadSprite(url, id);
- }
-
- /**
- * Setup multiple instances
- * @param {*} selector
- * @param {object} options
- */
-
- }, {
- key: 'setup',
- value: function setup(selector) {
- var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
-
- var targets = null;
-
- if (utils.is.string(selector)) {
- targets = Array.from(document.querySelectorAll(selector));
- } else if (utils.is.nodeList(selector)) {
- targets = Array.from(selector);
- } else if (utils.is.array(selector)) {
- targets = selector.filter(utils.is.element);
- }
-
- if (utils.is.empty(targets)) {
- return null;
- }
-
- return targets.map(function (t) {
- return new Plyr(t, options);
- });
- }
- }]);
- return Plyr;
-}();
-
-Plyr.defaults = utils.cloneDeep(defaults$1);
-
-// ==========================================================================
-
-return Plyr;
+ // Toggle poster
+ togglePoster: function togglePoster(enable) {
+ toggleClass(this.elements.container, this.config.classNames.posterEnabled, enable);
+ },
+
+
+ // Set the poster image (async)
+ // Used internally for the poster setter, with the passive option forced to false
+ setPoster: function setPoster(poster) {
+ var _this2 = this;
+
+ var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
+
+ // Don't override if call is passive
+ if (passive && this.poster) {
+ return Promise.reject(new Error('Poster already set'));
+ }
+
+ // Set property synchronously to respect the call order
+ this.media.setAttribute('poster', poster);
+
+ // Wait until ui is ready
+ return ready.call(this)
+ // Load image
+ .then(function () {
+ return loadImage(poster);
+ }).catch(function (err) {
+ // Hide poster on error unless it's been set by another call
+ if (poster === _this2.poster) {
+ ui.togglePoster.call(_this2, false);
+ }
+ // Rethrow
+ throw err;
+ }).then(function () {
+ // Prevent race conditions
+ if (poster !== _this2.poster) {
+ throw new Error('setPoster cancelled by later call to setPoster');
+ }
+ }).then(function () {
+ Object.assign(_this2.elements.poster.style, {
+ backgroundImage: 'url(\'' + poster + '\')',
+ // Reset backgroundSize as well (since it can be set to "cover" for padded thumbnails for youtube)
+ backgroundSize: ''
+ });
+ ui.togglePoster.call(_this2, true);
+ return poster;
+ });
+ },
+
+
+ // Check playing state
+ checkPlaying: function checkPlaying(event) {
+ var _this3 = this;
+
+ // Class hooks
+ toggleClass(this.elements.container, this.config.classNames.playing, this.playing);
+ toggleClass(this.elements.container, this.config.classNames.paused, this.paused);
+ toggleClass(this.elements.container, this.config.classNames.stopped, this.stopped);
+
+ // Set state
+ Array.from(this.elements.buttons.play).forEach(function (target) {
+ target.pressed = _this3.playing;
+ });
+
+ // Only update controls on non timeupdate events
+ if (is$1.event(event) && event.type === 'timeupdate') {
+ return;
+ }
+
+ // Toggle controls
+ ui.toggleControls.call(this);
+ },
+
+
+ // Check if media is loading
+ checkLoading: function checkLoading(event) {
+ var _this4 = this;
+
+ this.loading = ['stalled', 'waiting'].includes(event.type);
+
+ // Clear timer
+ clearTimeout(this.timers.loading);
+
+ // Timer to prevent flicker when seeking
+ this.timers.loading = setTimeout(function () {
+ // Update progress bar loading class state
+ toggleClass(_this4.elements.container, _this4.config.classNames.loading, _this4.loading);
+
+ // Update controls visibility
+ ui.toggleControls.call(_this4);
+ }, this.loading ? 250 : 0);
+ },
+
+
+ // Toggle controls based on state and `force` argument
+ toggleControls: function toggleControls(force) {
+ var controls$$1 = this.elements.controls;
+
+
+ if (controls$$1 && this.config.hideControls) {
+ // Show controls if force, loading, paused, or button interaction, otherwise hide
+ this.toggleControls(Boolean(force || this.loading || this.paused || controls$$1.pressed || controls$$1.hover));
+ }
+ }
+ };
+
+ // ==========================================================================
+
+ var Listeners = function () {
+ function Listeners(player) {
+ classCallCheck(this, Listeners);
+
+ this.player = player;
+ this.lastKey = null;
+
+ this.handleKey = this.handleKey.bind(this);
+ this.toggleMenu = this.toggleMenu.bind(this);
+ this.firstTouch = this.firstTouch.bind(this);
+ }
+
+ // Handle key presses
+
+
+ createClass(Listeners, [{
+ key: 'handleKey',
+ value: function handleKey(event) {
+ var _this = this;
+
+ var code = event.keyCode ? event.keyCode : event.which;
+ var pressed = event.type === 'keydown';
+ var repeat = pressed && code === this.lastKey;
+
+ // Bail if a modifier key is set
+ if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) {
+ return;
+ }
+
+ // If the event is bubbled from the media element
+ // Firefox doesn't get the keycode for whatever reason
+ if (!is$1.number(code)) {
+ return;
+ }
+
+ // Seek by the number keys
+ var seekByKey = function seekByKey() {
+ // Divide the max duration into 10th's and times by the number value
+ _this.player.currentTime = _this.player.duration / 10 * (code - 48);
+ };
+
+ // Handle the key on keydown
+ // Reset on keyup
+ if (pressed) {
+ // Which keycodes should we prevent default
+ var preventDefault = [32, 37, 38, 39, 40, 48, 49, 50, 51, 52, 53, 54, 56, 57, 67, 70, 73, 75, 76, 77, 79];
+
+ // Check focused element
+ // and if the focused element is not editable (e.g. text input)
+ // and any that accept key input http://webaim.org/techniques/keyboard/
+ var focused = getFocusElement();
+ if (is$1.element(focused) && focused !== this.player.elements.inputs.seek && matches(focused, this.player.config.selectors.editable)) {
+ return;
+ }
+
+ // If the code is found prevent default (e.g. prevent scrolling for arrows)
+ if (preventDefault.includes(code)) {
+ event.preventDefault();
+ event.stopPropagation();
+ }
+
+ switch (code) {
+ case 48:
+ case 49:
+ case 50:
+ case 51:
+ case 52:
+ case 53:
+ case 54:
+ case 55:
+ case 56:
+ case 57:
+ // 0-9
+ if (!repeat) {
+ seekByKey();
+ }
+ break;
+
+ case 32:
+ case 75:
+ // Space and K key
+ if (!repeat) {
+ this.player.togglePlay();
+ }
+ break;
+
+ case 38:
+ // Arrow up
+ this.player.increaseVolume(0.1);
+ break;
+
+ case 40:
+ // Arrow down
+ this.player.decreaseVolume(0.1);
+ break;
+
+ case 77:
+ // M key
+ if (!repeat) {
+ this.player.muted = !this.player.muted;
+ }
+ break;
+
+ case 39:
+ // Arrow forward
+ this.player.forward();
+ break;
+
+ case 37:
+ // Arrow back
+ this.player.rewind();
+ break;
+
+ case 70:
+ // F key
+ this.player.fullscreen.toggle();
+ break;
+
+ case 67:
+ // C key
+ if (!repeat) {
+ this.player.toggleCaptions();
+ }
+ break;
+
+ case 76:
+ // L key
+ this.player.loop = !this.player.loop;
+ break;
+
+ /* case 73:
+ this.setLoop('start');
+ break;
+ case 76:
+ this.setLoop();
+ break;
+ case 79:
+ this.setLoop('end');
+ break; */
+
+ default:
+ break;
+ }
+
+ // Escape is handle natively when in full screen
+ // So we only need to worry about non native
+ if (!this.player.fullscreen.enabled && this.player.fullscreen.active && code === 27) {
+ this.player.fullscreen.toggle();
+ }
+
+ // Store last code for next cycle
+ this.lastKey = code;
+ } else {
+ this.lastKey = null;
+ }
+ }
+
+ // Toggle menu
+
+ }, {
+ key: 'toggleMenu',
+ value: function toggleMenu(event) {
+ controls.toggleMenu.call(this.player, event);
+ }
+
+ // Device is touch enabled
+
+ }, {
+ key: 'firstTouch',
+ value: function firstTouch() {
+ this.player.touch = true;
+
+ // Add touch class
+ toggleClass(this.player.elements.container, this.player.config.classNames.isTouch, true);
+ }
+
+ // Global window & document listeners
+
+ }, {
+ key: 'global',
+ value: function global() {
+ var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
+
+ // Keyboard shortcuts
+ if (this.player.config.keyboard.global) {
+ toggleListener.call(this.player, window, 'keydown keyup', this.handleKey, toggle, false);
+ }
+
+ // Click anywhere closes menu
+ toggleListener.call(this.player, document.body, 'click', this.toggleMenu, toggle);
+
+ // Detect touch by events
+ once.call(this.player, document.body, 'touchstart', this.firstTouch);
+ }
+
+ // Container listeners
+
+ }, {
+ key: 'container',
+ value: function container() {
+ var _this2 = this;
+
+ // Keyboard shortcuts
+ if (!this.player.config.keyboard.global && this.player.config.keyboard.focused) {
+ on.call(this.player, this.player.elements.container, 'keydown keyup', this.handleKey, false);
+ }
+
+ // Detect tab focus
+ // Remove class on blur/focusout
+ on.call(this.player, this.player.elements.container, 'focusout', function (event) {
+ toggleClass(event.target, _this2.player.config.classNames.tabFocus, false);
+ });
+ // Add classname to tabbed elements
+ on.call(this.player, this.player.elements.container, 'keydown', function (event) {
+ if (event.keyCode !== 9) {
+ return;
+ }
+
+ // Delay the adding of classname until the focus has changed
+ // This event fires before the focusin event
+ setTimeout(function () {
+ toggleClass(getFocusElement(), _this2.player.config.classNames.tabFocus, true);
+ }, 0);
+ });
+
+ // Toggle controls on mouse events and entering fullscreen
+ on.call(this.player, this.player.elements.container, 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen', function (event) {
+ var controls$$1 = _this2.player.elements.controls;
+
+ // Remove button states for fullscreen
+
+ if (event.type === 'enterfullscreen') {
+ controls$$1.pressed = false;
+ controls$$1.hover = false;
+ }
+
+ // Show, then hide after a timeout unless another control event occurs
+ var show = ['touchstart', 'touchmove', 'mousemove'].includes(event.type);
+
+ var delay = 0;
+
+ if (show) {
+ ui.toggleControls.call(_this2.player, true);
+ // Use longer timeout for touch devices
+ delay = _this2.player.touch ? 3000 : 2000;
+ }
+
+ // Clear timer
+ clearTimeout(_this2.player.timers.controls);
+ // Timer to prevent flicker when seeking
+ _this2.player.timers.controls = setTimeout(function () {
+ return ui.toggleControls.call(_this2.player, false);
+ }, delay);
+ });
+ }
+
+ // Listen for media events
+
+ }, {
+ key: 'media',
+ value: function media() {
+ var _this3 = this;
+
+ // Time change on media
+ on.call(this.player, this.player.media, 'timeupdate seeking seeked', function (event) {
+ return controls.timeUpdate.call(_this3.player, event);
+ });
+
+ // Display duration
+ on.call(this.player, this.player.media, 'durationchange loadeddata loadedmetadata', function (event) {
+ return controls.durationUpdate.call(_this3.player, event);
+ });
+
+ // Check for audio tracks on load
+ // We can't use `loadedmetadata` as it doesn't seem to have audio tracks at that point
+ on.call(this.player, this.player.media, 'canplay', function () {
+ toggleHidden(_this3.player.elements.volume, !_this3.player.hasAudio);
+ toggleHidden(_this3.player.elements.buttons.mute, !_this3.player.hasAudio);
+ });
+
+ // Handle the media finishing
+ on.call(this.player, this.player.media, 'ended', function () {
+ // Show poster on end
+ if (_this3.player.isHTML5 && _this3.player.isVideo && _this3.player.config.resetOnEnd) {
+ // Restart
+ _this3.player.restart();
+ }
+ });
+
+ // Check for buffer progress
+ on.call(this.player, this.player.media, 'progress playing seeking seeked', function (event) {
+ return controls.updateProgress.call(_this3.player, event);
+ });
+
+ // Handle volume changes
+ on.call(this.player, this.player.media, 'volumechange', function (event) {
+ return controls.updateVolume.call(_this3.player, event);
+ });
+
+ // Handle play/pause
+ on.call(this.player, this.player.media, 'playing play pause ended emptied timeupdate', function (event) {
+ return ui.checkPlaying.call(_this3.player, event);
+ });
+
+ // Loading state
+ on.call(this.player, this.player.media, 'waiting canplay seeked playing', function (event) {
+ return ui.checkLoading.call(_this3.player, event);
+ });
+
+ // If autoplay, then load advertisement if required
+ // TODO: Show some sort of loading state while the ad manager loads else there's a delay before ad shows
+ on.call(this.player, this.player.media, 'playing', function () {
+ if (!_this3.player.ads) {
+ return;
+ }
+
+ // If ads are enabled, wait for them first
+ if (_this3.player.ads.enabled && !_this3.player.ads.initialized) {
+ // Wait for manager response
+ _this3.player.ads.managerPromise.then(function () {
+ return _this3.player.ads.play();
+ }).catch(function () {
+ return _this3.player.play();
+ });
+ }
+ });
+
+ // Click video
+ if (this.player.supported.ui && this.player.config.clickToPlay && !this.player.isAudio) {
+ // Re-fetch the wrapper
+ var wrapper = getElement.call(this.player, '.' + this.player.config.classNames.video);
+
+ // Bail if there's no wrapper (this should never happen)
+ if (!is$1.element(wrapper)) {
+ return;
+ }
+
+ // On click play, pause ore restart
+ on.call(this.player, wrapper, 'click', function () {
+ // Touch devices will just show controls (if we're hiding controls)
+ if (_this3.player.config.hideControls && _this3.player.touch && !_this3.player.paused) {
+ return;
+ }
+
+ if (_this3.player.paused) {
+ _this3.player.play();
+ } else if (_this3.player.ended) {
+ _this3.player.restart();
+ _this3.player.play();
+ } else {
+ _this3.player.pause();
+ }
+ });
+ }
+
+ // Disable right click
+ if (this.player.supported.ui && this.player.config.disableContextMenu) {
+ on.call(this.player, this.player.elements.wrapper, 'contextmenu', function (event) {
+ event.preventDefault();
+ }, false);
+ }
+
+ // Volume change
+ on.call(this.player, this.player.media, 'volumechange', function () {
+ // Save to storage
+ _this3.player.storage.set({ volume: _this3.player.volume, muted: _this3.player.muted });
+ });
+
+ // Speed change
+ on.call(this.player, this.player.media, 'ratechange', function () {
+ // Update UI
+ controls.updateSetting.call(_this3.player, 'speed');
+
+ // Save to storage
+ _this3.player.storage.set({ speed: _this3.player.speed });
+ });
+
+ // Quality request
+ on.call(this.player, this.player.media, 'qualityrequested', function (event) {
+ // Save to storage
+ _this3.player.storage.set({ quality: event.detail.quality });
+ });
+
+ // Quality change
+ on.call(this.player, this.player.media, 'qualitychange', function (event) {
+ // Update UI
+ controls.updateSetting.call(_this3.player, 'quality', null, event.detail.quality);
+ });
+
+ // Proxy events to container
+ // Bubble up key events for Edge
+ var proxyEvents = this.player.config.events.concat(['keyup', 'keydown']).join(' ');
+ on.call(this.player, this.player.media, proxyEvents, function (event) {
+ var _event$detail = event.detail,
+ detail = _event$detail === undefined ? {} : _event$detail;
+
+ // Get error details from media
+
+ if (event.type === 'error') {
+ detail = _this3.player.media.error;
+ }
+
+ triggerEvent.call(_this3.player, _this3.player.elements.container, event.type, true, detail);
+ });
+ }
+
+ // Listen for control events
+
+ }, {
+ key: 'controls',
+ value: function controls$$1() {
+ var _this4 = this;
+
+ // IE doesn't support input event, so we fallback to change
+ var inputEvent = browser.isIE ? 'change' : 'input';
+
+ // Run default and custom handlers
+ var proxy = function proxy(event, defaultHandler, customHandlerKey) {
+ var customHandler = _this4.player.config.listeners[customHandlerKey];
+ var hasCustomHandler = is$1.function(customHandler);
+ var returned = true;
+
+ // Execute custom handler
+ if (hasCustomHandler) {
+ returned = customHandler.call(_this4.player, event);
+ }
+
+ // Only call default handler if not prevented in custom handler
+ if (returned && is$1.function(defaultHandler)) {
+ defaultHandler.call(_this4.player, event);
+ }
+ };
+
+ // Trigger custom and default handlers
+ var bind = function bind(element, type, defaultHandler, customHandlerKey) {
+ var passive = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;
+
+ var customHandler = _this4.player.config.listeners[customHandlerKey];
+ var hasCustomHandler = is$1.function(customHandler);
+
+ on.call(_this4.player, element, type, function (event) {
+ return proxy(event, defaultHandler, customHandlerKey);
+ }, passive && !hasCustomHandler);
+ };
+
+ // Play/pause toggle
+ Array.from(this.player.elements.buttons.play).forEach(function (button) {
+ bind(button, 'click', _this4.player.togglePlay, 'play');
+ });
+
+ // Pause
+ bind(this.player.elements.buttons.restart, 'click', this.player.restart, 'restart');
+
+ // Rewind
+ bind(this.player.elements.buttons.rewind, 'click', this.player.rewind, 'rewind');
+
+ // Rewind
+ bind(this.player.elements.buttons.fastForward, 'click', this.player.forward, 'fastForward');
+
+ // Mute toggle
+ bind(this.player.elements.buttons.mute, 'click', function () {
+ _this4.player.muted = !_this4.player.muted;
+ }, 'mute');
+
+ // Captions toggle
+ bind(this.player.elements.buttons.captions, 'click', function () {
+ return _this4.player.toggleCaptions();
+ });
+
+ // Fullscreen toggle
+ bind(this.player.elements.buttons.fullscreen, 'click', function () {
+ _this4.player.fullscreen.toggle();
+ }, 'fullscreen');
+
+ // Picture-in-Picture
+ bind(this.player.elements.buttons.pip, 'click', function () {
+ _this4.player.pip = 'toggle';
+ }, 'pip');
+
+ // Airplay
+ bind(this.player.elements.buttons.airplay, 'click', this.player.airplay, 'airplay');
+
+ // Settings menu
+ bind(this.player.elements.buttons.settings, 'click', function (event) {
+ controls.toggleMenu.call(_this4.player, event);
+ });
+
+ // Settings menu
+ bind(this.player.elements.settings.form, 'click', function (event) {
+ event.stopPropagation();
+
+ // Go back to home tab on click
+ var showHomeTab = function showHomeTab() {
+ var id = 'plyr-settings-' + _this4.player.id + '-home';
+ controls.showTab.call(_this4.player, id);
+ };
+
+ // Settings menu items - use event delegation as items are added/removed
+ if (matches(event.target, _this4.player.config.selectors.inputs.language)) {
+ proxy(event, function () {
+ _this4.player.currentTrack = Number(event.target.value);
+ showHomeTab();
+ }, 'language');
+ } else if (matches(event.target, _this4.player.config.selectors.inputs.quality)) {
+ proxy(event, function () {
+ _this4.player.quality = event.target.value;
+ showHomeTab();
+ }, 'quality');
+ } else if (matches(event.target, _this4.player.config.selectors.inputs.speed)) {
+ proxy(event, function () {
+ _this4.player.speed = parseFloat(event.target.value);
+ showHomeTab();
+ }, 'speed');
+ } else {
+ var tab = event.target;
+ controls.showTab.call(_this4.player, tab.getAttribute('aria-controls'));
+ }
+ });
+
+ // Set range input alternative "value", which matches the tooltip time (#954)
+ bind(this.player.elements.inputs.seek, 'mousedown mousemove', function (event) {
+ var clientRect = _this4.player.elements.progress.getBoundingClientRect();
+ var percent = 100 / clientRect.width * (event.pageX - clientRect.left);
+ event.currentTarget.setAttribute('seek-value', percent);
+ });
+
+ // Pause while seeking
+ bind(this.player.elements.inputs.seek, 'mousedown mouseup keydown keyup touchstart touchend', function (event) {
+ var seek = event.currentTarget;
+
+ var code = event.keyCode ? event.keyCode : event.which;
+ var eventType = event.type;
+
+ if ((eventType === 'keydown' || eventType === 'keyup') && code !== 39 && code !== 37) {
+ return;
+ }
+ // Was playing before?
+ var play = seek.hasAttribute('play-on-seeked');
+
+ // Done seeking
+ var done = ['mouseup', 'touchend', 'keyup'].includes(event.type);
+
+ // If we're done seeking and it was playing, resume playback
+ if (play && done) {
+ seek.removeAttribute('play-on-seeked');
+ _this4.player.play();
+ } else if (!done && _this4.player.playing) {
+ seek.setAttribute('play-on-seeked', '');
+ _this4.player.pause();
+ }
+ });
+
+ // Seek
+ bind(this.player.elements.inputs.seek, inputEvent, function (event) {
+ var seek = event.currentTarget;
+
+ // If it exists, use seek-value instead of "value" for consistency with tooltip time (#954)
+ var seekTo = seek.getAttribute('seek-value');
+
+ if (is$1.empty(seekTo)) {
+ seekTo = seek.value;
+ }
+
+ seek.removeAttribute('seek-value');
+
+ _this4.player.currentTime = seekTo / seek.max * _this4.player.duration;
+ }, 'seek');
+
+ // Current time invert
+ // Only if one time element is used for both currentTime and duration
+ if (this.player.config.toggleInvert && !is$1.element(this.player.elements.display.duration)) {
+ bind(this.player.elements.display.currentTime, 'click', function () {
+ // Do nothing if we're at the start
+ if (_this4.player.currentTime === 0) {
+ return;
+ }
+
+ _this4.player.config.invertTime = !_this4.player.config.invertTime;
+
+ controls.timeUpdate.call(_this4.player);
+ });
+ }
+
+ // Volume
+ bind(this.player.elements.inputs.volume, inputEvent, function (event) {
+ _this4.player.volume = event.target.value;
+ }, 'volume');
+
+ // Polyfill for lower fill in <input type="range"> for webkit
+ if (browser.isWebkit) {
+ Array.from(getElements.call(this.player, 'input[type="range"]')).forEach(function (element) {
+ bind(element, 'input', function (event) {
+ return controls.updateRangeFill.call(_this4.player, event.target);
+ });
+ });
+ }
+
+ // Seek tooltip
+ bind(this.player.elements.progress, 'mouseenter mouseleave mousemove', function (event) {
+ return controls.updateSeekTooltip.call(_this4.player, event);
+ });
+
+ // Update controls.hover state (used for ui.toggleControls to avoid hiding when interacting)
+ bind(this.player.elements.controls, 'mouseenter mouseleave', function (event) {
+ _this4.player.elements.controls.hover = !_this4.player.touch && event.type === 'mouseenter';
+ });
+
+ // Update controls.pressed state (used for ui.toggleControls to avoid hiding when interacting)
+ bind(this.player.elements.controls, 'mousedown mouseup touchstart touchend touchcancel', function (event) {
+ _this4.player.elements.controls.pressed = ['mousedown', 'touchstart'].includes(event.type);
+ });
+
+ // Focus in/out on controls
+ bind(this.player.elements.controls, 'focusin focusout', function (event) {
+ var _player = _this4.player,
+ config = _player.config,
+ elements = _player.elements,
+ timers = _player.timers;
+
+ // Skip transition to prevent focus from scrolling the parent element
+
+ toggleClass(elements.controls, config.classNames.noTransition, event.type === 'focusin');
+
+ // Toggle
+ ui.toggleControls.call(_this4.player, event.type === 'focusin');
+
+ // If focusin, hide again after delay
+ if (event.type === 'focusin') {
+ // Restore transition
+ setTimeout(function () {
+ toggleClass(elements.controls, config.classNames.noTransition, false);
+ }, 0);
+
+ // Delay a little more for keyboard users
+ var delay = _this4.touch ? 3000 : 4000;
+
+ // Clear timer
+ clearTimeout(timers.controls);
+ // Hide
+ timers.controls = setTimeout(function () {
+ return ui.toggleControls.call(_this4.player, false);
+ }, delay);
+ }
+ });
+
+ // Mouse wheel for volume
+ bind(this.player.elements.inputs.volume, 'wheel', function (event) {
+ // Detect "natural" scroll - suppored on OS X Safari only
+ // Other browsers on OS X will be inverted until support improves
+ var inverted = event.webkitDirectionInvertedFromDevice;
+ var step = 1 / 50;
+ var direction = 0;
+
+ // Scroll down (or up on natural) to decrease
+ if (event.deltaY < 0 || event.deltaX > 0) {
+ if (inverted) {
+ _this4.player.decreaseVolume(step);
+ direction = -1;
+ } else {
+ _this4.player.increaseVolume(step);
+ direction = 1;
+ }
+ }
+
+ // Scroll up (or down on natural) to increase
+ if (event.deltaY > 0 || event.deltaX < 0) {
+ if (inverted) {
+ _this4.player.increaseVolume(step);
+ direction = 1;
+ } else {
+ _this4.player.decreaseVolume(step);
+ direction = -1;
+ }
+ }
+
+ // Don't break page scrolling at max and min
+ if (direction === 1 && _this4.player.media.volume < 1 || direction === -1 && _this4.player.media.volume > 0) {
+ event.preventDefault();
+ }
+ }, 'volume', false);
+ }
+ }]);
+ return Listeners;
+ }();
+
+ var loadjs_umd = createCommonjsModule(function (module, exports) {
+ (function(root, factory) {
+ if (typeof undefined === 'function' && undefined.amd) {
+ undefined([], factory);
+ } else {
+ module.exports = factory();
+ }
+ }(commonjsGlobal, function() {
+ /**
+ * Global dependencies.
+ * @global {Object} document - DOM
+ */
+
+ var devnull = function() {},
+ bundleIdCache = {},
+ bundleResultCache = {},
+ bundleCallbackQueue = {};
+
+
+ /**
+ * Subscribe to bundle load event.
+ * @param {string[]} bundleIds - Bundle ids
+ * @param {Function} callbackFn - The callback function
+ */
+ function subscribe(bundleIds, callbackFn) {
+ // listify
+ bundleIds = bundleIds.push ? bundleIds : [bundleIds];
+
+ var depsNotFound = [],
+ i = bundleIds.length,
+ numWaiting = i,
+ fn,
+ bundleId,
+ r,
+ q;
+
+ // define callback function
+ fn = function (bundleId, pathsNotFound) {
+ if (pathsNotFound.length) depsNotFound.push(bundleId);
+
+ numWaiting--;
+ if (!numWaiting) callbackFn(depsNotFound);
+ };
+
+ // register callback
+ while (i--) {
+ bundleId = bundleIds[i];
+
+ // execute callback if in result cache
+ r = bundleResultCache[bundleId];
+ if (r) {
+ fn(bundleId, r);
+ continue;
+ }
+
+ // add to callback queue
+ q = bundleCallbackQueue[bundleId] = bundleCallbackQueue[bundleId] || [];
+ q.push(fn);
+ }
+ }
+
+
+ /**
+ * Publish bundle load event.
+ * @param {string} bundleId - Bundle id
+ * @param {string[]} pathsNotFound - List of files not found
+ */
+ function publish(bundleId, pathsNotFound) {
+ // exit if id isn't defined
+ if (!bundleId) return;
+
+ var q = bundleCallbackQueue[bundleId];
+
+ // cache result
+ bundleResultCache[bundleId] = pathsNotFound;
+
+ // exit if queue is empty
+ if (!q) return;
+
+ // empty callback queue
+ while (q.length) {
+ q[0](bundleId, pathsNotFound);
+ q.splice(0, 1);
+ }
+ }
+
+
+ /**
+ * Execute callbacks.
+ * @param {Object or Function} args - The callback args
+ * @param {string[]} depsNotFound - List of dependencies not found
+ */
+ function executeCallbacks(args, depsNotFound) {
+ // accept function as argument
+ if (args.call) args = {success: args};
+
+ // success and error callbacks
+ if (depsNotFound.length) (args.error || devnull)(depsNotFound);
+ else (args.success || devnull)(args);
+ }
+
+
+ /**
+ * Load individual file.
+ * @param {string} path - The file path
+ * @param {Function} callbackFn - The callback function
+ */
+ function loadFile(path, callbackFn, args, numTries) {
+ var doc = document,
+ async = args.async,
+ maxTries = (args.numRetries || 0) + 1,
+ beforeCallbackFn = args.before || devnull,
+ pathStripped = path.replace(/^(css|img)!/, ''),
+ isCss,
+ e;
+
+ numTries = numTries || 0;
+
+ if (/(^css!|\.css$)/.test(path)) {
+ isCss = true;
+
+ // css
+ e = doc.createElement('link');
+ e.rel = 'stylesheet';
+ e.href = pathStripped; //.replace(/^css!/, ''); // remove "css!" prefix
+ } else if (/(^img!|\.(png|gif|jpg|svg)$)/.test(path)) {
+ // image
+ e = doc.createElement('img');
+ e.src = pathStripped;
+ } else {
+ // javascript
+ e = doc.createElement('script');
+ e.src = path;
+ e.async = async === undefined ? true : async;
+ }
+
+ e.onload = e.onerror = e.onbeforeload = function (ev) {
+ var result = ev.type[0];
+
+ // Note: The following code isolates IE using `hideFocus` and treats empty
+ // stylesheets as failures to get around lack of onerror support
+ if (isCss && 'hideFocus' in e) {
+ try {
+ if (!e.sheet.cssText.length) result = 'e';
+ } catch (x) {
+ // sheets objects created from load errors don't allow access to
+ // `cssText`
+ result = 'e';
+ }
+ }
+
+ // handle retries in case of load failure
+ if (result == 'e') {
+ // increment counter
+ numTries += 1;
+
+ // exit function and try again
+ if (numTries < maxTries) {
+ return loadFile(path, callbackFn, args, numTries);
+ }
+ }
+
+ // execute callback
+ callbackFn(path, result, ev.defaultPrevented);
+ };
+
+ // add to document (unless callback returns `false`)
+ if (beforeCallbackFn(path, e) !== false) doc.head.appendChild(e);
+ }
+
+
+ /**
+ * Load multiple files.
+ * @param {string[]} paths - The file paths
+ * @param {Function} callbackFn - The callback function
+ */
+ function loadFiles(paths, callbackFn, args) {
+ // listify paths
+ paths = paths.push ? paths : [paths];
+
+ var numWaiting = paths.length,
+ x = numWaiting,
+ pathsNotFound = [],
+ fn,
+ i;
+
+ // define callback function
+ fn = function(path, result, defaultPrevented) {
+ // handle error
+ if (result == 'e') pathsNotFound.push(path);
+
+ // handle beforeload event. If defaultPrevented then that means the load
+ // will be blocked (ex. Ghostery/ABP on Safari)
+ if (result == 'b') {
+ if (defaultPrevented) pathsNotFound.push(path);
+ else return;
+ }
+
+ numWaiting--;
+ if (!numWaiting) callbackFn(pathsNotFound);
+ };
+
+ // load scripts
+ for (i=0; i < x; i++) loadFile(paths[i], fn, args);
+ }
+
+
+ /**
+ * Initiate script load and register bundle.
+ * @param {(string|string[])} paths - The file paths
+ * @param {(string|Function)} [arg1] - The bundleId or success callback
+ * @param {Function} [arg2] - The success or error callback
+ * @param {Function} [arg3] - The error callback
+ */
+ function loadjs(paths, arg1, arg2) {
+ var bundleId,
+ args;
+
+ // bundleId (if string)
+ if (arg1 && arg1.trim) bundleId = arg1;
+
+ // args (default is {})
+ args = (bundleId ? arg2 : arg1) || {};
+
+ // throw error if bundle is already defined
+ if (bundleId) {
+ if (bundleId in bundleIdCache) {
+ throw "LoadJS";
+ } else {
+ bundleIdCache[bundleId] = true;
+ }
+ }
+
+ // load scripts
+ loadFiles(paths, function (pathsNotFound) {
+ // execute callbacks
+ executeCallbacks(args, pathsNotFound);
+
+ // publish bundle load event
+ publish(bundleId, pathsNotFound);
+ }, args);
+ }
+
+
+ /**
+ * Execute callbacks when dependencies have been satisfied.
+ * @param {(string|string[])} deps - List of bundle ids
+ * @param {Object} args - success/error arguments
+ */
+ loadjs.ready = function ready(deps, args) {
+ // subscribe to bundle load event
+ subscribe(deps, function (depsNotFound) {
+ // execute callbacks
+ executeCallbacks(args, depsNotFound);
+ });
+
+ return loadjs;
+ };
+
+
+ /**
+ * Manually satisfy bundle dependencies.
+ * @param {string} bundleId - The bundle id
+ */
+ loadjs.done = function done(bundleId) {
+ publish(bundleId, []);
+ };
+
+
+ /**
+ * Reset loadjs dependencies statuses
+ */
+ loadjs.reset = function reset() {
+ bundleIdCache = {};
+ bundleResultCache = {};
+ bundleCallbackQueue = {};
+ };
+
+
+ /**
+ * Determine if bundle has already been defined
+ * @param String} bundleId - The bundle id
+ */
+ loadjs.isDefined = function isDefined(bundleId) {
+ return bundleId in bundleIdCache;
+ };
+
+
+ // export
+ return loadjs;
+
+ }));
+ });
+
+ // ==========================================================================
+
+ function loadScript(url) {
+ return new Promise(function (resolve, reject) {
+ loadjs_umd(url, {
+ success: resolve,
+ error: reject
+ });
+ });
+ }
+
+ // ==========================================================================
+
+ // Parse Vimeo ID from URL
+ function parseId(url) {
+ if (is$1.empty(url)) {
+ return null;
+ }
+
+ if (is$1.number(Number(url))) {
+ return url;
+ }
+
+ var regex = /^.*(vimeo.com\/|video\/)(\d+).*/;
+ return url.match(regex) ? RegExp.$2 : url;
+ }
+
+ // Get aspect ratio for dimensions
+ function getAspectRatio(width, height) {
+ var getRatio = function getRatio(w, h) {
+ return h === 0 ? w : getRatio(h, w % h);
+ };
+ var ratio = getRatio(width, height);
+ return width / ratio + ':' + height / ratio;
+ }
+
+ // Set playback state and trigger change (only on actual change)
+ function assurePlaybackState(play) {
+ if (play && !this.embed.hasPlayed) {
+ this.embed.hasPlayed = true;
+ }
+ if (this.media.paused === play) {
+ this.media.paused = !play;
+ triggerEvent.call(this, this.media, play ? 'play' : 'pause');
+ }
+ }
+
+ var vimeo = {
+ setup: function setup() {
+ var _this = this;
+
+ // Add embed class for responsive
+ toggleClass(this.elements.wrapper, this.config.classNames.embed, true);
+
+ // Set intial ratio
+ vimeo.setAspectRatio.call(this);
+
+ // Load the API if not already
+ if (!is$1.object(window.Vimeo)) {
+ loadScript(this.config.urls.vimeo.sdk).then(function () {
+ vimeo.ready.call(_this);
+ }).catch(function (error) {
+ _this.debug.warn('Vimeo API failed to load', error);
+ });
+ } else {
+ vimeo.ready.call(this);
+ }
+ },
+
+
+ // Set aspect ratio
+ // For Vimeo we have an extra 300% height <div> to hide the standard controls and UI
+ setAspectRatio: function setAspectRatio(input) {
+ var _split = (is$1.string(input) ? input : this.config.ratio).split(':'),
+ _split2 = slicedToArray(_split, 2),
+ x = _split2[0],
+ y = _split2[1];
+
+ var padding = 100 / x * y;
+ this.elements.wrapper.style.paddingBottom = padding + '%';
+
+ if (this.supported.ui) {
+ var height = 240;
+ var offset = (height - padding) / (height / 50);
+
+ this.media.style.transform = 'translateY(-' + offset + '%)';
+ }
+ },
+
+
+ // API Ready
+ ready: function ready$$1() {
+ var _this2 = this;
+
+ var player = this;
+
+ // Get Vimeo params for the iframe
+ var options = {
+ loop: player.config.loop.active,
+ autoplay: player.autoplay,
+ // muted: player.muted,
+ byline: false,
+ portrait: false,
+ title: false,
+ speed: true,
+ transparent: 0,
+ gesture: 'media',
+ playsinline: !this.config.fullscreen.iosNative
+ };
+ var params = buildUrlParams(options);
+
+ // Get the source URL or ID
+ var source = player.media.getAttribute('src');
+
+ // Get from <div> if needed
+ if (is$1.empty(source)) {
+ source = player.media.getAttribute(player.config.attributes.embed.id);
+ }
+
+ var id = parseId(source);
+
+ // Build an iframe
+ var iframe = createElement('iframe');
+ var src = format(player.config.urls.vimeo.iframe, id, params);
+ iframe.setAttribute('src', src);
+ iframe.setAttribute('allowfullscreen', '');
+ iframe.setAttribute('allowtransparency', '');
+ iframe.setAttribute('allow', 'autoplay');
+
+ // Get poster, if already set
+ var poster = player.poster;
+
+ // Inject the package
+
+ var wrapper = createElement('div', { poster: poster, class: player.config.classNames.embedContainer });
+ wrapper.appendChild(iframe);
+ player.media = replaceElement(wrapper, player.media);
+
+ // Get poster image
+ fetch$1(format(player.config.urls.vimeo.api, id), 'json').then(function (response) {
+ if (is$1.empty(response)) {
+ return;
+ }
+
+ // Get the URL for thumbnail
+ var url = new URL(response[0].thumbnail_large);
+
+ // Get original image
+ url.pathname = url.pathname.split('_')[0] + '.jpg';
+
+ // Set and show poster
+ ui.setPoster.call(player, url.href).catch(function () {});
+ });
+
+ // Setup instance
+ // https://github.com/vimeo/player.js
+ player.embed = new window.Vimeo.Player(iframe, {
+ autopause: player.config.autopause,
+ muted: player.muted
+ });
+
+ player.media.paused = true;
+ player.media.currentTime = 0;
+
+ // Disable native text track rendering
+ if (player.supported.ui) {
+ player.embed.disableTextTrack();
+ }
+
+ // Create a faux HTML5 API using the Vimeo API
+ player.media.play = function () {
+ assurePlaybackState.call(player, true);
+ return player.embed.play();
+ };
+
+ player.media.pause = function () {
+ assurePlaybackState.call(player, false);
+ return player.embed.pause();
+ };
+
+ player.media.stop = function () {
+ player.pause();
+ player.currentTime = 0;
+ };
+
+ // Seeking
+ var currentTime = player.media.currentTime;
+
+ Object.defineProperty(player.media, 'currentTime', {
+ get: function get() {
+ return currentTime;
+ },
+ set: function set(time) {
+ // Vimeo will automatically play on seek if the video hasn't been played before
+
+ // Get current paused state and volume etc
+ var embed = player.embed,
+ media = player.media,
+ paused = player.paused,
+ volume = player.volume;
+
+ var restorePause = paused && !embed.hasPlayed;
+
+ // Set seeking state and trigger event
+ media.seeking = true;
+ triggerEvent.call(player, media, 'seeking');
+
+ // If paused, mute until seek is complete
+ Promise.resolve(restorePause && embed.setVolume(0))
+ // Seek
+ .then(function () {
+ return embed.setCurrentTime(time);
+ })
+ // Restore paused
+ .then(function () {
+ return restorePause && embed.pause();
+ })
+ // Restore volume
+ .then(function () {
+ return restorePause && embed.setVolume(volume);
+ }).catch(function () {
+ // Do nothing
+ });
+ }
+ });
+
+ // Playback speed
+ var speed = player.config.speed.selected;
+ Object.defineProperty(player.media, 'playbackRate', {
+ get: function get() {
+ return speed;
+ },
+ set: function set(input) {
+ player.embed.setPlaybackRate(input).then(function () {
+ speed = input;
+ triggerEvent.call(player, player.media, 'ratechange');
+ }).catch(function (error) {
+ // Hide menu item (and menu if empty)
+ if (error.name === 'Error') {
+ controls.setSpeedMenu.call(player, []);
+ }
+ });
+ }
+ });
+
+ // Volume
+ var volume = player.config.volume;
+
+ Object.defineProperty(player.media, 'volume', {
+ get: function get() {
+ return volume;
+ },
+ set: function set(input) {
+ player.embed.setVolume(input).then(function () {
+ volume = input;
+ triggerEvent.call(player, player.media, 'volumechange');
+ });
+ }
+ });
+
+ // Muted
+ var muted = player.config.muted;
+
+ Object.defineProperty(player.media, 'muted', {
+ get: function get() {
+ return muted;
+ },
+ set: function set(input) {
+ var toggle = is$1.boolean(input) ? input : false;
+
+ player.embed.setVolume(toggle ? 0 : player.config.volume).then(function () {
+ muted = toggle;
+ triggerEvent.call(player, player.media, 'volumechange');
+ });
+ }
+ });
+
+ // Loop
+ var loop = player.config.loop;
+
+ Object.defineProperty(player.media, 'loop', {
+ get: function get() {
+ return loop;
+ },
+ set: function set(input) {
+ var toggle = is$1.boolean(input) ? input : player.config.loop.active;
+
+ player.embed.setLoop(toggle).then(function () {
+ loop = toggle;
+ });
+ }
+ });
+
+ // Source
+ var currentSrc = void 0;
+ player.embed.getVideoUrl().then(function (value) {
+ currentSrc = value;
+ }).catch(function (error) {
+ _this2.debug.warn(error);
+ });
+
+ Object.defineProperty(player.media, 'currentSrc', {
+ get: function get() {
+ return currentSrc;
+ }
+ });
+
+ // Ended
+ Object.defineProperty(player.media, 'ended', {
+ get: function get() {
+ return player.currentTime === player.duration;
+ }
+ });
+
+ // Set aspect ratio based on video size
+ Promise.all([player.embed.getVideoWidth(), player.embed.getVideoHeight()]).then(function (dimensions) {
+ var ratio = getAspectRatio(dimensions[0], dimensions[1]);
+ vimeo.setAspectRatio.call(_this2, ratio);
+ });
+
+ // Set autopause
+ player.embed.setAutopause(player.config.autopause).then(function (state) {
+ player.config.autopause = state;
+ });
+
+ // Get title
+ player.embed.getVideoTitle().then(function (title) {
+ player.config.title = title;
+ ui.setTitle.call(_this2);
+ });
+
+ // Get current time
+ player.embed.getCurrentTime().then(function (value) {
+ currentTime = value;
+ triggerEvent.call(player, player.media, 'timeupdate');
+ });
+
+ // Get duration
+ player.embed.getDuration().then(function (value) {
+ player.media.duration = value;
+ triggerEvent.call(player, player.media, 'durationchange');
+ });
+
+ // Get captions
+ player.embed.getTextTracks().then(function (tracks) {
+ player.media.textTracks = tracks;
+ captions.setup.call(player);
+ });
+
+ player.embed.on('cuechange', function (_ref) {
+ var _ref$cues = _ref.cues,
+ cues = _ref$cues === undefined ? [] : _ref$cues;
+
+ var strippedCues = cues.map(function (cue) {
+ return stripHTML(cue.text);
+ });
+ captions.updateCues.call(player, strippedCues);
+ });
+
+ player.embed.on('loaded', function () {
+ // Assure state and events are updated on autoplay
+ player.embed.getPaused().then(function (paused) {
+ assurePlaybackState.call(player, !paused);
+ if (!paused) {
+ triggerEvent.call(player, player.media, 'playing');
+ }
+ });
+
+ if (is$1.element(player.embed.element) && player.supported.ui) {
+ var frame = player.embed.element;
+
+ // Fix keyboard focus issues
+ // https://github.com/sampotts/plyr/issues/317
+ frame.setAttribute('tabindex', -1);
+ }
+ });
+
+ player.embed.on('play', function () {
+ assurePlaybackState.call(player, true);
+ triggerEvent.call(player, player.media, 'playing');
+ });
+
+ player.embed.on('pause', function () {
+ assurePlaybackState.call(player, false);
+ });
+
+ player.embed.on('timeupdate', function (data) {
+ player.media.seeking = false;
+ currentTime = data.seconds;
+ triggerEvent.call(player, player.media, 'timeupdate');
+ });
+
+ player.embed.on('progress', function (data) {
+ player.media.buffered = data.percent;
+ triggerEvent.call(player, player.media, 'progress');
+
+ // Check all loaded
+ if (parseInt(data.percent, 10) === 1) {
+ triggerEvent.call(player, player.media, 'canplaythrough');
+ }
+
+ // Get duration as if we do it before load, it gives an incorrect value
+ // https://github.com/sampotts/plyr/issues/891
+ player.embed.getDuration().then(function (value) {
+ if (value !== player.media.duration) {
+ player.media.duration = value;
+ triggerEvent.call(player, player.media, 'durationchange');
+ }
+ });
+ });
+
+ player.embed.on('seeked', function () {
+ player.media.seeking = false;
+ triggerEvent.call(player, player.media, 'seeked');
+ });
+
+ player.embed.on('ended', function () {
+ player.media.paused = true;
+ triggerEvent.call(player, player.media, 'ended');
+ });
+
+ player.embed.on('error', function (detail) {
+ player.media.error = detail;
+ triggerEvent.call(player, player.media, 'error');
+ });
+
+ // Rebuild UI
+ setTimeout(function () {
+ return ui.build.call(player);
+ }, 0);
+ }
+ };
+
+ // ==========================================================================
+
+ // Parse YouTube ID from URL
+ function parseId$1(url) {
+ if (is$1.empty(url)) {
+ return null;
+ }
+
+ var regex = /^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|&v=)([^#&?]*).*/;
+ return url.match(regex) ? RegExp.$2 : url;
+ }
+
+ // Standardise YouTube quality unit
+ function mapQualityUnit(input) {
+ var qualities = {
+ hd2160: 2160,
+ hd1440: 1440,
+ hd1080: 1080,
+ hd720: 720,
+ large: 480,
+ medium: 360,
+ small: 240,
+ tiny: 144
+ };
+
+ var entry = Object.entries(qualities).find(function (entry) {
+ return entry.includes(input);
+ });
+
+ if (entry) {
+ // Get the match corresponding to the input
+ return entry.find(function (value) {
+ return value !== input;
+ });
+ }
+
+ return 'default';
+ }
+
+ function mapQualityUnits(levels) {
+ if (is$1.empty(levels)) {
+ return levels;
+ }
+
+ return dedupe(levels.map(function (level) {
+ return mapQualityUnit(level);
+ }));
+ }
+
+ // Set playback state and trigger change (only on actual change)
+ function assurePlaybackState$1(play) {
+ if (play && !this.embed.hasPlayed) {
+ this.embed.hasPlayed = true;
+ }
+ if (this.media.paused === play) {
+ this.media.paused = !play;
+ triggerEvent.call(this, this.media, play ? 'play' : 'pause');
+ }
+ }
+
+ var youtube = {
+ setup: function setup() {
+ var _this = this;
+
+ // Add embed class for responsive
+ toggleClass(this.elements.wrapper, this.config.classNames.embed, true);
+
+ // Set aspect ratio
+ youtube.setAspectRatio.call(this);
+
+ // Setup API
+ if (is$1.object(window.YT) && is$1.function(window.YT.Player)) {
+ youtube.ready.call(this);
+ } else {
+ // Load the API
+ loadScript(this.config.urls.youtube.sdk).catch(function (error) {
+ _this.debug.warn('YouTube API failed to load', error);
+ });
+
+ // Setup callback for the API
+ // YouTube has it's own system of course...
+ window.onYouTubeReadyCallbacks = window.onYouTubeReadyCallbacks || [];
+
+ // Add to queue
+ window.onYouTubeReadyCallbacks.push(function () {
+ youtube.ready.call(_this);
+ });
+
+ // Set callback to process queue
+ window.onYouTubeIframeAPIReady = function () {
+ window.onYouTubeReadyCallbacks.forEach(function (callback) {
+ callback();
+ });
+ };
+ }
+ },
+
+
+ // Get the media title
+ getTitle: function getTitle(videoId) {
+ var _this2 = this;
+
+ // Try via undocumented API method first
+ // This method disappears now and then though...
+ // https://github.com/sampotts/plyr/issues/709
+ if (is$1.function(this.embed.getVideoData)) {
+ var _embed$getVideoData = this.embed.getVideoData(),
+ title = _embed$getVideoData.title;
+
+ if (is$1.empty(title)) {
+ this.config.title = title;
+ ui.setTitle.call(this);
+ return;
+ }
+ }
+
+ // Or via Google API
+ var key = this.config.keys.google;
+ if (is$1.string(key) && !is$1.empty(key)) {
+ var url = format(this.config.urls.youtube.api, videoId, key);
+
+ fetch$1(url).then(function (result) {
+ if (is$1.object(result)) {
+ _this2.config.title = result.items[0].snippet.title;
+ ui.setTitle.call(_this2);
+ }
+ }).catch(function () {});
+ }
+ },
+
+
+ // Set aspect ratio
+ setAspectRatio: function setAspectRatio() {
+ var ratio = this.config.ratio.split(':');
+ this.elements.wrapper.style.paddingBottom = 100 / ratio[0] * ratio[1] + '%';
+ },
+
+
+ // API ready
+ ready: function ready$$1() {
+ var player = this;
+
+ // Ignore already setup (race condition)
+ var currentId = player.media.getAttribute('id');
+ if (!is$1.empty(currentId) && currentId.startsWith('youtube-')) {
+ return;
+ }
+
+ // Get the source URL or ID
+ var source = player.media.getAttribute('src');
+
+ // Get from <div> if needed
+ if (is$1.empty(source)) {
+ source = player.media.getAttribute(this.config.attributes.embed.id);
+ }
+
+ // Replace the <iframe> with a <div> due to YouTube API issues
+ var videoId = parseId$1(source);
+ var id = generateId(player.provider);
+
+ // Get poster, if already set
+ var poster = player.poster;
+
+ // Replace media element
+
+ var container = createElement('div', { id: id, poster: poster });
+ player.media = replaceElement(container, player.media);
+
+ // Id to poster wrapper
+ var posterSrc = function posterSrc(format$$1) {
+ return 'https://img.youtube.com/vi/' + videoId + '/' + format$$1 + 'default.jpg';
+ };
+
+ // Check thumbnail images in order of quality, but reject fallback thumbnails (120px wide)
+ loadImage(posterSrc('maxres'), 121) // Higest quality and unpadded
+ .catch(function () {
+ return loadImage(posterSrc('sd'), 121);
+ }) // 480p padded 4:3
+ .catch(function () {
+ return loadImage(posterSrc('hq'));
+ }) // 360p padded 4:3. Always exists
+ .then(function (image) {
+ return ui.setPoster.call(player, image.src);
+ }).then(function (posterSrc) {
+ // If the image is padded, use background-size "cover" instead (like youtube does too with their posters)
+ if (!posterSrc.includes('maxres')) {
+ player.elements.poster.style.backgroundSize = 'cover';
+ }
+ }).catch(function () {});
+
+ // Setup instance
+ // https://developers.google.com/youtube/iframe_api_reference
+ player.embed = new window.YT.Player(id, {
+ videoId: videoId,
+ playerVars: {
+ autoplay: player.config.autoplay ? 1 : 0, // Autoplay
+ controls: player.supported.ui ? 0 : 1, // Only show controls if not fully supported
+ rel: 0, // No related vids
+ showinfo: 0, // Hide info
+ iv_load_policy: 3, // Hide annotations
+ modestbranding: 1, // Hide logos as much as possible (they still show one in the corner when paused)
+ disablekb: 1, // Disable keyboard as we handle it
+ playsinline: 1, // Allow iOS inline playback
+
+ // Tracking for stats
+ // origin: window ? `${window.location.protocol}//${window.location.host}` : null,
+ widget_referrer: window ? window.location.href : null,
+
+ // Captions are flaky on YouTube
+ cc_load_policy: player.captions.active ? 1 : 0,
+ cc_lang_pref: player.config.captions.language
+ },
+ events: {
+ onError: function onError(event) {
+ // YouTube may fire onError twice, so only handle it once
+ if (!player.media.error) {
+ var code = event.data;
+ // Messages copied from https://developers.google.com/youtube/iframe_api_reference#onError
+ var message = {
+ 2: 'The request contains an invalid parameter value. For example, this error occurs if you specify a video ID that does not have 11 characters, or if the video ID contains invalid characters, such as exclamation points or asterisks.',
+ 5: 'The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.',
+ 100: 'The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.',
+ 101: 'The owner of the requested video does not allow it to be played in embedded players.',
+ 150: 'The owner of the requested video does not allow it to be played in embedded players.'
+ }[code] || 'An unknown error occured';
+
+ player.media.error = { code: code, message: message };
+
+ triggerEvent.call(player, player.media, 'error');
+ }
+ },
+ onPlaybackQualityChange: function onPlaybackQualityChange() {
+ triggerEvent.call(player, player.media, 'qualitychange', false, {
+ quality: player.media.quality
+ });
+ },
+ onPlaybackRateChange: function onPlaybackRateChange(event) {
+ // Get the instance
+ var instance = event.target;
+
+ // Get current speed
+ player.media.playbackRate = instance.getPlaybackRate();
+
+ triggerEvent.call(player, player.media, 'ratechange');
+ },
+ onReady: function onReady(event) {
+ // Get the instance
+ var instance = event.target;
+
+ // Get the title
+ youtube.getTitle.call(player, videoId);
+
+ // Create a faux HTML5 API using the YouTube API
+ player.media.play = function () {
+ assurePlaybackState$1.call(player, true);
+ instance.playVideo();
+ };
+
+ player.media.pause = function () {
+ assurePlaybackState$1.call(player, false);
+ instance.pauseVideo();
+ };
+
+ player.media.stop = function () {
+ instance.stopVideo();
+ };
+
+ player.media.duration = instance.getDuration();
+ player.media.paused = true;
+
+ // Seeking
+ player.media.currentTime = 0;
+ Object.defineProperty(player.media, 'currentTime', {
+ get: function get() {
+ return Number(instance.getCurrentTime());
+ },
+ set: function set(time) {
+ // If paused, mute audio preventively (YouTube starts playing on seek if the video hasn't been played yet).
+ if (player.paused) {
+ player.embed.mute();
+ }
+
+ // Set seeking state and trigger event
+ player.media.seeking = true;
+ triggerEvent.call(player, player.media, 'seeking');
+
+ // Seek after events sent
+ instance.seekTo(time);
+ }
+ });
+
+ // Playback speed
+ Object.defineProperty(player.media, 'playbackRate', {
+ get: function get() {
+ return instance.getPlaybackRate();
+ },
+ set: function set(input) {
+ instance.setPlaybackRate(input);
+ }
+ });
+
+ // Quality
+ Object.defineProperty(player.media, 'quality', {
+ get: function get() {
+ return mapQualityUnit(instance.getPlaybackQuality());
+ },
+ set: function set(input) {
+ instance.setPlaybackQuality(mapQualityUnit(input));
+ }
+ });
+
+ // Volume
+ var volume = player.config.volume;
+
+ Object.defineProperty(player.media, 'volume', {
+ get: function get() {
+ return volume;
+ },
+ set: function set(input) {
+ volume = input;
+ instance.setVolume(volume * 100);
+ triggerEvent.call(player, player.media, 'volumechange');
+ }
+ });
+
+ // Muted
+ var muted = player.config.muted;
+
+ Object.defineProperty(player.media, 'muted', {
+ get: function get() {
+ return muted;
+ },
+ set: function set(input) {
+ var toggle = is$1.boolean(input) ? input : muted;
+ muted = toggle;
+ instance[toggle ? 'mute' : 'unMute']();
+ triggerEvent.call(player, player.media, 'volumechange');
+ }
+ });
+
+ // Source
+ Object.defineProperty(player.media, 'currentSrc', {
+ get: function get() {
+ return instance.getVideoUrl();
+ }
+ });
+
+ // Ended
+ Object.defineProperty(player.media, 'ended', {
+ get: function get() {
+ return player.currentTime === player.duration;
+ }
+ });
+
+ // Get available speeds
+ player.options.speed = instance.getAvailablePlaybackRates();
+
+ // Set the tabindex to avoid focus entering iframe
+ if (player.supported.ui) {
+ player.media.setAttribute('tabindex', -1);
+ }
+
+ triggerEvent.call(player, player.media, 'timeupdate');
+ triggerEvent.call(player, player.media, 'durationchange');
+
+ // Reset timer
+ clearInterval(player.timers.buffering);
+
+ // Setup buffering
+ player.timers.buffering = setInterval(function () {
+ // Get loaded % from YouTube
+ player.media.buffered = instance.getVideoLoadedFraction();
+
+ // Trigger progress only when we actually buffer something
+ if (player.media.lastBuffered === null || player.media.lastBuffered < player.media.buffered) {
+ triggerEvent.call(player, player.media, 'progress');
+ }
+
+ // Set last buffer point
+ player.media.lastBuffered = player.media.buffered;
+
+ // Bail if we're at 100%
+ if (player.media.buffered === 1) {
+ clearInterval(player.timers.buffering);
+
+ // Trigger event
+ triggerEvent.call(player, player.media, 'canplaythrough');
+ }
+ }, 200);
+
+ // Rebuild UI
+ setTimeout(function () {
+ return ui.build.call(player);
+ }, 50);
+ },
+ onStateChange: function onStateChange(event) {
+ // Get the instance
+ var instance = event.target;
+
+ // Reset timer
+ clearInterval(player.timers.playing);
+
+ var seeked = player.media.seeking && [1, 2].includes(event.data);
+
+ if (seeked) {
+ // Unset seeking and fire seeked event
+ player.media.seeking = false;
+ triggerEvent.call(player, player.media, 'seeked');
+ }
+
+ // Handle events
+ // -1 Unstarted
+ // 0 Ended
+ // 1 Playing
+ // 2 Paused
+ // 3 Buffering
+ // 5 Video cued
+ switch (event.data) {
+ case -1:
+ // Update scrubber
+ triggerEvent.call(player, player.media, 'timeupdate');
+
+ // Get loaded % from YouTube
+ player.media.buffered = instance.getVideoLoadedFraction();
+ triggerEvent.call(player, player.media, 'progress');
+
+ break;
+
+ case 0:
+ assurePlaybackState$1.call(player, false);
+
+ // YouTube doesn't support loop for a single video, so mimick it.
+ if (player.media.loop) {
+ // YouTube needs a call to `stopVideo` before playing again
+ instance.stopVideo();
+ instance.playVideo();
+ } else {
+ triggerEvent.call(player, player.media, 'ended');
+ }
+
+ break;
+
+ case 1:
+ // Restore paused state (YouTube starts playing on seek if the video hasn't been played yet)
+ if (player.media.paused && !player.embed.hasPlayed) {
+ player.media.pause();
+ } else {
+ assurePlaybackState$1.call(player, true);
+
+ triggerEvent.call(player, player.media, 'playing');
+
+ // Poll to get playback progress
+ player.timers.playing = setInterval(function () {
+ triggerEvent.call(player, player.media, 'timeupdate');
+ }, 50);
+
+ // Check duration again due to YouTube bug
+ // https://github.com/sampotts/plyr/issues/374
+ // https://code.google.com/p/gdata-issues/issues/detail?id=8690
+ if (player.media.duration !== instance.getDuration()) {
+ player.media.duration = instance.getDuration();
+ triggerEvent.call(player, player.media, 'durationchange');
+ }
+
+ // Get quality
+ controls.setQualityMenu.call(player, mapQualityUnits(instance.getAvailableQualityLevels()));
+ }
+
+ break;
+
+ case 2:
+ // Restore audio (YouTube starts playing on seek if the video hasn't been played yet)
+ if (!player.muted) {
+ player.embed.unMute();
+ }
+ assurePlaybackState$1.call(player, false);
+
+ break;
+
+ default:
+ break;
+ }
+
+ triggerEvent.call(player, player.elements.container, 'statechange', false, {
+ code: event.data
+ });
+ }
+ }
+ });
+ }
+ };
+
+ // ==========================================================================
+
+ var media = {
+ // Setup media
+ setup: function setup() {
+ // If there's no media, bail
+ if (!this.media) {
+ this.debug.warn('No media element found!');
+ return;
+ }
+
+ // Add type class
+ toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', this.type), true);
+
+ // Add provider class
+ toggleClass(this.elements.container, this.config.classNames.provider.replace('{0}', this.provider), true);
+
+ // Add video class for embeds
+ // This will require changes if audio embeds are added
+ if (this.isEmbed) {
+ toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', 'video'), true);
+ }
+
+ // Inject the player wrapper
+ if (this.isVideo) {
+ // Create the wrapper div
+ this.elements.wrapper = createElement('div', {
+ class: this.config.classNames.video
+ });
+
+ // Wrap the video in a container
+ wrap$2(this.media, this.elements.wrapper);
+
+ // Faux poster container
+ this.elements.poster = createElement('div', {
+ class: this.config.classNames.poster
+ });
+
+ this.elements.wrapper.appendChild(this.elements.poster);
+ }
+
+ if (this.isHTML5) {
+ html5.extend.call(this);
+ } else if (this.isYouTube) {
+ youtube.setup.call(this);
+ } else if (this.isVimeo) {
+ vimeo.setup.call(this);
+ }
+ }
+ };
+
+ // ==========================================================================
+
+ var Ads = function () {
+ /**
+ * Ads constructor.
+ * @param {object} player
+ * @return {Ads}
+ */
+ function Ads(player) {
+ var _this = this;
+
+ classCallCheck(this, Ads);
+
+ this.player = player;
+ this.publisherId = player.config.ads.publisherId;
+ this.playing = false;
+ this.initialized = false;
+ this.elements = {
+ container: null,
+ displayContainer: null
+ };
+ this.manager = null;
+ this.loader = null;
+ this.cuePoints = null;
+ this.events = {};
+ this.safetyTimer = null;
+ this.countdownTimer = null;
+
+ // Setup a promise to resolve when the IMA manager is ready
+ this.managerPromise = new Promise(function (resolve, reject) {
+ // The ad is loaded and ready
+ _this.on('loaded', resolve);
+
+ // Ads failed
+ _this.on('error', reject);
+ });
+
+ this.load();
+ }
+
+ createClass(Ads, [{
+ key: 'load',
+
+
+ /**
+ * Load the IMA SDK
+ */
+ value: function load() {
+ var _this2 = this;
+
+ if (this.enabled) {
+ // Check if the Google IMA3 SDK is loaded or load it ourselves
+ if (!is$1.object(window.google) || !is$1.object(window.google.ima)) {
+ loadScript(this.player.config.urls.googleIMA.sdk).then(function () {
+ _this2.ready();
+ }).catch(function () {
+ // Script failed to load or is blocked
+ _this2.trigger('error', new Error('Google IMA SDK failed to load'));
+ });
+ } else {
+ this.ready();
+ }
+ }
+ }
+
+ /**
+ * Get the ads instance ready
+ */
+
+ }, {
+ key: 'ready',
+ value: function ready$$1() {
+ var _this3 = this;
+
+ // Start ticking our safety timer. If the whole advertisement
+ // thing doesn't resolve within our set time; we bail
+ this.startSafetyTimer(12000, 'ready()');
+
+ // Clear the safety timer
+ this.managerPromise.then(function () {
+ _this3.clearSafetyTimer('onAdsManagerLoaded()');
+ });
+
+ // Set listeners on the Plyr instance
+ this.listeners();
+
+ // Setup the IMA SDK
+ this.setupIMA();
+ }
+
+ // Build the default tag URL
+
+ }, {
+ key: 'setupIMA',
+
+
+ /**
+ * In order for the SDK to display ads for our video, we need to tell it where to put them,
+ * so here we define our ad container. This div is set up to render on top of the video player.
+ * Using the code below, we tell the SDK to render ads within that div. We also provide a
+ * handle to the content video player - the SDK will poll the current time of our player to
+ * properly place mid-rolls. After we create the ad display container, we initialize it. On
+ * mobile devices, this initialization is done as the result of a user action.
+ */
+ value: function setupIMA() {
+ // Create the container for our advertisements
+ this.elements.container = createElement('div', {
+ class: this.player.config.classNames.ads
+ });
+ this.player.elements.container.appendChild(this.elements.container);
+
+ // So we can run VPAID2
+ google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED);
+
+ // Set language
+ google.ima.settings.setLocale(this.player.config.ads.language);
+
+ // We assume the adContainer is the video container of the plyr element
+ // that will house the ads
+ this.elements.displayContainer = new google.ima.AdDisplayContainer(this.elements.container);
+
+ // Request video ads to be pre-loaded
+ this.requestAds();
+ }
+
+ /**
+ * Request advertisements
+ */
+
+ }, {
+ key: 'requestAds',
+ value: function requestAds() {
+ var _this4 = this;
+
+ var container = this.player.elements.container;
+
+
+ try {
+ // Create ads loader
+ this.loader = new google.ima.AdsLoader(this.elements.displayContainer);
+
+ // Listen and respond to ads loaded and error events
+ this.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, function (event) {
+ return _this4.onAdsManagerLoaded(event);
+ }, false);
+ this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) {
+ return _this4.onAdError(error);
+ }, false);
+
+ // Request video ads
+ var request = new google.ima.AdsRequest();
+ request.adTagUrl = this.tagUrl;
+
+ // Specify the linear and nonlinear slot sizes. This helps the SDK
+ // to select the correct creative if multiple are returned
+ request.linearAdSlotWidth = container.offsetWidth;
+ request.linearAdSlotHeight = container.offsetHeight;
+ request.nonLinearAdSlotWidth = container.offsetWidth;
+ request.nonLinearAdSlotHeight = container.offsetHeight;
+
+ // We only overlay ads as we only support video.
+ request.forceNonLinearFullSlot = false;
+
+ // Mute based on current state
+ request.setAdWillPlayMuted(!this.player.muted);
+
+ this.loader.requestAds(request);
+ } catch (e) {
+ this.onAdError(e);
+ }
+ }
+
+ /**
+ * Update the ad countdown
+ * @param {boolean} start
+ */
+
+ }, {
+ key: 'pollCountdown',
+ value: function pollCountdown() {
+ var _this5 = this;
+
+ var start = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
+
+ if (!start) {
+ clearInterval(this.countdownTimer);
+ this.elements.container.removeAttribute('data-badge-text');
+ return;
+ }
+
+ var update = function update() {
+ var time = formatTime(Math.max(_this5.manager.getRemainingTime(), 0));
+ var label = i18n.get('advertisement', _this5.player.config) + ' - ' + time;
+ _this5.elements.container.setAttribute('data-badge-text', label);
+ };
+
+ this.countdownTimer = setInterval(update, 100);
+ }
+
+ /**
+ * This method is called whenever the ads are ready inside the AdDisplayContainer
+ * @param {Event} adsManagerLoadedEvent
+ */
+
+ }, {
+ key: 'onAdsManagerLoaded',
+ value: function onAdsManagerLoaded(event) {
+ var _this6 = this;
+
+ // Get the ads manager
+ var settings = new google.ima.AdsRenderingSettings();
+
+ // Tell the SDK to save and restore content video state on our behalf
+ settings.restoreCustomPlaybackStateOnAdBreakComplete = true;
+ settings.enablePreloading = true;
+
+ // The SDK is polling currentTime on the contentPlayback. And needs a duration
+ // so it can determine when to start the mid- and post-roll
+ this.manager = event.getAdsManager(this.player, settings);
+
+ // Get the cue points for any mid-rolls by filtering out the pre- and post-roll
+ this.cuePoints = this.manager.getCuePoints();
+
+ // Add advertisement cue's within the time line if available
+ if (!is$1.empty(this.cuePoints)) {
+ this.cuePoints.forEach(function (cuePoint) {
+ if (cuePoint !== 0 && cuePoint !== -1 && cuePoint < _this6.player.duration) {
+ var seekElement = _this6.player.elements.progress;
+
+ if (is$1.element(seekElement)) {
+ var cuePercentage = 100 / _this6.player.duration * cuePoint;
+ var cue = createElement('span', {
+ class: _this6.player.config.classNames.cues
+ });
+
+ cue.style.left = cuePercentage.toString() + '%';
+ seekElement.appendChild(cue);
+ }
+ }
+ });
+ }
+
+ // Get skippable state
+ // TODO: Skip button
+ // this.player.debug.warn(this.manager.getAdSkippableState());
+
+ // Set volume to match player
+ this.manager.setVolume(this.player.volume);
+
+ // Add listeners to the required events
+ // Advertisement error events
+ this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) {
+ return _this6.onAdError(error);
+ });
+
+ // Advertisement regular events
+ Object.keys(google.ima.AdEvent.Type).forEach(function (type) {
+ _this6.manager.addEventListener(google.ima.AdEvent.Type[type], function (event) {
+ return _this6.onAdEvent(event);
+ });
+ });
+
+ // Resolve our adsManager
+ this.trigger('loaded');
+ }
+
+ /**
+ * This is where all the event handling takes place. Retrieve the ad from the event. Some
+ * events (e.g. ALL_ADS_COMPLETED) don't have the ad object associated
+ * https://developers.google.com/interactive-media-ads/docs/sdks/html5/v3/apis#ima.AdEvent.Type
+ * @param {Event} event
+ */
+
+ }, {
+ key: 'onAdEvent',
+ value: function onAdEvent(event) {
+ var _this7 = this;
+
+ var container = this.player.elements.container;
+
+ // Retrieve the ad from the event. Some events (e.g. ALL_ADS_COMPLETED)
+ // don't have ad object associated
+
+ var ad = event.getAd();
+
+ // Proxy event
+ var dispatchEvent = function dispatchEvent(type) {
+ var event = 'ads' + type.replace(/_/g, '').toLowerCase();
+ triggerEvent.call(_this7.player, _this7.player.media, event);
+ };
+
+ switch (event.type) {
+ case google.ima.AdEvent.Type.LOADED:
+ // This is the first event sent for an ad - it is possible to determine whether the
+ // ad is a video ad or an overlay
+ this.trigger('loaded');
+
+ // Bubble event
+ dispatchEvent(event.type);
+
+ // Start countdown
+ this.pollCountdown(true);
+
+ if (!ad.isLinear()) {
+ // Position AdDisplayContainer correctly for overlay
+ ad.width = container.offsetWidth;
+ ad.height = container.offsetHeight;
+ }
+
+ // console.info('Ad type: ' + event.getAd().getAdPodInfo().getPodIndex());
+ // console.info('Ad time: ' + event.getAd().getAdPodInfo().getTimeOffset());
+ break;
+
+ case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:
+ // All ads for the current videos are done. We can now request new advertisements
+ // in case the video is re-played
+
+ // Fire event
+ dispatchEvent(event.type);
+
+ // TODO: Example for what happens when a next video in a playlist would be loaded.
+ // So here we load a new video when all ads are done.
+ // Then we load new ads within a new adsManager. When the video
+ // Is started - after - the ads are loaded, then we get ads.
+ // You can also easily test cancelling and reloading by running
+ // player.ads.cancel() and player.ads.play from the console I guess.
+ // this.player.source = {
+ // type: 'video',
+ // title: 'View From A Blue Moon',
+ // sources: [{
+ // src:
+ // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.mp4', type:
+ // 'video/mp4', }], poster:
+ // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg', tracks:
+ // [ { kind: 'captions', label: 'English', srclang: 'en', src:
+ // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt',
+ // default: true, }, { kind: 'captions', label: 'French', srclang: 'fr', src:
+ // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt', }, ],
+ // };
+
+ // TODO: So there is still this thing where a video should only be allowed to start
+ // playing when the IMA SDK is ready or has failed
+
+ this.loadAds();
+ break;
+
+ case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:
+ // This event indicates the ad has started - the video player can adjust the UI,
+ // for example display a pause button and remaining time. Fired when content should
+ // be paused. This usually happens right before an ad is about to cover the content
+
+ dispatchEvent(event.type);
+
+ this.pauseContent();
+
+ break;
+
+ case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:
+ // This event indicates the ad has finished - the video player can perform
+ // appropriate UI actions, such as removing the timer for remaining time detection.
+ // Fired when content should be resumed. This usually happens when an ad finishes
+ // or collapses
+
+ dispatchEvent(event.type);
+
+ this.pollCountdown();
+
+ this.resumeContent();
+
+ break;
+
+ case google.ima.AdEvent.Type.STARTED:
+ case google.ima.AdEvent.Type.MIDPOINT:
+ case google.ima.AdEvent.Type.COMPLETE:
+ case google.ima.AdEvent.Type.IMPRESSION:
+ case google.ima.AdEvent.Type.CLICK:
+ dispatchEvent(event.type);
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ /**
+ * Any ad error handling comes through here
+ * @param {Event} event
+ */
+
+ }, {
+ key: 'onAdError',
+ value: function onAdError(event) {
+ this.cancel();
+ this.player.debug.warn('Ads error', event);
+ }
+
+ /**
+ * Setup hooks for Plyr and window events. This ensures
+ * the mid- and post-roll launch at the correct time. And
+ * resize the advertisement when the player resizes
+ */
+
+ }, {
+ key: 'listeners',
+ value: function listeners() {
+ var _this8 = this;
+
+ var container = this.player.elements.container;
+
+ var time = void 0;
+
+ // Add listeners to the required events
+ this.player.on('ended', function () {
+ _this8.loader.contentComplete();
+ });
+
+ this.player.on('seeking', function () {
+ time = _this8.player.currentTime;
+ return time;
+ });
+
+ this.player.on('seeked', function () {
+ var seekedTime = _this8.player.currentTime;
+
+ if (is$1.empty(_this8.cuePoints)) {
+ return;
+ }
+
+ _this8.cuePoints.forEach(function (cuePoint, index) {
+ if (time < cuePoint && cuePoint < seekedTime) {
+ _this8.manager.discardAdBreak();
+ _this8.cuePoints.splice(index, 1);
+ }
+ });
+ });
+
+ // Listen to the resizing of the window. And resize ad accordingly
+ // TODO: eventually implement ResizeObserver
+ window.addEventListener('resize', function () {
+ if (_this8.manager) {
+ _this8.manager.resize(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);
+ }
+ });
+ }
+
+ /**
+ * Initialize the adsManager and start playing advertisements
+ */
+
+ }, {
+ key: 'play',
+ value: function play() {
+ var _this9 = this;
+
+ var container = this.player.elements.container;
+
+
+ if (!this.managerPromise) {
+ this.resumeContent();
+ }
+
+ // Play the requested advertisement whenever the adsManager is ready
+ this.managerPromise.then(function () {
+ // Initialize the container. Must be done via a user action on mobile devices
+ _this9.elements.displayContainer.initialize();
+
+ try {
+ if (!_this9.initialized) {
+ // Initialize the ads manager. Ad rules playlist will start at this time
+ _this9.manager.init(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);
+
+ // Call play to start showing the ad. Single video and overlay ads will
+ // start at this time; the call will be ignored for ad rules
+ _this9.manager.start();
+ }
+
+ _this9.initialized = true;
+ } catch (adError) {
+ // An error may be thrown if there was a problem with the
+ // VAST response
+ _this9.onAdError(adError);
+ }
+ }).catch(function () {});
+ }
+
+ /**
+ * Resume our video
+ */
+
+ }, {
+ key: 'resumeContent',
+ value: function resumeContent() {
+ // Hide the advertisement container
+ this.elements.container.style.zIndex = '';
+
+ // Ad is stopped
+ this.playing = false;
+
+ // Play our video
+ if (this.player.currentTime < this.player.duration) {
+ this.player.play();
+ }
+ }
+
+ /**
+ * Pause our video
+ */
+
+ }, {
+ key: 'pauseContent',
+ value: function pauseContent() {
+ // Show the advertisement container
+ this.elements.container.style.zIndex = 3;
+
+ // Ad is playing.
+ this.playing = true;
+
+ // Pause our video.
+ this.player.pause();
+ }
+
+ /**
+ * Destroy the adsManager so we can grab new ads after this. If we don't then we're not
+ * allowed to call new ads based on google policies, as they interpret this as an accidental
+ * video requests. https://developers.google.com/interactive-
+ * media-ads/docs/sdks/android/faq#8
+ */
+
+ }, {
+ key: 'cancel',
+ value: function cancel() {
+ // Pause our video
+ if (this.initialized) {
+ this.resumeContent();
+ }
+
+ // Tell our instance that we're done for now
+ this.trigger('error');
+
+ // Re-create our adsManager
+ this.loadAds();
+ }
+
+ /**
+ * Re-create our adsManager
+ */
+
+ }, {
+ key: 'loadAds',
+ value: function loadAds() {
+ var _this10 = this;
+
+ // Tell our adsManager to go bye bye
+ this.managerPromise.then(function () {
+ // Destroy our adsManager
+ if (_this10.manager) {
+ _this10.manager.destroy();
+ }
+
+ // Re-set our adsManager promises
+ _this10.managerPromise = new Promise(function (resolve) {
+ _this10.on('loaded', resolve);
+ _this10.player.debug.log(_this10.manager);
+ });
+
+ // Now request some new advertisements
+ _this10.requestAds();
+ }).catch(function () {});
+ }
+
+ /**
+ * Handles callbacks after an ad event was invoked
+ * @param {string} event - Event type
+ */
+
+ }, {
+ key: 'trigger',
+ value: function trigger(event) {
+ var _this11 = this;
+
+ for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
+ args[_key - 1] = arguments[_key];
+ }
+
+ var handlers = this.events[event];
+
+ if (is$1.array(handlers)) {
+ handlers.forEach(function (handler) {
+ if (is$1.function(handler)) {
+ handler.apply(_this11, args);
+ }
+ });
+ }
+ }
+
+ /**
+ * Add event listeners
+ * @param {string} event - Event type
+ * @param {function} callback - Callback for when event occurs
+ * @return {Ads}
+ */
+
+ }, {
+ key: 'on',
+ value: function on$$1(event, callback) {
+ if (!is$1.array(this.events[event])) {
+ this.events[event] = [];
+ }
+
+ this.events[event].push(callback);
+
+ return this;
+ }
+
+ /**
+ * Setup a safety timer for when the ad network doesn't respond for whatever reason.
+ * The advertisement has 12 seconds to get its things together. We stop this timer when the
+ * advertisement is playing, or when a user action is required to start, then we clear the
+ * timer on ad ready
+ * @param {number} time
+ * @param {string} from
+ */
+
+ }, {
+ key: 'startSafetyTimer',
+ value: function startSafetyTimer(time, from) {
+ var _this12 = this;
+
+ this.player.debug.log('Safety timer invoked from: ' + from);
+
+ this.safetyTimer = setTimeout(function () {
+ _this12.cancel();
+ _this12.clearSafetyTimer('startSafetyTimer()');
+ }, time);
+ }
+
+ /**
+ * Clear our safety timer(s)
+ * @param {string} from
+ */
+
+ }, {
+ key: 'clearSafetyTimer',
+ value: function clearSafetyTimer(from) {
+ if (!is$1.nullOrUndefined(this.safetyTimer)) {
+ this.player.debug.log('Safety timer cleared from: ' + from);
+
+ clearTimeout(this.safetyTimer);
+ this.safetyTimer = null;
+ }
+ }
+ }, {
+ key: 'enabled',
+ get: function get() {
+ return this.player.isVideo && this.player.config.ads.enabled && !is$1.empty(this.publisherId);
+ }
+ }, {
+ key: 'tagUrl',
+ get: function get() {
+ var params = {
+ AV_PUBLISHERID: '58c25bb0073ef448b1087ad6',
+ AV_CHANNELID: '5a0458dc28a06145e4519d21',
+ AV_URL: location.hostname,
+ cb: Date.now(),
+ AV_WIDTH: 640,
+ AV_HEIGHT: 480,
+ AV_CDIM2: this.publisherId
+ };
+
+ var base = 'https://go.aniview.com/api/adserver6/vast/';
+
+ return base + '?' + buildUrlParams(params);
+ }
+ }]);
+ return Ads;
+ }();
+
+ // ==========================================================================
+
+ var source = {
+ // Add elements to HTML5 media (source, tracks, etc)
+ insertElements: function insertElements(type, attributes) {
+ var _this = this;
+
+ if (is$1.string(attributes)) {
+ insertElement(type, this.media, {
+ src: attributes
+ });
+ } else if (is$1.array(attributes)) {
+ attributes.forEach(function (attribute) {
+ insertElement(type, _this.media, attribute);
+ });
+ }
+ },
+
+
+ // Update source
+ // Sources are not checked for support so be careful
+ change: function change(input) {
+ var _this2 = this;
+
+ if (!getDeep(input, 'sources.length')) {
+ this.debug.warn('Invalid source format');
+ return;
+ }
+
+ // Cancel current network requests
+ html5.cancelRequests.call(this);
+
+ // Destroy instance and re-setup
+ this.destroy.call(this, function () {
+ // Reset quality options
+ _this2.options.quality = [];
+
+ // Remove elements
+ removeElement(_this2.media);
+ _this2.media = null;
+
+ // Reset class name
+ if (is$1.element(_this2.elements.container)) {
+ _this2.elements.container.removeAttribute('class');
+ }
+
+ // Set the type and provider
+ var sources = input.sources,
+ type = input.type;
+
+ var _sources = slicedToArray(sources, 1),
+ _sources$ = _sources[0],
+ _sources$$provider = _sources$.provider,
+ provider = _sources$$provider === undefined ? providers.html5 : _sources$$provider,
+ src = _sources$.src;
+
+ var tagName = provider === 'html5' ? type : 'div';
+ var attributes = provider === 'html5' ? {} : { src: src };
+
+ Object.assign(_this2, {
+ provider: provider,
+ type: type,
+ // Check for support
+ supported: support.check(type, provider, _this2.config.playsinline),
+ // Create new element
+ media: createElement(tagName, attributes)
+ });
+
+ // Inject the new element
+ _this2.elements.container.appendChild(_this2.media);
+
+ // Autoplay the new source?
+ if (is$1.boolean(input.autoplay)) {
+ _this2.config.autoplay = input.autoplay;
+ }
+
+ // Set attributes for audio and video
+ if (_this2.isHTML5) {
+ if (_this2.config.crossorigin) {
+ _this2.media.setAttribute('crossorigin', '');
+ }
+ if (_this2.config.autoplay) {
+ _this2.media.setAttribute('autoplay', '');
+ }
+ if (!is$1.empty(input.poster)) {
+ _this2.poster = input.poster;
+ }
+ if (_this2.config.loop.active) {
+ _this2.media.setAttribute('loop', '');
+ }
+ if (_this2.config.muted) {
+ _this2.media.setAttribute('muted', '');
+ }
+ if (_this2.config.playsinline) {
+ _this2.media.setAttribute('playsinline', '');
+ }
+ }
+
+ // Restore class hook
+ ui.addStyleHook.call(_this2);
+
+ // Set new sources for html5
+ if (_this2.isHTML5) {
+ source.insertElements.call(_this2, 'source', sources);
+ }
+
+ // Set video title
+ _this2.config.title = input.title;
+
+ // Set up from scratch
+ media.setup.call(_this2);
+
+ // HTML5 stuff
+ if (_this2.isHTML5) {
+ // Setup captions
+ if ('tracks' in input) {
+ source.insertElements.call(_this2, 'track', input.tracks);
+ }
+
+ // Load HTML5 sources
+ _this2.media.load();
+ }
+
+ // If HTML5 or embed but not fully supported, setupInterface and call ready now
+ if (_this2.isHTML5 || _this2.isEmbed && !_this2.supported.ui) {
+ // Setup interface
+ ui.build.call(_this2);
+ }
+
+ // Update the fullscreen support
+ _this2.fullscreen.update();
+ }, true);
+ }
+ };
+
+ // ==========================================================================
+
+ // Private properties
+ // TODO: Use a WeakMap for private globals
+ // const globals = new WeakMap();
+
+ // Plyr instance
+
+ var Plyr = function () {
+ function Plyr(target, options) {
+ var _this = this;
+
+ classCallCheck(this, Plyr);
+
+ this.timers = {};
+
+ // State
+ this.ready = false;
+ this.loading = false;
+ this.failed = false;
+
+ // Touch device
+ this.touch = support.touch;
+
+ // Set the media element
+ this.media = target;
+
+ // String selector passed
+ if (is$1.string(this.media)) {
+ this.media = document.querySelectorAll(this.media);
+ }
+
+ // jQuery, NodeList or Array passed, use first element
+ if (window.jQuery && this.media instanceof jQuery || is$1.nodeList(this.media) || is$1.array(this.media)) {
+ // eslint-disable-next-line
+ this.media = this.media[0];
+ }
+
+ // Set config
+ this.config = extend({}, defaults$1, Plyr.defaults, options || {}, function () {
+ try {
+ return JSON.parse(_this.media.getAttribute('data-plyr-config'));
+ } catch (e) {
+ return {};
+ }
+ }());
+
+ // Elements cache
+ this.elements = {
+ container: null,
+ buttons: {},
+ display: {},
+ progress: {},
+ inputs: {},
+ settings: {
+ menu: null,
+ panes: {},
+ tabs: {}
+ },
+ captions: null
+ };
+
+ // Captions
+ this.captions = {
+ active: null,
+ currentTrack: -1,
+ meta: new WeakMap()
+ };
+
+ // Fullscreen
+ this.fullscreen = {
+ active: false
+ };
+
+ // Options
+ this.options = {
+ speed: [],
+ quality: []
+ };
+
+ // Debugging
+ // TODO: move to globals
+ this.debug = new Console(this.config.debug);
+
+ // Log config options and support
+ this.debug.log('Config', this.config);
+ this.debug.log('Support', support);
+
+ // We need an element to setup
+ if (is$1.nullOrUndefined(this.media) || !is$1.element(this.media)) {
+ this.debug.error('Setup failed: no suitable element passed');
+ return;
+ }
+
+ // Bail if the element is initialized
+ if (this.media.plyr) {
+ this.debug.warn('Target already setup');
+ return;
+ }
+
+ // Bail if not enabled
+ if (!this.config.enabled) {
+ this.debug.error('Setup failed: disabled by config');
+ return;
+ }
+
+ // Bail if disabled or no basic support
+ // You may want to disable certain UAs etc
+ if (!support.check().api) {
+ this.debug.error('Setup failed: no support');
+ return;
+ }
+
+ // Cache original element state for .destroy()
+ var clone = this.media.cloneNode(true);
+ clone.autoplay = false;
+ this.elements.original = clone;
+
+ // Set media type based on tag or data attribute
+ // Supported: video, audio, vimeo, youtube
+ var type = this.media.tagName.toLowerCase();
+
+ // Embed properties
+ var iframe = null;
+ var url = null;
+
+ // Different setup based on type
+ switch (type) {
+ case 'div':
+ // Find the frame
+ iframe = this.media.querySelector('iframe');
+
+ // <iframe> type
+ if (is$1.element(iframe)) {
+ // Detect provider
+ url = parseUrl(iframe.getAttribute('src'));
+ this.provider = getProviderByUrl(url.toString());
+
+ // Rework elements
+ this.elements.container = this.media;
+ this.media = iframe;
+
+ // Reset classname
+ this.elements.container.className = '';
+
+ // Get attributes from URL and set config
+ if (url.searchParams.length) {
+ var truthy = ['1', 'true'];
+
+ if (truthy.includes(url.searchParams.get('autoplay'))) {
+ this.config.autoplay = true;
+ }
+ if (truthy.includes(url.searchParams.get('loop'))) {
+ this.config.loop.active = true;
+ }
+
+ // TODO: replace fullscreen.iosNative with this playsinline config option
+ // YouTube requires the playsinline in the URL
+ if (this.isYouTube) {
+ this.config.playsinline = truthy.includes(url.searchParams.get('playsinline'));
+ } else {
+ this.config.playsinline = true;
+ }
+ }
+ } else {
+ // <div> with attributes
+ this.provider = this.media.getAttribute(this.config.attributes.embed.provider);
+
+ // Remove attribute
+ this.media.removeAttribute(this.config.attributes.embed.provider);
+ }
+
+ // Unsupported or missing provider
+ if (is$1.empty(this.provider) || !Object.keys(providers).includes(this.provider)) {
+ this.debug.error('Setup failed: Invalid provider');
+ return;
+ }
+
+ // Audio will come later for external providers
+ this.type = types.video;
+
+ break;
+
+ case 'video':
+ case 'audio':
+ this.type = type;
+ this.provider = providers.html5;
+
+ // Get config from attributes
+ if (this.media.hasAttribute('crossorigin')) {
+ this.config.crossorigin = true;
+ }
+ if (this.media.hasAttribute('autoplay')) {
+ this.config.autoplay = true;
+ }
+ if (this.media.hasAttribute('playsinline')) {
+ this.config.playsinline = true;
+ }
+ if (this.media.hasAttribute('muted')) {
+ this.config.muted = true;
+ }
+ if (this.media.hasAttribute('loop')) {
+ this.config.loop.active = true;
+ }
+
+ break;
+
+ default:
+ this.debug.error('Setup failed: unsupported type');
+ return;
+ }
+
+ // Check for support again but with type
+ this.supported = support.check(this.type, this.provider, this.config.playsinline);
+
+ // If no support for even API, bail
+ if (!this.supported.api) {
+ this.debug.error('Setup failed: no support');
+ return;
+ }
+
+ this.eventListeners = [];
+
+ // Create listeners
+ this.listeners = new Listeners(this);
+
+ // Setup local storage for user settings
+ this.storage = new Storage(this);
+
+ // Store reference
+ this.media.plyr = this;
+
+ // Wrap media
+ if (!is$1.element(this.elements.container)) {
+ this.elements.container = createElement('div');
+ wrap$2(this.media, this.elements.container);
+ }
+
+ // Add style hook
+ ui.addStyleHook.call(this);
+
+ // Setup media
+ media.setup.call(this);
+
+ // Listen for events if debugging
+ if (this.config.debug) {
+ on.call(this, this.elements.container, this.config.events.join(' '), function (event) {
+ _this.debug.log('event: ' + event.type);
+ });
+ }
+
+ // Setup interface
+ // If embed but not fully supported, build interface now to avoid flash of controls
+ if (this.isHTML5 || this.isEmbed && !this.supported.ui) {
+ ui.build.call(this);
+ }
+
+ // Container listeners
+ this.listeners.container();
+
+ // Global listeners
+ this.listeners.global();
+
+ // Setup fullscreen
+ this.fullscreen = new Fullscreen(this);
+
+ // Setup ads if provided
+ this.ads = new Ads(this);
+
+ // Autoplay if required
+ if (this.config.autoplay) {
+ this.play();
+ }
+ }
+
+ // ---------------------------------------
+ // API
+ // ---------------------------------------
+
+ /**
+ * Types and provider helpers
+ */
+
+
+ createClass(Plyr, [{
+ key: 'play',
+
+
+ /**
+ * Play the media, or play the advertisement (if they are not blocked)
+ */
+ value: function play() {
+ if (!is$1.function(this.media.play)) {
+ return null;
+ }
+
+ // Return the promise (for HTML5)
+ return this.media.play();
+ }
+
+ /**
+ * Pause the media
+ */
+
+ }, {
+ key: 'pause',
+ value: function pause() {
+ if (!this.playing || !is$1.function(this.media.pause)) {
+ return;
+ }
+
+ this.media.pause();
+ }
+
+ /**
+ * Get playing state
+ */
+
+ }, {
+ key: 'togglePlay',
+
+
+ /**
+ * Toggle playback based on current status
+ * @param {boolean} input
+ */
+ value: function togglePlay(input) {
+ // Toggle based on current state if nothing passed
+ var toggle = is$1.boolean(input) ? input : !this.playing;
+
+ if (toggle) {
+ this.play();
+ } else {
+ this.pause();
+ }
+ }
+
+ /**
+ * Stop playback
+ */
+
+ }, {
+ key: 'stop',
+ value: function stop() {
+ if (this.isHTML5) {
+ this.pause();
+ this.restart();
+ } else if (is$1.function(this.media.stop)) {
+ this.media.stop();
+ }
+ }
+
+ /**
+ * Restart playback
+ */
+
+ }, {
+ key: 'restart',
+ value: function restart() {
+ this.currentTime = 0;
+ }
+
+ /**
+ * Rewind
+ * @param {number} seekTime - how far to rewind in seconds. Defaults to the config.seekTime
+ */
+
+ }, {
+ key: 'rewind',
+ value: function rewind(seekTime) {
+ this.currentTime = this.currentTime - (is$1.number(seekTime) ? seekTime : this.config.seekTime);
+ }
+
+ /**
+ * Fast forward
+ * @param {number} seekTime - how far to fast forward in seconds. Defaults to the config.seekTime
+ */
+
+ }, {
+ key: 'forward',
+ value: function forward(seekTime) {
+ this.currentTime = this.currentTime + (is$1.number(seekTime) ? seekTime : this.config.seekTime);
+ }
+
+ /**
+ * Seek to a time
+ * @param {number} input - where to seek to in seconds. Defaults to 0 (the start)
+ */
+
+ }, {
+ key: 'increaseVolume',
+
+
+ /**
+ * Increase volume
+ * @param {boolean} step - How much to decrease by (between 0 and 1)
+ */
+ value: function increaseVolume(step) {
+ var volume = this.media.muted ? 0 : this.volume;
+ this.volume = volume + (is$1.number(step) ? step : 1);
+ }
+
+ /**
+ * Decrease volume
+ * @param {boolean} step - How much to decrease by (between 0 and 1)
+ */
+
+ }, {
+ key: 'decreaseVolume',
+ value: function decreaseVolume(step) {
+ var volume = this.media.muted ? 0 : this.volume;
+ this.volume = volume - (is$1.number(step) ? step : 1);
+ }
+
+ /**
+ * Set muted state
+ * @param {boolean} mute
+ */
+
+ }, {
+ key: 'toggleCaptions',
+
+
+ /**
+ * Toggle captions
+ * @param {boolean} input - Whether to enable captions
+ */
+ value: function toggleCaptions(input) {
+ captions.toggle.call(this, input, false);
+ }
+
+ /**
+ * Set the caption track by index
+ * @param {number} - Caption index
+ */
+
+ }, {
+ key: 'airplay',
+
+
+ /**
+ * Trigger the airplay dialog
+ * TODO: update player with state, support, enabled
+ */
+ value: function airplay() {
+ // Show dialog if supported
+ if (support.airplay) {
+ this.media.webkitShowPlaybackTargetPicker();
+ }
+ }
+
+ /**
+ * Toggle the player controls
+ * @param {boolean} [toggle] - Whether to show the controls
+ */
+
+ }, {
+ key: 'toggleControls',
+ value: function toggleControls(toggle) {
+ // Don't toggle if missing UI support or if it's audio
+ if (this.supported.ui && !this.isAudio) {
+ // Get state before change
+ var isHidden = hasClass(this.elements.container, this.config.classNames.hideControls);
+
+ // Negate the argument if not undefined since adding the class to hides the controls
+ var force = typeof toggle === 'undefined' ? undefined : !toggle;
+
+ // Apply and get updated state
+ var hiding = toggleClass(this.elements.container, this.config.classNames.hideControls, force);
+
+ // Close menu
+ if (hiding && this.config.controls.includes('settings') && !is$1.empty(this.config.settings)) {
+ controls.toggleMenu.call(this, false);
+ }
+ // Trigger event on change
+ if (hiding !== isHidden) {
+ var eventName = hiding ? 'controlshidden' : 'controlsshown';
+ triggerEvent.call(this, this.media, eventName);
+ }
+ return !hiding;
+ }
+ return false;
+ }
+
+ /**
+ * Add event listeners
+ * @param {string} event - Event type
+ * @param {function} callback - Callback for when event occurs
+ */
+
+ }, {
+ key: 'on',
+ value: function on$$1(event, callback) {
+ on.call(this, this.elements.container, event, callback);
+ }
+ /**
+ * Add event listeners once
+ * @param {string} event - Event type
+ * @param {function} callback - Callback for when event occurs
+ */
+
+ }, {
+ key: 'once',
+ value: function once$$1(event, callback) {
+ once.call(this, this.elements.container, event, callback);
+ }
+ /**
+ * Remove event listeners
+ * @param {string} event - Event type
+ * @param {function} callback - Callback for when event occurs
+ */
+
+ }, {
+ key: 'off',
+ value: function off$$1(event, callback) {
+ off(this.elements.container, event, callback);
+ }
+
+ /**
+ * Destroy an instance
+ * Event listeners are removed when elements are removed
+ * http://stackoverflow.com/questions/12528049/if-a-dom-element-is-removed-are-its-listeners-also-removed-from-memory
+ * @param {function} callback - Callback for when destroy is complete
+ * @param {boolean} soft - Whether it's a soft destroy (for source changes etc)
+ */
+
+ }, {
+ key: 'destroy',
+ value: function destroy(callback) {
+ var _this2 = this;
+
+ var soft = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
+
+ if (!this.ready) {
+ return;
+ }
+
+ var done = function done() {
+ // Reset overflow (incase destroyed while in fullscreen)
+ document.body.style.overflow = '';
+
+ // GC for embed
+ _this2.embed = null;
+
+ // If it's a soft destroy, make minimal changes
+ if (soft) {
+ if (Object.keys(_this2.elements).length) {
+ // Remove elements
+ removeElement(_this2.elements.buttons.play);
+ removeElement(_this2.elements.captions);
+ removeElement(_this2.elements.controls);
+ removeElement(_this2.elements.wrapper);
+
+ // Clear for GC
+ _this2.elements.buttons.play = null;
+ _this2.elements.captions = null;
+ _this2.elements.controls = null;
+ _this2.elements.wrapper = null;
+ }
+
+ // Callback
+ if (is$1.function(callback)) {
+ callback();
+ }
+ } else {
+ // Unbind listeners
+ unbindListeners.call(_this2);
+
+ // Replace the container with the original element provided
+ replaceElement(_this2.elements.original, _this2.elements.container);
+
+ // Event
+ triggerEvent.call(_this2, _this2.elements.original, 'destroyed', true);
+
+ // Callback
+ if (is$1.function(callback)) {
+ callback.call(_this2.elements.original);
+ }
+
+ // Reset state
+ _this2.ready = false;
+
+ // Clear for garbage collection
+ setTimeout(function () {
+ _this2.elements = null;
+ _this2.media = null;
+ }, 200);
+ }
+ };
+
+ // Stop playback
+ this.stop();
+
+ // Provider specific stuff
+ if (this.isHTML5) {
+ // Clear timeout
+ clearTimeout(this.timers.loading);
+
+ // Restore native video controls
+ ui.toggleNativeControls.call(this, true);
+
+ // Clean up
+ done();
+ } else if (this.isYouTube) {
+ // Clear timers
+ clearInterval(this.timers.buffering);
+ clearInterval(this.timers.playing);
+
+ // Destroy YouTube API
+ if (this.embed !== null && is$1.function(this.embed.destroy)) {
+ this.embed.destroy();
+ }
+
+ // Clean up
+ done();
+ } else if (this.isVimeo) {
+ // Destroy Vimeo API
+ // then clean up (wait, to prevent postmessage errors)
+ if (this.embed !== null) {
+ this.embed.unload().then(done);
+ }
+
+ // Vimeo does not always return
+ setTimeout(done, 200);
+ }
+ }
+
+ /**
+ * Check for support for a mime type (HTML5 only)
+ * @param {string} type - Mime type
+ */
+
+ }, {
+ key: 'supports',
+ value: function supports(type) {
+ return support.mime.call(this, type);
+ }
+
+ /**
+ * Check for support
+ * @param {string} type - Player type (audio/video)
+ * @param {string} provider - Provider (html5/youtube/vimeo)
+ * @param {bool} inline - Where player has `playsinline` sttribute
+ */
+
+ }, {
+ key: 'isHTML5',
+ get: function get() {
+ return Boolean(this.provider === providers.html5);
+ }
+ }, {
+ key: 'isEmbed',
+ get: function get() {
+ return Boolean(this.isYouTube || this.isVimeo);
+ }
+ }, {
+ key: 'isYouTube',
+ get: function get() {
+ return Boolean(this.provider === providers.youtube);
+ }
+ }, {
+ key: 'isVimeo',
+ get: function get() {
+ return Boolean(this.provider === providers.vimeo);
+ }
+ }, {
+ key: 'isVideo',
+ get: function get() {
+ return Boolean(this.type === types.video);
+ }
+ }, {
+ key: 'isAudio',
+ get: function get() {
+ return Boolean(this.type === types.audio);
+ }
+ }, {
+ key: 'playing',
+ get: function get() {
+ return Boolean(this.ready && !this.paused && !this.ended);
+ }
+
+ /**
+ * Get paused state
+ */
+
+ }, {
+ key: 'paused',
+ get: function get() {
+ return Boolean(this.media.paused);
+ }
+
+ /**
+ * Get stopped state
+ */
+
+ }, {
+ key: 'stopped',
+ get: function get() {
+ return Boolean(this.paused && this.currentTime === 0);
+ }
+
+ /**
+ * Get ended state
+ */
+
+ }, {
+ key: 'ended',
+ get: function get() {
+ return Boolean(this.media.ended);
+ }
+ }, {
+ key: 'currentTime',
+ set: function set(input) {
+ // Bail if media duration isn't available yet
+ if (!this.duration) {
+ return;
+ }
+
+ // Validate input
+ var inputIsValid = is$1.number(input) && input > 0;
+
+ // Set
+ this.media.currentTime = inputIsValid ? Math.min(input, this.duration) : 0;
+
+ // Logging
+ this.debug.log('Seeking to ' + this.currentTime + ' seconds');
+ }
+
+ /**
+ * Get current time
+ */
+ ,
+ get: function get() {
+ return Number(this.media.currentTime);
+ }
+
+ /**
+ * Get buffered
+ */
+
+ }, {
+ key: 'buffered',
+ get: function get() {
+ var buffered = this.media.buffered;
+
+ // YouTube / Vimeo return a float between 0-1
+
+ if (is$1.number(buffered)) {
+ return buffered;
+ }
+
+ // HTML5
+ // TODO: Handle buffered chunks of the media
+ // (i.e. seek to another section buffers only that section)
+ if (buffered && buffered.length && this.duration > 0) {
+ return buffered.end(0) / this.duration;
+ }
+
+ return 0;
+ }
+
+ /**
+ * Get seeking status
+ */
+
+ }, {
+ key: 'seeking',
+ get: function get() {
+ return Boolean(this.media.seeking);
+ }
+
+ /**
+ * Get the duration of the current media
+ */
+
+ }, {
+ key: 'duration',
+ get: function get() {
+ // Faux duration set via config
+ var fauxDuration = parseFloat(this.config.duration);
+
+ // Media duration can be NaN before the media has loaded
+ var duration = (this.media || {}).duration || 0;
+
+ // If config duration is funky, use regular duration
+ return fauxDuration || duration;
+ }
+
+ /**
+ * Set the player volume
+ * @param {number} value - must be between 0 and 1. Defaults to the value from local storage and config.volume if not set in storage
+ */
+
+ }, {
+ key: 'volume',
+ set: function set(value) {
+ var volume = value;
+ var max = 1;
+ var min = 0;
+
+ if (is$1.string(volume)) {
+ volume = Number(volume);
+ }
+
+ // Load volume from storage if no value specified
+ if (!is$1.number(volume)) {
+ volume = this.storage.get('volume');
+ }
+
+ // Use config if all else fails
+ if (!is$1.number(volume)) {
+ volume = this.config.volume;
+ }
+
+ // Maximum is volumeMax
+ if (volume > max) {
+ volume = max;
+ }
+ // Minimum is volumeMin
+ if (volume < min) {
+ volume = min;
+ }
+
+ // Update config
+ this.config.volume = volume;
+
+ // Set the player volume
+ this.media.volume = volume;
+
+ // If muted, and we're increasing volume manually, reset muted state
+ if (!is$1.empty(value) && this.muted && volume > 0) {
+ this.muted = false;
+ }
+ }
+
+ /**
+ * Get the current player volume
+ */
+ ,
+ get: function get() {
+ return Number(this.media.volume);
+ }
+ }, {
+ key: 'muted',
+ set: function set(mute) {
+ var toggle = mute;
+
+ // Load muted state from storage
+ if (!is$1.boolean(toggle)) {
+ toggle = this.storage.get('muted');
+ }
+
+ // Use config if all else fails
+ if (!is$1.boolean(toggle)) {
+ toggle = this.config.muted;
+ }
+
+ // Update config
+ this.config.muted = toggle;
+
+ // Set mute on the player
+ this.media.muted = toggle;
+ }
+
+ /**
+ * Get current muted state
+ */
+ ,
+ get: function get() {
+ return Boolean(this.media.muted);
+ }
+
+ /**
+ * Check if the media has audio
+ */
+
+ }, {
+ key: 'hasAudio',
+ get: function get() {
+ // Assume yes for all non HTML5 (as we can't tell...)
+ if (!this.isHTML5) {
+ return true;
+ }
+
+ if (this.isAudio) {
+ return true;
+ }
+
+ // Get audio tracks
+ return Boolean(this.media.mozHasAudio) || Boolean(this.media.webkitAudioDecodedByteCount) || Boolean(this.media.audioTracks && this.media.audioTracks.length);
+ }
+
+ /**
+ * Set playback speed
+ * @param {number} speed - the speed of playback (0.5-2.0)
+ */
+
+ }, {
+ key: 'speed',
+ set: function set(input) {
+ var speed = null;
+
+ if (is$1.number(input)) {
+ speed = input;
+ }
+
+ if (!is$1.number(speed)) {
+ speed = this.storage.get('speed');
+ }
+
+ if (!is$1.number(speed)) {
+ speed = this.config.speed.selected;
+ }
+
+ // Set min/max
+ if (speed < 0.1) {
+ speed = 0.1;
+ }
+ if (speed > 2.0) {
+ speed = 2.0;
+ }
+
+ if (!this.config.speed.options.includes(speed)) {
+ this.debug.warn('Unsupported speed (' + speed + ')');
+ return;
+ }
+
+ // Update config
+ this.config.speed.selected = speed;
+
+ // Set media speed
+ this.media.playbackRate = speed;
+ }
+
+ /**
+ * Get current playback speed
+ */
+ ,
+ get: function get() {
+ return Number(this.media.playbackRate);
+ }
+
+ /**
+ * Set playback quality
+ * Currently HTML5 & YouTube only
+ * @param {number} input - Quality level
+ */
+
+ }, {
+ key: 'quality',
+ set: function set(input) {
+ var config = this.config.quality;
+ var options = this.options.quality;
+
+ if (!options.length) {
+ return;
+ }
+
+ var quality = [!is$1.empty(input) && Number(input), this.storage.get('quality'), config.selected, config.default].find(is$1.number);
+
+ if (!options.includes(quality)) {
+ var value = closest(options, quality);
+ this.debug.warn('Unsupported quality option: ' + quality + ', using ' + value + ' instead');
+ quality = value;
+ }
+
+ // Trigger request event
+ triggerEvent.call(this, this.media, 'qualityrequested', false, { quality: quality });
+
+ // Update config
+ config.selected = quality;
+
+ // Set quality
+ this.media.quality = quality;
+ }
+
+ /**
+ * Get current quality level
+ */
+ ,
+ get: function get() {
+ return this.media.quality;
+ }
+
+ /**
+ * Toggle loop
+ * TODO: Finish fancy new logic. Set the indicator on load as user may pass loop as config
+ * @param {boolean} input - Whether to loop or not
+ */
+
+ }, {
+ key: 'loop',
+ set: function set(input) {
+ var toggle = is$1.boolean(input) ? input : this.config.loop.active;
+ this.config.loop.active = toggle;
+ this.media.loop = toggle;
+
+ // Set default to be a true toggle
+ /* const type = ['start', 'end', 'all', 'none', 'toggle'].includes(input) ? input : 'toggle';
+ switch (type) {
+ case 'start':
+ if (this.config.loop.end && this.config.loop.end <= this.currentTime) {
+ this.config.loop.end = null;
+ }
+ this.config.loop.start = this.currentTime;
+ // this.config.loop.indicator.start = this.elements.display.played.value;
+ break;
+ case 'end':
+ if (this.config.loop.start >= this.currentTime) {
+ return this;
+ }
+ this.config.loop.end = this.currentTime;
+ // this.config.loop.indicator.end = this.elements.display.played.value;
+ break;
+ case 'all':
+ this.config.loop.start = 0;
+ this.config.loop.end = this.duration - 2;
+ this.config.loop.indicator.start = 0;
+ this.config.loop.indicator.end = 100;
+ break;
+ case 'toggle':
+ if (this.config.loop.active) {
+ this.config.loop.start = 0;
+ this.config.loop.end = null;
+ } else {
+ this.config.loop.start = 0;
+ this.config.loop.end = this.duration - 2;
+ }
+ break;
+ default:
+ this.config.loop.start = 0;
+ this.config.loop.end = null;
+ break;
+ } */
+ }
+
+ /**
+ * Get current loop state
+ */
+ ,
+ get: function get() {
+ return Boolean(this.media.loop);
+ }
+
+ /**
+ * Set new media source
+ * @param {object} input - The new source object (see docs)
+ */
+
+ }, {
+ key: 'source',
+ set: function set(input) {
+ source.change.call(this, input);
+ }
+
+ /**
+ * Get current source
+ */
+ ,
+ get: function get() {
+ return this.media.currentSrc;
+ }
+
+ /**
+ * Set the poster image for a video
+ * @param {input} - the URL for the new poster image
+ */
+
+ }, {
+ key: 'poster',
+ set: function set(input) {
+ if (!this.isVideo) {
+ this.debug.warn('Poster can only be set for video');
+ return;
+ }
+
+ ui.setPoster.call(this, input, false).catch(function () {});
+ }
+
+ /**
+ * Get the current poster image
+ */
+ ,
+ get: function get() {
+ if (!this.isVideo) {
+ return null;
+ }
+
+ return this.media.getAttribute('poster');
+ }
+
+ /**
+ * Set the autoplay state
+ * @param {boolean} input - Whether to autoplay or not
+ */
+
+ }, {
+ key: 'autoplay',
+ set: function set(input) {
+ var toggle = is$1.boolean(input) ? input : this.config.autoplay;
+ this.config.autoplay = toggle;
+ }
+
+ /**
+ * Get the current autoplay state
+ */
+ ,
+ get: function get() {
+ return Boolean(this.config.autoplay);
+ }
+ }, {
+ key: 'currentTrack',
+ set: function set(input) {
+ captions.set.call(this, input, false);
+ }
+
+ /**
+ * Get the current caption track index (-1 if disabled)
+ */
+ ,
+ get: function get() {
+ var _captions = this.captions,
+ toggled = _captions.toggled,
+ currentTrack = _captions.currentTrack;
+
+ return toggled ? currentTrack : -1;
+ }
+
+ /**
+ * Set the wanted language for captions
+ * Since tracks can be added later it won't update the actual caption track until there is a matching track
+ * @param {string} - Two character ISO language code (e.g. EN, FR, PT, etc)
+ */
+
+ }, {
+ key: 'language',
+ set: function set(input) {
+ captions.setLanguage.call(this, input, false);
+ }
+
+ /**
+ * Get the current track's language
+ */
+ ,
+ get: function get() {
+ return (captions.getCurrentTrack.call(this) || {}).language;
+ }
+
+ /**
+ * Toggle picture-in-picture playback on WebKit/MacOS
+ * TODO: update player with state, support, enabled
+ * TODO: detect outside changes
+ */
+
+ }, {
+ key: 'pip',
+ set: function set(input) {
+ var states = {
+ pip: 'picture-in-picture',
+ inline: 'inline'
+ };
+
+ // Bail if no support
+ if (!support.pip) {
+ return;
+ }
+
+ // Toggle based on current state if not passed
+ var toggle = is$1.boolean(input) ? input : this.pip === states.inline;
+
+ // Toggle based on current state
+ this.media.webkitSetPresentationMode(toggle ? states.pip : states.inline);
+ }
+
+ /**
+ * Get the current picture-in-picture state
+ */
+ ,
+ get: function get() {
+ if (!support.pip) {
+ return null;
+ }
+
+ return this.media.webkitPresentationMode;
+ }
+ }], [{
+ key: 'supported',
+ value: function supported(type, provider, inline) {
+ return support.check(type, provider, inline);
+ }
+
+ /**
+ * Load an SVG sprite into the page
+ * @param {string} url - URL for the SVG sprite
+ * @param {string} [id] - Unique ID
+ */
+
+ }, {
+ key: 'loadSprite',
+ value: function loadSprite$$1(url, id) {
+ return loadSprite(url, id);
+ }
+
+ /**
+ * Setup multiple instances
+ * @param {*} selector
+ * @param {object} options
+ */
+
+ }, {
+ key: 'setup',
+ value: function setup(selector) {
+ var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+
+ var targets = null;
+
+ if (is$1.string(selector)) {
+ targets = Array.from(document.querySelectorAll(selector));
+ } else if (is$1.nodeList(selector)) {
+ targets = Array.from(selector);
+ } else if (is$1.array(selector)) {
+ targets = selector.filter(is$1.element);
+ }
+
+ if (is$1.empty(targets)) {
+ return null;
+ }
+
+ return targets.map(function (t) {
+ return new Plyr(t, options);
+ });
+ }
+ }]);
+ return Plyr;
+ }();
+
+ Plyr.defaults = cloneDeep(defaults$1);
+
+ // ==========================================================================
+
+ return Plyr;
})));
diff --git a/dist/plyr.polyfilled.js.map b/dist/plyr.polyfilled.js.map
index 13c66f50..15e69425 100644
--- a/dist/plyr.polyfilled.js.map
+++ b/dist/plyr.polyfilled.js.map
@@ -1 +1 @@
-{"version":3,"sources":["../../node_modules/core-js/modules/_global.js","../../node_modules/core-js/modules/_core.js","../../node_modules/core-js/modules/_is-object.js","../../node_modules/core-js/modules/_an-object.js","../../node_modules/core-js/modules/_fails.js","../../node_modules/core-js/modules/_descriptors.js","../../node_modules/core-js/modules/_dom-create.js","../../node_modules/core-js/modules/_ie8-dom-define.js","../../node_modules/core-js/modules/_to-primitive.js","../../node_modules/core-js/modules/_object-dp.js","../../node_modules/core-js/modules/_property-desc.js","../../node_modules/core-js/modules/_hide.js","../../node_modules/core-js/modules/_has.js","../../node_modules/core-js/modules/_uid.js","../../node_modules/core-js/modules/_redefine.js","../../node_modules/core-js/modules/_a-function.js","../../node_modules/core-js/modules/_ctx.js","../../node_modules/core-js/modules/_export.js","../../node_modules/core-js/modules/_typed.js","../../node_modules/core-js/modules/_library.js","../../node_modules/core-js/modules/_redefine-all.js","../../node_modules/core-js/modules/_an-instance.js","../../node_modules/core-js/modules/_to-integer.js","../../node_modules/core-js/modules/_to-length.js","../../node_modules/core-js/modules/_to-index.js","../../node_modules/core-js/modules/_cof.js","../../node_modules/core-js/modules/_iobject.js","../../node_modules/core-js/modules/_defined.js","../../node_modules/core-js/modules/_to-iobject.js","../../node_modules/core-js/modules/_to-absolute-index.js","../../node_modules/core-js/modules/_array-includes.js","../../node_modules/core-js/modules/_shared.js","../../node_modules/core-js/modules/_shared-key.js","../../node_modules/core-js/modules/_object-keys-internal.js","../../node_modules/core-js/modules/_enum-bug-keys.js","../../node_modules/core-js/modules/_object-gopn.js","../../node_modules/core-js/modules/_to-object.js","../../node_modules/core-js/modules/_array-fill.js","../../node_modules/core-js/modules/_wks.js","../../node_modules/core-js/modules/_set-to-string-tag.js","../../node_modules/core-js/modules/_typed-buffer.js","../../node_modules/core-js/modules/_species-constructor.js","../../node_modules/core-js/modules/_set-species.js","../../node_modules/core-js/modules/es6.typed.array-buffer.js","../../node_modules/core-js/modules/_classof.js","../../node_modules/core-js/modules/_iterators.js","../../node_modules/core-js/modules/_is-array-iter.js","../../node_modules/core-js/modules/_object-keys.js","../../node_modules/core-js/modules/_object-dps.js","../../node_modules/core-js/modules/_html.js","../../node_modules/core-js/modules/_object-create.js","../../node_modules/core-js/modules/_object-gpo.js","../../node_modules/core-js/modules/core.get-iterator-method.js","../../node_modules/core-js/modules/_is-array.js","../../node_modules/core-js/modules/_array-species-constructor.js","../../node_modules/core-js/modules/_array-species-create.js","../../node_modules/core-js/modules/_array-methods.js","../../node_modules/core-js/modules/_add-to-unscopables.js","../../node_modules/core-js/modules/_iter-step.js","../../node_modules/core-js/modules/_iter-create.js","../../node_modules/core-js/modules/_iter-define.js","../../node_modules/core-js/modules/es6.array.iterator.js","../../node_modules/core-js/modules/_iter-detect.js","../../node_modules/core-js/modules/_array-copy-within.js","../../node_modules/core-js/modules/_object-pie.js","../../node_modules/core-js/modules/_object-gopd.js","../../node_modules/core-js/modules/_typed-array.js","../../node_modules/core-js/modules/es6.typed.int8-array.js","../../node_modules/core-js/modules/es6.typed.uint8-array.js","../../node_modules/core-js/modules/es6.typed.uint8-clamped-array.js","../../node_modules/core-js/modules/es6.typed.int16-array.js","../../node_modules/core-js/modules/es6.typed.uint16-array.js","../../node_modules/core-js/modules/es6.typed.int32-array.js","../../node_modules/core-js/modules/es6.typed.uint32-array.js","../../node_modules/core-js/modules/es6.typed.float32-array.js","../../node_modules/core-js/modules/es6.typed.float64-array.js","../../node_modules/core-js/modules/_iter-call.js","../../node_modules/core-js/modules/_for-of.js","../../node_modules/core-js/modules/_meta.js","../../node_modules/core-js/modules/_validate-collection.js","../../node_modules/core-js/modules/_collection-strong.js","../../node_modules/core-js/modules/_set-proto.js","../../node_modules/core-js/modules/_inherit-if-required.js","../../node_modules/core-js/modules/_collection.js","../../node_modules/core-js/modules/es6.map.js","../../node_modules/core-js/modules/es6.set.js","../../node_modules/core-js/modules/_object-gops.js","../../node_modules/core-js/modules/_object-assign.js","../../node_modules/core-js/modules/_collection-weak.js","../../node_modules/core-js/modules/es6.weak-map.js","../../node_modules/core-js/modules/es6.weak-set.js","../../node_modules/core-js/modules/es6.reflect.apply.js","../../node_modules/core-js/modules/_invoke.js","../../node_modules/core-js/modules/_bind.js","../../node_modules/core-js/modules/es6.reflect.construct.js","../../node_modules/core-js/modules/es6.reflect.define-property.js","../../node_modules/core-js/modules/es6.reflect.delete-property.js","../../node_modules/core-js/modules/es6.reflect.get.js","../../node_modules/core-js/modules/es6.reflect.get-own-property-descriptor.js","../../node_modules/core-js/modules/es6.reflect.get-prototype-of.js","../../node_modules/core-js/modules/es6.reflect.has.js","../../node_modules/core-js/modules/es6.reflect.is-extensible.js","../../node_modules/core-js/modules/_own-keys.js","../../node_modules/core-js/modules/es6.reflect.own-keys.js","../../node_modules/core-js/modules/es6.reflect.prevent-extensions.js","../../node_modules/core-js/modules/es6.reflect.set.js","../../node_modules/core-js/modules/es6.reflect.set-prototype-of.js","../../node_modules/core-js/modules/_task.js","../../node_modules/core-js/modules/_microtask.js","../../node_modules/core-js/modules/_new-promise-capability.js","../../node_modules/core-js/modules/_perform.js","../../node_modules/core-js/modules/_promise-resolve.js","../../node_modules/core-js/modules/es6.promise.js","../../node_modules/core-js/modules/_wks-ext.js","../../node_modules/core-js/modules/_wks-define.js","../../node_modules/core-js/modules/_enum-keys.js","../../node_modules/core-js/modules/_object-gopn-ext.js","../../node_modules/core-js/modules/es6.symbol.js","../../node_modules/core-js/modules/_object-sap.js","../../node_modules/core-js/modules/es6.object.freeze.js","../../node_modules/core-js/modules/es6.object.seal.js","../../node_modules/core-js/modules/es6.object.prevent-extensions.js","../../node_modules/core-js/modules/es6.object.is-frozen.js","../../node_modules/core-js/modules/es6.object.is-sealed.js","../../node_modules/core-js/modules/es6.object.is-extensible.js","../../node_modules/core-js/modules/es6.object.get-own-property-descriptor.js","../../node_modules/core-js/modules/es6.object.get-prototype-of.js","../../node_modules/core-js/modules/es6.object.keys.js","../../node_modules/core-js/modules/es6.object.get-own-property-names.js","../../node_modules/core-js/modules/es6.object.assign.js","../../node_modules/core-js/modules/_same-value.js","../../node_modules/core-js/modules/es6.object.is.js","../../node_modules/core-js/modules/es6.function.name.js","../../node_modules/core-js/modules/es6.string.raw.js","../../node_modules/core-js/modules/es6.string.from-code-point.js","../../node_modules/core-js/modules/_string-at.js","../../node_modules/core-js/modules/es6.string.code-point-at.js","../../node_modules/core-js/modules/_string-repeat.js","../../node_modules/core-js/modules/es6.string.repeat.js","../../node_modules/core-js/modules/_is-regexp.js","../../node_modules/core-js/modules/_string-context.js","../../node_modules/core-js/modules/_fails-is-regexp.js","../../node_modules/core-js/modules/es6.string.starts-with.js","../../node_modules/core-js/modules/es6.string.ends-with.js","../../node_modules/core-js/modules/es6.string.includes.js","../../node_modules/core-js/modules/_flags.js","../../node_modules/core-js/modules/es6.regexp.flags.js","../../node_modules/core-js/modules/_fix-re-wks.js","../../node_modules/core-js/modules/es6.regexp.match.js","../../node_modules/core-js/modules/es6.regexp.replace.js","../../node_modules/core-js/modules/es6.regexp.split.js","../../node_modules/core-js/modules/es6.regexp.search.js","../../node_modules/core-js/modules/_create-property.js","../../node_modules/core-js/modules/es6.array.from.js","../../node_modules/core-js/modules/es6.array.of.js","../../node_modules/core-js/modules/es6.array.copy-within.js","../../node_modules/core-js/modules/es6.array.find.js","../../node_modules/core-js/modules/es6.array.find-index.js","../../node_modules/core-js/modules/es6.array.fill.js","../../node_modules/core-js/modules/es6.number.is-finite.js","../../node_modules/core-js/modules/_is-integer.js","../../node_modules/core-js/modules/es6.number.is-integer.js","../../node_modules/core-js/modules/es6.number.is-safe-integer.js","../../node_modules/core-js/modules/es6.number.is-nan.js","../../node_modules/core-js/modules/es6.number.epsilon.js","../../node_modules/core-js/modules/es6.number.min-safe-integer.js","../../node_modules/core-js/modules/es6.number.max-safe-integer.js","../../node_modules/core-js/modules/_math-log1p.js","../../node_modules/core-js/modules/es6.math.acosh.js","../../node_modules/core-js/modules/es6.math.asinh.js","../../node_modules/core-js/modules/es6.math.atanh.js","../../node_modules/core-js/modules/_math-sign.js","../../node_modules/core-js/modules/es6.math.cbrt.js","../../node_modules/core-js/modules/es6.math.clz32.js","../../node_modules/core-js/modules/es6.math.cosh.js","../../node_modules/core-js/modules/_math-expm1.js","../../node_modules/core-js/modules/es6.math.expm1.js","../../node_modules/core-js/modules/_math-fround.js","../../node_modules/core-js/modules/es6.math.fround.js","../../node_modules/core-js/modules/es6.math.hypot.js","../../node_modules/core-js/modules/es6.math.imul.js","../../node_modules/core-js/modules/es6.math.log1p.js","../../node_modules/core-js/modules/es6.math.log10.js","../../node_modules/core-js/modules/es6.math.log2.js","../../node_modules/core-js/modules/es6.math.sign.js","../../node_modules/core-js/modules/es6.math.sinh.js","../../node_modules/core-js/modules/es6.math.tanh.js","../../node_modules/core-js/modules/es6.math.trunc.js","../../node_modules/core-js/modules/es7.array.includes.js","../../node_modules/core-js/modules/_object-to-array.js","../../node_modules/core-js/modules/es7.object.values.js","../../node_modules/core-js/modules/es7.object.entries.js","../../node_modules/core-js/modules/es7.object.get-own-property-descriptors.js","../../node_modules/core-js/modules/_string-pad.js","../../node_modules/core-js/modules/_user-agent.js","../../node_modules/core-js/modules/es7.string.pad-start.js","../../node_modules/core-js/modules/es7.string.pad-end.js","../../node_modules/core-js/modules/web.timers.js","../../node_modules/core-js/modules/web.immediate.js","../../node_modules/core-js/modules/web.dom.iterable.js","../../node_modules/regenerator-runtime/runtime.js","../../node_modules/custom-event-polyfill/custom-event-polyfill.js","../../node_modules/url-polyfill/url-polyfill.js","../../node_modules/loadjs/dist/loadjs.umd.js","storage.js","types.js","utils.js","support.js","html5.js","i18n.js","controls.js","captions.js","console.js","defaults.js","fullscreen.js","ui.js","listeners.js","plugins/vimeo.js","plugins/youtube.js","media.js","plugins/ads.js","source.js","plyr.js","plyr.polyfilled.js"],"names":["isObject","require$$0","document","require$$1","require$$2","anObject","toPrimitive","IE8_DOM_DEFINE","dP","createDesc","has","hide","global","aFunction","core","ctx","redefine","uid","toInteger","toLength","cof","IObject","defined","min","toIObject","toAbsoluteIndex","$keys","toObject","DESCRIPTORS","toIndex","$typed","anInstance","arrayFill","redefineAll","fails","LIBRARY","setToStringTag","SPECIES","buffer","VIEW","$export","speciesConstructor","TAG","Iterators","enumBugKeys","getKeys","IE_PROTO","PROTOTYPE","dPs","ITERATOR","classof","isArray","asc","ArrayProto","create","descriptor","$iterCreate","getPrototypeOf","step","addToUnscopables","pIE","require$$3","require$$4","require$$5","require$$6","require$$7","require$$8","require$$9","require$$10","require$$11","require$$12","require$$13","require$$14","require$$15","require$$16","require$$17","require$$18","require$$19","require$$20","require$$21","require$$22","require$$23","require$$24","require$$25","require$$26","require$$27","require$$28","require$$29","require$$30","require$$31","require$$32","require$$33","require$$34","require$$35","require$$36","require$$37","require$$38","getIterFn","isArrayIter","call","forOf","validate","$iterDefine","setSpecies","meta","$iterDetect","inheritIfRequired","strong","gOPS","createArrayMethod","id","$has","weak","assign","invoke","bind","gOPD","getProto","Reflect","gOPN","setProto","cel","html","process","Promise","newPromiseCapability","TypeError","isNode","newPromiseCapabilityModule","perform","promiseResolve","wksExt","toString","$GOPD","$DP","gOPNExt","wks","shared","ObjectProto","USE_NATIVE","$fails","_create","enumKeys","wksDefine","$getOwnPropertyDescriptor","$getPrototypeOf","isRegExp","MATCH","context","$defineProperty","createProperty","$find","KEY","forced","floor","isInteger","log1p","sign","$expm1","abs","exp","expm1","isEnum","ownKeys","repeat","navigator","userAgent","$pad","wrap","$task","i","NAME","$iterators","this","CustomEvent","define","Storage","player","enabled","config","storage","key","supported","store","window","localStorage","getItem","utils","is","empty","json","JSON","parse","string","length","object","get","extend","setItem","stringify","test","removeItem","e","providers","types","input","getConstructor","Object","Number","isNaN","String","Boolean","Function","nullOrUndefined","Array","instanceof","WeakMap","NodeList","Element","Text","Event","TextTrackCue","VTTCue","TextTrack","kind","array","nodeList","keys","constructor","documentMode","documentElement","style","platform","url","responseType","resolve","reject","request","XMLHttpRequest","addEventListener","responseText","response","Error","statusText","open","send","src","minWidth","image","Image","handler","onload","onerror","naturalWidth","prefix","hasId","isCached","exists","getElementById","update","container","data","innerHTML","body","insertAdjacentElement","useStorage","createElement","toggleHidden","setAttribute","cached","content","fetch","then","result","catch","Math","random","elements","wrapper","targets","from","reverse","forEach","element","index","child","cloneNode","parent","parentNode","sibling","nextSibling","appendChild","insertBefore","type","attributes","text","setAttributes","innerText","target","removeElement","removeChild","childNodes","lastChild","newChild","oldChild","replaceChild","entries","value","sel","existingAttributes","existing","split","selector","s","trim","className","replace","stripped","parts","start","charAt","class","hidden","boolean","hasAttribute","removeAttribute","force","method","classList","contains","prototype","match","querySelectorAll","includes","matches","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","querySelector","focused","activeElement","toggle","focusable","getElements","first","last","trap","event","keyCode","getFocusElement","shiftKey","focus","preventDefault","on","off","callback","passive","capture","function","Node","toggleListener","events","options","support","passiveListeners","bubbles","detail","dispatchEvent","args","current","max","toFixed","parseInt","time","displayHours","inverted","number","formatTime","format","slice","hours","getHours","mins","getMinutes","secs","getSeconds","find","RegExp","toUpperCase","substr","toLowerCase","replaceAll","toTitleCase","toPascalCase","sources","source","shift","filter","item","indexOf","path","reduce","obj","prev","curr","youtube","vimeo","regex","$2","parser","href","search","startsWith","parseUrl","hashes","params","hash","val","decodeURIComponent","map","encodeURIComponent","join","fragment","createDocumentFragment","firstChild","width","height","getRatio","w","h","ratio","transitionEndEvent","undefined","offsetHeight","provider","playsinline","api","ui","browser","getBrowser","canPlayInline","isIPhone","video","rangeInput","audio","webkitSetPresentationMode","WebKitPlaybackTargetAvailabilityEvent","media","isHTML5","canPlayType","isVideo","isAudio","defineProperty","removeEventListener","range","matchMedia","html5","getSources","sizes","getAttribute","dedupe","mime","currentTime","playing","onLoadedMetaData","load","play","blankVideo","debug","log","i18n","getDeep","seekTime","title","controls","URL","iconUrl","location","cors","host","isIE","svg4everybody","getElement","selectors","buttons","pause","restart","rewind","fastForward","mute","pip","airplay","settings","captions","fullscreen","progress","inputs","seek","volume","display","duration","seekTooltip","classNames","tooltip","error","warn","toggleNativeControls","namespace","getIconUrl","iconPath","iconPrefix","icon","createElementNS","use","setAttributeNS","attr","badge","menu","buttonType","button","toCamelCase","label","labelPressed","iconPressed","control","createIcon","createLabel","getAttributesFromSelector","push","controlPressed","hasClass","pressed","toggleClass","updateRangeFill","suffix","list","checked","radio","faux","insertAdjacentHTML","forceHours","setRange","muted","setProgress","getElementsByTagName","nodeValue","getPercentage","buffered","percent","isWebkit","setProperty","tooltips","clientRect","getBoundingClientRect","visible","touch","pageX","left","parseFloat","updateTimeDisplay","invert","invertTime","seeking","updateProgress","hasDuration","displayDuration","paused","updateSeekTooltip","setting","tabs","panes","quality","toggleTab","checkMenu","emptyElement","getBadge","createBadge","sort","a","b","sorting","createMenuItem","getLabel","updateSetting","pane","currentTrack","default","tracks","getTracks","track","active","language","unshift","speed","isVimeo","values","some","tab","form","show","isMenuItem","isButton","stopPropagation","clone","position","opacity","name","scrollWidth","scrollHeight","isTab","transitions","reducedMotion","size","getTabSize","restore","propertyName","createButton","createRange","createProgress","createTime","inner","home","back","setQualityMenu","getQualityOptions","setSpeedMenu","loadSprite","props","findElements","repaint","labels","isYouTube","textTracks","setCaptionsMenu","insertAfter","hostname","protocol","createObjectURL","blob","userLanguage","setLanguage","trackEvents","set","mode","updateCues","trackRemoved","currentTrackNode","firstMatch","toggleCaptions","getCurrentTrack","embed","enableTextTrack","fromLanguage","sortIsDefault","sorted","cues","activeCues","cue","getCueAsHTML","getHTML","cueText","changed","caption","noop","Console","console","defaults","onChange","isIos","trapFocus","toggleFallback","scrollPosition","scrollX","scrollY","scrollTo","x","y","overflow","fallback","Fullscreen","property","native","iosNative","webkitEnterFullscreen","requestFullscreen","webkitExitFullscreen","cancelFullScreen","exitFullscreen","action","enter","exit","fullscreenElement","fullscreenEnabled","webkitFullscreenEnabled","mozFullScreenEnabled","msFullscreenEnabled","prefixes","pre","uiSupported","listeners","inject","setup","loop","updateVolume","timeUpdate","checkPlaying","isTouch","ready","setTitle","poster","backgroundImage","setPoster","durationUpdate","isEmbed","iframe","enable","posterEnabled","loadPromise","loadImage","togglePoster","stopped","toggleControls","loading","timers","setTimeout","hideControls","hover","Listeners","lastKey","handleKey","toggleMenu","firstTouch","code","which","altKey","ctrlKey","metaKey","seekByKey","editable","togglePlay","increaseVolume","decreaseVolume","forward","keyboard","tabFocus","delay","hasAudio","resetOnEnd","checkLoading","ads","initialized","managerPromise","clickToPlay","ended","disableContextMenu","concat","inputEvent","proxy","defaultHandler","customHandlerKey","customHandler","hasCustomHandler","returned","showHomeTab","showTab","currentTarget","eventType","done","seekTo","toggleInvert","noTransition","webkitDirectionInvertedFromDevice","direction","deltaY","deltaX","assurePlaybackState","hasPlayed","setAspectRatio","Vimeo","loadScript","urls","sdk","padding","paddingBottom","offset","transform","autoplay","buildUrlParams","parseVimeoId","embedContainer","replaceElement","thumbnail_large","pathname","Player","autopause","disableTextTrack","stop","restorePause","setVolume","setCurrentTime","selected","setPlaybackRate","setLoop","currentSrc","getVideoUrl","all","getVideoWidth","getVideoHeight","getAspectRatio","dimensions","setAutopause","state","getVideoTitle","getCurrentTime","getDuration","getTextTracks","strippedCues","stripHTML","getPaused","frame","seconds","build","mapQualityUnit","mapQualityUnits","levels","level","YT","onYouTubeReadyCallbacks","onYouTubeIframeAPIReady","videoId","getVideoData","google","items","snippet","currentId","parseYouTubeId","generateId","posterSrc","backgroundSize","message","instance","playbackRate","getPlaybackRate","getTitle","playVideo","pauseVideo","stopVideo","getPlaybackQuality","setPlaybackQuality","getAvailablePlaybackRates","buffering","setInterval","getVideoLoadedFraction","lastBuffered","seeked","getAvailableQualityLevels","unMute","Ads","publisherId","manager","loader","cuePoints","safetyTimer","countdownTimer","ima","googleIMA","trigger","startSafetyTimer","clearSafetyTimer","setupIMA","setVpaidMode","ImaSdkSettings","VpaidMode","ENABLED","setLocale","displayContainer","AdDisplayContainer","requestAds","AdsLoader","AdsManagerLoadedEvent","Type","ADS_MANAGER_LOADED","onAdsManagerLoaded","AdErrorEvent","AD_ERROR","onAdError","AdsRequest","adTagUrl","tagUrl","linearAdSlotWidth","offsetWidth","linearAdSlotHeight","nonLinearAdSlotWidth","nonLinearAdSlotHeight","forceNonLinearFullSlot","setAdWillPlayMuted","getRemainingTime","AdsRenderingSettings","restoreCustomPlaybackStateOnAdBreakComplete","enablePreloading","getAdsManager","getCuePoints","cuePoint","seekElement","cuePercentage","AdEvent","onAdEvent","ad","getAd","LOADED","pollCountdown","isLinear","ALL_ADS_COMPLETED","loadAds","CONTENT_PAUSE_REQUESTED","pauseContent","CONTENT_RESUME_REQUESTED","resumeContent","STARTED","MIDPOINT","COMPLETE","IMPRESSION","CLICK","cancel","contentComplete","seekedTime","discardAdBreak","splice","resize","ViewMode","NORMAL","initialize","init","adError","zIndex","destroy","handlers","apply","Date","now","base","insertElement","attribute","cancelRequests","check","crossorigin","addStyleHook","insertElements","Plyr","failed","jQuery","plyr","original","tagName","getProviderByUrl","getUrlParams","truthy","webkitShowPlaybackTargetPicker","isHidden","hiding","eventName","soft","clear","unload","inputIsValid","end","fauxDuration","mozHasAudio","webkitAudioDecodedByteCount","audioTracks","closest","change","states","inline","webkitPresentationMode","t","cloneDeep"],"mappings":"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","file":"plyr.polyfilled.js","sourcesContent":["// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nvar global = module.exports = typeof window != 'undefined' && window.Math == Math\n ? window : typeof self != 'undefined' && self.Math == Math ? self\n // eslint-disable-next-line no-new-func\n : Function('return this')();\nif (typeof __g == 'number') __g = global; // eslint-disable-line no-undef\n","var core = module.exports = { version: '2.5.3' };\nif (typeof __e == 'number') __e = core; // eslint-disable-line no-undef\n","module.exports = function (it) {\n return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n","var isObject = require('./_is-object');\nmodule.exports = function (it) {\n if (!isObject(it)) throw TypeError(it + ' is not an object!');\n return it;\n};\n","module.exports = function (exec) {\n try {\n return !!exec();\n } catch (e) {\n return true;\n }\n};\n","// Thank's IE8 for his funny defineProperty\nmodule.exports = !require('./_fails')(function () {\n return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;\n});\n","var isObject = require('./_is-object');\nvar document = require('./_global').document;\n// typeof document.createElement is 'object' in old IE\nvar is = isObject(document) && isObject(document.createElement);\nmodule.exports = function (it) {\n return is ? document.createElement(it) : {};\n};\n","module.exports = !require('./_descriptors') && !require('./_fails')(function () {\n return Object.defineProperty(require('./_dom-create')('div'), 'a', { get: function () { return 7; } }).a != 7;\n});\n","// 7.1.1 ToPrimitive(input [, PreferredType])\nvar isObject = require('./_is-object');\n// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n// and the second argument - flag - preferred type is a string\nmodule.exports = function (it, S) {\n if (!isObject(it)) return it;\n var fn, val;\n if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;\n if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n throw TypeError(\"Can't convert object to primitive value\");\n};\n","var anObject = require('./_an-object');\nvar IE8_DOM_DEFINE = require('./_ie8-dom-define');\nvar toPrimitive = require('./_to-primitive');\nvar dP = Object.defineProperty;\n\nexports.f = require('./_descriptors') ? Object.defineProperty : function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPrimitive(P, true);\n anObject(Attributes);\n if (IE8_DOM_DEFINE) try {\n return dP(O, P, Attributes);\n } catch (e) { /* empty */ }\n if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');\n if ('value' in Attributes) O[P] = Attributes.value;\n return O;\n};\n","module.exports = function (bitmap, value) {\n return {\n enumerable: !(bitmap & 1),\n configurable: !(bitmap & 2),\n writable: !(bitmap & 4),\n value: value\n };\n};\n","var dP = require('./_object-dp');\nvar createDesc = require('./_property-desc');\nmodule.exports = require('./_descriptors') ? function (object, key, value) {\n return dP.f(object, key, createDesc(1, value));\n} : function (object, key, value) {\n object[key] = value;\n return object;\n};\n","var hasOwnProperty = {}.hasOwnProperty;\nmodule.exports = function (it, key) {\n return hasOwnProperty.call(it, key);\n};\n","var id = 0;\nvar px = Math.random();\nmodule.exports = function (key) {\n return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));\n};\n","var global = require('./_global');\nvar hide = require('./_hide');\nvar has = require('./_has');\nvar SRC = require('./_uid')('src');\nvar TO_STRING = 'toString';\nvar $toString = Function[TO_STRING];\nvar TPL = ('' + $toString).split(TO_STRING);\n\nrequire('./_core').inspectSource = function (it) {\n return $toString.call(it);\n};\n\n(module.exports = function (O, key, val, safe) {\n var isFunction = typeof val == 'function';\n if (isFunction) has(val, 'name') || hide(val, 'name', key);\n if (O[key] === val) return;\n if (isFunction) has(val, SRC) || hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key)));\n if (O === global) {\n O[key] = val;\n } else if (!safe) {\n delete O[key];\n hide(O, key, val);\n } else if (O[key]) {\n O[key] = val;\n } else {\n hide(O, key, val);\n }\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n})(Function.prototype, TO_STRING, function toString() {\n return typeof this == 'function' && this[SRC] || $toString.call(this);\n});\n","module.exports = function (it) {\n if (typeof it != 'function') throw TypeError(it + ' is not a function!');\n return it;\n};\n","// optional / simple context binding\nvar aFunction = require('./_a-function');\nmodule.exports = function (fn, that, length) {\n aFunction(fn);\n if (that === undefined) return fn;\n switch (length) {\n case 1: return function (a) {\n return fn.call(that, a);\n };\n case 2: return function (a, b) {\n return fn.call(that, a, b);\n };\n case 3: return function (a, b, c) {\n return fn.call(that, a, b, c);\n };\n }\n return function (/* ...args */) {\n return fn.apply(that, arguments);\n };\n};\n","var global = require('./_global');\nvar core = require('./_core');\nvar hide = require('./_hide');\nvar redefine = require('./_redefine');\nvar ctx = require('./_ctx');\nvar PROTOTYPE = 'prototype';\n\nvar $export = function (type, name, source) {\n var IS_FORCED = type & $export.F;\n var IS_GLOBAL = type & $export.G;\n var IS_STATIC = type & $export.S;\n var IS_PROTO = type & $export.P;\n var IS_BIND = type & $export.B;\n var target = IS_GLOBAL ? global : IS_STATIC ? global[name] || (global[name] = {}) : (global[name] || {})[PROTOTYPE];\n var exports = IS_GLOBAL ? core : core[name] || (core[name] = {});\n var expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {});\n var key, own, out, exp;\n if (IS_GLOBAL) source = name;\n for (key in source) {\n // contains in native\n own = !IS_FORCED && target && target[key] !== undefined;\n // export native or passed\n out = (own ? target : source)[key];\n // bind timers to global for call from export context\n exp = IS_BIND && own ? ctx(out, global) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;\n // extend global\n if (target) redefine(target, key, out, type & $export.U);\n // export\n if (exports[key] != out) hide(exports, key, exp);\n if (IS_PROTO && expProto[key] != out) expProto[key] = out;\n }\n};\nglobal.core = core;\n// type bitmap\n$export.F = 1; // forced\n$export.G = 2; // global\n$export.S = 4; // static\n$export.P = 8; // proto\n$export.B = 16; // bind\n$export.W = 32; // wrap\n$export.U = 64; // safe\n$export.R = 128; // real proto method for `library`\nmodule.exports = $export;\n","var global = require('./_global');\nvar hide = require('./_hide');\nvar uid = require('./_uid');\nvar TYPED = uid('typed_array');\nvar VIEW = uid('view');\nvar ABV = !!(global.ArrayBuffer && global.DataView);\nvar CONSTR = ABV;\nvar i = 0;\nvar l = 9;\nvar Typed;\n\nvar TypedArrayConstructors = (\n 'Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array'\n).split(',');\n\nwhile (i < l) {\n if (Typed = global[TypedArrayConstructors[i++]]) {\n hide(Typed.prototype, TYPED, true);\n hide(Typed.prototype, VIEW, true);\n } else CONSTR = false;\n}\n\nmodule.exports = {\n ABV: ABV,\n CONSTR: CONSTR,\n TYPED: TYPED,\n VIEW: VIEW\n};\n","module.exports = false;\n","var redefine = require('./_redefine');\nmodule.exports = function (target, src, safe) {\n for (var key in src) redefine(target, key, src[key], safe);\n return target;\n};\n","module.exports = function (it, Constructor, name, forbiddenField) {\n if (!(it instanceof Constructor) || (forbiddenField !== undefined && forbiddenField in it)) {\n throw TypeError(name + ': incorrect invocation!');\n } return it;\n};\n","// 7.1.4 ToInteger\nvar ceil = Math.ceil;\nvar floor = Math.floor;\nmodule.exports = function (it) {\n return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);\n};\n","// 7.1.15 ToLength\nvar toInteger = require('./_to-integer');\nvar min = Math.min;\nmodule.exports = function (it) {\n return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991\n};\n","// https://tc39.github.io/ecma262/#sec-toindex\nvar toInteger = require('./_to-integer');\nvar toLength = require('./_to-length');\nmodule.exports = function (it) {\n if (it === undefined) return 0;\n var number = toInteger(it);\n var length = toLength(number);\n if (number !== length) throw RangeError('Wrong length!');\n return length;\n};\n","var toString = {}.toString;\n\nmodule.exports = function (it) {\n return toString.call(it).slice(8, -1);\n};\n","// fallback for non-array-like ES3 and non-enumerable old V8 strings\nvar cof = require('./_cof');\n// eslint-disable-next-line no-prototype-builtins\nmodule.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) {\n return cof(it) == 'String' ? it.split('') : Object(it);\n};\n","// 7.2.1 RequireObjectCoercible(argument)\nmodule.exports = function (it) {\n if (it == undefined) throw TypeError(\"Can't call method on \" + it);\n return it;\n};\n","// to indexed object, toObject with fallback for non-array-like ES3 strings\nvar IObject = require('./_iobject');\nvar defined = require('./_defined');\nmodule.exports = function (it) {\n return IObject(defined(it));\n};\n","var toInteger = require('./_to-integer');\nvar max = Math.max;\nvar min = Math.min;\nmodule.exports = function (index, length) {\n index = toInteger(index);\n return index < 0 ? max(index + length, 0) : min(index, length);\n};\n","// false -> Array#indexOf\n// true -> Array#includes\nvar toIObject = require('./_to-iobject');\nvar toLength = require('./_to-length');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nmodule.exports = function (IS_INCLUDES) {\n return function ($this, el, fromIndex) {\n var O = toIObject($this);\n var length = toLength(O.length);\n var index = toAbsoluteIndex(fromIndex, length);\n var value;\n // Array#includes uses SameValueZero equality algorithm\n // eslint-disable-next-line no-self-compare\n if (IS_INCLUDES && el != el) while (length > index) {\n value = O[index++];\n // eslint-disable-next-line no-self-compare\n if (value != value) return true;\n // Array#indexOf ignores holes, Array#includes - not\n } else for (;length > index; index++) if (IS_INCLUDES || index in O) {\n if (O[index] === el) return IS_INCLUDES || index || 0;\n } return !IS_INCLUDES && -1;\n };\n};\n","var global = require('./_global');\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || (global[SHARED] = {});\nmodule.exports = function (key) {\n return store[key] || (store[key] = {});\n};\n","var shared = require('./_shared')('keys');\nvar uid = require('./_uid');\nmodule.exports = function (key) {\n return shared[key] || (shared[key] = uid(key));\n};\n","var has = require('./_has');\nvar toIObject = require('./_to-iobject');\nvar arrayIndexOf = require('./_array-includes')(false);\nvar IE_PROTO = require('./_shared-key')('IE_PROTO');\n\nmodule.exports = function (object, names) {\n var O = toIObject(object);\n var i = 0;\n var result = [];\n var key;\n for (key in O) if (key != IE_PROTO) has(O, key) && result.push(key);\n // Don't enum bug & hidden keys\n while (names.length > i) if (has(O, key = names[i++])) {\n ~arrayIndexOf(result, key) || result.push(key);\n }\n return result;\n};\n","// IE 8- don't enum bug keys\nmodule.exports = (\n 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'\n).split(',');\n","// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)\nvar $keys = require('./_object-keys-internal');\nvar hiddenKeys = require('./_enum-bug-keys').concat('length', 'prototype');\n\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n return $keys(O, hiddenKeys);\n};\n","// 7.1.13 ToObject(argument)\nvar defined = require('./_defined');\nmodule.exports = function (it) {\n return Object(defined(it));\n};\n","// 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length)\n'use strict';\nvar toObject = require('./_to-object');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nvar toLength = require('./_to-length');\nmodule.exports = function fill(value /* , start = 0, end = @length */) {\n var O = toObject(this);\n var length = toLength(O.length);\n var aLen = arguments.length;\n var index = toAbsoluteIndex(aLen > 1 ? arguments[1] : undefined, length);\n var end = aLen > 2 ? arguments[2] : undefined;\n var endPos = end === undefined ? length : toAbsoluteIndex(end, length);\n while (endPos > index) O[index++] = value;\n return O;\n};\n","var store = require('./_shared')('wks');\nvar uid = require('./_uid');\nvar Symbol = require('./_global').Symbol;\nvar USE_SYMBOL = typeof Symbol == 'function';\n\nvar $exports = module.exports = function (name) {\n return store[name] || (store[name] =\n USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name));\n};\n\n$exports.store = store;\n","var def = require('./_object-dp').f;\nvar has = require('./_has');\nvar TAG = require('./_wks')('toStringTag');\n\nmodule.exports = function (it, tag, stat) {\n if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag });\n};\n","'use strict';\nvar global = require('./_global');\nvar DESCRIPTORS = require('./_descriptors');\nvar LIBRARY = require('./_library');\nvar $typed = require('./_typed');\nvar hide = require('./_hide');\nvar redefineAll = require('./_redefine-all');\nvar fails = require('./_fails');\nvar anInstance = require('./_an-instance');\nvar toInteger = require('./_to-integer');\nvar toLength = require('./_to-length');\nvar toIndex = require('./_to-index');\nvar gOPN = require('./_object-gopn').f;\nvar dP = require('./_object-dp').f;\nvar arrayFill = require('./_array-fill');\nvar setToStringTag = require('./_set-to-string-tag');\nvar ARRAY_BUFFER = 'ArrayBuffer';\nvar DATA_VIEW = 'DataView';\nvar PROTOTYPE = 'prototype';\nvar WRONG_LENGTH = 'Wrong length!';\nvar WRONG_INDEX = 'Wrong index!';\nvar $ArrayBuffer = global[ARRAY_BUFFER];\nvar $DataView = global[DATA_VIEW];\nvar Math = global.Math;\nvar RangeError = global.RangeError;\n// eslint-disable-next-line no-shadow-restricted-names\nvar Infinity = global.Infinity;\nvar BaseBuffer = $ArrayBuffer;\nvar abs = Math.abs;\nvar pow = Math.pow;\nvar floor = Math.floor;\nvar log = Math.log;\nvar LN2 = Math.LN2;\nvar BUFFER = 'buffer';\nvar BYTE_LENGTH = 'byteLength';\nvar BYTE_OFFSET = 'byteOffset';\nvar $BUFFER = DESCRIPTORS ? '_b' : BUFFER;\nvar $LENGTH = DESCRIPTORS ? '_l' : BYTE_LENGTH;\nvar $OFFSET = DESCRIPTORS ? '_o' : BYTE_OFFSET;\n\n// IEEE754 conversions based on https://github.com/feross/ieee754\nfunction packIEEE754(value, mLen, nBytes) {\n var buffer = new Array(nBytes);\n var eLen = nBytes * 8 - mLen - 1;\n var eMax = (1 << eLen) - 1;\n var eBias = eMax >> 1;\n var rt = mLen === 23 ? pow(2, -24) - pow(2, -77) : 0;\n var i = 0;\n var s = value < 0 || value === 0 && 1 / value < 0 ? 1 : 0;\n var e, m, c;\n value = abs(value);\n // eslint-disable-next-line no-self-compare\n if (value != value || value === Infinity) {\n // eslint-disable-next-line no-self-compare\n m = value != value ? 1 : 0;\n e = eMax;\n } else {\n e = floor(log(value) / LN2);\n if (value * (c = pow(2, -e)) < 1) {\n e--;\n c *= 2;\n }\n if (e + eBias >= 1) {\n value += rt / c;\n } else {\n value += rt * pow(2, 1 - eBias);\n }\n if (value * c >= 2) {\n e++;\n c /= 2;\n }\n if (e + eBias >= eMax) {\n m = 0;\n e = eMax;\n } else if (e + eBias >= 1) {\n m = (value * c - 1) * pow(2, mLen);\n e = e + eBias;\n } else {\n m = value * pow(2, eBias - 1) * pow(2, mLen);\n e = 0;\n }\n }\n for (; mLen >= 8; buffer[i++] = m & 255, m /= 256, mLen -= 8);\n e = e << mLen | m;\n eLen += mLen;\n for (; eLen > 0; buffer[i++] = e & 255, e /= 256, eLen -= 8);\n buffer[--i] |= s * 128;\n return buffer;\n}\nfunction unpackIEEE754(buffer, mLen, nBytes) {\n var eLen = nBytes * 8 - mLen - 1;\n var eMax = (1 << eLen) - 1;\n var eBias = eMax >> 1;\n var nBits = eLen - 7;\n var i = nBytes - 1;\n var s = buffer[i--];\n var e = s & 127;\n var m;\n s >>= 7;\n for (; nBits > 0; e = e * 256 + buffer[i], i--, nBits -= 8);\n m = e & (1 << -nBits) - 1;\n e >>= -nBits;\n nBits += mLen;\n for (; nBits > 0; m = m * 256 + buffer[i], i--, nBits -= 8);\n if (e === 0) {\n e = 1 - eBias;\n } else if (e === eMax) {\n return m ? NaN : s ? -Infinity : Infinity;\n } else {\n m = m + pow(2, mLen);\n e = e - eBias;\n } return (s ? -1 : 1) * m * pow(2, e - mLen);\n}\n\nfunction unpackI32(bytes) {\n return bytes[3] << 24 | bytes[2] << 16 | bytes[1] << 8 | bytes[0];\n}\nfunction packI8(it) {\n return [it & 0xff];\n}\nfunction packI16(it) {\n return [it & 0xff, it >> 8 & 0xff];\n}\nfunction packI32(it) {\n return [it & 0xff, it >> 8 & 0xff, it >> 16 & 0xff, it >> 24 & 0xff];\n}\nfunction packF64(it) {\n return packIEEE754(it, 52, 8);\n}\nfunction packF32(it) {\n return packIEEE754(it, 23, 4);\n}\n\nfunction addGetter(C, key, internal) {\n dP(C[PROTOTYPE], key, { get: function () { return this[internal]; } });\n}\n\nfunction get(view, bytes, index, isLittleEndian) {\n var numIndex = +index;\n var intIndex = toIndex(numIndex);\n if (intIndex + bytes > view[$LENGTH]) throw RangeError(WRONG_INDEX);\n var store = view[$BUFFER]._b;\n var start = intIndex + view[$OFFSET];\n var pack = store.slice(start, start + bytes);\n return isLittleEndian ? pack : pack.reverse();\n}\nfunction set(view, bytes, index, conversion, value, isLittleEndian) {\n var numIndex = +index;\n var intIndex = toIndex(numIndex);\n if (intIndex + bytes > view[$LENGTH]) throw RangeError(WRONG_INDEX);\n var store = view[$BUFFER]._b;\n var start = intIndex + view[$OFFSET];\n var pack = conversion(+value);\n for (var i = 0; i < bytes; i++) store[start + i] = pack[isLittleEndian ? i : bytes - i - 1];\n}\n\nif (!$typed.ABV) {\n $ArrayBuffer = function ArrayBuffer(length) {\n anInstance(this, $ArrayBuffer, ARRAY_BUFFER);\n var byteLength = toIndex(length);\n this._b = arrayFill.call(new Array(byteLength), 0);\n this[$LENGTH] = byteLength;\n };\n\n $DataView = function DataView(buffer, byteOffset, byteLength) {\n anInstance(this, $DataView, DATA_VIEW);\n anInstance(buffer, $ArrayBuffer, DATA_VIEW);\n var bufferLength = buffer[$LENGTH];\n var offset = toInteger(byteOffset);\n if (offset < 0 || offset > bufferLength) throw RangeError('Wrong offset!');\n byteLength = byteLength === undefined ? bufferLength - offset : toLength(byteLength);\n if (offset + byteLength > bufferLength) throw RangeError(WRONG_LENGTH);\n this[$BUFFER] = buffer;\n this[$OFFSET] = offset;\n this[$LENGTH] = byteLength;\n };\n\n if (DESCRIPTORS) {\n addGetter($ArrayBuffer, BYTE_LENGTH, '_l');\n addGetter($DataView, BUFFER, '_b');\n addGetter($DataView, BYTE_LENGTH, '_l');\n addGetter($DataView, BYTE_OFFSET, '_o');\n }\n\n redefineAll($DataView[PROTOTYPE], {\n getInt8: function getInt8(byteOffset) {\n return get(this, 1, byteOffset)[0] << 24 >> 24;\n },\n getUint8: function getUint8(byteOffset) {\n return get(this, 1, byteOffset)[0];\n },\n getInt16: function getInt16(byteOffset /* , littleEndian */) {\n var bytes = get(this, 2, byteOffset, arguments[1]);\n return (bytes[1] << 8 | bytes[0]) << 16 >> 16;\n },\n getUint16: function getUint16(byteOffset /* , littleEndian */) {\n var bytes = get(this, 2, byteOffset, arguments[1]);\n return bytes[1] << 8 | bytes[0];\n },\n getInt32: function getInt32(byteOffset /* , littleEndian */) {\n return unpackI32(get(this, 4, byteOffset, arguments[1]));\n },\n getUint32: function getUint32(byteOffset /* , littleEndian */) {\n return unpackI32(get(this, 4, byteOffset, arguments[1])) >>> 0;\n },\n getFloat32: function getFloat32(byteOffset /* , littleEndian */) {\n return unpackIEEE754(get(this, 4, byteOffset, arguments[1]), 23, 4);\n },\n getFloat64: function getFloat64(byteOffset /* , littleEndian */) {\n return unpackIEEE754(get(this, 8, byteOffset, arguments[1]), 52, 8);\n },\n setInt8: function setInt8(byteOffset, value) {\n set(this, 1, byteOffset, packI8, value);\n },\n setUint8: function setUint8(byteOffset, value) {\n set(this, 1, byteOffset, packI8, value);\n },\n setInt16: function setInt16(byteOffset, value /* , littleEndian */) {\n set(this, 2, byteOffset, packI16, value, arguments[2]);\n },\n setUint16: function setUint16(byteOffset, value /* , littleEndian */) {\n set(this, 2, byteOffset, packI16, value, arguments[2]);\n },\n setInt32: function setInt32(byteOffset, value /* , littleEndian */) {\n set(this, 4, byteOffset, packI32, value, arguments[2]);\n },\n setUint32: function setUint32(byteOffset, value /* , littleEndian */) {\n set(this, 4, byteOffset, packI32, value, arguments[2]);\n },\n setFloat32: function setFloat32(byteOffset, value /* , littleEndian */) {\n set(this, 4, byteOffset, packF32, value, arguments[2]);\n },\n setFloat64: function setFloat64(byteOffset, value /* , littleEndian */) {\n set(this, 8, byteOffset, packF64, value, arguments[2]);\n }\n });\n} else {\n if (!fails(function () {\n $ArrayBuffer(1);\n }) || !fails(function () {\n new $ArrayBuffer(-1); // eslint-disable-line no-new\n }) || fails(function () {\n new $ArrayBuffer(); // eslint-disable-line no-new\n new $ArrayBuffer(1.5); // eslint-disable-line no-new\n new $ArrayBuffer(NaN); // eslint-disable-line no-new\n return $ArrayBuffer.name != ARRAY_BUFFER;\n })) {\n $ArrayBuffer = function ArrayBuffer(length) {\n anInstance(this, $ArrayBuffer);\n return new BaseBuffer(toIndex(length));\n };\n var ArrayBufferProto = $ArrayBuffer[PROTOTYPE] = BaseBuffer[PROTOTYPE];\n for (var keys = gOPN(BaseBuffer), j = 0, key; keys.length > j;) {\n if (!((key = keys[j++]) in $ArrayBuffer)) hide($ArrayBuffer, key, BaseBuffer[key]);\n }\n if (!LIBRARY) ArrayBufferProto.constructor = $ArrayBuffer;\n }\n // iOS Safari 7.x bug\n var view = new $DataView(new $ArrayBuffer(2));\n var $setInt8 = $DataView[PROTOTYPE].setInt8;\n view.setInt8(0, 2147483648);\n view.setInt8(1, 2147483649);\n if (view.getInt8(0) || !view.getInt8(1)) redefineAll($DataView[PROTOTYPE], {\n setInt8: function setInt8(byteOffset, value) {\n $setInt8.call(this, byteOffset, value << 24 >> 24);\n },\n setUint8: function setUint8(byteOffset, value) {\n $setInt8.call(this, byteOffset, value << 24 >> 24);\n }\n }, true);\n}\nsetToStringTag($ArrayBuffer, ARRAY_BUFFER);\nsetToStringTag($DataView, DATA_VIEW);\nhide($DataView[PROTOTYPE], $typed.VIEW, true);\nexports[ARRAY_BUFFER] = $ArrayBuffer;\nexports[DATA_VIEW] = $DataView;\n","// 7.3.20 SpeciesConstructor(O, defaultConstructor)\nvar anObject = require('./_an-object');\nvar aFunction = require('./_a-function');\nvar SPECIES = require('./_wks')('species');\nmodule.exports = function (O, D) {\n var C = anObject(O).constructor;\n var S;\n return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? D : aFunction(S);\n};\n","'use strict';\nvar global = require('./_global');\nvar dP = require('./_object-dp');\nvar DESCRIPTORS = require('./_descriptors');\nvar SPECIES = require('./_wks')('species');\n\nmodule.exports = function (KEY) {\n var C = global[KEY];\n if (DESCRIPTORS && C && !C[SPECIES]) dP.f(C, SPECIES, {\n configurable: true,\n get: function () { return this; }\n });\n};\n","'use strict';\nvar $export = require('./_export');\nvar $typed = require('./_typed');\nvar buffer = require('./_typed-buffer');\nvar anObject = require('./_an-object');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nvar toLength = require('./_to-length');\nvar isObject = require('./_is-object');\nvar ArrayBuffer = require('./_global').ArrayBuffer;\nvar speciesConstructor = require('./_species-constructor');\nvar $ArrayBuffer = buffer.ArrayBuffer;\nvar $DataView = buffer.DataView;\nvar $isView = $typed.ABV && ArrayBuffer.isView;\nvar $slice = $ArrayBuffer.prototype.slice;\nvar VIEW = $typed.VIEW;\nvar ARRAY_BUFFER = 'ArrayBuffer';\n\n$export($export.G + $export.W + $export.F * (ArrayBuffer !== $ArrayBuffer), { ArrayBuffer: $ArrayBuffer });\n\n$export($export.S + $export.F * !$typed.CONSTR, ARRAY_BUFFER, {\n // 24.1.3.1 ArrayBuffer.isView(arg)\n isView: function isView(it) {\n return $isView && $isView(it) || isObject(it) && VIEW in it;\n }\n});\n\n$export($export.P + $export.U + $export.F * require('./_fails')(function () {\n return !new $ArrayBuffer(2).slice(1, undefined).byteLength;\n}), ARRAY_BUFFER, {\n // 24.1.4.3 ArrayBuffer.prototype.slice(start, end)\n slice: function slice(start, end) {\n if ($slice !== undefined && end === undefined) return $slice.call(anObject(this), start); // FF fix\n var len = anObject(this).byteLength;\n var first = toAbsoluteIndex(start, len);\n var final = toAbsoluteIndex(end === undefined ? len : end, len);\n var result = new (speciesConstructor(this, $ArrayBuffer))(toLength(final - first));\n var viewS = new $DataView(this);\n var viewT = new $DataView(result);\n var index = 0;\n while (first < final) {\n viewT.setUint8(index++, viewS.getUint8(first++));\n } return result;\n }\n});\n\nrequire('./_set-species')(ARRAY_BUFFER);\n","// getting tag from 19.1.3.6 Object.prototype.toString()\nvar cof = require('./_cof');\nvar TAG = require('./_wks')('toStringTag');\n// ES3 wrong here\nvar ARG = cof(function () { return arguments; }()) == 'Arguments';\n\n// fallback for IE11 Script Access Denied error\nvar tryGet = function (it, key) {\n try {\n return it[key];\n } catch (e) { /* empty */ }\n};\n\nmodule.exports = function (it) {\n var O, T, B;\n return it === undefined ? 'Undefined' : it === null ? 'Null'\n // @@toStringTag case\n : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T\n // builtinTag case\n : ARG ? cof(O)\n // ES3 arguments fallback\n : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;\n};\n","module.exports = {};\n","// check on default Array iterator\nvar Iterators = require('./_iterators');\nvar ITERATOR = require('./_wks')('iterator');\nvar ArrayProto = Array.prototype;\n\nmodule.exports = function (it) {\n return it !== undefined && (Iterators.Array === it || ArrayProto[ITERATOR] === it);\n};\n","// 19.1.2.14 / 15.2.3.14 Object.keys(O)\nvar $keys = require('./_object-keys-internal');\nvar enumBugKeys = require('./_enum-bug-keys');\n\nmodule.exports = Object.keys || function keys(O) {\n return $keys(O, enumBugKeys);\n};\n","var dP = require('./_object-dp');\nvar anObject = require('./_an-object');\nvar getKeys = require('./_object-keys');\n\nmodule.exports = require('./_descriptors') ? Object.defineProperties : function defineProperties(O, Properties) {\n anObject(O);\n var keys = getKeys(Properties);\n var length = keys.length;\n var i = 0;\n var P;\n while (length > i) dP.f(O, P = keys[i++], Properties[P]);\n return O;\n};\n","var document = require('./_global').document;\nmodule.exports = document && document.documentElement;\n","// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])\nvar anObject = require('./_an-object');\nvar dPs = require('./_object-dps');\nvar enumBugKeys = require('./_enum-bug-keys');\nvar IE_PROTO = require('./_shared-key')('IE_PROTO');\nvar Empty = function () { /* empty */ };\nvar PROTOTYPE = 'prototype';\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar createDict = function () {\n // Thrash, waste and sodomy: IE GC bug\n var iframe = require('./_dom-create')('iframe');\n var i = enumBugKeys.length;\n var lt = '<';\n var gt = '>';\n var iframeDocument;\n iframe.style.display = 'none';\n require('./_html').appendChild(iframe);\n iframe.src = 'javascript:'; // eslint-disable-line no-script-url\n // createDict = iframe.contentWindow.Object;\n // html.removeChild(iframe);\n iframeDocument = iframe.contentWindow.document;\n iframeDocument.open();\n iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);\n iframeDocument.close();\n createDict = iframeDocument.F;\n while (i--) delete createDict[PROTOTYPE][enumBugKeys[i]];\n return createDict();\n};\n\nmodule.exports = Object.create || function create(O, Properties) {\n var result;\n if (O !== null) {\n Empty[PROTOTYPE] = anObject(O);\n result = new Empty();\n Empty[PROTOTYPE] = null;\n // add \"__proto__\" for Object.getPrototypeOf polyfill\n result[IE_PROTO] = O;\n } else result = createDict();\n return Properties === undefined ? result : dPs(result, Properties);\n};\n","// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)\nvar has = require('./_has');\nvar toObject = require('./_to-object');\nvar IE_PROTO = require('./_shared-key')('IE_PROTO');\nvar ObjectProto = Object.prototype;\n\nmodule.exports = Object.getPrototypeOf || function (O) {\n O = toObject(O);\n if (has(O, IE_PROTO)) return O[IE_PROTO];\n if (typeof O.constructor == 'function' && O instanceof O.constructor) {\n return O.constructor.prototype;\n } return O instanceof Object ? ObjectProto : null;\n};\n","var classof = require('./_classof');\nvar ITERATOR = require('./_wks')('iterator');\nvar Iterators = require('./_iterators');\nmodule.exports = require('./_core').getIteratorMethod = function (it) {\n if (it != undefined) return it[ITERATOR]\n || it['@@iterator']\n || Iterators[classof(it)];\n};\n","// 7.2.2 IsArray(argument)\nvar cof = require('./_cof');\nmodule.exports = Array.isArray || function isArray(arg) {\n return cof(arg) == 'Array';\n};\n","var isObject = require('./_is-object');\nvar isArray = require('./_is-array');\nvar SPECIES = require('./_wks')('species');\n\nmodule.exports = function (original) {\n var C;\n if (isArray(original)) {\n C = original.constructor;\n // cross-realm fallback\n if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;\n if (isObject(C)) {\n C = C[SPECIES];\n if (C === null) C = undefined;\n }\n } return C === undefined ? Array : C;\n};\n","// 9.4.2.3 ArraySpeciesCreate(originalArray, length)\nvar speciesConstructor = require('./_array-species-constructor');\n\nmodule.exports = function (original, length) {\n return new (speciesConstructor(original))(length);\n};\n","// 0 -> Array#forEach\n// 1 -> Array#map\n// 2 -> Array#filter\n// 3 -> Array#some\n// 4 -> Array#every\n// 5 -> Array#find\n// 6 -> Array#findIndex\nvar ctx = require('./_ctx');\nvar IObject = require('./_iobject');\nvar toObject = require('./_to-object');\nvar toLength = require('./_to-length');\nvar asc = require('./_array-species-create');\nmodule.exports = function (TYPE, $create) {\n var IS_MAP = TYPE == 1;\n var IS_FILTER = TYPE == 2;\n var IS_SOME = TYPE == 3;\n var IS_EVERY = TYPE == 4;\n var IS_FIND_INDEX = TYPE == 6;\n var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;\n var create = $create || asc;\n return function ($this, callbackfn, that) {\n var O = toObject($this);\n var self = IObject(O);\n var f = ctx(callbackfn, that, 3);\n var length = toLength(self.length);\n var index = 0;\n var result = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined;\n var val, res;\n for (;length > index; index++) if (NO_HOLES || index in self) {\n val = self[index];\n res = f(val, index, O);\n if (TYPE) {\n if (IS_MAP) result[index] = res; // map\n else if (res) switch (TYPE) {\n case 3: return true; // some\n case 5: return val; // find\n case 6: return index; // findIndex\n case 2: result.push(val); // filter\n } else if (IS_EVERY) return false; // every\n }\n }\n return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : result;\n };\n};\n","// 22.1.3.31 Array.prototype[@@unscopables]\nvar UNSCOPABLES = require('./_wks')('unscopables');\nvar ArrayProto = Array.prototype;\nif (ArrayProto[UNSCOPABLES] == undefined) require('./_hide')(ArrayProto, UNSCOPABLES, {});\nmodule.exports = function (key) {\n ArrayProto[UNSCOPABLES][key] = true;\n};\n","module.exports = function (done, value) {\n return { value: value, done: !!done };\n};\n","'use strict';\nvar create = require('./_object-create');\nvar descriptor = require('./_property-desc');\nvar setToStringTag = require('./_set-to-string-tag');\nvar IteratorPrototype = {};\n\n// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\nrequire('./_hide')(IteratorPrototype, require('./_wks')('iterator'), function () { return this; });\n\nmodule.exports = function (Constructor, NAME, next) {\n Constructor.prototype = create(IteratorPrototype, { next: descriptor(1, next) });\n setToStringTag(Constructor, NAME + ' Iterator');\n};\n","'use strict';\nvar LIBRARY = require('./_library');\nvar $export = require('./_export');\nvar redefine = require('./_redefine');\nvar hide = require('./_hide');\nvar has = require('./_has');\nvar Iterators = require('./_iterators');\nvar $iterCreate = require('./_iter-create');\nvar setToStringTag = require('./_set-to-string-tag');\nvar getPrototypeOf = require('./_object-gpo');\nvar ITERATOR = require('./_wks')('iterator');\nvar BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next`\nvar FF_ITERATOR = '@@iterator';\nvar KEYS = 'keys';\nvar VALUES = 'values';\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {\n $iterCreate(Constructor, NAME, next);\n var getMethod = function (kind) {\n if (!BUGGY && kind in proto) return proto[kind];\n switch (kind) {\n case KEYS: return function keys() { return new Constructor(this, kind); };\n case VALUES: return function values() { return new Constructor(this, kind); };\n } return function entries() { return new Constructor(this, kind); };\n };\n var TAG = NAME + ' Iterator';\n var DEF_VALUES = DEFAULT == VALUES;\n var VALUES_BUG = false;\n var proto = Base.prototype;\n var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT];\n var $default = (!BUGGY && $native) || getMethod(DEFAULT);\n var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined;\n var $anyNative = NAME == 'Array' ? proto.entries || $native : $native;\n var methods, key, IteratorPrototype;\n // Fix native\n if ($anyNative) {\n IteratorPrototype = getPrototypeOf($anyNative.call(new Base()));\n if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) {\n // Set @@toStringTag to native iterators\n setToStringTag(IteratorPrototype, TAG, true);\n // fix for some old engines\n if (!LIBRARY && !has(IteratorPrototype, ITERATOR)) hide(IteratorPrototype, ITERATOR, returnThis);\n }\n }\n // fix Array#{values, @@iterator}.name in V8 / FF\n if (DEF_VALUES && $native && $native.name !== VALUES) {\n VALUES_BUG = true;\n $default = function values() { return $native.call(this); };\n }\n // Define iterator\n if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) {\n hide(proto, ITERATOR, $default);\n }\n // Plug for library\n Iterators[NAME] = $default;\n Iterators[TAG] = returnThis;\n if (DEFAULT) {\n methods = {\n values: DEF_VALUES ? $default : getMethod(VALUES),\n keys: IS_SET ? $default : getMethod(KEYS),\n entries: $entries\n };\n if (FORCED) for (key in methods) {\n if (!(key in proto)) redefine(proto, key, methods[key]);\n } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods);\n }\n return methods;\n};\n","'use strict';\nvar addToUnscopables = require('./_add-to-unscopables');\nvar step = require('./_iter-step');\nvar Iterators = require('./_iterators');\nvar toIObject = require('./_to-iobject');\n\n// 22.1.3.4 Array.prototype.entries()\n// 22.1.3.13 Array.prototype.keys()\n// 22.1.3.29 Array.prototype.values()\n// 22.1.3.30 Array.prototype[@@iterator]()\nmodule.exports = require('./_iter-define')(Array, 'Array', function (iterated, kind) {\n this._t = toIObject(iterated); // target\n this._i = 0; // next index\n this._k = kind; // kind\n// 22.1.5.2.1 %ArrayIteratorPrototype%.next()\n}, function () {\n var O = this._t;\n var kind = this._k;\n var index = this._i++;\n if (!O || index >= O.length) {\n this._t = undefined;\n return step(1);\n }\n if (kind == 'keys') return step(0, index);\n if (kind == 'values') return step(0, O[index]);\n return step(0, [index, O[index]]);\n}, 'values');\n\n// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)\nIterators.Arguments = Iterators.Array;\n\naddToUnscopables('keys');\naddToUnscopables('values');\naddToUnscopables('entries');\n","var ITERATOR = require('./_wks')('iterator');\nvar SAFE_CLOSING = false;\n\ntry {\n var riter = [7][ITERATOR]();\n riter['return'] = function () { SAFE_CLOSING = true; };\n // eslint-disable-next-line no-throw-literal\n Array.from(riter, function () { throw 2; });\n} catch (e) { /* empty */ }\n\nmodule.exports = function (exec, skipClosing) {\n if (!skipClosing && !SAFE_CLOSING) return false;\n var safe = false;\n try {\n var arr = [7];\n var iter = arr[ITERATOR]();\n iter.next = function () { return { done: safe = true }; };\n arr[ITERATOR] = function () { return iter; };\n exec(arr);\n } catch (e) { /* empty */ }\n return safe;\n};\n","// 22.1.3.3 Array.prototype.copyWithin(target, start, end = this.length)\n'use strict';\nvar toObject = require('./_to-object');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nvar toLength = require('./_to-length');\n\nmodule.exports = [].copyWithin || function copyWithin(target /* = 0 */, start /* = 0, end = @length */) {\n var O = toObject(this);\n var len = toLength(O.length);\n var to = toAbsoluteIndex(target, len);\n var from = toAbsoluteIndex(start, len);\n var end = arguments.length > 2 ? arguments[2] : undefined;\n var count = Math.min((end === undefined ? len : toAbsoluteIndex(end, len)) - from, len - to);\n var inc = 1;\n if (from < to && to < from + count) {\n inc = -1;\n from += count - 1;\n to += count - 1;\n }\n while (count-- > 0) {\n if (from in O) O[to] = O[from];\n else delete O[to];\n to += inc;\n from += inc;\n } return O;\n};\n","exports.f = {}.propertyIsEnumerable;\n","var pIE = require('./_object-pie');\nvar createDesc = require('./_property-desc');\nvar toIObject = require('./_to-iobject');\nvar toPrimitive = require('./_to-primitive');\nvar has = require('./_has');\nvar IE8_DOM_DEFINE = require('./_ie8-dom-define');\nvar gOPD = Object.getOwnPropertyDescriptor;\n\nexports.f = require('./_descriptors') ? gOPD : function getOwnPropertyDescriptor(O, P) {\n O = toIObject(O);\n P = toPrimitive(P, true);\n if (IE8_DOM_DEFINE) try {\n return gOPD(O, P);\n } catch (e) { /* empty */ }\n if (has(O, P)) return createDesc(!pIE.f.call(O, P), O[P]);\n};\n","'use strict';\nif (require('./_descriptors')) {\n var LIBRARY = require('./_library');\n var global = require('./_global');\n var fails = require('./_fails');\n var $export = require('./_export');\n var $typed = require('./_typed');\n var $buffer = require('./_typed-buffer');\n var ctx = require('./_ctx');\n var anInstance = require('./_an-instance');\n var propertyDesc = require('./_property-desc');\n var hide = require('./_hide');\n var redefineAll = require('./_redefine-all');\n var toInteger = require('./_to-integer');\n var toLength = require('./_to-length');\n var toIndex = require('./_to-index');\n var toAbsoluteIndex = require('./_to-absolute-index');\n var toPrimitive = require('./_to-primitive');\n var has = require('./_has');\n var classof = require('./_classof');\n var isObject = require('./_is-object');\n var toObject = require('./_to-object');\n var isArrayIter = require('./_is-array-iter');\n var create = require('./_object-create');\n var getPrototypeOf = require('./_object-gpo');\n var gOPN = require('./_object-gopn').f;\n var getIterFn = require('./core.get-iterator-method');\n var uid = require('./_uid');\n var wks = require('./_wks');\n var createArrayMethod = require('./_array-methods');\n var createArrayIncludes = require('./_array-includes');\n var speciesConstructor = require('./_species-constructor');\n var ArrayIterators = require('./es6.array.iterator');\n var Iterators = require('./_iterators');\n var $iterDetect = require('./_iter-detect');\n var setSpecies = require('./_set-species');\n var arrayFill = require('./_array-fill');\n var arrayCopyWithin = require('./_array-copy-within');\n var $DP = require('./_object-dp');\n var $GOPD = require('./_object-gopd');\n var dP = $DP.f;\n var gOPD = $GOPD.f;\n var RangeError = global.RangeError;\n var TypeError = global.TypeError;\n var Uint8Array = global.Uint8Array;\n var ARRAY_BUFFER = 'ArrayBuffer';\n var SHARED_BUFFER = 'Shared' + ARRAY_BUFFER;\n var BYTES_PER_ELEMENT = 'BYTES_PER_ELEMENT';\n var PROTOTYPE = 'prototype';\n var ArrayProto = Array[PROTOTYPE];\n var $ArrayBuffer = $buffer.ArrayBuffer;\n var $DataView = $buffer.DataView;\n var arrayForEach = createArrayMethod(0);\n var arrayFilter = createArrayMethod(2);\n var arraySome = createArrayMethod(3);\n var arrayEvery = createArrayMethod(4);\n var arrayFind = createArrayMethod(5);\n var arrayFindIndex = createArrayMethod(6);\n var arrayIncludes = createArrayIncludes(true);\n var arrayIndexOf = createArrayIncludes(false);\n var arrayValues = ArrayIterators.values;\n var arrayKeys = ArrayIterators.keys;\n var arrayEntries = ArrayIterators.entries;\n var arrayLastIndexOf = ArrayProto.lastIndexOf;\n var arrayReduce = ArrayProto.reduce;\n var arrayReduceRight = ArrayProto.reduceRight;\n var arrayJoin = ArrayProto.join;\n var arraySort = ArrayProto.sort;\n var arraySlice = ArrayProto.slice;\n var arrayToString = ArrayProto.toString;\n var arrayToLocaleString = ArrayProto.toLocaleString;\n var ITERATOR = wks('iterator');\n var TAG = wks('toStringTag');\n var TYPED_CONSTRUCTOR = uid('typed_constructor');\n var DEF_CONSTRUCTOR = uid('def_constructor');\n var ALL_CONSTRUCTORS = $typed.CONSTR;\n var TYPED_ARRAY = $typed.TYPED;\n var VIEW = $typed.VIEW;\n var WRONG_LENGTH = 'Wrong length!';\n\n var $map = createArrayMethod(1, function (O, length) {\n return allocate(speciesConstructor(O, O[DEF_CONSTRUCTOR]), length);\n });\n\n var LITTLE_ENDIAN = fails(function () {\n // eslint-disable-next-line no-undef\n return new Uint8Array(new Uint16Array([1]).buffer)[0] === 1;\n });\n\n var FORCED_SET = !!Uint8Array && !!Uint8Array[PROTOTYPE].set && fails(function () {\n new Uint8Array(1).set({});\n });\n\n var toOffset = function (it, BYTES) {\n var offset = toInteger(it);\n if (offset < 0 || offset % BYTES) throw RangeError('Wrong offset!');\n return offset;\n };\n\n var validate = function (it) {\n if (isObject(it) && TYPED_ARRAY in it) return it;\n throw TypeError(it + ' is not a typed array!');\n };\n\n var allocate = function (C, length) {\n if (!(isObject(C) && TYPED_CONSTRUCTOR in C)) {\n throw TypeError('It is not a typed array constructor!');\n } return new C(length);\n };\n\n var speciesFromList = function (O, list) {\n return fromList(speciesConstructor(O, O[DEF_CONSTRUCTOR]), list);\n };\n\n var fromList = function (C, list) {\n var index = 0;\n var length = list.length;\n var result = allocate(C, length);\n while (length > index) result[index] = list[index++];\n return result;\n };\n\n var addGetter = function (it, key, internal) {\n dP(it, key, { get: function () { return this._d[internal]; } });\n };\n\n var $from = function from(source /* , mapfn, thisArg */) {\n var O = toObject(source);\n var aLen = arguments.length;\n var mapfn = aLen > 1 ? arguments[1] : undefined;\n var mapping = mapfn !== undefined;\n var iterFn = getIterFn(O);\n var i, length, values, result, step, iterator;\n if (iterFn != undefined && !isArrayIter(iterFn)) {\n for (iterator = iterFn.call(O), values = [], i = 0; !(step = iterator.next()).done; i++) {\n values.push(step.value);\n } O = values;\n }\n if (mapping && aLen > 2) mapfn = ctx(mapfn, arguments[2], 2);\n for (i = 0, length = toLength(O.length), result = allocate(this, length); length > i; i++) {\n result[i] = mapping ? mapfn(O[i], i) : O[i];\n }\n return result;\n };\n\n var $of = function of(/* ...items */) {\n var index = 0;\n var length = arguments.length;\n var result = allocate(this, length);\n while (length > index) result[index] = arguments[index++];\n return result;\n };\n\n // iOS Safari 6.x fails here\n var TO_LOCALE_BUG = !!Uint8Array && fails(function () { arrayToLocaleString.call(new Uint8Array(1)); });\n\n var $toLocaleString = function toLocaleString() {\n return arrayToLocaleString.apply(TO_LOCALE_BUG ? arraySlice.call(validate(this)) : validate(this), arguments);\n };\n\n var proto = {\n copyWithin: function copyWithin(target, start /* , end */) {\n return arrayCopyWithin.call(validate(this), target, start, arguments.length > 2 ? arguments[2] : undefined);\n },\n every: function every(callbackfn /* , thisArg */) {\n return arrayEvery(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n },\n fill: function fill(value /* , start, end */) { // eslint-disable-line no-unused-vars\n return arrayFill.apply(validate(this), arguments);\n },\n filter: function filter(callbackfn /* , thisArg */) {\n return speciesFromList(this, arrayFilter(validate(this), callbackfn,\n arguments.length > 1 ? arguments[1] : undefined));\n },\n find: function find(predicate /* , thisArg */) {\n return arrayFind(validate(this), predicate, arguments.length > 1 ? arguments[1] : undefined);\n },\n findIndex: function findIndex(predicate /* , thisArg */) {\n return arrayFindIndex(validate(this), predicate, arguments.length > 1 ? arguments[1] : undefined);\n },\n forEach: function forEach(callbackfn /* , thisArg */) {\n arrayForEach(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n },\n indexOf: function indexOf(searchElement /* , fromIndex */) {\n return arrayIndexOf(validate(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);\n },\n includes: function includes(searchElement /* , fromIndex */) {\n return arrayIncludes(validate(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);\n },\n join: function join(separator) { // eslint-disable-line no-unused-vars\n return arrayJoin.apply(validate(this), arguments);\n },\n lastIndexOf: function lastIndexOf(searchElement /* , fromIndex */) { // eslint-disable-line no-unused-vars\n return arrayLastIndexOf.apply(validate(this), arguments);\n },\n map: function map(mapfn /* , thisArg */) {\n return $map(validate(this), mapfn, arguments.length > 1 ? arguments[1] : undefined);\n },\n reduce: function reduce(callbackfn /* , initialValue */) { // eslint-disable-line no-unused-vars\n return arrayReduce.apply(validate(this), arguments);\n },\n reduceRight: function reduceRight(callbackfn /* , initialValue */) { // eslint-disable-line no-unused-vars\n return arrayReduceRight.apply(validate(this), arguments);\n },\n reverse: function reverse() {\n var that = this;\n var length = validate(that).length;\n var middle = Math.floor(length / 2);\n var index = 0;\n var value;\n while (index < middle) {\n value = that[index];\n that[index++] = that[--length];\n that[length] = value;\n } return that;\n },\n some: function some(callbackfn /* , thisArg */) {\n return arraySome(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n },\n sort: function sort(comparefn) {\n return arraySort.call(validate(this), comparefn);\n },\n subarray: function subarray(begin, end) {\n var O = validate(this);\n var length = O.length;\n var $begin = toAbsoluteIndex(begin, length);\n return new (speciesConstructor(O, O[DEF_CONSTRUCTOR]))(\n O.buffer,\n O.byteOffset + $begin * O.BYTES_PER_ELEMENT,\n toLength((end === undefined ? length : toAbsoluteIndex(end, length)) - $begin)\n );\n }\n };\n\n var $slice = function slice(start, end) {\n return speciesFromList(this, arraySlice.call(validate(this), start, end));\n };\n\n var $set = function set(arrayLike /* , offset */) {\n validate(this);\n var offset = toOffset(arguments[1], 1);\n var length = this.length;\n var src = toObject(arrayLike);\n var len = toLength(src.length);\n var index = 0;\n if (len + offset > length) throw RangeError(WRONG_LENGTH);\n while (index < len) this[offset + index] = src[index++];\n };\n\n var $iterators = {\n entries: function entries() {\n return arrayEntries.call(validate(this));\n },\n keys: function keys() {\n return arrayKeys.call(validate(this));\n },\n values: function values() {\n return arrayValues.call(validate(this));\n }\n };\n\n var isTAIndex = function (target, key) {\n return isObject(target)\n && target[TYPED_ARRAY]\n && typeof key != 'symbol'\n && key in target\n && String(+key) == String(key);\n };\n var $getDesc = function getOwnPropertyDescriptor(target, key) {\n return isTAIndex(target, key = toPrimitive(key, true))\n ? propertyDesc(2, target[key])\n : gOPD(target, key);\n };\n var $setDesc = function defineProperty(target, key, desc) {\n if (isTAIndex(target, key = toPrimitive(key, true))\n && isObject(desc)\n && has(desc, 'value')\n && !has(desc, 'get')\n && !has(desc, 'set')\n // TODO: add validation descriptor w/o calling accessors\n && !desc.configurable\n && (!has(desc, 'writable') || desc.writable)\n && (!has(desc, 'enumerable') || desc.enumerable)\n ) {\n target[key] = desc.value;\n return target;\n } return dP(target, key, desc);\n };\n\n if (!ALL_CONSTRUCTORS) {\n $GOPD.f = $getDesc;\n $DP.f = $setDesc;\n }\n\n $export($export.S + $export.F * !ALL_CONSTRUCTORS, 'Object', {\n getOwnPropertyDescriptor: $getDesc,\n defineProperty: $setDesc\n });\n\n if (fails(function () { arrayToString.call({}); })) {\n arrayToString = arrayToLocaleString = function toString() {\n return arrayJoin.call(this);\n };\n }\n\n var $TypedArrayPrototype$ = redefineAll({}, proto);\n redefineAll($TypedArrayPrototype$, $iterators);\n hide($TypedArrayPrototype$, ITERATOR, $iterators.values);\n redefineAll($TypedArrayPrototype$, {\n slice: $slice,\n set: $set,\n constructor: function () { /* noop */ },\n toString: arrayToString,\n toLocaleString: $toLocaleString\n });\n addGetter($TypedArrayPrototype$, 'buffer', 'b');\n addGetter($TypedArrayPrototype$, 'byteOffset', 'o');\n addGetter($TypedArrayPrototype$, 'byteLength', 'l');\n addGetter($TypedArrayPrototype$, 'length', 'e');\n dP($TypedArrayPrototype$, TAG, {\n get: function () { return this[TYPED_ARRAY]; }\n });\n\n // eslint-disable-next-line max-statements\n module.exports = function (KEY, BYTES, wrapper, CLAMPED) {\n CLAMPED = !!CLAMPED;\n var NAME = KEY + (CLAMPED ? 'Clamped' : '') + 'Array';\n var GETTER = 'get' + KEY;\n var SETTER = 'set' + KEY;\n var TypedArray = global[NAME];\n var Base = TypedArray || {};\n var TAC = TypedArray && getPrototypeOf(TypedArray);\n var FORCED = !TypedArray || !$typed.ABV;\n var O = {};\n var TypedArrayPrototype = TypedArray && TypedArray[PROTOTYPE];\n var getter = function (that, index) {\n var data = that._d;\n return data.v[GETTER](index * BYTES + data.o, LITTLE_ENDIAN);\n };\n var setter = function (that, index, value) {\n var data = that._d;\n if (CLAMPED) value = (value = Math.round(value)) < 0 ? 0 : value > 0xff ? 0xff : value & 0xff;\n data.v[SETTER](index * BYTES + data.o, value, LITTLE_ENDIAN);\n };\n var addElement = function (that, index) {\n dP(that, index, {\n get: function () {\n return getter(this, index);\n },\n set: function (value) {\n return setter(this, index, value);\n },\n enumerable: true\n });\n };\n if (FORCED) {\n TypedArray = wrapper(function (that, data, $offset, $length) {\n anInstance(that, TypedArray, NAME, '_d');\n var index = 0;\n var offset = 0;\n var buffer, byteLength, length, klass;\n if (!isObject(data)) {\n length = toIndex(data);\n byteLength = length * BYTES;\n buffer = new $ArrayBuffer(byteLength);\n } else if (data instanceof $ArrayBuffer || (klass = classof(data)) == ARRAY_BUFFER || klass == SHARED_BUFFER) {\n buffer = data;\n offset = toOffset($offset, BYTES);\n var $len = data.byteLength;\n if ($length === undefined) {\n if ($len % BYTES) throw RangeError(WRONG_LENGTH);\n byteLength = $len - offset;\n if (byteLength < 0) throw RangeError(WRONG_LENGTH);\n } else {\n byteLength = toLength($length) * BYTES;\n if (byteLength + offset > $len) throw RangeError(WRONG_LENGTH);\n }\n length = byteLength / BYTES;\n } else if (TYPED_ARRAY in data) {\n return fromList(TypedArray, data);\n } else {\n return $from.call(TypedArray, data);\n }\n hide(that, '_d', {\n b: buffer,\n o: offset,\n l: byteLength,\n e: length,\n v: new $DataView(buffer)\n });\n while (index < length) addElement(that, index++);\n });\n TypedArrayPrototype = TypedArray[PROTOTYPE] = create($TypedArrayPrototype$);\n hide(TypedArrayPrototype, 'constructor', TypedArray);\n } else if (!fails(function () {\n TypedArray(1);\n }) || !fails(function () {\n new TypedArray(-1); // eslint-disable-line no-new\n }) || !$iterDetect(function (iter) {\n new TypedArray(); // eslint-disable-line no-new\n new TypedArray(null); // eslint-disable-line no-new\n new TypedArray(1.5); // eslint-disable-line no-new\n new TypedArray(iter); // eslint-disable-line no-new\n }, true)) {\n TypedArray = wrapper(function (that, data, $offset, $length) {\n anInstance(that, TypedArray, NAME);\n var klass;\n // `ws` module bug, temporarily remove validation length for Uint8Array\n // https://github.com/websockets/ws/pull/645\n if (!isObject(data)) return new Base(toIndex(data));\n if (data instanceof $ArrayBuffer || (klass = classof(data)) == ARRAY_BUFFER || klass == SHARED_BUFFER) {\n return $length !== undefined\n ? new Base(data, toOffset($offset, BYTES), $length)\n : $offset !== undefined\n ? new Base(data, toOffset($offset, BYTES))\n : new Base(data);\n }\n if (TYPED_ARRAY in data) return fromList(TypedArray, data);\n return $from.call(TypedArray, data);\n });\n arrayForEach(TAC !== Function.prototype ? gOPN(Base).concat(gOPN(TAC)) : gOPN(Base), function (key) {\n if (!(key in TypedArray)) hide(TypedArray, key, Base[key]);\n });\n TypedArray[PROTOTYPE] = TypedArrayPrototype;\n if (!LIBRARY) TypedArrayPrototype.constructor = TypedArray;\n }\n var $nativeIterator = TypedArrayPrototype[ITERATOR];\n var CORRECT_ITER_NAME = !!$nativeIterator\n && ($nativeIterator.name == 'values' || $nativeIterator.name == undefined);\n var $iterator = $iterators.values;\n hide(TypedArray, TYPED_CONSTRUCTOR, true);\n hide(TypedArrayPrototype, TYPED_ARRAY, NAME);\n hide(TypedArrayPrototype, VIEW, true);\n hide(TypedArrayPrototype, DEF_CONSTRUCTOR, TypedArray);\n\n if (CLAMPED ? new TypedArray(1)[TAG] != NAME : !(TAG in TypedArrayPrototype)) {\n dP(TypedArrayPrototype, TAG, {\n get: function () { return NAME; }\n });\n }\n\n O[NAME] = TypedArray;\n\n $export($export.G + $export.W + $export.F * (TypedArray != Base), O);\n\n $export($export.S, NAME, {\n BYTES_PER_ELEMENT: BYTES\n });\n\n $export($export.S + $export.F * fails(function () { Base.of.call(TypedArray, 1); }), NAME, {\n from: $from,\n of: $of\n });\n\n if (!(BYTES_PER_ELEMENT in TypedArrayPrototype)) hide(TypedArrayPrototype, BYTES_PER_ELEMENT, BYTES);\n\n $export($export.P, NAME, proto);\n\n setSpecies(NAME);\n\n $export($export.P + $export.F * FORCED_SET, NAME, { set: $set });\n\n $export($export.P + $export.F * !CORRECT_ITER_NAME, NAME, $iterators);\n\n if (!LIBRARY && TypedArrayPrototype.toString != arrayToString) TypedArrayPrototype.toString = arrayToString;\n\n $export($export.P + $export.F * fails(function () {\n new TypedArray(1).slice();\n }), NAME, { slice: $slice });\n\n $export($export.P + $export.F * (fails(function () {\n return [1, 2].toLocaleString() != new TypedArray([1, 2]).toLocaleString();\n }) || !fails(function () {\n TypedArrayPrototype.toLocaleString.call([1, 2]);\n })), NAME, { toLocaleString: $toLocaleString });\n\n Iterators[NAME] = CORRECT_ITER_NAME ? $nativeIterator : $iterator;\n if (!LIBRARY && !CORRECT_ITER_NAME) hide(TypedArrayPrototype, ITERATOR, $iterator);\n };\n} else module.exports = function () { /* empty */ };\n","require('./_typed-array')('Int8', 1, function (init) {\n return function Int8Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Uint8', 1, function (init) {\n return function Uint8Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Uint8', 1, function (init) {\n return function Uint8ClampedArray(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n}, true);\n","require('./_typed-array')('Int16', 2, function (init) {\n return function Int16Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Uint16', 2, function (init) {\n return function Uint16Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Int32', 4, function (init) {\n return function Int32Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Uint32', 4, function (init) {\n return function Uint32Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Float32', 4, function (init) {\n return function Float32Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Float64', 8, function (init) {\n return function Float64Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","// call something on iterator step with safe closing on error\nvar anObject = require('./_an-object');\nmodule.exports = function (iterator, fn, value, entries) {\n try {\n return entries ? fn(anObject(value)[0], value[1]) : fn(value);\n // 7.4.6 IteratorClose(iterator, completion)\n } catch (e) {\n var ret = iterator['return'];\n if (ret !== undefined) anObject(ret.call(iterator));\n throw e;\n }\n};\n","var ctx = require('./_ctx');\nvar call = require('./_iter-call');\nvar isArrayIter = require('./_is-array-iter');\nvar anObject = require('./_an-object');\nvar toLength = require('./_to-length');\nvar getIterFn = require('./core.get-iterator-method');\nvar BREAK = {};\nvar RETURN = {};\nvar exports = module.exports = function (iterable, entries, fn, that, ITERATOR) {\n var iterFn = ITERATOR ? function () { return iterable; } : getIterFn(iterable);\n var f = ctx(fn, that, entries ? 2 : 1);\n var index = 0;\n var length, step, iterator, result;\n if (typeof iterFn != 'function') throw TypeError(iterable + ' is not iterable!');\n // fast case for arrays with default iterator\n if (isArrayIter(iterFn)) for (length = toLength(iterable.length); length > index; index++) {\n result = entries ? f(anObject(step = iterable[index])[0], step[1]) : f(iterable[index]);\n if (result === BREAK || result === RETURN) return result;\n } else for (iterator = iterFn.call(iterable); !(step = iterator.next()).done;) {\n result = call(iterator, f, step.value, entries);\n if (result === BREAK || result === RETURN) return result;\n }\n};\nexports.BREAK = BREAK;\nexports.RETURN = RETURN;\n","var META = require('./_uid')('meta');\nvar isObject = require('./_is-object');\nvar has = require('./_has');\nvar setDesc = require('./_object-dp').f;\nvar id = 0;\nvar isExtensible = Object.isExtensible || function () {\n return true;\n};\nvar FREEZE = !require('./_fails')(function () {\n return isExtensible(Object.preventExtensions({}));\n});\nvar setMeta = function (it) {\n setDesc(it, META, { value: {\n i: 'O' + ++id, // object ID\n w: {} // weak collections IDs\n } });\n};\nvar fastKey = function (it, create) {\n // return primitive with prefix\n if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;\n if (!has(it, META)) {\n // can't set metadata to uncaught frozen object\n if (!isExtensible(it)) return 'F';\n // not necessary to add metadata\n if (!create) return 'E';\n // add missing metadata\n setMeta(it);\n // return object ID\n } return it[META].i;\n};\nvar getWeak = function (it, create) {\n if (!has(it, META)) {\n // can't set metadata to uncaught frozen object\n if (!isExtensible(it)) return true;\n // not necessary to add metadata\n if (!create) return false;\n // add missing metadata\n setMeta(it);\n // return hash weak collections IDs\n } return it[META].w;\n};\n// add metadata on freeze-family methods calling\nvar onFreeze = function (it) {\n if (FREEZE && meta.NEED && isExtensible(it) && !has(it, META)) setMeta(it);\n return it;\n};\nvar meta = module.exports = {\n KEY: META,\n NEED: false,\n fastKey: fastKey,\n getWeak: getWeak,\n onFreeze: onFreeze\n};\n","var isObject = require('./_is-object');\nmodule.exports = function (it, TYPE) {\n if (!isObject(it) || it._t !== TYPE) throw TypeError('Incompatible receiver, ' + TYPE + ' required!');\n return it;\n};\n","'use strict';\nvar dP = require('./_object-dp').f;\nvar create = require('./_object-create');\nvar redefineAll = require('./_redefine-all');\nvar ctx = require('./_ctx');\nvar anInstance = require('./_an-instance');\nvar forOf = require('./_for-of');\nvar $iterDefine = require('./_iter-define');\nvar step = require('./_iter-step');\nvar setSpecies = require('./_set-species');\nvar DESCRIPTORS = require('./_descriptors');\nvar fastKey = require('./_meta').fastKey;\nvar validate = require('./_validate-collection');\nvar SIZE = DESCRIPTORS ? '_s' : 'size';\n\nvar getEntry = function (that, key) {\n // fast case\n var index = fastKey(key);\n var entry;\n if (index !== 'F') return that._i[index];\n // frozen object case\n for (entry = that._f; entry; entry = entry.n) {\n if (entry.k == key) return entry;\n }\n};\n\nmodule.exports = {\n getConstructor: function (wrapper, NAME, IS_MAP, ADDER) {\n var C = wrapper(function (that, iterable) {\n anInstance(that, C, NAME, '_i');\n that._t = NAME; // collection type\n that._i = create(null); // index\n that._f = undefined; // first entry\n that._l = undefined; // last entry\n that[SIZE] = 0; // size\n if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n });\n redefineAll(C.prototype, {\n // 23.1.3.1 Map.prototype.clear()\n // 23.2.3.2 Set.prototype.clear()\n clear: function clear() {\n for (var that = validate(this, NAME), data = that._i, entry = that._f; entry; entry = entry.n) {\n entry.r = true;\n if (entry.p) entry.p = entry.p.n = undefined;\n delete data[entry.i];\n }\n that._f = that._l = undefined;\n that[SIZE] = 0;\n },\n // 23.1.3.3 Map.prototype.delete(key)\n // 23.2.3.4 Set.prototype.delete(value)\n 'delete': function (key) {\n var that = validate(this, NAME);\n var entry = getEntry(that, key);\n if (entry) {\n var next = entry.n;\n var prev = entry.p;\n delete that._i[entry.i];\n entry.r = true;\n if (prev) prev.n = next;\n if (next) next.p = prev;\n if (that._f == entry) that._f = next;\n if (that._l == entry) that._l = prev;\n that[SIZE]--;\n } return !!entry;\n },\n // 23.2.3.6 Set.prototype.forEach(callbackfn, thisArg = undefined)\n // 23.1.3.5 Map.prototype.forEach(callbackfn, thisArg = undefined)\n forEach: function forEach(callbackfn /* , that = undefined */) {\n validate(this, NAME);\n var f = ctx(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3);\n var entry;\n while (entry = entry ? entry.n : this._f) {\n f(entry.v, entry.k, this);\n // revert to the last existing entry\n while (entry && entry.r) entry = entry.p;\n }\n },\n // 23.1.3.7 Map.prototype.has(key)\n // 23.2.3.7 Set.prototype.has(value)\n has: function has(key) {\n return !!getEntry(validate(this, NAME), key);\n }\n });\n if (DESCRIPTORS) dP(C.prototype, 'size', {\n get: function () {\n return validate(this, NAME)[SIZE];\n }\n });\n return C;\n },\n def: function (that, key, value) {\n var entry = getEntry(that, key);\n var prev, index;\n // change existing entry\n if (entry) {\n entry.v = value;\n // create new entry\n } else {\n that._l = entry = {\n i: index = fastKey(key, true), // <- index\n k: key, // <- key\n v: value, // <- value\n p: prev = that._l, // <- previous entry\n n: undefined, // <- next entry\n r: false // <- removed\n };\n if (!that._f) that._f = entry;\n if (prev) prev.n = entry;\n that[SIZE]++;\n // add to index\n if (index !== 'F') that._i[index] = entry;\n } return that;\n },\n getEntry: getEntry,\n setStrong: function (C, NAME, IS_MAP) {\n // add .keys, .values, .entries, [@@iterator]\n // 23.1.3.4, 23.1.3.8, 23.1.3.11, 23.1.3.12, 23.2.3.5, 23.2.3.8, 23.2.3.10, 23.2.3.11\n $iterDefine(C, NAME, function (iterated, kind) {\n this._t = validate(iterated, NAME); // target\n this._k = kind; // kind\n this._l = undefined; // previous\n }, function () {\n var that = this;\n var kind = that._k;\n var entry = that._l;\n // revert to the last existing entry\n while (entry && entry.r) entry = entry.p;\n // get next entry\n if (!that._t || !(that._l = entry = entry ? entry.n : that._t._f)) {\n // or finish the iteration\n that._t = undefined;\n return step(1);\n }\n // return step by kind\n if (kind == 'keys') return step(0, entry.k);\n if (kind == 'values') return step(0, entry.v);\n return step(0, [entry.k, entry.v]);\n }, IS_MAP ? 'entries' : 'values', !IS_MAP, true);\n\n // add [@@species], 23.1.2.2, 23.2.2.2\n setSpecies(NAME);\n }\n};\n","// Works with __proto__ only. Old v8 can't work with null proto objects.\n/* eslint-disable no-proto */\nvar isObject = require('./_is-object');\nvar anObject = require('./_an-object');\nvar check = function (O, proto) {\n anObject(O);\n if (!isObject(proto) && proto !== null) throw TypeError(proto + \": can't set as prototype!\");\n};\nmodule.exports = {\n set: Object.setPrototypeOf || ('__proto__' in {} ? // eslint-disable-line\n function (test, buggy, set) {\n try {\n set = require('./_ctx')(Function.call, require('./_object-gopd').f(Object.prototype, '__proto__').set, 2);\n set(test, []);\n buggy = !(test instanceof Array);\n } catch (e) { buggy = true; }\n return function setPrototypeOf(O, proto) {\n check(O, proto);\n if (buggy) O.__proto__ = proto;\n else set(O, proto);\n return O;\n };\n }({}, false) : undefined),\n check: check\n};\n","var isObject = require('./_is-object');\nvar setPrototypeOf = require('./_set-proto').set;\nmodule.exports = function (that, target, C) {\n var S = target.constructor;\n var P;\n if (S !== C && typeof S == 'function' && (P = S.prototype) !== C.prototype && isObject(P) && setPrototypeOf) {\n setPrototypeOf(that, P);\n } return that;\n};\n","'use strict';\nvar global = require('./_global');\nvar $export = require('./_export');\nvar redefine = require('./_redefine');\nvar redefineAll = require('./_redefine-all');\nvar meta = require('./_meta');\nvar forOf = require('./_for-of');\nvar anInstance = require('./_an-instance');\nvar isObject = require('./_is-object');\nvar fails = require('./_fails');\nvar $iterDetect = require('./_iter-detect');\nvar setToStringTag = require('./_set-to-string-tag');\nvar inheritIfRequired = require('./_inherit-if-required');\n\nmodule.exports = function (NAME, wrapper, methods, common, IS_MAP, IS_WEAK) {\n var Base = global[NAME];\n var C = Base;\n var ADDER = IS_MAP ? 'set' : 'add';\n var proto = C && C.prototype;\n var O = {};\n var fixMethod = function (KEY) {\n var fn = proto[KEY];\n redefine(proto, KEY,\n KEY == 'delete' ? function (a) {\n return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);\n } : KEY == 'has' ? function has(a) {\n return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);\n } : KEY == 'get' ? function get(a) {\n return IS_WEAK && !isObject(a) ? undefined : fn.call(this, a === 0 ? 0 : a);\n } : KEY == 'add' ? function add(a) { fn.call(this, a === 0 ? 0 : a); return this; }\n : function set(a, b) { fn.call(this, a === 0 ? 0 : a, b); return this; }\n );\n };\n if (typeof C != 'function' || !(IS_WEAK || proto.forEach && !fails(function () {\n new C().entries().next();\n }))) {\n // create collection constructor\n C = common.getConstructor(wrapper, NAME, IS_MAP, ADDER);\n redefineAll(C.prototype, methods);\n meta.NEED = true;\n } else {\n var instance = new C();\n // early implementations not supports chaining\n var HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) != instance;\n // V8 ~ Chromium 40- weak-collections throws on primitives, but should return false\n var THROWS_ON_PRIMITIVES = fails(function () { instance.has(1); });\n // most early implementations doesn't supports iterables, most modern - not close it correctly\n var ACCEPT_ITERABLES = $iterDetect(function (iter) { new C(iter); }); // eslint-disable-line no-new\n // for early implementations -0 and +0 not the same\n var BUGGY_ZERO = !IS_WEAK && fails(function () {\n // V8 ~ Chromium 42- fails only with 5+ elements\n var $instance = new C();\n var index = 5;\n while (index--) $instance[ADDER](index, index);\n return !$instance.has(-0);\n });\n if (!ACCEPT_ITERABLES) {\n C = wrapper(function (target, iterable) {\n anInstance(target, C, NAME);\n var that = inheritIfRequired(new Base(), target, C);\n if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n return that;\n });\n C.prototype = proto;\n proto.constructor = C;\n }\n if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) {\n fixMethod('delete');\n fixMethod('has');\n IS_MAP && fixMethod('get');\n }\n if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER);\n // weak collections should not contains .clear method\n if (IS_WEAK && proto.clear) delete proto.clear;\n }\n\n setToStringTag(C, NAME);\n\n O[NAME] = C;\n $export($export.G + $export.W + $export.F * (C != Base), O);\n\n if (!IS_WEAK) common.setStrong(C, NAME, IS_MAP);\n\n return C;\n};\n","'use strict';\nvar strong = require('./_collection-strong');\nvar validate = require('./_validate-collection');\nvar MAP = 'Map';\n\n// 23.1 Map Objects\nmodule.exports = require('./_collection')(MAP, function (get) {\n return function Map() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };\n}, {\n // 23.1.3.6 Map.prototype.get(key)\n get: function get(key) {\n var entry = strong.getEntry(validate(this, MAP), key);\n return entry && entry.v;\n },\n // 23.1.3.9 Map.prototype.set(key, value)\n set: function set(key, value) {\n return strong.def(validate(this, MAP), key === 0 ? 0 : key, value);\n }\n}, strong, true);\n","'use strict';\nvar strong = require('./_collection-strong');\nvar validate = require('./_validate-collection');\nvar SET = 'Set';\n\n// 23.2 Set Objects\nmodule.exports = require('./_collection')(SET, function (get) {\n return function Set() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };\n}, {\n // 23.2.3.1 Set.prototype.add(value)\n add: function add(value) {\n return strong.def(validate(this, SET), value = value === 0 ? 0 : value, value);\n }\n}, strong);\n","exports.f = Object.getOwnPropertySymbols;\n","'use strict';\n// 19.1.2.1 Object.assign(target, source, ...)\nvar getKeys = require('./_object-keys');\nvar gOPS = require('./_object-gops');\nvar pIE = require('./_object-pie');\nvar toObject = require('./_to-object');\nvar IObject = require('./_iobject');\nvar $assign = Object.assign;\n\n// should work with symbols and should have deterministic property order (V8 bug)\nmodule.exports = !$assign || require('./_fails')(function () {\n var A = {};\n var B = {};\n // eslint-disable-next-line no-undef\n var S = Symbol();\n var K = 'abcdefghijklmnopqrst';\n A[S] = 7;\n K.split('').forEach(function (k) { B[k] = k; });\n return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K;\n}) ? function assign(target, source) { // eslint-disable-line no-unused-vars\n var T = toObject(target);\n var aLen = arguments.length;\n var index = 1;\n var getSymbols = gOPS.f;\n var isEnum = pIE.f;\n while (aLen > index) {\n var S = IObject(arguments[index++]);\n var keys = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S);\n var length = keys.length;\n var j = 0;\n var key;\n while (length > j) if (isEnum.call(S, key = keys[j++])) T[key] = S[key];\n } return T;\n} : $assign;\n","'use strict';\nvar redefineAll = require('./_redefine-all');\nvar getWeak = require('./_meta').getWeak;\nvar anObject = require('./_an-object');\nvar isObject = require('./_is-object');\nvar anInstance = require('./_an-instance');\nvar forOf = require('./_for-of');\nvar createArrayMethod = require('./_array-methods');\nvar $has = require('./_has');\nvar validate = require('./_validate-collection');\nvar arrayFind = createArrayMethod(5);\nvar arrayFindIndex = createArrayMethod(6);\nvar id = 0;\n\n// fallback for uncaught frozen keys\nvar uncaughtFrozenStore = function (that) {\n return that._l || (that._l = new UncaughtFrozenStore());\n};\nvar UncaughtFrozenStore = function () {\n this.a = [];\n};\nvar findUncaughtFrozen = function (store, key) {\n return arrayFind(store.a, function (it) {\n return it[0] === key;\n });\n};\nUncaughtFrozenStore.prototype = {\n get: function (key) {\n var entry = findUncaughtFrozen(this, key);\n if (entry) return entry[1];\n },\n has: function (key) {\n return !!findUncaughtFrozen(this, key);\n },\n set: function (key, value) {\n var entry = findUncaughtFrozen(this, key);\n if (entry) entry[1] = value;\n else this.a.push([key, value]);\n },\n 'delete': function (key) {\n var index = arrayFindIndex(this.a, function (it) {\n return it[0] === key;\n });\n if (~index) this.a.splice(index, 1);\n return !!~index;\n }\n};\n\nmodule.exports = {\n getConstructor: function (wrapper, NAME, IS_MAP, ADDER) {\n var C = wrapper(function (that, iterable) {\n anInstance(that, C, NAME, '_i');\n that._t = NAME; // collection type\n that._i = id++; // collection id\n that._l = undefined; // leak store for uncaught frozen objects\n if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n });\n redefineAll(C.prototype, {\n // 23.3.3.2 WeakMap.prototype.delete(key)\n // 23.4.3.3 WeakSet.prototype.delete(value)\n 'delete': function (key) {\n if (!isObject(key)) return false;\n var data = getWeak(key);\n if (data === true) return uncaughtFrozenStore(validate(this, NAME))['delete'](key);\n return data && $has(data, this._i) && delete data[this._i];\n },\n // 23.3.3.4 WeakMap.prototype.has(key)\n // 23.4.3.4 WeakSet.prototype.has(value)\n has: function has(key) {\n if (!isObject(key)) return false;\n var data = getWeak(key);\n if (data === true) return uncaughtFrozenStore(validate(this, NAME)).has(key);\n return data && $has(data, this._i);\n }\n });\n return C;\n },\n def: function (that, key, value) {\n var data = getWeak(anObject(key), true);\n if (data === true) uncaughtFrozenStore(that).set(key, value);\n else data[that._i] = value;\n return that;\n },\n ufstore: uncaughtFrozenStore\n};\n","'use strict';\nvar each = require('./_array-methods')(0);\nvar redefine = require('./_redefine');\nvar meta = require('./_meta');\nvar assign = require('./_object-assign');\nvar weak = require('./_collection-weak');\nvar isObject = require('./_is-object');\nvar fails = require('./_fails');\nvar validate = require('./_validate-collection');\nvar WEAK_MAP = 'WeakMap';\nvar getWeak = meta.getWeak;\nvar isExtensible = Object.isExtensible;\nvar uncaughtFrozenStore = weak.ufstore;\nvar tmp = {};\nvar InternalMap;\n\nvar wrapper = function (get) {\n return function WeakMap() {\n return get(this, arguments.length > 0 ? arguments[0] : undefined);\n };\n};\n\nvar methods = {\n // 23.3.3.3 WeakMap.prototype.get(key)\n get: function get(key) {\n if (isObject(key)) {\n var data = getWeak(key);\n if (data === true) return uncaughtFrozenStore(validate(this, WEAK_MAP)).get(key);\n return data ? data[this._i] : undefined;\n }\n },\n // 23.3.3.5 WeakMap.prototype.set(key, value)\n set: function set(key, value) {\n return weak.def(validate(this, WEAK_MAP), key, value);\n }\n};\n\n// 23.3 WeakMap Objects\nvar $WeakMap = module.exports = require('./_collection')(WEAK_MAP, wrapper, methods, weak, true, true);\n\n// IE11 WeakMap frozen keys fix\nif (fails(function () { return new $WeakMap().set((Object.freeze || Object)(tmp), 7).get(tmp) != 7; })) {\n InternalMap = weak.getConstructor(wrapper, WEAK_MAP);\n assign(InternalMap.prototype, methods);\n meta.NEED = true;\n each(['delete', 'has', 'get', 'set'], function (key) {\n var proto = $WeakMap.prototype;\n var method = proto[key];\n redefine(proto, key, function (a, b) {\n // store frozen objects on internal weakmap shim\n if (isObject(a) && !isExtensible(a)) {\n if (!this._f) this._f = new InternalMap();\n var result = this._f[key](a, b);\n return key == 'set' ? this : result;\n // store all the rest on native weakmap\n } return method.call(this, a, b);\n });\n });\n}\n","'use strict';\nvar weak = require('./_collection-weak');\nvar validate = require('./_validate-collection');\nvar WEAK_SET = 'WeakSet';\n\n// 23.4 WeakSet Objects\nrequire('./_collection')(WEAK_SET, function (get) {\n return function WeakSet() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };\n}, {\n // 23.4.3.1 WeakSet.prototype.add(value)\n add: function add(value) {\n return weak.def(validate(this, WEAK_SET), value, true);\n }\n}, weak, false, true);\n","// 26.1.1 Reflect.apply(target, thisArgument, argumentsList)\nvar $export = require('./_export');\nvar aFunction = require('./_a-function');\nvar anObject = require('./_an-object');\nvar rApply = (require('./_global').Reflect || {}).apply;\nvar fApply = Function.apply;\n// MS Edge argumentsList argument is optional\n$export($export.S + $export.F * !require('./_fails')(function () {\n rApply(function () { /* empty */ });\n}), 'Reflect', {\n apply: function apply(target, thisArgument, argumentsList) {\n var T = aFunction(target);\n var L = anObject(argumentsList);\n return rApply ? rApply(T, thisArgument, L) : fApply.call(T, thisArgument, L);\n }\n});\n","// fast apply, http://jsperf.lnkit.com/fast-apply/5\nmodule.exports = function (fn, args, that) {\n var un = that === undefined;\n switch (args.length) {\n case 0: return un ? fn()\n : fn.call(that);\n case 1: return un ? fn(args[0])\n : fn.call(that, args[0]);\n case 2: return un ? fn(args[0], args[1])\n : fn.call(that, args[0], args[1]);\n case 3: return un ? fn(args[0], args[1], args[2])\n : fn.call(that, args[0], args[1], args[2]);\n case 4: return un ? fn(args[0], args[1], args[2], args[3])\n : fn.call(that, args[0], args[1], args[2], args[3]);\n } return fn.apply(that, args);\n};\n","'use strict';\nvar aFunction = require('./_a-function');\nvar isObject = require('./_is-object');\nvar invoke = require('./_invoke');\nvar arraySlice = [].slice;\nvar factories = {};\n\nvar construct = function (F, len, args) {\n if (!(len in factories)) {\n for (var n = [], i = 0; i < len; i++) n[i] = 'a[' + i + ']';\n // eslint-disable-next-line no-new-func\n factories[len] = Function('F,a', 'return new F(' + n.join(',') + ')');\n } return factories[len](F, args);\n};\n\nmodule.exports = Function.bind || function bind(that /* , ...args */) {\n var fn = aFunction(this);\n var partArgs = arraySlice.call(arguments, 1);\n var bound = function (/* args... */) {\n var args = partArgs.concat(arraySlice.call(arguments));\n return this instanceof bound ? construct(fn, args.length, args) : invoke(fn, args, that);\n };\n if (isObject(fn.prototype)) bound.prototype = fn.prototype;\n return bound;\n};\n","// 26.1.2 Reflect.construct(target, argumentsList [, newTarget])\nvar $export = require('./_export');\nvar create = require('./_object-create');\nvar aFunction = require('./_a-function');\nvar anObject = require('./_an-object');\nvar isObject = require('./_is-object');\nvar fails = require('./_fails');\nvar bind = require('./_bind');\nvar rConstruct = (require('./_global').Reflect || {}).construct;\n\n// MS Edge supports only 2 arguments and argumentsList argument is optional\n// FF Nightly sets third argument as `new.target`, but does not create `this` from it\nvar NEW_TARGET_BUG = fails(function () {\n function F() { /* empty */ }\n return !(rConstruct(function () { /* empty */ }, [], F) instanceof F);\n});\nvar ARGS_BUG = !fails(function () {\n rConstruct(function () { /* empty */ });\n});\n\n$export($export.S + $export.F * (NEW_TARGET_BUG || ARGS_BUG), 'Reflect', {\n construct: function construct(Target, args /* , newTarget */) {\n aFunction(Target);\n anObject(args);\n var newTarget = arguments.length < 3 ? Target : aFunction(arguments[2]);\n if (ARGS_BUG && !NEW_TARGET_BUG) return rConstruct(Target, args, newTarget);\n if (Target == newTarget) {\n // w/o altered newTarget, optimization for 0-4 arguments\n switch (args.length) {\n case 0: return new Target();\n case 1: return new Target(args[0]);\n case 2: return new Target(args[0], args[1]);\n case 3: return new Target(args[0], args[1], args[2]);\n case 4: return new Target(args[0], args[1], args[2], args[3]);\n }\n // w/o altered newTarget, lot of arguments case\n var $args = [null];\n $args.push.apply($args, args);\n return new (bind.apply(Target, $args))();\n }\n // with altered newTarget, not support built-in constructors\n var proto = newTarget.prototype;\n var instance = create(isObject(proto) ? proto : Object.prototype);\n var result = Function.apply.call(Target, instance, args);\n return isObject(result) ? result : instance;\n }\n});\n","// 26.1.3 Reflect.defineProperty(target, propertyKey, attributes)\nvar dP = require('./_object-dp');\nvar $export = require('./_export');\nvar anObject = require('./_an-object');\nvar toPrimitive = require('./_to-primitive');\n\n// MS Edge has broken Reflect.defineProperty - throwing instead of returning false\n$export($export.S + $export.F * require('./_fails')(function () {\n // eslint-disable-next-line no-undef\n Reflect.defineProperty(dP.f({}, 1, { value: 1 }), 1, { value: 2 });\n}), 'Reflect', {\n defineProperty: function defineProperty(target, propertyKey, attributes) {\n anObject(target);\n propertyKey = toPrimitive(propertyKey, true);\n anObject(attributes);\n try {\n dP.f(target, propertyKey, attributes);\n return true;\n } catch (e) {\n return false;\n }\n }\n});\n","// 26.1.4 Reflect.deleteProperty(target, propertyKey)\nvar $export = require('./_export');\nvar gOPD = require('./_object-gopd').f;\nvar anObject = require('./_an-object');\n\n$export($export.S, 'Reflect', {\n deleteProperty: function deleteProperty(target, propertyKey) {\n var desc = gOPD(anObject(target), propertyKey);\n return desc && !desc.configurable ? false : delete target[propertyKey];\n }\n});\n","// 26.1.6 Reflect.get(target, propertyKey [, receiver])\nvar gOPD = require('./_object-gopd');\nvar getPrototypeOf = require('./_object-gpo');\nvar has = require('./_has');\nvar $export = require('./_export');\nvar isObject = require('./_is-object');\nvar anObject = require('./_an-object');\n\nfunction get(target, propertyKey /* , receiver */) {\n var receiver = arguments.length < 3 ? target : arguments[2];\n var desc, proto;\n if (anObject(target) === receiver) return target[propertyKey];\n if (desc = gOPD.f(target, propertyKey)) return has(desc, 'value')\n ? desc.value\n : desc.get !== undefined\n ? desc.get.call(receiver)\n : undefined;\n if (isObject(proto = getPrototypeOf(target))) return get(proto, propertyKey, receiver);\n}\n\n$export($export.S, 'Reflect', { get: get });\n","// 26.1.7 Reflect.getOwnPropertyDescriptor(target, propertyKey)\nvar gOPD = require('./_object-gopd');\nvar $export = require('./_export');\nvar anObject = require('./_an-object');\n\n$export($export.S, 'Reflect', {\n getOwnPropertyDescriptor: function getOwnPropertyDescriptor(target, propertyKey) {\n return gOPD.f(anObject(target), propertyKey);\n }\n});\n","// 26.1.8 Reflect.getPrototypeOf(target)\nvar $export = require('./_export');\nvar getProto = require('./_object-gpo');\nvar anObject = require('./_an-object');\n\n$export($export.S, 'Reflect', {\n getPrototypeOf: function getPrototypeOf(target) {\n return getProto(anObject(target));\n }\n});\n","// 26.1.9 Reflect.has(target, propertyKey)\nvar $export = require('./_export');\n\n$export($export.S, 'Reflect', {\n has: function has(target, propertyKey) {\n return propertyKey in target;\n }\n});\n","// 26.1.10 Reflect.isExtensible(target)\nvar $export = require('./_export');\nvar anObject = require('./_an-object');\nvar $isExtensible = Object.isExtensible;\n\n$export($export.S, 'Reflect', {\n isExtensible: function isExtensible(target) {\n anObject(target);\n return $isExtensible ? $isExtensible(target) : true;\n }\n});\n","// all object keys, includes non-enumerable and symbols\nvar gOPN = require('./_object-gopn');\nvar gOPS = require('./_object-gops');\nvar anObject = require('./_an-object');\nvar Reflect = require('./_global').Reflect;\nmodule.exports = Reflect && Reflect.ownKeys || function ownKeys(it) {\n var keys = gOPN.f(anObject(it));\n var getSymbols = gOPS.f;\n return getSymbols ? keys.concat(getSymbols(it)) : keys;\n};\n","// 26.1.11 Reflect.ownKeys(target)\nvar $export = require('./_export');\n\n$export($export.S, 'Reflect', { ownKeys: require('./_own-keys') });\n","// 26.1.12 Reflect.preventExtensions(target)\nvar $export = require('./_export');\nvar anObject = require('./_an-object');\nvar $preventExtensions = Object.preventExtensions;\n\n$export($export.S, 'Reflect', {\n preventExtensions: function preventExtensions(target) {\n anObject(target);\n try {\n if ($preventExtensions) $preventExtensions(target);\n return true;\n } catch (e) {\n return false;\n }\n }\n});\n","// 26.1.13 Reflect.set(target, propertyKey, V [, receiver])\nvar dP = require('./_object-dp');\nvar gOPD = require('./_object-gopd');\nvar getPrototypeOf = require('./_object-gpo');\nvar has = require('./_has');\nvar $export = require('./_export');\nvar createDesc = require('./_property-desc');\nvar anObject = require('./_an-object');\nvar isObject = require('./_is-object');\n\nfunction set(target, propertyKey, V /* , receiver */) {\n var receiver = arguments.length < 4 ? target : arguments[3];\n var ownDesc = gOPD.f(anObject(target), propertyKey);\n var existingDescriptor, proto;\n if (!ownDesc) {\n if (isObject(proto = getPrototypeOf(target))) {\n return set(proto, propertyKey, V, receiver);\n }\n ownDesc = createDesc(0);\n }\n if (has(ownDesc, 'value')) {\n if (ownDesc.writable === false || !isObject(receiver)) return false;\n existingDescriptor = gOPD.f(receiver, propertyKey) || createDesc(0);\n existingDescriptor.value = V;\n dP.f(receiver, propertyKey, existingDescriptor);\n return true;\n }\n return ownDesc.set === undefined ? false : (ownDesc.set.call(receiver, V), true);\n}\n\n$export($export.S, 'Reflect', { set: set });\n","// 26.1.14 Reflect.setPrototypeOf(target, proto)\nvar $export = require('./_export');\nvar setProto = require('./_set-proto');\n\nif (setProto) $export($export.S, 'Reflect', {\n setPrototypeOf: function setPrototypeOf(target, proto) {\n setProto.check(target, proto);\n try {\n setProto.set(target, proto);\n return true;\n } catch (e) {\n return false;\n }\n }\n});\n","var ctx = require('./_ctx');\nvar invoke = require('./_invoke');\nvar html = require('./_html');\nvar cel = require('./_dom-create');\nvar global = require('./_global');\nvar process = global.process;\nvar setTask = global.setImmediate;\nvar clearTask = global.clearImmediate;\nvar MessageChannel = global.MessageChannel;\nvar Dispatch = global.Dispatch;\nvar counter = 0;\nvar queue = {};\nvar ONREADYSTATECHANGE = 'onreadystatechange';\nvar defer, channel, port;\nvar run = function () {\n var id = +this;\n // eslint-disable-next-line no-prototype-builtins\n if (queue.hasOwnProperty(id)) {\n var fn = queue[id];\n delete queue[id];\n fn();\n }\n};\nvar listener = function (event) {\n run.call(event.data);\n};\n// Node.js 0.9+ & IE10+ has setImmediate, otherwise:\nif (!setTask || !clearTask) {\n setTask = function setImmediate(fn) {\n var args = [];\n var i = 1;\n while (arguments.length > i) args.push(arguments[i++]);\n queue[++counter] = function () {\n // eslint-disable-next-line no-new-func\n invoke(typeof fn == 'function' ? fn : Function(fn), args);\n };\n defer(counter);\n return counter;\n };\n clearTask = function clearImmediate(id) {\n delete queue[id];\n };\n // Node.js 0.8-\n if (require('./_cof')(process) == 'process') {\n defer = function (id) {\n process.nextTick(ctx(run, id, 1));\n };\n // Sphere (JS game engine) Dispatch API\n } else if (Dispatch && Dispatch.now) {\n defer = function (id) {\n Dispatch.now(ctx(run, id, 1));\n };\n // Browsers with MessageChannel, includes WebWorkers\n } else if (MessageChannel) {\n channel = new MessageChannel();\n port = channel.port2;\n channel.port1.onmessage = listener;\n defer = ctx(port.postMessage, port, 1);\n // Browsers with postMessage, skip WebWorkers\n // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'\n } else if (global.addEventListener && typeof postMessage == 'function' && !global.importScripts) {\n defer = function (id) {\n global.postMessage(id + '', '*');\n };\n global.addEventListener('message', listener, false);\n // IE8-\n } else if (ONREADYSTATECHANGE in cel('script')) {\n defer = function (id) {\n html.appendChild(cel('script'))[ONREADYSTATECHANGE] = function () {\n html.removeChild(this);\n run.call(id);\n };\n };\n // Rest old browsers\n } else {\n defer = function (id) {\n setTimeout(ctx(run, id, 1), 0);\n };\n }\n}\nmodule.exports = {\n set: setTask,\n clear: clearTask\n};\n","var global = require('./_global');\nvar macrotask = require('./_task').set;\nvar Observer = global.MutationObserver || global.WebKitMutationObserver;\nvar process = global.process;\nvar Promise = global.Promise;\nvar isNode = require('./_cof')(process) == 'process';\n\nmodule.exports = function () {\n var head, last, notify;\n\n var flush = function () {\n var parent, fn;\n if (isNode && (parent = process.domain)) parent.exit();\n while (head) {\n fn = head.fn;\n head = head.next;\n try {\n fn();\n } catch (e) {\n if (head) notify();\n else last = undefined;\n throw e;\n }\n } last = undefined;\n if (parent) parent.enter();\n };\n\n // Node.js\n if (isNode) {\n notify = function () {\n process.nextTick(flush);\n };\n // browsers with MutationObserver, except iOS Safari - https://github.com/zloirock/core-js/issues/339\n } else if (Observer && !(global.navigator && global.navigator.standalone)) {\n var toggle = true;\n var node = document.createTextNode('');\n new Observer(flush).observe(node, { characterData: true }); // eslint-disable-line no-new\n notify = function () {\n node.data = toggle = !toggle;\n };\n // environments with maybe non-completely correct, but existent Promise\n } else if (Promise && Promise.resolve) {\n var promise = Promise.resolve();\n notify = function () {\n promise.then(flush);\n };\n // for other environments - macrotask based on:\n // - setImmediate\n // - MessageChannel\n // - window.postMessag\n // - onreadystatechange\n // - setTimeout\n } else {\n notify = function () {\n // strange IE + webpack dev server bug - use .call(global)\n macrotask.call(global, flush);\n };\n }\n\n return function (fn) {\n var task = { fn: fn, next: undefined };\n if (last) last.next = task;\n if (!head) {\n head = task;\n notify();\n } last = task;\n };\n};\n","'use strict';\n// 25.4.1.5 NewPromiseCapability(C)\nvar aFunction = require('./_a-function');\n\nfunction PromiseCapability(C) {\n var resolve, reject;\n this.promise = new C(function ($$resolve, $$reject) {\n if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor');\n resolve = $$resolve;\n reject = $$reject;\n });\n this.resolve = aFunction(resolve);\n this.reject = aFunction(reject);\n}\n\nmodule.exports.f = function (C) {\n return new PromiseCapability(C);\n};\n","module.exports = function (exec) {\n try {\n return { e: false, v: exec() };\n } catch (e) {\n return { e: true, v: e };\n }\n};\n","var anObject = require('./_an-object');\nvar isObject = require('./_is-object');\nvar newPromiseCapability = require('./_new-promise-capability');\n\nmodule.exports = function (C, x) {\n anObject(C);\n if (isObject(x) && x.constructor === C) return x;\n var promiseCapability = newPromiseCapability.f(C);\n var resolve = promiseCapability.resolve;\n resolve(x);\n return promiseCapability.promise;\n};\n","'use strict';\nvar LIBRARY = require('./_library');\nvar global = require('./_global');\nvar ctx = require('./_ctx');\nvar classof = require('./_classof');\nvar $export = require('./_export');\nvar isObject = require('./_is-object');\nvar aFunction = require('./_a-function');\nvar anInstance = require('./_an-instance');\nvar forOf = require('./_for-of');\nvar speciesConstructor = require('./_species-constructor');\nvar task = require('./_task').set;\nvar microtask = require('./_microtask')();\nvar newPromiseCapabilityModule = require('./_new-promise-capability');\nvar perform = require('./_perform');\nvar promiseResolve = require('./_promise-resolve');\nvar PROMISE = 'Promise';\nvar TypeError = global.TypeError;\nvar process = global.process;\nvar $Promise = global[PROMISE];\nvar isNode = classof(process) == 'process';\nvar empty = function () { /* empty */ };\nvar Internal, newGenericPromiseCapability, OwnPromiseCapability, Wrapper;\nvar newPromiseCapability = newGenericPromiseCapability = newPromiseCapabilityModule.f;\n\nvar USE_NATIVE = !!function () {\n try {\n // correct subclassing with @@species support\n var promise = $Promise.resolve(1);\n var FakePromise = (promise.constructor = {})[require('./_wks')('species')] = function (exec) {\n exec(empty, empty);\n };\n // unhandled rejections tracking support, NodeJS Promise without it fails @@species test\n return (isNode || typeof PromiseRejectionEvent == 'function') && promise.then(empty) instanceof FakePromise;\n } catch (e) { /* empty */ }\n}();\n\n// helpers\nvar isThenable = function (it) {\n var then;\n return isObject(it) && typeof (then = it.then) == 'function' ? then : false;\n};\nvar notify = function (promise, isReject) {\n if (promise._n) return;\n promise._n = true;\n var chain = promise._c;\n microtask(function () {\n var value = promise._v;\n var ok = promise._s == 1;\n var i = 0;\n var run = function (reaction) {\n var handler = ok ? reaction.ok : reaction.fail;\n var resolve = reaction.resolve;\n var reject = reaction.reject;\n var domain = reaction.domain;\n var result, then;\n try {\n if (handler) {\n if (!ok) {\n if (promise._h == 2) onHandleUnhandled(promise);\n promise._h = 1;\n }\n if (handler === true) result = value;\n else {\n if (domain) domain.enter();\n result = handler(value);\n if (domain) domain.exit();\n }\n if (result === reaction.promise) {\n reject(TypeError('Promise-chain cycle'));\n } else if (then = isThenable(result)) {\n then.call(result, resolve, reject);\n } else resolve(result);\n } else reject(value);\n } catch (e) {\n reject(e);\n }\n };\n while (chain.length > i) run(chain[i++]); // variable length - can't use forEach\n promise._c = [];\n promise._n = false;\n if (isReject && !promise._h) onUnhandled(promise);\n });\n};\nvar onUnhandled = function (promise) {\n task.call(global, function () {\n var value = promise._v;\n var unhandled = isUnhandled(promise);\n var result, handler, console;\n if (unhandled) {\n result = perform(function () {\n if (isNode) {\n process.emit('unhandledRejection', value, promise);\n } else if (handler = global.onunhandledrejection) {\n handler({ promise: promise, reason: value });\n } else if ((console = global.console) && console.error) {\n console.error('Unhandled promise rejection', value);\n }\n });\n // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should\n promise._h = isNode || isUnhandled(promise) ? 2 : 1;\n } promise._a = undefined;\n if (unhandled && result.e) throw result.v;\n });\n};\nvar isUnhandled = function (promise) {\n return promise._h !== 1 && (promise._a || promise._c).length === 0;\n};\nvar onHandleUnhandled = function (promise) {\n task.call(global, function () {\n var handler;\n if (isNode) {\n process.emit('rejectionHandled', promise);\n } else if (handler = global.onrejectionhandled) {\n handler({ promise: promise, reason: promise._v });\n }\n });\n};\nvar $reject = function (value) {\n var promise = this;\n if (promise._d) return;\n promise._d = true;\n promise = promise._w || promise; // unwrap\n promise._v = value;\n promise._s = 2;\n if (!promise._a) promise._a = promise._c.slice();\n notify(promise, true);\n};\nvar $resolve = function (value) {\n var promise = this;\n var then;\n if (promise._d) return;\n promise._d = true;\n promise = promise._w || promise; // unwrap\n try {\n if (promise === value) throw TypeError(\"Promise can't be resolved itself\");\n if (then = isThenable(value)) {\n microtask(function () {\n var wrapper = { _w: promise, _d: false }; // wrap\n try {\n then.call(value, ctx($resolve, wrapper, 1), ctx($reject, wrapper, 1));\n } catch (e) {\n $reject.call(wrapper, e);\n }\n });\n } else {\n promise._v = value;\n promise._s = 1;\n notify(promise, false);\n }\n } catch (e) {\n $reject.call({ _w: promise, _d: false }, e); // wrap\n }\n};\n\n// constructor polyfill\nif (!USE_NATIVE) {\n // 25.4.3.1 Promise(executor)\n $Promise = function Promise(executor) {\n anInstance(this, $Promise, PROMISE, '_h');\n aFunction(executor);\n Internal.call(this);\n try {\n executor(ctx($resolve, this, 1), ctx($reject, this, 1));\n } catch (err) {\n $reject.call(this, err);\n }\n };\n // eslint-disable-next-line no-unused-vars\n Internal = function Promise(executor) {\n this._c = []; // <- awaiting reactions\n this._a = undefined; // <- checked in isUnhandled reactions\n this._s = 0; // <- state\n this._d = false; // <- done\n this._v = undefined; // <- value\n this._h = 0; // <- rejection state, 0 - default, 1 - handled, 2 - unhandled\n this._n = false; // <- notify\n };\n Internal.prototype = require('./_redefine-all')($Promise.prototype, {\n // 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected)\n then: function then(onFulfilled, onRejected) {\n var reaction = newPromiseCapability(speciesConstructor(this, $Promise));\n reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;\n reaction.fail = typeof onRejected == 'function' && onRejected;\n reaction.domain = isNode ? process.domain : undefined;\n this._c.push(reaction);\n if (this._a) this._a.push(reaction);\n if (this._s) notify(this, false);\n return reaction.promise;\n },\n // 25.4.5.1 Promise.prototype.catch(onRejected)\n 'catch': function (onRejected) {\n return this.then(undefined, onRejected);\n }\n });\n OwnPromiseCapability = function () {\n var promise = new Internal();\n this.promise = promise;\n this.resolve = ctx($resolve, promise, 1);\n this.reject = ctx($reject, promise, 1);\n };\n newPromiseCapabilityModule.f = newPromiseCapability = function (C) {\n return C === $Promise || C === Wrapper\n ? new OwnPromiseCapability(C)\n : newGenericPromiseCapability(C);\n };\n}\n\n$export($export.G + $export.W + $export.F * !USE_NATIVE, { Promise: $Promise });\nrequire('./_set-to-string-tag')($Promise, PROMISE);\nrequire('./_set-species')(PROMISE);\nWrapper = require('./_core')[PROMISE];\n\n// statics\n$export($export.S + $export.F * !USE_NATIVE, PROMISE, {\n // 25.4.4.5 Promise.reject(r)\n reject: function reject(r) {\n var capability = newPromiseCapability(this);\n var $$reject = capability.reject;\n $$reject(r);\n return capability.promise;\n }\n});\n$export($export.S + $export.F * (LIBRARY || !USE_NATIVE), PROMISE, {\n // 25.4.4.6 Promise.resolve(x)\n resolve: function resolve(x) {\n return promiseResolve(LIBRARY && this === Wrapper ? $Promise : this, x);\n }\n});\n$export($export.S + $export.F * !(USE_NATIVE && require('./_iter-detect')(function (iter) {\n $Promise.all(iter)['catch'](empty);\n})), PROMISE, {\n // 25.4.4.1 Promise.all(iterable)\n all: function all(iterable) {\n var C = this;\n var capability = newPromiseCapability(C);\n var resolve = capability.resolve;\n var reject = capability.reject;\n var result = perform(function () {\n var values = [];\n var index = 0;\n var remaining = 1;\n forOf(iterable, false, function (promise) {\n var $index = index++;\n var alreadyCalled = false;\n values.push(undefined);\n remaining++;\n C.resolve(promise).then(function (value) {\n if (alreadyCalled) return;\n alreadyCalled = true;\n values[$index] = value;\n --remaining || resolve(values);\n }, reject);\n });\n --remaining || resolve(values);\n });\n if (result.e) reject(result.v);\n return capability.promise;\n },\n // 25.4.4.4 Promise.race(iterable)\n race: function race(iterable) {\n var C = this;\n var capability = newPromiseCapability(C);\n var reject = capability.reject;\n var result = perform(function () {\n forOf(iterable, false, function (promise) {\n C.resolve(promise).then(capability.resolve, reject);\n });\n });\n if (result.e) reject(result.v);\n return capability.promise;\n }\n});\n","exports.f = require('./_wks');\n","var global = require('./_global');\nvar core = require('./_core');\nvar LIBRARY = require('./_library');\nvar wksExt = require('./_wks-ext');\nvar defineProperty = require('./_object-dp').f;\nmodule.exports = function (name) {\n var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {});\n if (name.charAt(0) != '_' && !(name in $Symbol)) defineProperty($Symbol, name, { value: wksExt.f(name) });\n};\n","// all enumerable object keys, includes symbols\nvar getKeys = require('./_object-keys');\nvar gOPS = require('./_object-gops');\nvar pIE = require('./_object-pie');\nmodule.exports = function (it) {\n var result = getKeys(it);\n var getSymbols = gOPS.f;\n if (getSymbols) {\n var symbols = getSymbols(it);\n var isEnum = pIE.f;\n var i = 0;\n var key;\n while (symbols.length > i) if (isEnum.call(it, key = symbols[i++])) result.push(key);\n } return result;\n};\n","// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window\nvar toIObject = require('./_to-iobject');\nvar gOPN = require('./_object-gopn').f;\nvar toString = {}.toString;\n\nvar windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames\n ? Object.getOwnPropertyNames(window) : [];\n\nvar getWindowNames = function (it) {\n try {\n return gOPN(it);\n } catch (e) {\n return windowNames.slice();\n }\n};\n\nmodule.exports.f = function getOwnPropertyNames(it) {\n return windowNames && toString.call(it) == '[object Window]' ? getWindowNames(it) : gOPN(toIObject(it));\n};\n","'use strict';\n// ECMAScript 6 symbols shim\nvar global = require('./_global');\nvar has = require('./_has');\nvar DESCRIPTORS = require('./_descriptors');\nvar $export = require('./_export');\nvar redefine = require('./_redefine');\nvar META = require('./_meta').KEY;\nvar $fails = require('./_fails');\nvar shared = require('./_shared');\nvar setToStringTag = require('./_set-to-string-tag');\nvar uid = require('./_uid');\nvar wks = require('./_wks');\nvar wksExt = require('./_wks-ext');\nvar wksDefine = require('./_wks-define');\nvar enumKeys = require('./_enum-keys');\nvar isArray = require('./_is-array');\nvar anObject = require('./_an-object');\nvar isObject = require('./_is-object');\nvar toIObject = require('./_to-iobject');\nvar toPrimitive = require('./_to-primitive');\nvar createDesc = require('./_property-desc');\nvar _create = require('./_object-create');\nvar gOPNExt = require('./_object-gopn-ext');\nvar $GOPD = require('./_object-gopd');\nvar $DP = require('./_object-dp');\nvar $keys = require('./_object-keys');\nvar gOPD = $GOPD.f;\nvar dP = $DP.f;\nvar gOPN = gOPNExt.f;\nvar $Symbol = global.Symbol;\nvar $JSON = global.JSON;\nvar _stringify = $JSON && $JSON.stringify;\nvar PROTOTYPE = 'prototype';\nvar HIDDEN = wks('_hidden');\nvar TO_PRIMITIVE = wks('toPrimitive');\nvar isEnum = {}.propertyIsEnumerable;\nvar SymbolRegistry = shared('symbol-registry');\nvar AllSymbols = shared('symbols');\nvar OPSymbols = shared('op-symbols');\nvar ObjectProto = Object[PROTOTYPE];\nvar USE_NATIVE = typeof $Symbol == 'function';\nvar QObject = global.QObject;\n// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173\nvar setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;\n\n// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687\nvar setSymbolDesc = DESCRIPTORS && $fails(function () {\n return _create(dP({}, 'a', {\n get: function () { return dP(this, 'a', { value: 7 }).a; }\n })).a != 7;\n}) ? function (it, key, D) {\n var protoDesc = gOPD(ObjectProto, key);\n if (protoDesc) delete ObjectProto[key];\n dP(it, key, D);\n if (protoDesc && it !== ObjectProto) dP(ObjectProto, key, protoDesc);\n} : dP;\n\nvar wrap = function (tag) {\n var sym = AllSymbols[tag] = _create($Symbol[PROTOTYPE]);\n sym._k = tag;\n return sym;\n};\n\nvar isSymbol = USE_NATIVE && typeof $Symbol.iterator == 'symbol' ? function (it) {\n return typeof it == 'symbol';\n} : function (it) {\n return it instanceof $Symbol;\n};\n\nvar $defineProperty = function defineProperty(it, key, D) {\n if (it === ObjectProto) $defineProperty(OPSymbols, key, D);\n anObject(it);\n key = toPrimitive(key, true);\n anObject(D);\n if (has(AllSymbols, key)) {\n if (!D.enumerable) {\n if (!has(it, HIDDEN)) dP(it, HIDDEN, createDesc(1, {}));\n it[HIDDEN][key] = true;\n } else {\n if (has(it, HIDDEN) && it[HIDDEN][key]) it[HIDDEN][key] = false;\n D = _create(D, { enumerable: createDesc(0, false) });\n } return setSymbolDesc(it, key, D);\n } return dP(it, key, D);\n};\nvar $defineProperties = function defineProperties(it, P) {\n anObject(it);\n var keys = enumKeys(P = toIObject(P));\n var i = 0;\n var l = keys.length;\n var key;\n while (l > i) $defineProperty(it, key = keys[i++], P[key]);\n return it;\n};\nvar $create = function create(it, P) {\n return P === undefined ? _create(it) : $defineProperties(_create(it), P);\n};\nvar $propertyIsEnumerable = function propertyIsEnumerable(key) {\n var E = isEnum.call(this, key = toPrimitive(key, true));\n if (this === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return false;\n return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true;\n};\nvar $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key) {\n it = toIObject(it);\n key = toPrimitive(key, true);\n if (it === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return;\n var D = gOPD(it, key);\n if (D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) D.enumerable = true;\n return D;\n};\nvar $getOwnPropertyNames = function getOwnPropertyNames(it) {\n var names = gOPN(toIObject(it));\n var result = [];\n var i = 0;\n var key;\n while (names.length > i) {\n if (!has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META) result.push(key);\n } return result;\n};\nvar $getOwnPropertySymbols = function getOwnPropertySymbols(it) {\n var IS_OP = it === ObjectProto;\n var names = gOPN(IS_OP ? OPSymbols : toIObject(it));\n var result = [];\n var i = 0;\n var key;\n while (names.length > i) {\n if (has(AllSymbols, key = names[i++]) && (IS_OP ? has(ObjectProto, key) : true)) result.push(AllSymbols[key]);\n } return result;\n};\n\n// 19.4.1.1 Symbol([description])\nif (!USE_NATIVE) {\n $Symbol = function Symbol() {\n if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor!');\n var tag = uid(arguments.length > 0 ? arguments[0] : undefined);\n var $set = function (value) {\n if (this === ObjectProto) $set.call(OPSymbols, value);\n if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;\n setSymbolDesc(this, tag, createDesc(1, value));\n };\n if (DESCRIPTORS && setter) setSymbolDesc(ObjectProto, tag, { configurable: true, set: $set });\n return wrap(tag);\n };\n redefine($Symbol[PROTOTYPE], 'toString', function toString() {\n return this._k;\n });\n\n $GOPD.f = $getOwnPropertyDescriptor;\n $DP.f = $defineProperty;\n require('./_object-gopn').f = gOPNExt.f = $getOwnPropertyNames;\n require('./_object-pie').f = $propertyIsEnumerable;\n require('./_object-gops').f = $getOwnPropertySymbols;\n\n if (DESCRIPTORS && !require('./_library')) {\n redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true);\n }\n\n wksExt.f = function (name) {\n return wrap(wks(name));\n };\n}\n\n$export($export.G + $export.W + $export.F * !USE_NATIVE, { Symbol: $Symbol });\n\nfor (var es6Symbols = (\n // 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14\n 'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'\n).split(','), j = 0; es6Symbols.length > j;)wks(es6Symbols[j++]);\n\nfor (var wellKnownSymbols = $keys(wks.store), k = 0; wellKnownSymbols.length > k;) wksDefine(wellKnownSymbols[k++]);\n\n$export($export.S + $export.F * !USE_NATIVE, 'Symbol', {\n // 19.4.2.1 Symbol.for(key)\n 'for': function (key) {\n return has(SymbolRegistry, key += '')\n ? SymbolRegistry[key]\n : SymbolRegistry[key] = $Symbol(key);\n },\n // 19.4.2.5 Symbol.keyFor(sym)\n keyFor: function keyFor(sym) {\n if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol!');\n for (var key in SymbolRegistry) if (SymbolRegistry[key] === sym) return key;\n },\n useSetter: function () { setter = true; },\n useSimple: function () { setter = false; }\n});\n\n$export($export.S + $export.F * !USE_NATIVE, 'Object', {\n // 19.1.2.2 Object.create(O [, Properties])\n create: $create,\n // 19.1.2.4 Object.defineProperty(O, P, Attributes)\n defineProperty: $defineProperty,\n // 19.1.2.3 Object.defineProperties(O, Properties)\n defineProperties: $defineProperties,\n // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)\n getOwnPropertyDescriptor: $getOwnPropertyDescriptor,\n // 19.1.2.7 Object.getOwnPropertyNames(O)\n getOwnPropertyNames: $getOwnPropertyNames,\n // 19.1.2.8 Object.getOwnPropertySymbols(O)\n getOwnPropertySymbols: $getOwnPropertySymbols\n});\n\n// 24.3.2 JSON.stringify(value [, replacer [, space]])\n$JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function () {\n var S = $Symbol();\n // MS Edge converts symbol values to JSON as {}\n // WebKit converts symbol values to JSON as null\n // V8 throws on boxed symbols\n return _stringify([S]) != '[null]' || _stringify({ a: S }) != '{}' || _stringify(Object(S)) != '{}';\n})), 'JSON', {\n stringify: function stringify(it) {\n var args = [it];\n var i = 1;\n var replacer, $replacer;\n while (arguments.length > i) args.push(arguments[i++]);\n $replacer = replacer = args[1];\n if (!isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined\n if (!isArray(replacer)) replacer = function (key, value) {\n if (typeof $replacer == 'function') value = $replacer.call(this, key, value);\n if (!isSymbol(value)) return value;\n };\n args[1] = replacer;\n return _stringify.apply($JSON, args);\n }\n});\n\n// 19.4.3.4 Symbol.prototype[@@toPrimitive](hint)\n$Symbol[PROTOTYPE][TO_PRIMITIVE] || require('./_hide')($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf);\n// 19.4.3.5 Symbol.prototype[@@toStringTag]\nsetToStringTag($Symbol, 'Symbol');\n// 20.2.1.9 Math[@@toStringTag]\nsetToStringTag(Math, 'Math', true);\n// 24.3.3 JSON[@@toStringTag]\nsetToStringTag(global.JSON, 'JSON', true);\n","// most Object methods by ES6 should accept primitives\nvar $export = require('./_export');\nvar core = require('./_core');\nvar fails = require('./_fails');\nmodule.exports = function (KEY, exec) {\n var fn = (core.Object || {})[KEY] || Object[KEY];\n var exp = {};\n exp[KEY] = exec(fn);\n $export($export.S + $export.F * fails(function () { fn(1); }), 'Object', exp);\n};\n","// 19.1.2.5 Object.freeze(O)\nvar isObject = require('./_is-object');\nvar meta = require('./_meta').onFreeze;\n\nrequire('./_object-sap')('freeze', function ($freeze) {\n return function freeze(it) {\n return $freeze && isObject(it) ? $freeze(meta(it)) : it;\n };\n});\n","// 19.1.2.17 Object.seal(O)\nvar isObject = require('./_is-object');\nvar meta = require('./_meta').onFreeze;\n\nrequire('./_object-sap')('seal', function ($seal) {\n return function seal(it) {\n return $seal && isObject(it) ? $seal(meta(it)) : it;\n };\n});\n","// 19.1.2.15 Object.preventExtensions(O)\nvar isObject = require('./_is-object');\nvar meta = require('./_meta').onFreeze;\n\nrequire('./_object-sap')('preventExtensions', function ($preventExtensions) {\n return function preventExtensions(it) {\n return $preventExtensions && isObject(it) ? $preventExtensions(meta(it)) : it;\n };\n});\n","// 19.1.2.12 Object.isFrozen(O)\nvar isObject = require('./_is-object');\n\nrequire('./_object-sap')('isFrozen', function ($isFrozen) {\n return function isFrozen(it) {\n return isObject(it) ? $isFrozen ? $isFrozen(it) : false : true;\n };\n});\n","// 19.1.2.13 Object.isSealed(O)\nvar isObject = require('./_is-object');\n\nrequire('./_object-sap')('isSealed', function ($isSealed) {\n return function isSealed(it) {\n return isObject(it) ? $isSealed ? $isSealed(it) : false : true;\n };\n});\n","// 19.1.2.11 Object.isExtensible(O)\nvar isObject = require('./_is-object');\n\nrequire('./_object-sap')('isExtensible', function ($isExtensible) {\n return function isExtensible(it) {\n return isObject(it) ? $isExtensible ? $isExtensible(it) : true : false;\n };\n});\n","// 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)\nvar toIObject = require('./_to-iobject');\nvar $getOwnPropertyDescriptor = require('./_object-gopd').f;\n\nrequire('./_object-sap')('getOwnPropertyDescriptor', function () {\n return function getOwnPropertyDescriptor(it, key) {\n return $getOwnPropertyDescriptor(toIObject(it), key);\n };\n});\n","// 19.1.2.9 Object.getPrototypeOf(O)\nvar toObject = require('./_to-object');\nvar $getPrototypeOf = require('./_object-gpo');\n\nrequire('./_object-sap')('getPrototypeOf', function () {\n return function getPrototypeOf(it) {\n return $getPrototypeOf(toObject(it));\n };\n});\n","// 19.1.2.14 Object.keys(O)\nvar toObject = require('./_to-object');\nvar $keys = require('./_object-keys');\n\nrequire('./_object-sap')('keys', function () {\n return function keys(it) {\n return $keys(toObject(it));\n };\n});\n","// 19.1.2.7 Object.getOwnPropertyNames(O)\nrequire('./_object-sap')('getOwnPropertyNames', function () {\n return require('./_object-gopn-ext').f;\n});\n","// 19.1.3.1 Object.assign(target, source)\nvar $export = require('./_export');\n\n$export($export.S + $export.F, 'Object', { assign: require('./_object-assign') });\n","// 7.2.9 SameValue(x, y)\nmodule.exports = Object.is || function is(x, y) {\n // eslint-disable-next-line no-self-compare\n return x === y ? x !== 0 || 1 / x === 1 / y : x != x && y != y;\n};\n","// 19.1.3.10 Object.is(value1, value2)\nvar $export = require('./_export');\n$export($export.S, 'Object', { is: require('./_same-value') });\n","var dP = require('./_object-dp').f;\nvar FProto = Function.prototype;\nvar nameRE = /^\\s*function ([^ (]*)/;\nvar NAME = 'name';\n\n// 19.2.4.2 name\nNAME in FProto || require('./_descriptors') && dP(FProto, NAME, {\n configurable: true,\n get: function () {\n try {\n return ('' + this).match(nameRE)[1];\n } catch (e) {\n return '';\n }\n }\n});\n","var $export = require('./_export');\nvar toIObject = require('./_to-iobject');\nvar toLength = require('./_to-length');\n\n$export($export.S, 'String', {\n // 21.1.2.4 String.raw(callSite, ...substitutions)\n raw: function raw(callSite) {\n var tpl = toIObject(callSite.raw);\n var len = toLength(tpl.length);\n var aLen = arguments.length;\n var res = [];\n var i = 0;\n while (len > i) {\n res.push(String(tpl[i++]));\n if (i < aLen) res.push(String(arguments[i]));\n } return res.join('');\n }\n});\n","var $export = require('./_export');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nvar fromCharCode = String.fromCharCode;\nvar $fromCodePoint = String.fromCodePoint;\n\n// length should be 1, old FF problem\n$export($export.S + $export.F * (!!$fromCodePoint && $fromCodePoint.length != 1), 'String', {\n // 21.1.2.2 String.fromCodePoint(...codePoints)\n fromCodePoint: function fromCodePoint(x) { // eslint-disable-line no-unused-vars\n var res = [];\n var aLen = arguments.length;\n var i = 0;\n var code;\n while (aLen > i) {\n code = +arguments[i++];\n if (toAbsoluteIndex(code, 0x10ffff) !== code) throw RangeError(code + ' is not a valid code point');\n res.push(code < 0x10000\n ? fromCharCode(code)\n : fromCharCode(((code -= 0x10000) >> 10) + 0xd800, code % 0x400 + 0xdc00)\n );\n } return res.join('');\n }\n});\n","var toInteger = require('./_to-integer');\nvar defined = require('./_defined');\n// true -> String#at\n// false -> String#codePointAt\nmodule.exports = function (TO_STRING) {\n return function (that, pos) {\n var s = String(defined(that));\n var i = toInteger(pos);\n var l = s.length;\n var a, b;\n if (i < 0 || i >= l) return TO_STRING ? '' : undefined;\n a = s.charCodeAt(i);\n return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff\n ? TO_STRING ? s.charAt(i) : a\n : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;\n };\n};\n","'use strict';\nvar $export = require('./_export');\nvar $at = require('./_string-at')(false);\n$export($export.P, 'String', {\n // 21.1.3.3 String.prototype.codePointAt(pos)\n codePointAt: function codePointAt(pos) {\n return $at(this, pos);\n }\n});\n","'use strict';\nvar toInteger = require('./_to-integer');\nvar defined = require('./_defined');\n\nmodule.exports = function repeat(count) {\n var str = String(defined(this));\n var res = '';\n var n = toInteger(count);\n if (n < 0 || n == Infinity) throw RangeError(\"Count can't be negative\");\n for (;n > 0; (n >>>= 1) && (str += str)) if (n & 1) res += str;\n return res;\n};\n","var $export = require('./_export');\n\n$export($export.P, 'String', {\n // 21.1.3.13 String.prototype.repeat(count)\n repeat: require('./_string-repeat')\n});\n","// 7.2.8 IsRegExp(argument)\nvar isObject = require('./_is-object');\nvar cof = require('./_cof');\nvar MATCH = require('./_wks')('match');\nmodule.exports = function (it) {\n var isRegExp;\n return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : cof(it) == 'RegExp');\n};\n","// helper for String#{startsWith, endsWith, includes}\nvar isRegExp = require('./_is-regexp');\nvar defined = require('./_defined');\n\nmodule.exports = function (that, searchString, NAME) {\n if (isRegExp(searchString)) throw TypeError('String#' + NAME + \" doesn't accept regex!\");\n return String(defined(that));\n};\n","var MATCH = require('./_wks')('match');\nmodule.exports = function (KEY) {\n var re = /./;\n try {\n '/./'[KEY](re);\n } catch (e) {\n try {\n re[MATCH] = false;\n return !'/./'[KEY](re);\n } catch (f) { /* empty */ }\n } return true;\n};\n","// 21.1.3.18 String.prototype.startsWith(searchString [, position ])\n'use strict';\nvar $export = require('./_export');\nvar toLength = require('./_to-length');\nvar context = require('./_string-context');\nvar STARTS_WITH = 'startsWith';\nvar $startsWith = ''[STARTS_WITH];\n\n$export($export.P + $export.F * require('./_fails-is-regexp')(STARTS_WITH), 'String', {\n startsWith: function startsWith(searchString /* , position = 0 */) {\n var that = context(this, searchString, STARTS_WITH);\n var index = toLength(Math.min(arguments.length > 1 ? arguments[1] : undefined, that.length));\n var search = String(searchString);\n return $startsWith\n ? $startsWith.call(that, search, index)\n : that.slice(index, index + search.length) === search;\n }\n});\n","// 21.1.3.6 String.prototype.endsWith(searchString [, endPosition])\n'use strict';\nvar $export = require('./_export');\nvar toLength = require('./_to-length');\nvar context = require('./_string-context');\nvar ENDS_WITH = 'endsWith';\nvar $endsWith = ''[ENDS_WITH];\n\n$export($export.P + $export.F * require('./_fails-is-regexp')(ENDS_WITH), 'String', {\n endsWith: function endsWith(searchString /* , endPosition = @length */) {\n var that = context(this, searchString, ENDS_WITH);\n var endPosition = arguments.length > 1 ? arguments[1] : undefined;\n var len = toLength(that.length);\n var end = endPosition === undefined ? len : Math.min(toLength(endPosition), len);\n var search = String(searchString);\n return $endsWith\n ? $endsWith.call(that, search, end)\n : that.slice(end - search.length, end) === search;\n }\n});\n","// 21.1.3.7 String.prototype.includes(searchString, position = 0)\n'use strict';\nvar $export = require('./_export');\nvar context = require('./_string-context');\nvar INCLUDES = 'includes';\n\n$export($export.P + $export.F * require('./_fails-is-regexp')(INCLUDES), 'String', {\n includes: function includes(searchString /* , position = 0 */) {\n return !!~context(this, searchString, INCLUDES)\n .indexOf(searchString, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","'use strict';\n// 21.2.5.3 get RegExp.prototype.flags\nvar anObject = require('./_an-object');\nmodule.exports = function () {\n var that = anObject(this);\n var result = '';\n if (that.global) result += 'g';\n if (that.ignoreCase) result += 'i';\n if (that.multiline) result += 'm';\n if (that.unicode) result += 'u';\n if (that.sticky) result += 'y';\n return result;\n};\n","// 21.2.5.3 get RegExp.prototype.flags()\nif (require('./_descriptors') && /./g.flags != 'g') require('./_object-dp').f(RegExp.prototype, 'flags', {\n configurable: true,\n get: require('./_flags')\n});\n","'use strict';\nvar hide = require('./_hide');\nvar redefine = require('./_redefine');\nvar fails = require('./_fails');\nvar defined = require('./_defined');\nvar wks = require('./_wks');\n\nmodule.exports = function (KEY, length, exec) {\n var SYMBOL = wks(KEY);\n var fns = exec(defined, SYMBOL, ''[KEY]);\n var strfn = fns[0];\n var rxfn = fns[1];\n if (fails(function () {\n var O = {};\n O[SYMBOL] = function () { return 7; };\n return ''[KEY](O) != 7;\n })) {\n redefine(String.prototype, KEY, strfn);\n hide(RegExp.prototype, SYMBOL, length == 2\n // 21.2.5.8 RegExp.prototype[@@replace](string, replaceValue)\n // 21.2.5.11 RegExp.prototype[@@split](string, limit)\n ? function (string, arg) { return rxfn.call(string, this, arg); }\n // 21.2.5.6 RegExp.prototype[@@match](string)\n // 21.2.5.9 RegExp.prototype[@@search](string)\n : function (string) { return rxfn.call(string, this); }\n );\n }\n};\n","// @@match logic\nrequire('./_fix-re-wks')('match', 1, function (defined, MATCH, $match) {\n // 21.1.3.11 String.prototype.match(regexp)\n return [function match(regexp) {\n 'use strict';\n var O = defined(this);\n var fn = regexp == undefined ? undefined : regexp[MATCH];\n return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[MATCH](String(O));\n }, $match];\n});\n","// @@replace logic\nrequire('./_fix-re-wks')('replace', 2, function (defined, REPLACE, $replace) {\n // 21.1.3.14 String.prototype.replace(searchValue, replaceValue)\n return [function replace(searchValue, replaceValue) {\n 'use strict';\n var O = defined(this);\n var fn = searchValue == undefined ? undefined : searchValue[REPLACE];\n return fn !== undefined\n ? fn.call(searchValue, O, replaceValue)\n : $replace.call(String(O), searchValue, replaceValue);\n }, $replace];\n});\n","// @@split logic\nrequire('./_fix-re-wks')('split', 2, function (defined, SPLIT, $split) {\n 'use strict';\n var isRegExp = require('./_is-regexp');\n var _split = $split;\n var $push = [].push;\n var $SPLIT = 'split';\n var LENGTH = 'length';\n var LAST_INDEX = 'lastIndex';\n if (\n 'abbc'[$SPLIT](/(b)*/)[1] == 'c' ||\n 'test'[$SPLIT](/(?:)/, -1)[LENGTH] != 4 ||\n 'ab'[$SPLIT](/(?:ab)*/)[LENGTH] != 2 ||\n '.'[$SPLIT](/(.?)(.?)/)[LENGTH] != 4 ||\n '.'[$SPLIT](/()()/)[LENGTH] > 1 ||\n ''[$SPLIT](/.?/)[LENGTH]\n ) {\n var NPCG = /()??/.exec('')[1] === undefined; // nonparticipating capturing group\n // based on es5-shim implementation, need to rework it\n $split = function (separator, limit) {\n var string = String(this);\n if (separator === undefined && limit === 0) return [];\n // If `separator` is not a regex, use native split\n if (!isRegExp(separator)) return _split.call(string, separator, limit);\n var output = [];\n var flags = (separator.ignoreCase ? 'i' : '') +\n (separator.multiline ? 'm' : '') +\n (separator.unicode ? 'u' : '') +\n (separator.sticky ? 'y' : '');\n var lastLastIndex = 0;\n var splitLimit = limit === undefined ? 4294967295 : limit >>> 0;\n // Make `global` and avoid `lastIndex` issues by working with a copy\n var separatorCopy = new RegExp(separator.source, flags + 'g');\n var separator2, match, lastIndex, lastLength, i;\n // Doesn't need flags gy, but they don't hurt\n if (!NPCG) separator2 = new RegExp('^' + separatorCopy.source + '$(?!\\\\s)', flags);\n while (match = separatorCopy.exec(string)) {\n // `separatorCopy.lastIndex` is not reliable cross-browser\n lastIndex = match.index + match[0][LENGTH];\n if (lastIndex > lastLastIndex) {\n output.push(string.slice(lastLastIndex, match.index));\n // Fix browsers whose `exec` methods don't consistently return `undefined` for NPCG\n // eslint-disable-next-line no-loop-func\n if (!NPCG && match[LENGTH] > 1) match[0].replace(separator2, function () {\n for (i = 1; i < arguments[LENGTH] - 2; i++) if (arguments[i] === undefined) match[i] = undefined;\n });\n if (match[LENGTH] > 1 && match.index < string[LENGTH]) $push.apply(output, match.slice(1));\n lastLength = match[0][LENGTH];\n lastLastIndex = lastIndex;\n if (output[LENGTH] >= splitLimit) break;\n }\n if (separatorCopy[LAST_INDEX] === match.index) separatorCopy[LAST_INDEX]++; // Avoid an infinite loop\n }\n if (lastLastIndex === string[LENGTH]) {\n if (lastLength || !separatorCopy.test('')) output.push('');\n } else output.push(string.slice(lastLastIndex));\n return output[LENGTH] > splitLimit ? output.slice(0, splitLimit) : output;\n };\n // Chakra, V8\n } else if ('0'[$SPLIT](undefined, 0)[LENGTH]) {\n $split = function (separator, limit) {\n return separator === undefined && limit === 0 ? [] : _split.call(this, separator, limit);\n };\n }\n // 21.1.3.17 String.prototype.split(separator, limit)\n return [function split(separator, limit) {\n var O = defined(this);\n var fn = separator == undefined ? undefined : separator[SPLIT];\n return fn !== undefined ? fn.call(separator, O, limit) : $split.call(String(O), separator, limit);\n }, $split];\n});\n","// @@search logic\nrequire('./_fix-re-wks')('search', 1, function (defined, SEARCH, $search) {\n // 21.1.3.15 String.prototype.search(regexp)\n return [function search(regexp) {\n 'use strict';\n var O = defined(this);\n var fn = regexp == undefined ? undefined : regexp[SEARCH];\n return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[SEARCH](String(O));\n }, $search];\n});\n","'use strict';\nvar $defineProperty = require('./_object-dp');\nvar createDesc = require('./_property-desc');\n\nmodule.exports = function (object, index, value) {\n if (index in object) $defineProperty.f(object, index, createDesc(0, value));\n else object[index] = value;\n};\n","'use strict';\nvar ctx = require('./_ctx');\nvar $export = require('./_export');\nvar toObject = require('./_to-object');\nvar call = require('./_iter-call');\nvar isArrayIter = require('./_is-array-iter');\nvar toLength = require('./_to-length');\nvar createProperty = require('./_create-property');\nvar getIterFn = require('./core.get-iterator-method');\n\n$export($export.S + $export.F * !require('./_iter-detect')(function (iter) { Array.from(iter); }), 'Array', {\n // 22.1.2.1 Array.from(arrayLike, mapfn = undefined, thisArg = undefined)\n from: function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {\n var O = toObject(arrayLike);\n var C = typeof this == 'function' ? this : Array;\n var aLen = arguments.length;\n var mapfn = aLen > 1 ? arguments[1] : undefined;\n var mapping = mapfn !== undefined;\n var index = 0;\n var iterFn = getIterFn(O);\n var length, result, step, iterator;\n if (mapping) mapfn = ctx(mapfn, aLen > 2 ? arguments[2] : undefined, 2);\n // if object isn't iterable or it's array with default iterator - use simple case\n if (iterFn != undefined && !(C == Array && isArrayIter(iterFn))) {\n for (iterator = iterFn.call(O), result = new C(); !(step = iterator.next()).done; index++) {\n createProperty(result, index, mapping ? call(iterator, mapfn, [step.value, index], true) : step.value);\n }\n } else {\n length = toLength(O.length);\n for (result = new C(length); length > index; index++) {\n createProperty(result, index, mapping ? mapfn(O[index], index) : O[index]);\n }\n }\n result.length = index;\n return result;\n }\n});\n","'use strict';\nvar $export = require('./_export');\nvar createProperty = require('./_create-property');\n\n// WebKit Array.of isn't generic\n$export($export.S + $export.F * require('./_fails')(function () {\n function F() { /* empty */ }\n return !(Array.of.call(F) instanceof F);\n}), 'Array', {\n // 22.1.2.3 Array.of( ...items)\n of: function of(/* ...args */) {\n var index = 0;\n var aLen = arguments.length;\n var result = new (typeof this == 'function' ? this : Array)(aLen);\n while (aLen > index) createProperty(result, index, arguments[index++]);\n result.length = aLen;\n return result;\n }\n});\n","// 22.1.3.3 Array.prototype.copyWithin(target, start, end = this.length)\nvar $export = require('./_export');\n\n$export($export.P, 'Array', { copyWithin: require('./_array-copy-within') });\n\nrequire('./_add-to-unscopables')('copyWithin');\n","'use strict';\n// 22.1.3.8 Array.prototype.find(predicate, thisArg = undefined)\nvar $export = require('./_export');\nvar $find = require('./_array-methods')(5);\nvar KEY = 'find';\nvar forced = true;\n// Shouldn't skip holes\nif (KEY in []) Array(1)[KEY](function () { forced = false; });\n$export($export.P + $export.F * forced, 'Array', {\n find: function find(callbackfn /* , that = undefined */) {\n return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\nrequire('./_add-to-unscopables')(KEY);\n","'use strict';\n// 22.1.3.9 Array.prototype.findIndex(predicate, thisArg = undefined)\nvar $export = require('./_export');\nvar $find = require('./_array-methods')(6);\nvar KEY = 'findIndex';\nvar forced = true;\n// Shouldn't skip holes\nif (KEY in []) Array(1)[KEY](function () { forced = false; });\n$export($export.P + $export.F * forced, 'Array', {\n findIndex: function findIndex(callbackfn /* , that = undefined */) {\n return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\nrequire('./_add-to-unscopables')(KEY);\n","// 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length)\nvar $export = require('./_export');\n\n$export($export.P, 'Array', { fill: require('./_array-fill') });\n\nrequire('./_add-to-unscopables')('fill');\n","// 20.1.2.2 Number.isFinite(number)\nvar $export = require('./_export');\nvar _isFinite = require('./_global').isFinite;\n\n$export($export.S, 'Number', {\n isFinite: function isFinite(it) {\n return typeof it == 'number' && _isFinite(it);\n }\n});\n","// 20.1.2.3 Number.isInteger(number)\nvar isObject = require('./_is-object');\nvar floor = Math.floor;\nmodule.exports = function isInteger(it) {\n return !isObject(it) && isFinite(it) && floor(it) === it;\n};\n","// 20.1.2.3 Number.isInteger(number)\nvar $export = require('./_export');\n\n$export($export.S, 'Number', { isInteger: require('./_is-integer') });\n","// 20.1.2.5 Number.isSafeInteger(number)\nvar $export = require('./_export');\nvar isInteger = require('./_is-integer');\nvar abs = Math.abs;\n\n$export($export.S, 'Number', {\n isSafeInteger: function isSafeInteger(number) {\n return isInteger(number) && abs(number) <= 0x1fffffffffffff;\n }\n});\n","// 20.1.2.4 Number.isNaN(number)\nvar $export = require('./_export');\n\n$export($export.S, 'Number', {\n isNaN: function isNaN(number) {\n // eslint-disable-next-line no-self-compare\n return number != number;\n }\n});\n","// 20.1.2.1 Number.EPSILON\nvar $export = require('./_export');\n\n$export($export.S, 'Number', { EPSILON: Math.pow(2, -52) });\n","// 20.1.2.10 Number.MIN_SAFE_INTEGER\nvar $export = require('./_export');\n\n$export($export.S, 'Number', { MIN_SAFE_INTEGER: -0x1fffffffffffff });\n","// 20.1.2.6 Number.MAX_SAFE_INTEGER\nvar $export = require('./_export');\n\n$export($export.S, 'Number', { MAX_SAFE_INTEGER: 0x1fffffffffffff });\n","// 20.2.2.20 Math.log1p(x)\nmodule.exports = Math.log1p || function log1p(x) {\n return (x = +x) > -1e-8 && x < 1e-8 ? x - x * x / 2 : Math.log(1 + x);\n};\n","// 20.2.2.3 Math.acosh(x)\nvar $export = require('./_export');\nvar log1p = require('./_math-log1p');\nvar sqrt = Math.sqrt;\nvar $acosh = Math.acosh;\n\n$export($export.S + $export.F * !($acosh\n // V8 bug: https://code.google.com/p/v8/issues/detail?id=3509\n && Math.floor($acosh(Number.MAX_VALUE)) == 710\n // Tor Browser bug: Math.acosh(Infinity) -> NaN\n && $acosh(Infinity) == Infinity\n), 'Math', {\n acosh: function acosh(x) {\n return (x = +x) < 1 ? NaN : x > 94906265.62425156\n ? Math.log(x) + Math.LN2\n : log1p(x - 1 + sqrt(x - 1) * sqrt(x + 1));\n }\n});\n","// 20.2.2.5 Math.asinh(x)\nvar $export = require('./_export');\nvar $asinh = Math.asinh;\n\nfunction asinh(x) {\n return !isFinite(x = +x) || x == 0 ? x : x < 0 ? -asinh(-x) : Math.log(x + Math.sqrt(x * x + 1));\n}\n\n// Tor Browser bug: Math.asinh(0) -> -0\n$export($export.S + $export.F * !($asinh && 1 / $asinh(0) > 0), 'Math', { asinh: asinh });\n","// 20.2.2.7 Math.atanh(x)\nvar $export = require('./_export');\nvar $atanh = Math.atanh;\n\n// Tor Browser bug: Math.atanh(-0) -> 0\n$export($export.S + $export.F * !($atanh && 1 / $atanh(-0) < 0), 'Math', {\n atanh: function atanh(x) {\n return (x = +x) == 0 ? x : Math.log((1 + x) / (1 - x)) / 2;\n }\n});\n","// 20.2.2.28 Math.sign(x)\nmodule.exports = Math.sign || function sign(x) {\n // eslint-disable-next-line no-self-compare\n return (x = +x) == 0 || x != x ? x : x < 0 ? -1 : 1;\n};\n","// 20.2.2.9 Math.cbrt(x)\nvar $export = require('./_export');\nvar sign = require('./_math-sign');\n\n$export($export.S, 'Math', {\n cbrt: function cbrt(x) {\n return sign(x = +x) * Math.pow(Math.abs(x), 1 / 3);\n }\n});\n","// 20.2.2.11 Math.clz32(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n clz32: function clz32(x) {\n return (x >>>= 0) ? 31 - Math.floor(Math.log(x + 0.5) * Math.LOG2E) : 32;\n }\n});\n","// 20.2.2.12 Math.cosh(x)\nvar $export = require('./_export');\nvar exp = Math.exp;\n\n$export($export.S, 'Math', {\n cosh: function cosh(x) {\n return (exp(x = +x) + exp(-x)) / 2;\n }\n});\n","// 20.2.2.14 Math.expm1(x)\nvar $expm1 = Math.expm1;\nmodule.exports = (!$expm1\n // Old FF bug\n || $expm1(10) > 22025.465794806719 || $expm1(10) < 22025.4657948067165168\n // Tor Browser bug\n || $expm1(-2e-17) != -2e-17\n) ? function expm1(x) {\n return (x = +x) == 0 ? x : x > -1e-6 && x < 1e-6 ? x + x * x / 2 : Math.exp(x) - 1;\n} : $expm1;\n","// 20.2.2.14 Math.expm1(x)\nvar $export = require('./_export');\nvar $expm1 = require('./_math-expm1');\n\n$export($export.S + $export.F * ($expm1 != Math.expm1), 'Math', { expm1: $expm1 });\n","// 20.2.2.16 Math.fround(x)\nvar sign = require('./_math-sign');\nvar pow = Math.pow;\nvar EPSILON = pow(2, -52);\nvar EPSILON32 = pow(2, -23);\nvar MAX32 = pow(2, 127) * (2 - EPSILON32);\nvar MIN32 = pow(2, -126);\n\nvar roundTiesToEven = function (n) {\n return n + 1 / EPSILON - 1 / EPSILON;\n};\n\nmodule.exports = Math.fround || function fround(x) {\n var $abs = Math.abs(x);\n var $sign = sign(x);\n var a, result;\n if ($abs < MIN32) return $sign * roundTiesToEven($abs / MIN32 / EPSILON32) * MIN32 * EPSILON32;\n a = (1 + EPSILON32 / EPSILON) * $abs;\n result = a - (a - $abs);\n // eslint-disable-next-line no-self-compare\n if (result > MAX32 || result != result) return $sign * Infinity;\n return $sign * result;\n};\n","// 20.2.2.16 Math.fround(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', { fround: require('./_math-fround') });\n","// 20.2.2.17 Math.hypot([value1[, value2[, … ]]])\nvar $export = require('./_export');\nvar abs = Math.abs;\n\n$export($export.S, 'Math', {\n hypot: function hypot(value1, value2) { // eslint-disable-line no-unused-vars\n var sum = 0;\n var i = 0;\n var aLen = arguments.length;\n var larg = 0;\n var arg, div;\n while (i < aLen) {\n arg = abs(arguments[i++]);\n if (larg < arg) {\n div = larg / arg;\n sum = sum * div * div + 1;\n larg = arg;\n } else if (arg > 0) {\n div = arg / larg;\n sum += div * div;\n } else sum += arg;\n }\n return larg === Infinity ? Infinity : larg * Math.sqrt(sum);\n }\n});\n","// 20.2.2.18 Math.imul(x, y)\nvar $export = require('./_export');\nvar $imul = Math.imul;\n\n// some WebKit versions fails with big numbers, some has wrong arity\n$export($export.S + $export.F * require('./_fails')(function () {\n return $imul(0xffffffff, 5) != -5 || $imul.length != 2;\n}), 'Math', {\n imul: function imul(x, y) {\n var UINT16 = 0xffff;\n var xn = +x;\n var yn = +y;\n var xl = UINT16 & xn;\n var yl = UINT16 & yn;\n return 0 | xl * yl + ((UINT16 & xn >>> 16) * yl + xl * (UINT16 & yn >>> 16) << 16 >>> 0);\n }\n});\n","// 20.2.2.20 Math.log1p(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', { log1p: require('./_math-log1p') });\n","// 20.2.2.21 Math.log10(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n log10: function log10(x) {\n return Math.log(x) * Math.LOG10E;\n }\n});\n","// 20.2.2.22 Math.log2(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n log2: function log2(x) {\n return Math.log(x) / Math.LN2;\n }\n});\n","// 20.2.2.28 Math.sign(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', { sign: require('./_math-sign') });\n","// 20.2.2.30 Math.sinh(x)\nvar $export = require('./_export');\nvar expm1 = require('./_math-expm1');\nvar exp = Math.exp;\n\n// V8 near Chromium 38 has a problem with very small numbers\n$export($export.S + $export.F * require('./_fails')(function () {\n return !Math.sinh(-2e-17) != -2e-17;\n}), 'Math', {\n sinh: function sinh(x) {\n return Math.abs(x = +x) < 1\n ? (expm1(x) - expm1(-x)) / 2\n : (exp(x - 1) - exp(-x - 1)) * (Math.E / 2);\n }\n});\n","// 20.2.2.33 Math.tanh(x)\nvar $export = require('./_export');\nvar expm1 = require('./_math-expm1');\nvar exp = Math.exp;\n\n$export($export.S, 'Math', {\n tanh: function tanh(x) {\n var a = expm1(x = +x);\n var b = expm1(-x);\n return a == Infinity ? 1 : b == Infinity ? -1 : (a - b) / (exp(x) + exp(-x));\n }\n});\n","// 20.2.2.34 Math.trunc(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n trunc: function trunc(it) {\n return (it > 0 ? Math.floor : Math.ceil)(it);\n }\n});\n","'use strict';\n// https://github.com/tc39/Array.prototype.includes\nvar $export = require('./_export');\nvar $includes = require('./_array-includes')(true);\n\n$export($export.P, 'Array', {\n includes: function includes(el /* , fromIndex = 0 */) {\n return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\nrequire('./_add-to-unscopables')('includes');\n","var getKeys = require('./_object-keys');\nvar toIObject = require('./_to-iobject');\nvar isEnum = require('./_object-pie').f;\nmodule.exports = function (isEntries) {\n return function (it) {\n var O = toIObject(it);\n var keys = getKeys(O);\n var length = keys.length;\n var i = 0;\n var result = [];\n var key;\n while (length > i) if (isEnum.call(O, key = keys[i++])) {\n result.push(isEntries ? [key, O[key]] : O[key]);\n } return result;\n };\n};\n","// https://github.com/tc39/proposal-object-values-entries\nvar $export = require('./_export');\nvar $values = require('./_object-to-array')(false);\n\n$export($export.S, 'Object', {\n values: function values(it) {\n return $values(it);\n }\n});\n","// https://github.com/tc39/proposal-object-values-entries\nvar $export = require('./_export');\nvar $entries = require('./_object-to-array')(true);\n\n$export($export.S, 'Object', {\n entries: function entries(it) {\n return $entries(it);\n }\n});\n","// https://github.com/tc39/proposal-object-getownpropertydescriptors\nvar $export = require('./_export');\nvar ownKeys = require('./_own-keys');\nvar toIObject = require('./_to-iobject');\nvar gOPD = require('./_object-gopd');\nvar createProperty = require('./_create-property');\n\n$export($export.S, 'Object', {\n getOwnPropertyDescriptors: function getOwnPropertyDescriptors(object) {\n var O = toIObject(object);\n var getDesc = gOPD.f;\n var keys = ownKeys(O);\n var result = {};\n var i = 0;\n var key, desc;\n while (keys.length > i) {\n desc = getDesc(O, key = keys[i++]);\n if (desc !== undefined) createProperty(result, key, desc);\n }\n return result;\n }\n});\n","// https://github.com/tc39/proposal-string-pad-start-end\nvar toLength = require('./_to-length');\nvar repeat = require('./_string-repeat');\nvar defined = require('./_defined');\n\nmodule.exports = function (that, maxLength, fillString, left) {\n var S = String(defined(that));\n var stringLength = S.length;\n var fillStr = fillString === undefined ? ' ' : String(fillString);\n var intMaxLength = toLength(maxLength);\n if (intMaxLength <= stringLength || fillStr == '') return S;\n var fillLen = intMaxLength - stringLength;\n var stringFiller = repeat.call(fillStr, Math.ceil(fillLen / fillStr.length));\n if (stringFiller.length > fillLen) stringFiller = stringFiller.slice(0, fillLen);\n return left ? stringFiller + S : S + stringFiller;\n};\n","var global = require('./_global');\nvar navigator = global.navigator;\n\nmodule.exports = navigator && navigator.userAgent || '';\n","'use strict';\n// https://github.com/tc39/proposal-string-pad-start-end\nvar $export = require('./_export');\nvar $pad = require('./_string-pad');\nvar userAgent = require('./_user-agent');\n\n// https://github.com/zloirock/core-js/issues/280\n$export($export.P + $export.F * /Version\\/10\\.\\d+(\\.\\d+)? Safari\\//.test(userAgent), 'String', {\n padStart: function padStart(maxLength /* , fillString = ' ' */) {\n return $pad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, true);\n }\n});\n","'use strict';\n// https://github.com/tc39/proposal-string-pad-start-end\nvar $export = require('./_export');\nvar $pad = require('./_string-pad');\nvar userAgent = require('./_user-agent');\n\n// https://github.com/zloirock/core-js/issues/280\n$export($export.P + $export.F * /Version\\/10\\.\\d+(\\.\\d+)? Safari\\//.test(userAgent), 'String', {\n padEnd: function padEnd(maxLength /* , fillString = ' ' */) {\n return $pad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, false);\n }\n});\n","// ie9- setTimeout & setInterval additional parameters fix\nvar global = require('./_global');\nvar $export = require('./_export');\nvar userAgent = require('./_user-agent');\nvar slice = [].slice;\nvar MSIE = /MSIE .\\./.test(userAgent); // <- dirty ie9- check\nvar wrap = function (set) {\n return function (fn, time /* , ...args */) {\n var boundArgs = arguments.length > 2;\n var args = boundArgs ? slice.call(arguments, 2) : false;\n return set(boundArgs ? function () {\n // eslint-disable-next-line no-new-func\n (typeof fn == 'function' ? fn : Function(fn)).apply(this, args);\n } : fn, time);\n };\n};\n$export($export.G + $export.B + $export.F * MSIE, {\n setTimeout: wrap(global.setTimeout),\n setInterval: wrap(global.setInterval)\n});\n","var $export = require('./_export');\nvar $task = require('./_task');\n$export($export.G + $export.B, {\n setImmediate: $task.set,\n clearImmediate: $task.clear\n});\n","var $iterators = require('./es6.array.iterator');\nvar getKeys = require('./_object-keys');\nvar redefine = require('./_redefine');\nvar global = require('./_global');\nvar hide = require('./_hide');\nvar Iterators = require('./_iterators');\nvar wks = require('./_wks');\nvar ITERATOR = wks('iterator');\nvar TO_STRING_TAG = wks('toStringTag');\nvar ArrayValues = Iterators.Array;\n\nvar DOMIterables = {\n CSSRuleList: true, // TODO: Not spec compliant, should be false.\n CSSStyleDeclaration: false,\n CSSValueList: false,\n ClientRectList: false,\n DOMRectList: false,\n DOMStringList: false,\n DOMTokenList: true,\n DataTransferItemList: false,\n FileList: false,\n HTMLAllCollection: false,\n HTMLCollection: false,\n HTMLFormElement: false,\n HTMLSelectElement: false,\n MediaList: true, // TODO: Not spec compliant, should be false.\n MimeTypeArray: false,\n NamedNodeMap: false,\n NodeList: true,\n PaintRequestList: false,\n Plugin: false,\n PluginArray: false,\n SVGLengthList: false,\n SVGNumberList: false,\n SVGPathSegList: false,\n SVGPointList: false,\n SVGStringList: false,\n SVGTransformList: false,\n SourceBufferList: false,\n StyleSheetList: true, // TODO: Not spec compliant, should be false.\n TextTrackCueList: false,\n TextTrackList: false,\n TouchList: false\n};\n\nfor (var collections = getKeys(DOMIterables), i = 0; i < collections.length; i++) {\n var NAME = collections[i];\n var explicit = DOMIterables[NAME];\n var Collection = global[NAME];\n var proto = Collection && Collection.prototype;\n var key;\n if (proto) {\n if (!proto[ITERATOR]) hide(proto, ITERATOR, ArrayValues);\n if (!proto[TO_STRING_TAG]) hide(proto, TO_STRING_TAG, NAME);\n Iterators[NAME] = ArrayValues;\n if (explicit) for (key in $iterators) if (!proto[key]) redefine(proto, key, $iterators[key], true);\n }\n}\n","/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * https://raw.github.com/facebook/regenerator/master/LICENSE file. An\n * additional grant of patent rights can be found in the PATENTS file in\n * the same directory.\n */\n\n!(function(global) {\n \"use strict\";\n\n var Op = Object.prototype;\n var hasOwn = Op.hasOwnProperty;\n var undefined; // More compressible than void 0.\n var $Symbol = typeof Symbol === \"function\" ? Symbol : {};\n var iteratorSymbol = $Symbol.iterator || \"@@iterator\";\n var asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\";\n var toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n\n var inModule = typeof module === \"object\";\n var runtime = global.regeneratorRuntime;\n if (runtime) {\n if (inModule) {\n // If regeneratorRuntime is defined globally and we're in a module,\n // make the exports object identical to regeneratorRuntime.\n module.exports = runtime;\n }\n // Don't bother evaluating the rest of this file if the runtime was\n // already defined globally.\n return;\n }\n\n // Define the runtime globally (as expected by generated code) as either\n // module.exports (if we're in a module) or a new, empty object.\n runtime = global.regeneratorRuntime = inModule ? module.exports : {};\n\n function wrap(innerFn, outerFn, self, tryLocsList) {\n // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.\n var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;\n var generator = Object.create(protoGenerator.prototype);\n var context = new Context(tryLocsList || []);\n\n // The ._invoke method unifies the implementations of the .next,\n // .throw, and .return methods.\n generator._invoke = makeInvokeMethod(innerFn, self, context);\n\n return generator;\n }\n runtime.wrap = wrap;\n\n // Try/catch helper to minimize deoptimizations. Returns a completion\n // record like context.tryEntries[i].completion. This interface could\n // have been (and was previously) designed to take a closure to be\n // invoked without arguments, but in all the cases we care about we\n // already have an existing method we want to call, so there's no need\n // to create a new function object. We can even get away with assuming\n // the method takes exactly one argument, since that happens to be true\n // in every case, so we don't have to touch the arguments object. The\n // only additional allocation required is the completion record, which\n // has a stable shape and so hopefully should be cheap to allocate.\n function tryCatch(fn, obj, arg) {\n try {\n return { type: \"normal\", arg: fn.call(obj, arg) };\n } catch (err) {\n return { type: \"throw\", arg: err };\n }\n }\n\n var GenStateSuspendedStart = \"suspendedStart\";\n var GenStateSuspendedYield = \"suspendedYield\";\n var GenStateExecuting = \"executing\";\n var GenStateCompleted = \"completed\";\n\n // Returning this object from the innerFn has the same effect as\n // breaking out of the dispatch switch statement.\n var ContinueSentinel = {};\n\n // Dummy constructor functions that we use as the .constructor and\n // .constructor.prototype properties for functions that return Generator\n // objects. For full spec compliance, you may wish to configure your\n // minifier not to mangle the names of these two functions.\n function Generator() {}\n function GeneratorFunction() {}\n function GeneratorFunctionPrototype() {}\n\n // This is a polyfill for %IteratorPrototype% for environments that\n // don't natively support it.\n var IteratorPrototype = {};\n IteratorPrototype[iteratorSymbol] = function () {\n return this;\n };\n\n var getProto = Object.getPrototypeOf;\n var NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n if (NativeIteratorPrototype &&\n NativeIteratorPrototype !== Op &&\n hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {\n // This environment has a native %IteratorPrototype%; use it instead\n // of the polyfill.\n IteratorPrototype = NativeIteratorPrototype;\n }\n\n var Gp = GeneratorFunctionPrototype.prototype =\n Generator.prototype = Object.create(IteratorPrototype);\n GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;\n GeneratorFunctionPrototype.constructor = GeneratorFunction;\n GeneratorFunctionPrototype[toStringTagSymbol] =\n GeneratorFunction.displayName = \"GeneratorFunction\";\n\n // Helper for defining the .next, .throw, and .return methods of the\n // Iterator interface in terms of a single ._invoke method.\n function defineIteratorMethods(prototype) {\n [\"next\", \"throw\", \"return\"].forEach(function(method) {\n prototype[method] = function(arg) {\n return this._invoke(method, arg);\n };\n });\n }\n\n runtime.isGeneratorFunction = function(genFun) {\n var ctor = typeof genFun === \"function\" && genFun.constructor;\n return ctor\n ? ctor === GeneratorFunction ||\n // For the native GeneratorFunction constructor, the best we can\n // do is to check its .name property.\n (ctor.displayName || ctor.name) === \"GeneratorFunction\"\n : false;\n };\n\n runtime.mark = function(genFun) {\n if (Object.setPrototypeOf) {\n Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);\n } else {\n genFun.__proto__ = GeneratorFunctionPrototype;\n if (!(toStringTagSymbol in genFun)) {\n genFun[toStringTagSymbol] = \"GeneratorFunction\";\n }\n }\n genFun.prototype = Object.create(Gp);\n return genFun;\n };\n\n // Within the body of any async function, `await x` is transformed to\n // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n // `hasOwn.call(value, \"__await\")` to determine if the yielded value is\n // meant to be awaited.\n runtime.awrap = function(arg) {\n return { __await: arg };\n };\n\n function AsyncIterator(generator) {\n function invoke(method, arg, resolve, reject) {\n var record = tryCatch(generator[method], generator, arg);\n if (record.type === \"throw\") {\n reject(record.arg);\n } else {\n var result = record.arg;\n var value = result.value;\n if (value &&\n typeof value === \"object\" &&\n hasOwn.call(value, \"__await\")) {\n return Promise.resolve(value.__await).then(function(value) {\n invoke(\"next\", value, resolve, reject);\n }, function(err) {\n invoke(\"throw\", err, resolve, reject);\n });\n }\n\n return Promise.resolve(value).then(function(unwrapped) {\n // When a yielded Promise is resolved, its final value becomes\n // the .value of the Promise<{value,done}> result for the\n // current iteration. If the Promise is rejected, however, the\n // result for this iteration will be rejected with the same\n // reason. Note that rejections of yielded Promises are not\n // thrown back into the generator function, as is the case\n // when an awaited Promise is rejected. This difference in\n // behavior between yield and await is important, because it\n // allows the consumer to decide what to do with the yielded\n // rejection (swallow it and continue, manually .throw it back\n // into the generator, abandon iteration, whatever). With\n // await, by contrast, there is no opportunity to examine the\n // rejection reason outside the generator function, so the\n // only option is to throw it from the await expression, and\n // let the generator function handle the exception.\n result.value = unwrapped;\n resolve(result);\n }, reject);\n }\n }\n\n if (typeof global.process === \"object\" && global.process.domain) {\n invoke = global.process.domain.bind(invoke);\n }\n\n var previousPromise;\n\n function enqueue(method, arg) {\n function callInvokeWithMethodAndArg() {\n return new Promise(function(resolve, reject) {\n invoke(method, arg, resolve, reject);\n });\n }\n\n return previousPromise =\n // If enqueue has been called before, then we want to wait until\n // all previous Promises have been resolved before calling invoke,\n // so that results are always delivered in the correct order. If\n // enqueue has not been called before, then it is important to\n // call invoke immediately, without waiting on a callback to fire,\n // so that the async generator function has the opportunity to do\n // any necessary setup in a predictable way. This predictability\n // is why the Promise constructor synchronously invokes its\n // executor callback, and why async functions synchronously\n // execute code before the first await. Since we implement simple\n // async functions in terms of async generators, it is especially\n // important to get this right, even though it requires care.\n previousPromise ? previousPromise.then(\n callInvokeWithMethodAndArg,\n // Avoid propagating failures to Promises returned by later\n // invocations of the iterator.\n callInvokeWithMethodAndArg\n ) : callInvokeWithMethodAndArg();\n }\n\n // Define the unified helper method that is used to implement .next,\n // .throw, and .return (see defineIteratorMethods).\n this._invoke = enqueue;\n }\n\n defineIteratorMethods(AsyncIterator.prototype);\n AsyncIterator.prototype[asyncIteratorSymbol] = function () {\n return this;\n };\n runtime.AsyncIterator = AsyncIterator;\n\n // Note that simple async functions are implemented on top of\n // AsyncIterator objects; they just return a Promise for the value of\n // the final result produced by the iterator.\n runtime.async = function(innerFn, outerFn, self, tryLocsList) {\n var iter = new AsyncIterator(\n wrap(innerFn, outerFn, self, tryLocsList)\n );\n\n return runtime.isGeneratorFunction(outerFn)\n ? iter // If outerFn is a generator, return the full iterator.\n : iter.next().then(function(result) {\n return result.done ? result.value : iter.next();\n });\n };\n\n function makeInvokeMethod(innerFn, self, context) {\n var state = GenStateSuspendedStart;\n\n return function invoke(method, arg) {\n if (state === GenStateExecuting) {\n throw new Error(\"Generator is already running\");\n }\n\n if (state === GenStateCompleted) {\n if (method === \"throw\") {\n throw arg;\n }\n\n // Be forgiving, per 25.3.3.3.3 of the spec:\n // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n return doneResult();\n }\n\n context.method = method;\n context.arg = arg;\n\n while (true) {\n var delegate = context.delegate;\n if (delegate) {\n var delegateResult = maybeInvokeDelegate(delegate, context);\n if (delegateResult) {\n if (delegateResult === ContinueSentinel) continue;\n return delegateResult;\n }\n }\n\n if (context.method === \"next\") {\n // Setting context._sent for legacy support of Babel's\n // function.sent implementation.\n context.sent = context._sent = context.arg;\n\n } else if (context.method === \"throw\") {\n if (state === GenStateSuspendedStart) {\n state = GenStateCompleted;\n throw context.arg;\n }\n\n context.dispatchException(context.arg);\n\n } else if (context.method === \"return\") {\n context.abrupt(\"return\", context.arg);\n }\n\n state = GenStateExecuting;\n\n var record = tryCatch(innerFn, self, context);\n if (record.type === \"normal\") {\n // If an exception is thrown from innerFn, we leave state ===\n // GenStateExecuting and loop back for another invocation.\n state = context.done\n ? GenStateCompleted\n : GenStateSuspendedYield;\n\n if (record.arg === ContinueSentinel) {\n continue;\n }\n\n return {\n value: record.arg,\n done: context.done\n };\n\n } else if (record.type === \"throw\") {\n state = GenStateCompleted;\n // Dispatch the exception by looping back around to the\n // context.dispatchException(context.arg) call above.\n context.method = \"throw\";\n context.arg = record.arg;\n }\n }\n };\n }\n\n // Call delegate.iterator[context.method](context.arg) and handle the\n // result, either by returning a { value, done } result from the\n // delegate iterator, or by modifying context.method and context.arg,\n // setting context.delegate to null, and returning the ContinueSentinel.\n function maybeInvokeDelegate(delegate, context) {\n var method = delegate.iterator[context.method];\n if (method === undefined) {\n // A .throw or .return when the delegate iterator has no .throw\n // method always terminates the yield* loop.\n context.delegate = null;\n\n if (context.method === \"throw\") {\n if (delegate.iterator.return) {\n // If the delegate iterator has a return method, give it a\n // chance to clean up.\n context.method = \"return\";\n context.arg = undefined;\n maybeInvokeDelegate(delegate, context);\n\n if (context.method === \"throw\") {\n // If maybeInvokeDelegate(context) changed context.method from\n // \"return\" to \"throw\", let that override the TypeError below.\n return ContinueSentinel;\n }\n }\n\n context.method = \"throw\";\n context.arg = new TypeError(\n \"The iterator does not provide a 'throw' method\");\n }\n\n return ContinueSentinel;\n }\n\n var record = tryCatch(method, delegate.iterator, context.arg);\n\n if (record.type === \"throw\") {\n context.method = \"throw\";\n context.arg = record.arg;\n context.delegate = null;\n return ContinueSentinel;\n }\n\n var info = record.arg;\n\n if (! info) {\n context.method = \"throw\";\n context.arg = new TypeError(\"iterator result is not an object\");\n context.delegate = null;\n return ContinueSentinel;\n }\n\n if (info.done) {\n // Assign the result of the finished delegate to the temporary\n // variable specified by delegate.resultName (see delegateYield).\n context[delegate.resultName] = info.value;\n\n // Resume execution at the desired location (see delegateYield).\n context.next = delegate.nextLoc;\n\n // If context.method was \"throw\" but the delegate handled the\n // exception, let the outer generator proceed normally. If\n // context.method was \"next\", forget context.arg since it has been\n // \"consumed\" by the delegate iterator. If context.method was\n // \"return\", allow the original .return call to continue in the\n // outer generator.\n if (context.method !== \"return\") {\n context.method = \"next\";\n context.arg = undefined;\n }\n\n } else {\n // Re-yield the result returned by the delegate method.\n return info;\n }\n\n // The delegate iterator is finished, so forget it and continue with\n // the outer generator.\n context.delegate = null;\n return ContinueSentinel;\n }\n\n // Define Generator.prototype.{next,throw,return} in terms of the\n // unified ._invoke helper method.\n defineIteratorMethods(Gp);\n\n Gp[toStringTagSymbol] = \"Generator\";\n\n // A Generator should always return itself as the iterator object when the\n // @@iterator function is called on it. Some browsers' implementations of the\n // iterator prototype chain incorrectly implement this, causing the Generator\n // object to not be returned from this call. This ensures that doesn't happen.\n // See https://github.com/facebook/regenerator/issues/274 for more details.\n Gp[iteratorSymbol] = function() {\n return this;\n };\n\n Gp.toString = function() {\n return \"[object Generator]\";\n };\n\n function pushTryEntry(locs) {\n var entry = { tryLoc: locs[0] };\n\n if (1 in locs) {\n entry.catchLoc = locs[1];\n }\n\n if (2 in locs) {\n entry.finallyLoc = locs[2];\n entry.afterLoc = locs[3];\n }\n\n this.tryEntries.push(entry);\n }\n\n function resetTryEntry(entry) {\n var record = entry.completion || {};\n record.type = \"normal\";\n delete record.arg;\n entry.completion = record;\n }\n\n function Context(tryLocsList) {\n // The root entry object (effectively a try statement without a catch\n // or a finally block) gives us a place to store values thrown from\n // locations where there is no enclosing try statement.\n this.tryEntries = [{ tryLoc: \"root\" }];\n tryLocsList.forEach(pushTryEntry, this);\n this.reset(true);\n }\n\n runtime.keys = function(object) {\n var keys = [];\n for (var key in object) {\n keys.push(key);\n }\n keys.reverse();\n\n // Rather than returning an object with a next method, we keep\n // things simple and return the next function itself.\n return function next() {\n while (keys.length) {\n var key = keys.pop();\n if (key in object) {\n next.value = key;\n next.done = false;\n return next;\n }\n }\n\n // To avoid creating an additional object, we just hang the .value\n // and .done properties off the next function object itself. This\n // also ensures that the minifier will not anonymize the function.\n next.done = true;\n return next;\n };\n };\n\n function values(iterable) {\n if (iterable) {\n var iteratorMethod = iterable[iteratorSymbol];\n if (iteratorMethod) {\n return iteratorMethod.call(iterable);\n }\n\n if (typeof iterable.next === \"function\") {\n return iterable;\n }\n\n if (!isNaN(iterable.length)) {\n var i = -1, next = function next() {\n while (++i < iterable.length) {\n if (hasOwn.call(iterable, i)) {\n next.value = iterable[i];\n next.done = false;\n return next;\n }\n }\n\n next.value = undefined;\n next.done = true;\n\n return next;\n };\n\n return next.next = next;\n }\n }\n\n // Return an iterator with no values.\n return { next: doneResult };\n }\n runtime.values = values;\n\n function doneResult() {\n return { value: undefined, done: true };\n }\n\n Context.prototype = {\n constructor: Context,\n\n reset: function(skipTempReset) {\n this.prev = 0;\n this.next = 0;\n // Resetting context._sent for legacy support of Babel's\n // function.sent implementation.\n this.sent = this._sent = undefined;\n this.done = false;\n this.delegate = null;\n\n this.method = \"next\";\n this.arg = undefined;\n\n this.tryEntries.forEach(resetTryEntry);\n\n if (!skipTempReset) {\n for (var name in this) {\n // Not sure about the optimal order of these conditions:\n if (name.charAt(0) === \"t\" &&\n hasOwn.call(this, name) &&\n !isNaN(+name.slice(1))) {\n this[name] = undefined;\n }\n }\n }\n },\n\n stop: function() {\n this.done = true;\n\n var rootEntry = this.tryEntries[0];\n var rootRecord = rootEntry.completion;\n if (rootRecord.type === \"throw\") {\n throw rootRecord.arg;\n }\n\n return this.rval;\n },\n\n dispatchException: function(exception) {\n if (this.done) {\n throw exception;\n }\n\n var context = this;\n function handle(loc, caught) {\n record.type = \"throw\";\n record.arg = exception;\n context.next = loc;\n\n if (caught) {\n // If the dispatched exception was caught by a catch block,\n // then let that catch block handle the exception normally.\n context.method = \"next\";\n context.arg = undefined;\n }\n\n return !! caught;\n }\n\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n var record = entry.completion;\n\n if (entry.tryLoc === \"root\") {\n // Exception thrown outside of any try block that could handle\n // it, so set the completion value of the entire function to\n // throw the exception.\n return handle(\"end\");\n }\n\n if (entry.tryLoc <= this.prev) {\n var hasCatch = hasOwn.call(entry, \"catchLoc\");\n var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n if (hasCatch && hasFinally) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n } else if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else if (hasCatch) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n }\n\n } else if (hasFinally) {\n if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else {\n throw new Error(\"try statement without catch or finally\");\n }\n }\n }\n },\n\n abrupt: function(type, arg) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc <= this.prev &&\n hasOwn.call(entry, \"finallyLoc\") &&\n this.prev < entry.finallyLoc) {\n var finallyEntry = entry;\n break;\n }\n }\n\n if (finallyEntry &&\n (type === \"break\" ||\n type === \"continue\") &&\n finallyEntry.tryLoc <= arg &&\n arg <= finallyEntry.finallyLoc) {\n // Ignore the finally entry if control is not jumping to a\n // location outside the try/catch block.\n finallyEntry = null;\n }\n\n var record = finallyEntry ? finallyEntry.completion : {};\n record.type = type;\n record.arg = arg;\n\n if (finallyEntry) {\n this.method = \"next\";\n this.next = finallyEntry.finallyLoc;\n return ContinueSentinel;\n }\n\n return this.complete(record);\n },\n\n complete: function(record, afterLoc) {\n if (record.type === \"throw\") {\n throw record.arg;\n }\n\n if (record.type === \"break\" ||\n record.type === \"continue\") {\n this.next = record.arg;\n } else if (record.type === \"return\") {\n this.rval = this.arg = record.arg;\n this.method = \"return\";\n this.next = \"end\";\n } else if (record.type === \"normal\" && afterLoc) {\n this.next = afterLoc;\n }\n\n return ContinueSentinel;\n },\n\n finish: function(finallyLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.finallyLoc === finallyLoc) {\n this.complete(entry.completion, entry.afterLoc);\n resetTryEntry(entry);\n return ContinueSentinel;\n }\n }\n },\n\n \"catch\": function(tryLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc === tryLoc) {\n var record = entry.completion;\n if (record.type === \"throw\") {\n var thrown = record.arg;\n resetTryEntry(entry);\n }\n return thrown;\n }\n }\n\n // The context.catch method must only be called with a location\n // argument that corresponds to a known catch block.\n throw new Error(\"illegal catch attempt\");\n },\n\n delegateYield: function(iterable, resultName, nextLoc) {\n this.delegate = {\n iterator: values(iterable),\n resultName: resultName,\n nextLoc: nextLoc\n };\n\n if (this.method === \"next\") {\n // Deliberately forget the last sent value so that we don't\n // accidentally pass it on to the delegate.\n this.arg = undefined;\n }\n\n return ContinueSentinel;\n }\n };\n})(\n // Among the various tricks for obtaining a reference to the global\n // object, this seems to be the most reliable technique that does not\n // use indirect eval (which violates Content Security Policy).\n typeof global === \"object\" ? global :\n typeof window === \"object\" ? window :\n typeof self === \"object\" ? self : this\n);\n","// Polyfill for creating CustomEvents on IE9/10/11\n\n// code pulled from:\n// https://github.com/d4tocchini/customevent-polyfill\n// https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent#Polyfill\n\ntry {\n var ce = new window.CustomEvent('test');\n ce.preventDefault();\n if (ce.defaultPrevented !== true) {\n // IE has problems with .preventDefault() on custom events\n // http://stackoverflow.com/questions/23349191\n throw new Error('Could not prevent default');\n }\n} catch(e) {\n var CustomEvent = function(event, params) {\n var evt, origPrevent;\n params = params || {\n bubbles: false,\n cancelable: false,\n detail: undefined\n };\n\n evt = document.createEvent(\"CustomEvent\");\n evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);\n origPrevent = evt.preventDefault;\n evt.preventDefault = function () {\n origPrevent.call(this);\n try {\n Object.defineProperty(this, 'defaultPrevented', {\n get: function () {\n return true;\n }\n });\n } catch(e) {\n this.defaultPrevented = true;\n }\n };\n return evt;\n };\n\n CustomEvent.prototype = window.Event.prototype;\n window.CustomEvent = CustomEvent; // expose definition to window\n}\n","(function(global) {\r\n /**\r\n * Polyfill URLSearchParams\r\n *\r\n * Inspired from : https://github.com/WebReflection/url-search-params/blob/master/src/url-search-params.js\r\n */\r\n\r\n var checkIfIteratorIsSupported = function() {\r\n try {\r\n return !!Symbol.iterator;\r\n } catch(error) {\r\n return false;\r\n }\r\n };\r\n\r\n\r\n var iteratorSupported = checkIfIteratorIsSupported();\r\n\r\n var createIterator = function(items) {\r\n var iterator = {\r\n next: function() {\r\n var value = items.shift();\r\n return { done: value === void 0, value: value };\r\n }\r\n };\r\n\r\n if(iteratorSupported) {\r\n iterator[Symbol.iterator] = function() {\r\n return iterator;\r\n };\r\n }\r\n\r\n return iterator;\r\n };\r\n\r\n /**\r\n * Search param name and values should be encoded according to https://url.spec.whatwg.org/#urlencoded-serializing\r\n * encodeURIComponent() produces the same result except encoding spaces as `%20` instead of `+`.\r\n */\r\n var serializeParam = function(value) {\r\n return encodeURIComponent(value).replace(/%20/g, '+');\r\n };\r\n\r\n var deserializeParam = function(value) {\r\n return decodeURIComponent(value).replace(/\\+/g, ' ');\r\n };\r\n\r\n var polyfillURLSearchParams= function() {\r\n\r\n var URLSearchParams = function(searchString) {\r\n Object.defineProperty(this, '_entries', { value: {} });\r\n\r\n if(typeof searchString === 'string') {\r\n if(searchString !== '') {\r\n searchString = searchString.replace(/^\\?/, '');\r\n var attributes = searchString.split('&');\r\n var attribute;\r\n for(var i = 0; i < attributes.length; i++) {\r\n attribute = attributes[i].split('=');\r\n this.append(\r\n deserializeParam(attribute[0]),\r\n (attribute.length > 1) ? deserializeParam(attribute[1]) : ''\r\n );\r\n }\r\n }\r\n } else if(searchString instanceof URLSearchParams) {\r\n var _this = this;\r\n searchString.forEach(function(value, name) {\r\n _this.append(value, name);\r\n });\r\n }\r\n };\r\n\r\n var proto = URLSearchParams.prototype;\r\n\r\n proto.append = function(name, value) {\r\n if(name in this._entries) {\r\n this._entries[name].push(value.toString());\r\n } else {\r\n this._entries[name] = [value.toString()];\r\n }\r\n };\r\n\r\n proto.delete = function(name) {\r\n delete this._entries[name];\r\n };\r\n\r\n proto.get = function(name) {\r\n return (name in this._entries) ? this._entries[name][0] : null;\r\n };\r\n\r\n proto.getAll = function(name) {\r\n return (name in this._entries) ? this._entries[name].slice(0) : [];\r\n };\r\n\r\n proto.has = function(name) {\r\n return (name in this._entries);\r\n };\r\n\r\n proto.set = function(name, value) {\r\n this._entries[name] = [value.toString()];\r\n };\r\n\r\n proto.forEach = function(callback, thisArg) {\r\n var entries;\r\n for(var name in this._entries) {\r\n if(this._entries.hasOwnProperty(name)) {\r\n entries = this._entries[name];\r\n for(var i = 0; i < entries.length; i++) {\r\n callback.call(thisArg, entries[i], name, this);\r\n }\r\n }\r\n }\r\n };\r\n\r\n proto.keys = function() {\r\n var items = [];\r\n this.forEach(function(value, name) { items.push(name); });\r\n return createIterator(items);\r\n };\r\n\r\n proto.values = function() {\r\n var items = [];\r\n this.forEach(function(value) { items.push(value); });\r\n return createIterator(items);\r\n };\r\n\r\n proto.entries = function() {\r\n var items = [];\r\n this.forEach(function(value, name) { items.push([name, value]); });\r\n return createIterator(items);\r\n };\r\n\r\n if(iteratorSupported) {\r\n proto[Symbol.iterator] = proto.entries;\r\n }\r\n\r\n proto.toString = function() {\r\n var searchString = '';\r\n this.forEach(function(value, name) {\r\n if(searchString.length > 0) searchString+= '&';\r\n searchString += serializeParam(name) + '=' + serializeParam(value);\r\n });\r\n return searchString;\r\n };\r\n\r\n global.URLSearchParams = URLSearchParams;\r\n };\r\n\r\n if(!('URLSearchParams' in global) || (new URLSearchParams('?a=1').toString() !== 'a=1')) {\r\n polyfillURLSearchParams();\r\n }\r\n\r\n // HTMLAnchorElement\r\n\r\n})(\r\n (typeof global !== 'undefined') ? global\r\n : ((typeof window !== 'undefined') ? window\r\n : ((typeof self !== 'undefined') ? self : this))\r\n);\r\n\r\n(function(global) {\r\n /**\r\n * Polyfill URL\r\n *\r\n * Inspired from : https://github.com/arv/DOM-URL-Polyfill/blob/master/src/url.js\r\n */\r\n\r\n var checkIfURLIsSupported = function() {\r\n try {\r\n var u = new URL('b', 'http://a');\r\n u.pathname = 'c%20d';\r\n return (u.href === 'http://a/c%20d') && u.searchParams;\r\n } catch(e) {\r\n return false;\r\n }\r\n };\r\n\r\n\r\n var polyfillURL = function() {\r\n var _URL = global.URL;\r\n\r\n var URL = function(url, base) {\r\n if(typeof url !== 'string') url = String(url);\r\n\r\n var doc = document.implementation.createHTMLDocument('');\r\n window.doc = doc;\r\n if(base) {\r\n var baseElement = doc.createElement('base');\r\n baseElement.href = base;\r\n doc.head.appendChild(baseElement);\r\n }\r\n\r\n var anchorElement = doc.createElement('a');\r\n anchorElement.href = url;\r\n doc.body.appendChild(anchorElement);\r\n anchorElement.href = anchorElement.href; // force href to refresh\r\n\r\n if(anchorElement.protocol === ':' || !/:/.test(anchorElement.href)) {\r\n throw new TypeError('Invalid URL');\r\n }\r\n\r\n Object.defineProperty(this, '_anchorElement', {\r\n value: anchorElement\r\n });\r\n };\r\n\r\n var proto = URL.prototype;\r\n\r\n var linkURLWithAnchorAttribute = function(attributeName) {\r\n Object.defineProperty(proto, attributeName, {\r\n get: function() {\r\n return this._anchorElement[attributeName];\r\n },\r\n set: function(value) {\r\n this._anchorElement[attributeName] = value;\r\n },\r\n enumerable: true\r\n });\r\n };\r\n\r\n ['hash', 'host', 'hostname', 'port', 'protocol', 'search']\r\n .forEach(function(attributeName) {\r\n linkURLWithAnchorAttribute(attributeName);\r\n });\r\n\r\n Object.defineProperties(proto, {\r\n\r\n 'toString': {\r\n get: function() {\r\n var _this = this;\r\n return function() {\r\n return _this.href;\r\n };\r\n }\r\n },\r\n\r\n 'href' : {\r\n get: function() {\r\n return this._anchorElement.href.replace(/\\?$/,'');\r\n },\r\n set: function(value) {\r\n this._anchorElement.href = value;\r\n },\r\n enumerable: true\r\n },\r\n\r\n 'pathname' : {\r\n get: function() {\r\n return this._anchorElement.pathname.replace(/(^\\/?)/,'/');\r\n },\r\n set: function(value) {\r\n this._anchorElement.pathname = value;\r\n },\r\n enumerable: true\r\n },\r\n\r\n 'origin': {\r\n get: function() {\r\n // get expected port from protocol\r\n var expectedPort = {'http:': 80, 'https:': 443, 'ftp:': 21}[this._anchorElement.protocol];\r\n // add port to origin if, expected port is different than actual port\r\n // and it is not empty f.e http://foo:8080\r\n // 8080 != 80 && 8080 != ''\r\n var addPortToOrigin = this._anchorElement.port != expectedPort &&\r\n this._anchorElement.port !== ''\r\n\r\n return this._anchorElement.protocol +\r\n '//' +\r\n this._anchorElement.hostname +\r\n (addPortToOrigin ? (':' + this._anchorElement.port) : '');\r\n },\r\n enumerable: true\r\n },\r\n\r\n 'password': { // TODO\r\n get: function() {\r\n return '';\r\n },\r\n set: function(value) {\r\n },\r\n enumerable: true\r\n },\r\n\r\n 'username': { // TODO\r\n get: function() {\r\n return '';\r\n },\r\n set: function(value) {\r\n },\r\n enumerable: true\r\n },\r\n\r\n 'searchParams': {\r\n get: function() {\r\n var searchParams = new URLSearchParams(this.search);\r\n var _this = this;\r\n ['append', 'delete', 'set'].forEach(function(methodName) {\r\n var method = searchParams[methodName];\r\n searchParams[methodName] = function() {\r\n method.apply(searchParams, arguments);\r\n _this.search = searchParams.toString();\r\n };\r\n });\r\n return searchParams;\r\n },\r\n enumerable: true\r\n }\r\n });\r\n\r\n URL.createObjectURL = function(blob) {\r\n return _URL.createObjectURL.apply(_URL, arguments);\r\n };\r\n\r\n URL.revokeObjectURL = function(url) {\r\n return _URL.revokeObjectURL.apply(_URL, arguments);\r\n };\r\n\r\n global.URL = URL;\r\n\r\n };\r\n\r\n if(!checkIfURLIsSupported()) {\r\n polyfillURL();\r\n }\r\n\r\n if((global.location !== void 0) && !('origin' in global.location)) {\r\n var getOrigin = function() {\r\n return global.location.protocol + '//' + global.location.hostname + (global.location.port ? (':' + global.location.port) : '');\r\n };\r\n\r\n try {\r\n Object.defineProperty(global.location, 'origin', {\r\n get: getOrigin,\r\n enumerable: true\r\n });\r\n } catch(e) {\r\n setInterval(function() {\r\n global.location.origin = getOrigin();\r\n }, 100);\r\n }\r\n }\r\n\r\n})(\r\n (typeof global !== 'undefined') ? global\r\n : ((typeof window !== 'undefined') ? window\r\n : ((typeof self !== 'undefined') ? self : this))\r\n);\r\n","(function(root, factory) {\n if (typeof define === 'function' && define.amd) {\n define([], factory);\n } else if (typeof exports === 'object') {\n module.exports = factory();\n } else {\n root.loadjs = factory();\n }\n}(this, function() {\n/**\n * Global dependencies.\n * @global {Object} document - DOM\n */\n\nvar devnull = function() {},\n bundleIdCache = {},\n bundleResultCache = {},\n bundleCallbackQueue = {};\n\n\n/**\n * Subscribe to bundle load event.\n * @param {string[]} bundleIds - Bundle ids\n * @param {Function} callbackFn - The callback function\n */\nfunction subscribe(bundleIds, callbackFn) {\n // listify\n bundleIds = bundleIds.push ? bundleIds : [bundleIds];\n\n var depsNotFound = [],\n i = bundleIds.length,\n numWaiting = i,\n fn,\n bundleId,\n r,\n q;\n\n // define callback function\n fn = function (bundleId, pathsNotFound) {\n if (pathsNotFound.length) depsNotFound.push(bundleId);\n\n numWaiting--;\n if (!numWaiting) callbackFn(depsNotFound);\n };\n\n // register callback\n while (i--) {\n bundleId = bundleIds[i];\n\n // execute callback if in result cache\n r = bundleResultCache[bundleId];\n if (r) {\n fn(bundleId, r);\n continue;\n }\n\n // add to callback queue\n q = bundleCallbackQueue[bundleId] = bundleCallbackQueue[bundleId] || [];\n q.push(fn);\n }\n}\n\n\n/**\n * Publish bundle load event.\n * @param {string} bundleId - Bundle id\n * @param {string[]} pathsNotFound - List of files not found\n */\nfunction publish(bundleId, pathsNotFound) {\n // exit if id isn't defined\n if (!bundleId) return;\n\n var q = bundleCallbackQueue[bundleId];\n\n // cache result\n bundleResultCache[bundleId] = pathsNotFound;\n\n // exit if queue is empty\n if (!q) return;\n\n // empty callback queue\n while (q.length) {\n q[0](bundleId, pathsNotFound);\n q.splice(0, 1);\n }\n}\n\n\n/**\n * Execute callbacks.\n * @param {Object or Function} args - The callback args\n * @param {string[]} depsNotFound - List of dependencies not found\n */\nfunction executeCallbacks(args, depsNotFound) {\n // accept function as argument\n if (args.call) args = {success: args};\n\n // success and error callbacks\n if (depsNotFound.length) (args.error || devnull)(depsNotFound);\n else (args.success || devnull)(args);\n}\n\n\n/**\n * Load individual file.\n * @param {string} path - The file path\n * @param {Function} callbackFn - The callback function\n */\nfunction loadFile(path, callbackFn, args, numTries) {\n var doc = document,\n async = args.async,\n maxTries = (args.numRetries || 0) + 1,\n beforeCallbackFn = args.before || devnull,\n pathStripped = path.replace(/^(css|img)!/, ''),\n isCss,\n e;\n\n numTries = numTries || 0;\n\n if (/(^css!|\\.css$)/.test(path)) {\n isCss = true;\n\n // css\n e = doc.createElement('link');\n e.rel = 'stylesheet';\n e.href = pathStripped; //.replace(/^css!/, ''); // remove \"css!\" prefix\n } else if (/(^img!|\\.(png|gif|jpg|svg)$)/.test(path)) {\n // image\n e = doc.createElement('img');\n e.src = pathStripped; \n } else {\n // javascript\n e = doc.createElement('script');\n e.src = path;\n e.async = async === undefined ? true : async;\n }\n\n e.onload = e.onerror = e.onbeforeload = function (ev) {\n var result = ev.type[0];\n\n // Note: The following code isolates IE using `hideFocus` and treats empty\n // stylesheets as failures to get around lack of onerror support\n if (isCss && 'hideFocus' in e) {\n try {\n if (!e.sheet.cssText.length) result = 'e';\n } catch (x) {\n // sheets objects created from load errors don't allow access to\n // `cssText`\n result = 'e';\n }\n }\n\n // handle retries in case of load failure\n if (result == 'e') {\n // increment counter\n numTries += 1;\n\n // exit function and try again\n if (numTries < maxTries) {\n return loadFile(path, callbackFn, args, numTries);\n }\n }\n\n // execute callback\n callbackFn(path, result, ev.defaultPrevented);\n };\n\n // add to document (unless callback returns `false`)\n if (beforeCallbackFn(path, e) !== false) doc.head.appendChild(e);\n}\n\n\n/**\n * Load multiple files.\n * @param {string[]} paths - The file paths\n * @param {Function} callbackFn - The callback function\n */\nfunction loadFiles(paths, callbackFn, args) {\n // listify paths\n paths = paths.push ? paths : [paths];\n\n var numWaiting = paths.length,\n x = numWaiting,\n pathsNotFound = [],\n fn,\n i;\n\n // define callback function\n fn = function(path, result, defaultPrevented) {\n // handle error\n if (result == 'e') pathsNotFound.push(path);\n\n // handle beforeload event. If defaultPrevented then that means the load\n // will be blocked (ex. Ghostery/ABP on Safari)\n if (result == 'b') {\n if (defaultPrevented) pathsNotFound.push(path);\n else return;\n }\n\n numWaiting--;\n if (!numWaiting) callbackFn(pathsNotFound);\n };\n\n // load scripts\n for (i=0; i < x; i++) loadFile(paths[i], fn, args);\n}\n\n\n/**\n * Initiate script load and register bundle.\n * @param {(string|string[])} paths - The file paths\n * @param {(string|Function)} [arg1] - The bundleId or success callback\n * @param {Function} [arg2] - The success or error callback\n * @param {Function} [arg3] - The error callback\n */\nfunction loadjs(paths, arg1, arg2) {\n var bundleId,\n args;\n\n // bundleId (if string)\n if (arg1 && arg1.trim) bundleId = arg1;\n\n // args (default is {})\n args = (bundleId ? arg2 : arg1) || {};\n\n // throw error if bundle is already defined\n if (bundleId) {\n if (bundleId in bundleIdCache) {\n throw \"LoadJS\";\n } else {\n bundleIdCache[bundleId] = true;\n }\n }\n\n // load scripts\n loadFiles(paths, function (pathsNotFound) {\n // execute callbacks\n executeCallbacks(args, pathsNotFound);\n\n // publish bundle load event\n publish(bundleId, pathsNotFound);\n }, args);\n}\n\n\n/**\n * Execute callbacks when dependencies have been satisfied.\n * @param {(string|string[])} deps - List of bundle ids\n * @param {Object} args - success/error arguments\n */\nloadjs.ready = function ready(deps, args) {\n // subscribe to bundle load event\n subscribe(deps, function (depsNotFound) {\n // execute callbacks\n executeCallbacks(args, depsNotFound);\n });\n\n return loadjs;\n};\n\n\n/**\n * Manually satisfy bundle dependencies.\n * @param {string} bundleId - The bundle id\n */\nloadjs.done = function done(bundleId) {\n publish(bundleId, []);\n};\n\n\n/**\n * Reset loadjs dependencies statuses\n */\nloadjs.reset = function reset() {\n bundleIdCache = {};\n bundleResultCache = {};\n bundleCallbackQueue = {};\n};\n\n\n/**\n * Determine if bundle has already been defined\n * @param String} bundleId - The bundle id\n */\nloadjs.isDefined = function isDefined(bundleId) {\n return bundleId in bundleIdCache;\n};\n\n\n// export\nreturn loadjs;\n\n}));\n","// ==========================================================================\n// Plyr storage\n// ==========================================================================\n\nimport utils from './utils';\n\nclass Storage {\n constructor(player) {\n this.enabled = player.config.storage.enabled;\n this.key = player.config.storage.key;\n }\n\n // Check for actual support (see if we can use it)\n static get supported() {\n try {\n if (!('localStorage' in window)) {\n return false;\n }\n\n const test = '___test';\n\n // Try to use it (it might be disabled, e.g. user is in private mode)\n // see: https://github.com/sampotts/plyr/issues/131\n window.localStorage.setItem(test, test);\n window.localStorage.removeItem(test);\n\n return true;\n } catch (e) {\n return false;\n }\n }\n\n get(key) {\n if (!Storage.supported || !this.enabled) {\n return null;\n }\n\n const store = window.localStorage.getItem(this.key);\n\n if (utils.is.empty(store)) {\n return null;\n }\n\n const json = JSON.parse(store);\n\n return utils.is.string(key) && key.length ? json[key] : json;\n }\n\n set(object) {\n // Bail if we don't have localStorage support or it's disabled\n if (!Storage.supported || !this.enabled) {\n return;\n }\n\n // Can only store objectst\n if (!utils.is.object(object)) {\n return;\n }\n\n // Get current storage\n let storage = this.get();\n\n // Default to empty object\n if (utils.is.empty(storage)) {\n storage = {};\n }\n\n // Update the working copy of the values\n utils.extend(storage, object);\n\n // Update storage\n window.localStorage.setItem(this.key, JSON.stringify(storage));\n }\n}\n\nexport default Storage;\n","// ==========================================================================\n// Plyr supported types and providers\n// ==========================================================================\n\nexport const providers = {\n html5: 'html5',\n youtube: 'youtube',\n vimeo: 'vimeo',\n};\n\nexport const types = {\n audio: 'audio',\n video: 'video',\n};\n\nexport default { providers, types };\n","// ==========================================================================\n// Plyr utils\n// ==========================================================================\n\nimport loadjs from 'loadjs';\nimport Storage from './storage';\nimport support from './support';\nimport { providers } from './types';\n\nconst utils = {\n // Check variable types\n is: {\n object(input) {\n return utils.getConstructor(input) === Object;\n },\n number(input) {\n return utils.getConstructor(input) === Number && !Number.isNaN(input);\n },\n string(input) {\n return utils.getConstructor(input) === String;\n },\n boolean(input) {\n return utils.getConstructor(input) === Boolean;\n },\n function(input) {\n return utils.getConstructor(input) === Function;\n },\n array(input) {\n return !utils.is.nullOrUndefined(input) && Array.isArray(input);\n },\n weakMap(input) {\n return utils.is.instanceof(input, WeakMap);\n },\n nodeList(input) {\n return utils.is.instanceof(input, NodeList);\n },\n element(input) {\n return utils.is.instanceof(input, Element);\n },\n textNode(input) {\n return utils.getConstructor(input) === Text;\n },\n event(input) {\n return utils.is.instanceof(input, Event);\n },\n cue(input) {\n return utils.is.instanceof(input, window.TextTrackCue) || utils.is.instanceof(input, window.VTTCue);\n },\n track(input) {\n return utils.is.instanceof(input, TextTrack) || (!utils.is.nullOrUndefined(input) && utils.is.string(input.kind));\n },\n url(input) {\n return !utils.is.nullOrUndefined(input) && /(ftp|http|https):\\/\\/(\\w+:{0,1}\\w*@)?(\\S+)(:[0-9]+)?(\\/|\\/([\\w#!:.?+=&%@!\\-/]))?/.test(input);\n },\n nullOrUndefined(input) {\n return input === null || typeof input === 'undefined';\n },\n empty(input) {\n return (\n utils.is.nullOrUndefined(input) ||\n ((utils.is.string(input) || utils.is.array(input) || utils.is.nodeList(input)) && !input.length) ||\n (utils.is.object(input) && !Object.keys(input).length)\n );\n },\n instanceof(input, constructor) {\n return Boolean(input && constructor && input instanceof constructor);\n },\n },\n\n getConstructor(input) {\n return !utils.is.nullOrUndefined(input) ? input.constructor : null;\n },\n\n // Unfortunately, due to mixed support, UA sniffing is required\n getBrowser() {\n return {\n isIE: /* @cc_on!@ */ false || !!document.documentMode,\n isWebkit: 'WebkitAppearance' in document.documentElement.style && !/Edge/.test(navigator.userAgent),\n isIPhone: /(iPhone|iPod)/gi.test(navigator.platform),\n isIos: /(iPad|iPhone|iPod)/gi.test(navigator.platform),\n };\n },\n\n // Fetch wrapper\n // Using XHR to avoid issues with older browsers\n fetch(url, responseType = 'text') {\n return new Promise((resolve, reject) => {\n try {\n const request = new XMLHttpRequest();\n\n // Check for CORS support\n if (!('withCredentials' in request)) {\n return;\n }\n\n request.addEventListener('load', () => {\n if (responseType === 'text') {\n try {\n resolve(JSON.parse(request.responseText));\n } catch (e) {\n resolve(request.responseText);\n }\n } else {\n resolve(request.response);\n }\n });\n\n request.addEventListener('error', () => {\n throw new Error(request.statusText);\n });\n\n request.open('GET', url, true);\n\n // Set the required response type\n request.responseType = responseType;\n\n request.send();\n } catch (e) {\n reject(e);\n }\n });\n },\n\n // Load image avoiding xhr/fetch CORS issues\n // Server status can't be obtained this way unfortunately, so this uses \"naturalWidth\" to determine if the image has loaded.\n // By default it checks if it is at least 1px, but you can add a second argument to change this.\n loadImage(src, minWidth = 1) {\n return new Promise((resolve, reject) => {\n const image = new Image();\n const handler = () => {\n delete image.onload;\n delete image.onerror;\n (image.naturalWidth >= minWidth ? resolve : reject)(image);\n };\n Object.assign(image, {onload: handler, onerror: handler, src});\n });\n },\n\n // Load an external script\n loadScript(url) {\n return new Promise((resolve, reject) => {\n loadjs(url, {\n success: resolve,\n error: reject,\n });\n });\n },\n\n // Load an external SVG sprite\n loadSprite(url, id) {\n if (!utils.is.string(url)) {\n return;\n }\n\n const prefix = 'cache';\n const hasId = utils.is.string(id);\n let isCached = false;\n\n const exists = () => document.getElementById(id) !== null;\n\n const update = (container, data) => {\n container.innerHTML = data;\n\n // Check again incase of race condition\n if (hasId && exists()) {\n return;\n }\n\n // Inject the SVG to the body\n document.body.insertAdjacentElement('afterbegin', container);\n };\n\n // Only load once if ID set\n if (!hasId || !exists()) {\n const useStorage = Storage.supported;\n\n // Create container\n const container = document.createElement('div');\n utils.toggleHidden(container, true);\n\n if (hasId) {\n container.setAttribute('id', id);\n }\n\n // Check in cache\n if (useStorage) {\n const cached = window.localStorage.getItem(`${prefix}-${id}`);\n isCached = cached !== null;\n\n if (isCached) {\n const data = JSON.parse(cached);\n update(container, data.content);\n }\n }\n\n // Get the sprite\n utils\n .fetch(url)\n .then(result => {\n if (utils.is.empty(result)) {\n return;\n }\n\n if (useStorage) {\n window.localStorage.setItem(\n `${prefix}-${id}`,\n JSON.stringify({\n content: result,\n }),\n );\n }\n\n update(container, result);\n })\n .catch(() => {});\n }\n },\n\n // Generate a random ID\n generateId(prefix) {\n return `${prefix}-${Math.floor(Math.random() * 10000)}`;\n },\n\n // Wrap an element\n wrap(elements, wrapper) {\n // Convert `elements` to an array, if necessary.\n const targets = elements.length ? elements : [elements];\n\n // Loops backwards to prevent having to clone the wrapper on the\n // first element (see `child` below).\n Array.from(targets)\n .reverse()\n .forEach((element, index) => {\n const child = index > 0 ? wrapper.cloneNode(true) : wrapper;\n\n // Cache the current parent and sibling.\n const parent = element.parentNode;\n const sibling = element.nextSibling;\n\n // Wrap the element (is automatically removed from its current\n // parent).\n child.appendChild(element);\n\n // If the element had a sibling, insert the wrapper before\n // the sibling to maintain the HTML structure; otherwise, just\n // append it to the parent.\n if (sibling) {\n parent.insertBefore(child, sibling);\n } else {\n parent.appendChild(child);\n }\n });\n },\n\n // Create a DocumentFragment\n createElement(type, attributes, text) {\n // Create a new <element>\n const element = document.createElement(type);\n\n // Set all passed attributes\n if (utils.is.object(attributes)) {\n utils.setAttributes(element, attributes);\n }\n\n // Add text node\n if (utils.is.string(text)) {\n element.innerText = text;\n }\n\n // Return built element\n return element;\n },\n\n // Inaert an element after another\n insertAfter(element, target) {\n target.parentNode.insertBefore(element, target.nextSibling);\n },\n\n // Insert a DocumentFragment\n insertElement(type, parent, attributes, text) {\n // Inject the new <element>\n parent.appendChild(utils.createElement(type, attributes, text));\n },\n\n // Remove element(s)\n removeElement(element) {\n if (utils.is.nodeList(element) || utils.is.array(element)) {\n Array.from(element).forEach(utils.removeElement);\n return;\n }\n\n if (!utils.is.element(element) || !utils.is.element(element.parentNode)) {\n return;\n }\n\n element.parentNode.removeChild(element);\n },\n\n // Remove all child elements\n emptyElement(element) {\n let { length } = element.childNodes;\n\n while (length > 0) {\n element.removeChild(element.lastChild);\n length -= 1;\n }\n },\n\n // Replace element\n replaceElement(newChild, oldChild) {\n if (!utils.is.element(oldChild) || !utils.is.element(oldChild.parentNode) || !utils.is.element(newChild)) {\n return null;\n }\n\n oldChild.parentNode.replaceChild(newChild, oldChild);\n\n return newChild;\n },\n\n // Set attributes\n setAttributes(element, attributes) {\n if (!utils.is.element(element) || utils.is.empty(attributes)) {\n return;\n }\n\n Object.entries(attributes).forEach(([\n key,\n value,\n ]) => {\n element.setAttribute(key, value);\n });\n },\n\n // Get an attribute object from a string selector\n getAttributesFromSelector(sel, existingAttributes) {\n // For example:\n // '.test' to { class: 'test' }\n // '#test' to { id: 'test' }\n // '[data-test=\"test\"]' to { 'data-test': 'test' }\n\n if (!utils.is.string(sel) || utils.is.empty(sel)) {\n return {};\n }\n\n const attributes = {};\n const existing = existingAttributes;\n\n sel.split(',').forEach(s => {\n // Remove whitespace\n const selector = s.trim();\n const className = selector.replace('.', '');\n const stripped = selector.replace(/[[\\]]/g, '');\n\n // Get the parts and value\n const parts = stripped.split('=');\n const key = parts[0];\n const value = parts.length > 1 ? parts[1].replace(/[\"']/g, '') : '';\n\n // Get the first character\n const start = selector.charAt(0);\n\n switch (start) {\n case '.':\n // Add to existing classname\n if (utils.is.object(existing) && utils.is.string(existing.class)) {\n existing.class += ` ${className}`;\n }\n\n attributes.class = className;\n break;\n\n case '#':\n // ID selector\n attributes.id = selector.replace('#', '');\n break;\n\n case '[':\n // Attribute selector\n attributes[key] = value;\n\n break;\n\n default:\n break;\n }\n });\n\n return attributes;\n },\n\n // Toggle hidden\n toggleHidden(element, hidden) {\n if (!utils.is.element(element)) {\n return;\n }\n\n let hide = hidden;\n\n if (!utils.is.boolean(hide)) {\n hide = !element.hasAttribute('hidden');\n }\n\n if (hide) {\n element.setAttribute('hidden', '');\n } else {\n element.removeAttribute('hidden');\n }\n },\n\n // Mirror Element.classList.toggle, with IE compatibility for \"force\" argument\n toggleClass(element, className, force) {\n if (utils.is.element(element)) {\n let method = 'toggle';\n if (typeof force !== 'undefined') {\n method = force ? 'add' : 'remove';\n }\n\n element.classList[method](className);\n return element.classList.contains(className);\n }\n\n return null;\n },\n\n // Has class name\n hasClass(element, className) {\n return utils.is.element(element) && element.classList.contains(className);\n },\n\n // Element matches selector\n matches(element, selector) {\n const prototype = { Element };\n\n function match() {\n return Array.from(document.querySelectorAll(selector)).includes(this);\n }\n\n const matches = prototype.matches || prototype.webkitMatchesSelector || prototype.mozMatchesSelector || prototype.msMatchesSelector || match;\n\n return matches.call(element, selector);\n },\n\n // Find all elements\n getElements(selector) {\n return this.elements.container.querySelectorAll(selector);\n },\n\n // Find a single element\n getElement(selector) {\n return this.elements.container.querySelector(selector);\n },\n\n // Get the focused element\n getFocusElement() {\n let focused = document.activeElement;\n\n if (!focused || focused === document.body) {\n focused = null;\n } else {\n focused = document.querySelector(':focus');\n }\n\n return focused;\n },\n\n // Trap focus inside container\n trapFocus(element = null, toggle = false) {\n if (!utils.is.element(element)) {\n return;\n }\n\n const focusable = utils.getElements.call(this, 'button:not(:disabled), input:not(:disabled), [tabindex]');\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n\n const trap = event => {\n // Bail if not tab key or not fullscreen\n if (event.key !== 'Tab' || event.keyCode !== 9) {\n return;\n }\n\n // Get the current focused element\n const focused = utils.getFocusElement();\n\n if (focused === last && !event.shiftKey) {\n // Move focus to first element that can be tabbed if Shift isn't used\n first.focus();\n event.preventDefault();\n } else if (focused === first && event.shiftKey) {\n // Move focus to last element that can be tabbed if Shift is used\n last.focus();\n event.preventDefault();\n }\n };\n\n if (toggle) {\n utils.on(this.elements.container, 'keydown', trap, false);\n } else {\n utils.off(this.elements.container, 'keydown', trap, false);\n }\n },\n\n // Toggle event listener\n toggleListener(elements, event, callback, toggle = false, passive = true, capture = false) {\n // Bail if no elemetns, event, or callback\n if (utils.is.empty(elements) || utils.is.empty(event) || !utils.is.function(callback)) {\n return;\n }\n\n // If a nodelist is passed, call itself on each node\n if (utils.is.nodeList(elements) || utils.is.array(elements)) {\n // Create listener for each node\n Array.from(elements).forEach(element => {\n if (element instanceof Node) {\n utils.toggleListener.call(null, element, event, callback, toggle, passive, capture);\n }\n });\n\n return;\n }\n\n // Allow multiple events\n const events = event.split(' ');\n\n // Build options\n // Default to just the capture boolean for browsers with no passive listener support\n let options = capture;\n\n // If passive events listeners are supported\n if (support.passiveListeners) {\n options = {\n // Whether the listener can be passive (i.e. default never prevented)\n passive,\n // Whether the listener is a capturing listener or not\n capture,\n };\n }\n\n // If a single node is passed, bind the event listener\n events.forEach(type => {\n elements[toggle ? 'addEventListener' : 'removeEventListener'](type, callback, options);\n });\n },\n\n // Bind event handler\n on(element, events = '', callback, passive = true, capture = false) {\n utils.toggleListener(element, events, callback, true, passive, capture);\n },\n\n // Unbind event handler\n off(element, events = '', callback, passive = true, capture = false) {\n utils.toggleListener(element, events, callback, false, passive, capture);\n },\n\n // Trigger event\n dispatchEvent(element, type = '', bubbles = false, detail = {}) {\n // Bail if no element\n if (!utils.is.element(element) || utils.is.empty(type)) {\n return;\n }\n\n // Create and dispatch the event\n const event = new CustomEvent(type, {\n bubbles,\n detail: Object.assign({}, detail, {\n plyr: this,\n }),\n });\n\n // Dispatch the event\n element.dispatchEvent(event);\n },\n\n // Format string\n format(input, ...args) {\n if (utils.is.empty(input)) {\n return input;\n }\n\n return input.toString().replace(/{(\\d+)}/g, (match, i) => (utils.is.string(args[i]) ? args[i] : ''));\n },\n\n // Get percentage\n getPercentage(current, max) {\n if (current === 0 || max === 0 || Number.isNaN(current) || Number.isNaN(max)) {\n return 0;\n }\n\n return (current / max * 100).toFixed(2);\n },\n\n // Time helpers\n getHours(value) {\n return parseInt((value / 60 / 60) % 60, 10);\n },\n getMinutes(value) {\n return parseInt((value / 60) % 60, 10);\n },\n getSeconds(value) {\n return parseInt(value % 60, 10);\n },\n\n // Format time to UI friendly string\n formatTime(time = 0, displayHours = false, inverted = false) {\n // Bail if the value isn't a number\n if (!utils.is.number(time)) {\n return utils.formatTime(null, displayHours, inverted);\n }\n\n // Format time component to add leading zero\n const format = value => `0${value}`.slice(-2);\n\n // Breakdown to hours, mins, secs\n let hours = utils.getHours(time);\n const mins = utils.getMinutes(time);\n const secs = utils.getSeconds(time);\n\n // Do we need to display hours?\n if (displayHours || hours > 0) {\n hours = `${hours}:`;\n } else {\n hours = '';\n }\n\n // Render\n return `${inverted ? '-' : ''}${hours}${format(mins)}:${format(secs)}`;\n },\n\n // Replace all occurances of a string in a string\n replaceAll(input = '', find = '', replace = '') {\n return input.replace(new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\\]/\\\\])/g, '\\\\$1'), 'g'), replace.toString());\n },\n\n // Convert to title case\n toTitleCase(input = '') {\n return input.toString().replace(/\\w\\S*/g, text => text.charAt(0).toUpperCase() + text.substr(1).toLowerCase());\n },\n\n // Convert string to pascalCase\n toPascalCase(input = '') {\n let string = input.toString();\n\n // Convert kebab case\n string = utils.replaceAll(string, '-', ' ');\n\n // Convert snake case\n string = utils.replaceAll(string, '_', ' ');\n\n // Convert to title case\n string = utils.toTitleCase(string);\n\n // Convert to pascal case\n return utils.replaceAll(string, ' ', '');\n },\n\n // Convert string to pascalCase\n toCamelCase(input = '') {\n let string = input.toString();\n\n // Convert to pascal case\n string = utils.toPascalCase(string);\n\n // Convert first character to lowercase\n return string.charAt(0).toLowerCase() + string.slice(1);\n },\n\n // Deep extend destination object with N more objects\n extend(target = {}, ...sources) {\n if (!sources.length) {\n return target;\n }\n\n const source = sources.shift();\n\n if (!utils.is.object(source)) {\n return target;\n }\n\n Object.keys(source).forEach(key => {\n if (utils.is.object(source[key])) {\n if (!Object.keys(target).includes(key)) {\n Object.assign(target, { [key]: {} });\n }\n\n utils.extend(target[key], source[key]);\n } else {\n Object.assign(target, { [key]: source[key] });\n }\n });\n\n return utils.extend(target, ...sources);\n },\n\n // Remove duplicates in an array\n dedupe(array) {\n if (!utils.is.array(array)) {\n return array;\n }\n\n return array.filter((item, index) => array.indexOf(item) === index);\n },\n\n // Clone nested objects\n cloneDeep(object) {\n return JSON.parse(JSON.stringify(object));\n },\n\n // Get a nested value in an object\n getDeep(object, path) {\n return path.split('.').reduce((obj, key) => obj && obj[key], object);\n },\n\n // Get the closest value in an array\n closest(array, value) {\n if (!utils.is.array(array) || !array.length) {\n return null;\n }\n\n return array.reduce((prev, curr) => (Math.abs(curr - value) < Math.abs(prev - value) ? curr : prev));\n },\n\n // Get the provider for a given URL\n getProviderByUrl(url) {\n // YouTube\n if (/^(https?:\\/\\/)?(www\\.)?(youtube\\.com|youtu\\.?be)\\/.+$/.test(url)) {\n return providers.youtube;\n }\n\n // Vimeo\n if (/^https?:\\/\\/player.vimeo.com\\/video\\/\\d{0,9}(?=\\b|\\/)/.test(url)) {\n return providers.vimeo;\n }\n\n return null;\n },\n\n // Parse YouTube ID from URL\n parseYouTubeId(url) {\n if (utils.is.empty(url)) {\n return null;\n }\n\n const regex = /^.*(youtu.be\\/|v\\/|u\\/\\w\\/|embed\\/|watch\\?v=|&v=)([^#&?]*).*/;\n return url.match(regex) ? RegExp.$2 : url;\n },\n\n // Parse Vimeo ID from URL\n parseVimeoId(url) {\n if (utils.is.empty(url)) {\n return null;\n }\n\n if (utils.is.number(Number(url))) {\n return url;\n }\n\n const regex = /^.*(vimeo.com\\/|video\\/)(\\d+).*/;\n return url.match(regex) ? RegExp.$2 : url;\n },\n\n // Convert a URL to a location object\n parseUrl(url) {\n const parser = document.createElement('a');\n parser.href = url;\n return parser;\n },\n\n // Get URL query parameters\n getUrlParams(input) {\n let search = input;\n\n // Parse URL if needed\n if (input.startsWith('http://') || input.startsWith('https://')) {\n ({ search } = utils.parseUrl(input));\n }\n\n if (utils.is.empty(search)) {\n return null;\n }\n\n const hashes = search.slice(search.indexOf('?') + 1).split('&');\n\n return hashes.reduce((params, hash) => {\n const [\n key,\n val,\n ] = hash.split('=');\n\n return Object.assign(params, { [key]: decodeURIComponent(val) });\n }, {});\n },\n\n // Convert object to URL parameters\n buildUrlParams(input) {\n if (!utils.is.object(input)) {\n return '';\n }\n\n return Object.keys(input)\n .map(key => `${encodeURIComponent(key)}=${encodeURIComponent(input[key])}`)\n .join('&');\n },\n\n // Remove HTML from a string\n stripHTML(source) {\n const fragment = document.createDocumentFragment();\n const element = document.createElement('div');\n fragment.appendChild(element);\n element.innerHTML = source;\n return fragment.firstChild.innerText;\n },\n\n // Like outerHTML, but also works for DocumentFragment\n getHTML(element) {\n const wrapper = document.createElement('div');\n wrapper.appendChild(element);\n return wrapper.innerHTML;\n },\n\n // Get aspect ratio for dimensions\n getAspectRatio(width, height) {\n const getRatio = (w, h) => (h === 0 ? w : getRatio(h, w % h));\n const ratio = getRatio(width, height);\n return `${width / ratio}:${height / ratio}`;\n },\n\n // Get the transition end event\n get transitionEndEvent() {\n const element = document.createElement('span');\n\n const events = {\n WebkitTransition: 'webkitTransitionEnd',\n MozTransition: 'transitionend',\n OTransition: 'oTransitionEnd otransitionend',\n transition: 'transitionend',\n };\n\n const type = Object.keys(events).find(event => element.style[event] !== undefined);\n\n return utils.is.string(type) ? events[type] : false;\n },\n\n // Force repaint of element\n repaint(element) {\n setTimeout(() => {\n utils.toggleHidden(element, true);\n element.offsetHeight; // eslint-disable-line\n utils.toggleHidden(element, false);\n }, 0);\n },\n};\n\nexport default utils;\n","// ==========================================================================\n// Plyr support checks\n// ==========================================================================\n\nimport utils from './utils';\n\n// Check for feature support\nconst support = {\n // Basic support\n audio: 'canPlayType' in document.createElement('audio'),\n video: 'canPlayType' in document.createElement('video'),\n\n // Check for support\n // Basic functionality vs full UI\n check(type, provider, playsinline) {\n let api = false;\n let ui = false;\n const browser = utils.getBrowser();\n const canPlayInline = browser.isIPhone && playsinline && support.playsinline;\n\n switch (`${provider}:${type}`) {\n case 'html5:video':\n api = support.video;\n ui = api && support.rangeInput && (!browser.isIPhone || canPlayInline);\n break;\n\n case 'html5:audio':\n api = support.audio;\n ui = api && support.rangeInput;\n break;\n\n case 'youtube:video':\n case 'vimeo:video':\n api = true;\n ui = support.rangeInput && (!browser.isIPhone || canPlayInline);\n break;\n\n default:\n api = support.audio && support.video;\n ui = api && support.rangeInput;\n }\n\n return {\n api,\n ui,\n };\n },\n\n // Picture-in-picture support\n // Safari only currently\n pip: (() => {\n const browser = utils.getBrowser();\n return !browser.isIPhone && utils.is.function(utils.createElement('video').webkitSetPresentationMode);\n })(),\n\n // Airplay support\n // Safari only currently\n airplay: utils.is.function(window.WebKitPlaybackTargetAvailabilityEvent),\n\n // Inline playback support\n // https://webkit.org/blog/6784/new-video-policies-for-ios/\n playsinline: 'playsInline' in document.createElement('video'),\n\n // Check for mime type support against a player instance\n // Credits: http://diveintohtml5.info/everything.html\n // Related: http://www.leanbackplayer.com/test/h5mt.html\n mime(type) {\n const { media } = this;\n\n try {\n // Bail if no checking function\n if (!this.isHTML5 || !utils.is.function(media.canPlayType)) {\n return false;\n }\n\n // Check directly if codecs specified\n if (type.includes('codecs=')) {\n return media.canPlayType(type).replace(/no/, '');\n }\n\n // Type specific checks\n if (this.isVideo) {\n switch (type) {\n case 'video/webm':\n return media.canPlayType('video/webm; codecs=\"vp8, vorbis\"').replace(/no/, '');\n\n case 'video/mp4':\n return media.canPlayType('video/mp4; codecs=\"avc1.42E01E, mp4a.40.2\"').replace(/no/, '');\n\n case 'video/ogg':\n return media.canPlayType('video/ogg; codecs=\"theora\"').replace(/no/, '');\n\n default:\n return false;\n }\n } else if (this.isAudio) {\n switch (type) {\n case 'audio/mpeg':\n return media.canPlayType('audio/mpeg;').replace(/no/, '');\n\n case 'audio/ogg':\n return media.canPlayType('audio/ogg; codecs=\"vorbis\"').replace(/no/, '');\n\n case 'audio/wav':\n return media.canPlayType('audio/wav; codecs=\"1\"').replace(/no/, '');\n\n default:\n return false;\n }\n }\n } catch (e) {\n return false;\n }\n\n // If we got this far, we're stuffed\n return false;\n },\n\n // Check for textTracks support\n textTracks: 'textTracks' in document.createElement('video'),\n\n // Check for passive event listener support\n // https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md\n // https://www.youtube.com/watch?v=NPM6172J22g\n passiveListeners: (() => {\n // Test via a getter in the options object to see if the passive property is accessed\n let supported = false;\n try {\n const options = Object.defineProperty({}, 'passive', {\n get() {\n supported = true;\n return null;\n },\n });\n window.addEventListener('test', null, options);\n window.removeEventListener('test', null, options);\n } catch (e) {\n // Do nothing\n }\n\n return supported;\n })(),\n\n // <input type=\"range\"> Sliders\n rangeInput: (() => {\n const range = document.createElement('input');\n range.type = 'range';\n return range.type === 'range';\n })(),\n\n // Touch\n // NOTE: Remember a device can be mouse + touch enabled so we check on first touch event\n touch: 'ontouchstart' in document.documentElement,\n\n // Detect transitions support\n transitions: utils.transitionEndEvent !== false,\n\n // Reduced motion iOS & MacOS setting\n // https://webkit.org/blog/7551/responsive-design-for-motion/\n reducedMotion: 'matchMedia' in window && window.matchMedia('(prefers-reduced-motion)').matches,\n};\n\nexport default support;\n","// ==========================================================================\n// Plyr HTML5 helpers\n// ==========================================================================\n\nimport support from './support';\nimport utils from './utils';\n\nconst html5 = {\n getSources() {\n if (!this.isHTML5) {\n return null;\n }\n\n return this.media.querySelectorAll('source');\n },\n\n // Get quality levels\n getQualityOptions() {\n if (!this.isHTML5) {\n return null;\n }\n\n // Get sources\n const sources = html5.getSources.call(this);\n\n if (utils.is.empty(sources)) {\n return null;\n }\n\n // Get <source> with size attribute\n const sizes = Array.from(sources).filter(source => !utils.is.empty(source.getAttribute('size')));\n\n // If none, bail\n if (utils.is.empty(sizes)) {\n return null;\n }\n\n // Reduce to unique list\n return utils.dedupe(sizes.map(source => Number(source.getAttribute('size'))));\n },\n\n extend() {\n if (!this.isHTML5) {\n return;\n }\n\n const player = this;\n\n // Quality\n Object.defineProperty(player.media, 'quality', {\n get() {\n // Get sources\n const sources = html5.getSources.call(player);\n\n if (utils.is.empty(sources)) {\n return null;\n }\n\n const matches = Array.from(sources).filter(source => source.getAttribute('src') === player.source);\n\n if (utils.is.empty(matches)) {\n return null;\n }\n\n return Number(matches[0].getAttribute('size'));\n },\n set(input) {\n // Get sources\n const sources = html5.getSources.call(player);\n\n if (utils.is.empty(sources)) {\n return;\n }\n\n // Get matches for requested size\n const matches = Array.from(sources).filter(source => Number(source.getAttribute('size')) === input);\n\n // No matches for requested size\n if (utils.is.empty(matches)) {\n return;\n }\n\n // Get supported sources\n const supported = matches.filter(source => support.mime.call(player, source.getAttribute('type')));\n\n // No supported sources\n if (utils.is.empty(supported)) {\n return;\n }\n\n // Trigger change event\n utils.dispatchEvent.call(player, player.media, 'qualityrequested', false, {\n quality: input,\n });\n\n // Get current state\n const { currentTime, playing } = player;\n\n // Set new source\n player.media.src = supported[0].getAttribute('src');\n\n // Restore time\n const onLoadedMetaData = () => {\n player.currentTime = currentTime;\n player.off('loadedmetadata', onLoadedMetaData);\n };\n player.on('loadedmetadata', onLoadedMetaData);\n\n // Load new source\n player.media.load();\n\n // Resume playing\n if (playing) {\n player.play();\n }\n\n // Trigger change event\n utils.dispatchEvent.call(player, player.media, 'qualitychange', false, {\n quality: input,\n });\n },\n });\n },\n\n // Cancel current network requests\n // See https://github.com/sampotts/plyr/issues/174\n cancelRequests() {\n if (!this.isHTML5) {\n return;\n }\n\n // Remove child sources\n utils.removeElement(html5.getSources());\n\n // Set blank video src attribute\n // This is to prevent a MEDIA_ERR_SRC_NOT_SUPPORTED error\n // Info: http://stackoverflow.com/questions/32231579/how-to-properly-dispose-of-an-html5-video-and-close-socket-or-connection\n this.media.setAttribute('src', this.config.blankVideo);\n\n // Load the new empty source\n // This will cancel existing requests\n // See https://github.com/sampotts/plyr/issues/174\n this.media.load();\n\n // Debugging\n this.debug.log('Cancelled network requests');\n },\n};\n\nexport default html5;\n","// ==========================================================================\n// Plyr internationalization\n// ==========================================================================\n\nimport utils from './utils';\n\nconst i18n = {\n get(key = '', config = {}) {\n if (utils.is.empty(key) || utils.is.empty(config)) {\n return '';\n }\n\n let string = utils.getDeep(config.i18n, key);\n\n if (utils.is.empty(string)) {\n return '';\n }\n\n const replace = {\n '{seektime}': config.seekTime,\n '{title}': config.title,\n };\n\n Object.entries(replace).forEach(([\n key,\n value,\n ]) => {\n string = utils.replaceAll(string, key, value);\n });\n\n return string;\n },\n};\n\nexport default i18n;\n","// ==========================================================================\n// Plyr controls\n// ==========================================================================\n\nimport captions from './captions';\nimport html5 from './html5';\nimport i18n from './i18n';\nimport support from './support';\nimport utils from './utils';\n\n// Sniff out the browser\nconst browser = utils.getBrowser();\n\nconst controls = {\n // Get icon URL\n getIconUrl() {\n const url = new URL(this.config.iconUrl, window.location);\n const cors = url.host !== window.location.host || (browser.isIE && !window.svg4everybody);\n\n return {\n url: this.config.iconUrl,\n cors,\n };\n },\n\n // Find the UI controls and store references in custom controls\n // TODO: Allow settings menus with custom controls\n findElements() {\n try {\n this.elements.controls = utils.getElement.call(this, this.config.selectors.controls.wrapper);\n\n // Buttons\n this.elements.buttons = {\n play: utils.getElements.call(this, this.config.selectors.buttons.play),\n pause: utils.getElement.call(this, this.config.selectors.buttons.pause),\n restart: utils.getElement.call(this, this.config.selectors.buttons.restart),\n rewind: utils.getElement.call(this, this.config.selectors.buttons.rewind),\n fastForward: utils.getElement.call(this, this.config.selectors.buttons.fastForward),\n mute: utils.getElement.call(this, this.config.selectors.buttons.mute),\n pip: utils.getElement.call(this, this.config.selectors.buttons.pip),\n airplay: utils.getElement.call(this, this.config.selectors.buttons.airplay),\n settings: utils.getElement.call(this, this.config.selectors.buttons.settings),\n captions: utils.getElement.call(this, this.config.selectors.buttons.captions),\n fullscreen: utils.getElement.call(this, this.config.selectors.buttons.fullscreen),\n };\n\n // Progress\n this.elements.progress = utils.getElement.call(this, this.config.selectors.progress);\n\n // Inputs\n this.elements.inputs = {\n seek: utils.getElement.call(this, this.config.selectors.inputs.seek),\n volume: utils.getElement.call(this, this.config.selectors.inputs.volume),\n };\n\n // Display\n this.elements.display = {\n buffer: utils.getElement.call(this, this.config.selectors.display.buffer),\n currentTime: utils.getElement.call(this, this.config.selectors.display.currentTime),\n duration: utils.getElement.call(this, this.config.selectors.display.duration),\n };\n\n // Seek tooltip\n if (utils.is.element(this.elements.progress)) {\n this.elements.display.seekTooltip = this.elements.progress.querySelector(`.${this.config.classNames.tooltip}`);\n }\n\n return true;\n } catch (error) {\n // Log it\n this.debug.warn('It looks like there is a problem with your custom controls HTML', error);\n\n // Restore native video controls\n this.toggleNativeControls(true);\n\n return false;\n }\n },\n\n // Create <svg> icon\n createIcon(type, attributes) {\n const namespace = 'http://www.w3.org/2000/svg';\n const iconUrl = controls.getIconUrl.call(this);\n const iconPath = `${!iconUrl.cors ? iconUrl.url : ''}#${this.config.iconPrefix}`;\n\n // Create <svg>\n const icon = document.createElementNS(namespace, 'svg');\n utils.setAttributes(\n icon,\n utils.extend(attributes, {\n role: 'presentation',\n focusable: 'false',\n }),\n );\n\n // Create the <use> to reference sprite\n const use = document.createElementNS(namespace, 'use');\n const path = `${iconPath}-${type}`;\n\n // Set `href` attributes\n // https://github.com/sampotts/plyr/issues/460\n // https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/xlink:href\n if ('href' in use) {\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'href', path);\n } else {\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path);\n }\n\n // Add <use> to <svg>\n icon.appendChild(use);\n\n return icon;\n },\n\n // Create hidden text label\n createLabel(type, attr) {\n let text = i18n.get(type, this.config);\n const attributes = Object.assign({}, attr);\n\n switch (type) {\n case 'pip':\n text = 'PIP';\n break;\n\n case 'airplay':\n text = 'AirPlay';\n break;\n\n default:\n break;\n }\n\n if ('class' in attributes) {\n attributes.class += ` ${this.config.classNames.hidden}`;\n } else {\n attributes.class = this.config.classNames.hidden;\n }\n\n return utils.createElement('span', attributes, text);\n },\n\n // Create a badge\n createBadge(text) {\n if (utils.is.empty(text)) {\n return null;\n }\n\n const badge = utils.createElement('span', {\n class: this.config.classNames.menu.value,\n });\n\n badge.appendChild(\n utils.createElement(\n 'span',\n {\n class: this.config.classNames.menu.badge,\n },\n text,\n ),\n );\n\n return badge;\n },\n\n // Create a <button>\n createButton(buttonType, attr) {\n const button = utils.createElement('button');\n const attributes = Object.assign({}, attr);\n let type = utils.toCamelCase(buttonType);\n\n let toggle = false;\n let label;\n let icon;\n let labelPressed;\n let iconPressed;\n\n if (!('type' in attributes)) {\n attributes.type = 'button';\n }\n\n if ('class' in attributes) {\n if (attributes.class.includes(this.config.classNames.control)) {\n attributes.class += ` ${this.config.classNames.control}`;\n }\n } else {\n attributes.class = this.config.classNames.control;\n }\n\n // Large play button\n switch (buttonType) {\n case 'play':\n toggle = true;\n label = 'play';\n labelPressed = 'pause';\n icon = 'play';\n iconPressed = 'pause';\n break;\n\n case 'mute':\n toggle = true;\n label = 'mute';\n labelPressed = 'unmute';\n icon = 'volume';\n iconPressed = 'muted';\n break;\n\n case 'captions':\n toggle = true;\n label = 'enableCaptions';\n labelPressed = 'disableCaptions';\n icon = 'captions-off';\n iconPressed = 'captions-on';\n break;\n\n case 'fullscreen':\n toggle = true;\n label = 'enterFullscreen';\n labelPressed = 'exitFullscreen';\n icon = 'enter-fullscreen';\n iconPressed = 'exit-fullscreen';\n break;\n\n case 'play-large':\n attributes.class += ` ${this.config.classNames.control}--overlaid`;\n type = 'play';\n label = 'play';\n icon = 'play';\n break;\n\n default:\n label = type;\n icon = buttonType;\n }\n\n // Setup toggle icon and labels\n if (toggle) {\n // Icon\n button.appendChild(controls.createIcon.call(this, iconPressed, { class: 'icon--pressed' }));\n button.appendChild(controls.createIcon.call(this, icon, { class: 'icon--not-pressed' }));\n\n // Label/Tooltip\n button.appendChild(controls.createLabel.call(this, labelPressed, { class: 'label--pressed' }));\n button.appendChild(controls.createLabel.call(this, label, { class: 'label--not-pressed' }));\n } else {\n button.appendChild(controls.createIcon.call(this, icon));\n button.appendChild(controls.createLabel.call(this, label));\n }\n\n // Merge attributes\n utils.extend(attributes, utils.getAttributesFromSelector(this.config.selectors.buttons[type], attributes));\n\n utils.setAttributes(button, attributes);\n\n // We have multiple play buttons\n if (type === 'play') {\n if (!utils.is.array(this.elements.buttons[type])) {\n this.elements.buttons[type] = [];\n }\n\n this.elements.buttons[type].push(button);\n } else {\n this.elements.buttons[type] = button;\n }\n\n // Toggle classname when pressed property is set\n const className = this.config.classNames.controlPressed;\n Object.defineProperty(button, 'pressed', {\n enumerable: true,\n get() {\n return utils.hasClass(button, className);\n },\n set(pressed = false) {\n utils.toggleClass(button, className, pressed);\n },\n });\n\n return button;\n },\n\n // Create an <input type='range'>\n createRange(type, attributes) {\n // Seek input\n const input = utils.createElement(\n 'input',\n utils.extend(\n utils.getAttributesFromSelector(this.config.selectors.inputs[type]),\n {\n type: 'range',\n min: 0,\n max: 100,\n step: 0.01,\n value: 0,\n autocomplete: 'off',\n // A11y fixes for https://github.com/sampotts/plyr/issues/905\n role: 'slider',\n 'aria-label': i18n.get(type, this.config),\n 'aria-valuemin': 0,\n 'aria-valuemax': 100,\n 'aria-valuenow': 0,\n },\n attributes,\n ),\n );\n\n this.elements.inputs[type] = input;\n\n // Set the fill for webkit now\n controls.updateRangeFill.call(this, input);\n\n return input;\n },\n\n // Create a <progress>\n createProgress(type, attributes) {\n const progress = utils.createElement(\n 'progress',\n utils.extend(\n utils.getAttributesFromSelector(this.config.selectors.display[type]),\n {\n min: 0,\n max: 100,\n value: 0,\n role: 'presentation',\n 'aria-hidden': true,\n },\n attributes,\n ),\n );\n\n // Create the label inside\n if (type !== 'volume') {\n progress.appendChild(utils.createElement('span', null, '0'));\n\n let suffix = '';\n switch (type) {\n case 'played':\n suffix = i18n.get('played', this.config);\n break;\n\n case 'buffer':\n suffix = i18n.get('buffered', this.config);\n break;\n\n default:\n break;\n }\n\n progress.innerText = `% ${suffix.toLowerCase()}`;\n }\n\n this.elements.display[type] = progress;\n\n return progress;\n },\n\n // Create time display\n createTime(type) {\n const attributes = utils.getAttributesFromSelector(this.config.selectors.display[type]);\n\n const container = utils.createElement(\n 'div',\n utils.extend(attributes, {\n class: `plyr__time ${attributes.class}`,\n 'aria-label': i18n.get(type, this.config),\n }),\n '00:00',\n );\n\n // Reference for updates\n this.elements.display[type] = container;\n\n return container;\n },\n\n // Create a settings menu item\n createMenuItem({value, list, type, title, badge = null, checked = false}) {\n const item = utils.createElement('li');\n\n const label = utils.createElement('label', {\n class: this.config.classNames.control,\n });\n\n const radio = utils.createElement(\n 'input',\n utils.extend(utils.getAttributesFromSelector(this.config.selectors.inputs[type]), {\n type: 'radio',\n name: `plyr-${type}`,\n value,\n checked,\n class: 'plyr__sr-only',\n }),\n );\n\n const faux = utils.createElement('span', { hidden: '' });\n\n label.appendChild(radio);\n label.appendChild(faux);\n label.insertAdjacentHTML('beforeend', title);\n\n if (utils.is.element(badge)) {\n label.appendChild(badge);\n }\n\n item.appendChild(label);\n list.appendChild(item);\n },\n\n // Format a time for display\n formatTime(time = 0, inverted = false) {\n // Bail if the value isn't a number\n if (!utils.is.number(time)) {\n return time;\n }\n\n // Always display hours if duration is over an hour\n const forceHours = utils.getHours(this.duration) > 0;\n\n return utils.formatTime(time, forceHours, inverted);\n },\n\n // Update the displayed time\n updateTimeDisplay(target = null, time = 0, inverted = false) {\n // Bail if there's no element to display or the value isn't a number\n if (!utils.is.element(target) || !utils.is.number(time)) {\n return;\n }\n\n // eslint-disable-next-line no-param-reassign\n target.innerText = controls.formatTime(time, inverted);\n },\n\n // Update volume UI and storage\n updateVolume() {\n if (!this.supported.ui) {\n return;\n }\n\n // Update range\n if (utils.is.element(this.elements.inputs.volume)) {\n controls.setRange.call(this, this.elements.inputs.volume, this.muted ? 0 : this.volume);\n }\n\n // Update mute state\n if (utils.is.element(this.elements.buttons.mute)) {\n this.elements.buttons.mute.pressed = this.muted || this.volume === 0;\n }\n },\n\n // Update seek value and lower fill\n setRange(target, value = 0) {\n if (!utils.is.element(target)) {\n return;\n }\n\n // eslint-disable-next-line\n target.value = value;\n\n // Webkit range fill\n controls.updateRangeFill.call(this, target);\n },\n\n // Update <progress> elements\n updateProgress(event) {\n if (!this.supported.ui || !utils.is.event(event)) {\n return;\n }\n\n let value = 0;\n\n const setProgress = (target, input) => {\n const value = utils.is.number(input) ? input : 0;\n const progress = utils.is.element(target) ? target : this.elements.display.buffer;\n\n // Update value and label\n if (utils.is.element(progress)) {\n progress.value = value;\n\n // Update text label inside\n const label = progress.getElementsByTagName('span')[0];\n if (utils.is.element(label)) {\n label.childNodes[0].nodeValue = value;\n }\n }\n };\n\n if (event) {\n switch (event.type) {\n // Video playing\n case 'timeupdate':\n case 'seeking':\n case 'seeked':\n value = utils.getPercentage(this.currentTime, this.duration);\n\n // Set seek range value only if it's a 'natural' time event\n if (event.type === 'timeupdate') {\n controls.setRange.call(this, this.elements.inputs.seek, value);\n }\n\n break;\n\n // Check buffer status\n case 'playing':\n case 'progress':\n setProgress(this.elements.display.buffer, this.buffered * 100);\n\n break;\n\n default:\n break;\n }\n }\n },\n\n // Webkit polyfill for lower fill range\n updateRangeFill(target) {\n // Get range from event if event passed\n const range = utils.is.event(target) ? target.target : target;\n\n // Needs to be a valid <input type='range'>\n if (!utils.is.element(range) || range.getAttribute('type') !== 'range') {\n return;\n }\n\n // Set aria values for https://github.com/sampotts/plyr/issues/905\n if (utils.matches(range, this.config.selectors.inputs.seek)) {\n range.setAttribute('aria-valuenow', this.currentTime);\n const currentTime = controls.formatTime(this.currentTime);\n const duration = controls.formatTime(this.duration);\n const format = i18n.get('seekLabel', this.config);\n range.setAttribute('aria-valuetext', format.replace('{currentTime}', currentTime).replace('{duration}', duration));\n } else if (utils.matches(range, this.config.selectors.inputs.volume)) {\n const percent = range.value * 100;\n range.setAttribute('aria-valuenow', percent);\n range.setAttribute('aria-valuetext', `${percent}%`);\n } else {\n range.setAttribute('aria-valuenow', range.value);\n }\n\n // WebKit only\n if (!browser.isWebkit) {\n return;\n }\n\n // Set CSS custom property\n range.style.setProperty('--value', `${range.value / range.max * 100}%`);\n },\n\n // Update hover tooltip for seeking\n updateSeekTooltip(event) {\n // Bail if setting not true\n if (\n !this.config.tooltips.seek ||\n !utils.is.element(this.elements.inputs.seek) ||\n !utils.is.element(this.elements.display.seekTooltip) ||\n this.duration === 0\n ) {\n return;\n }\n\n // Calculate percentage\n let percent = 0;\n const clientRect = this.elements.progress.getBoundingClientRect();\n const visible = `${this.config.classNames.tooltip}--visible`;\n\n const toggle = toggle => {\n utils.toggleClass(this.elements.display.seekTooltip, visible, toggle);\n };\n\n // Hide on touch\n if (this.touch) {\n toggle(false);\n return;\n }\n\n // Determine percentage, if already visible\n if (utils.is.event(event)) {\n percent = 100 / clientRect.width * (event.pageX - clientRect.left);\n } else if (utils.hasClass(this.elements.display.seekTooltip, visible)) {\n percent = parseFloat(this.elements.display.seekTooltip.style.left, 10);\n } else {\n return;\n }\n\n // Set bounds\n if (percent < 0) {\n percent = 0;\n } else if (percent > 100) {\n percent = 100;\n }\n\n // Display the time a click would seek to\n controls.updateTimeDisplay.call(this, this.elements.display.seekTooltip, this.duration / 100 * percent);\n\n // Set position\n this.elements.display.seekTooltip.style.left = `${percent}%`;\n\n // Show/hide the tooltip\n // If the event is a moues in/out and percentage is inside bounds\n if (utils.is.event(event) && [\n 'mouseenter',\n 'mouseleave',\n ].includes(event.type)) {\n toggle(event.type === 'mouseenter');\n }\n },\n\n // Handle time change event\n timeUpdate(event) {\n // Only invert if only one time element is displayed and used for both duration and currentTime\n const invert = !utils.is.element(this.elements.display.duration) && this.config.invertTime;\n\n // Duration\n controls.updateTimeDisplay.call(this, this.elements.display.currentTime, invert ? this.duration - this.currentTime : this.currentTime, invert);\n\n // Ignore updates while seeking\n if (event && event.type === 'timeupdate' && this.media.seeking) {\n return;\n }\n\n // Playing progress\n controls.updateProgress.call(this, event);\n },\n\n // Show the duration on metadataloaded or durationchange events\n durationUpdate() {\n // Bail if no UI or durationchange event triggered after playing/seek when invertTime is false\n if (!this.supported.ui || (!this.config.invertTime && this.currentTime)) {\n return;\n }\n\n // Update ARIA values\n if (utils.is.element(this.elements.inputs.seek)) {\n this.elements.inputs.seek.setAttribute('aria-valuemax', this.duration);\n }\n\n // If there's a spot to display duration\n const hasDuration = utils.is.element(this.elements.display.duration);\n\n // If there's only one time display, display duration there\n if (!hasDuration && this.config.displayDuration && this.paused) {\n controls.updateTimeDisplay.call(this, this.elements.display.currentTime, this.duration);\n }\n\n // If there's a duration element, update content\n if (hasDuration) {\n controls.updateTimeDisplay.call(this, this.elements.display.duration, this.duration);\n }\n\n // Update the tooltip (if visible)\n controls.updateSeekTooltip.call(this);\n },\n\n // Hide/show a tab\n toggleTab(setting, toggle) {\n utils.toggleHidden(this.elements.settings.tabs[setting], !toggle);\n },\n\n // Set the quality menu\n // TODO: Vimeo support\n setQualityMenu(options) {\n // Menu required\n if (!utils.is.element(this.elements.settings.panes.quality)) {\n return;\n }\n\n const type = 'quality';\n const list = this.elements.settings.panes.quality.querySelector('ul');\n\n // Set options if passed and filter based on config\n if (utils.is.array(options)) {\n this.options.quality = options.filter(quality => this.config.quality.options.includes(quality));\n }\n\n // Toggle the pane and tab\n const toggle = !utils.is.empty(this.options.quality) && this.options.quality.length > 1;\n controls.toggleTab.call(this, type, toggle);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If we're hiding, nothing more to do\n if (!toggle) {\n return;\n }\n\n // Empty the menu\n utils.emptyElement(list);\n\n // Get the badge HTML for HD, 4K etc\n const getBadge = quality => {\n const label = i18n.get(`qualityBadge.${quality}`, this.config);\n\n if (!label.length) {\n return null;\n }\n\n return controls.createBadge.call(this, label);\n };\n\n // Sort options by the config and then render options\n this.options.quality\n .sort((a, b) => {\n const sorting = this.config.quality.options;\n return sorting.indexOf(a) > sorting.indexOf(b) ? 1 : -1;\n })\n .forEach(quality => {\n controls.createMenuItem.call(this, {\n value: quality,\n list,\n type,\n title: controls.getLabel.call(this, 'quality', quality),\n badge: getBadge(quality),\n });\n });\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Translate a value into a nice label\n getLabel(setting, value) {\n switch (setting) {\n case 'speed':\n return value === 1 ? i18n.get('normal', this.config) : `${value}&times;`;\n\n case 'quality':\n if (utils.is.number(value)) {\n const label = i18n.get(`qualityLabel.${value}`, this.config);\n\n if (!label.length) {\n return `${value}p`;\n }\n\n return label;\n }\n\n return utils.toTitleCase(value);\n\n case 'captions':\n return captions.getLabel.call(this);\n\n default:\n return null;\n }\n },\n\n // Update the selected setting\n updateSetting(setting, container, input) {\n const pane = this.elements.settings.panes[setting];\n let value = null;\n let list = container;\n\n switch (setting) {\n case 'captions':\n value = this.currentTrack;\n break;\n\n default:\n value = !utils.is.empty(input) ? input : this[setting];\n\n // Get default\n if (utils.is.empty(value)) {\n value = this.config[setting].default;\n }\n\n // Unsupported value\n if (!utils.is.empty(this.options[setting]) && !this.options[setting].includes(value)) {\n this.debug.warn(`Unsupported value of '${value}' for ${setting}`);\n return;\n }\n\n // Disabled value\n if (!this.config[setting].options.includes(value)) {\n this.debug.warn(`Disabled value of '${value}' for ${setting}`);\n return;\n }\n\n break;\n }\n\n // Get the list if we need to\n if (!utils.is.element(list)) {\n list = pane && pane.querySelector('ul');\n }\n\n // If there's no list it means it's not been rendered...\n if (!utils.is.element(list)) {\n return;\n }\n\n // Update the label\n const label = this.elements.settings.tabs[setting].querySelector(`.${this.config.classNames.menu.value}`);\n label.innerHTML = controls.getLabel.call(this, setting, value);\n\n // Find the radio option and check it\n const target = list && list.querySelector(`input[value=\"${value}\"]`);\n\n if (utils.is.element(target)) {\n target.checked = true;\n }\n },\n\n // Set the looping options\n /* setLoopMenu() {\n // Menu required\n if (!utils.is.element(this.elements.settings.panes.loop)) {\n return;\n }\n\n const options = ['start', 'end', 'all', 'reset'];\n const list = this.elements.settings.panes.loop.querySelector('ul');\n\n // Show the pane and tab\n utils.toggleHidden(this.elements.settings.tabs.loop, false);\n utils.toggleHidden(this.elements.settings.panes.loop, false);\n\n // Toggle the pane and tab\n const toggle = !utils.is.empty(this.loop.options);\n controls.toggleTab.call(this, 'loop', toggle);\n\n // Empty the menu\n utils.emptyElement(list);\n\n options.forEach(option => {\n const item = utils.createElement('li');\n\n const button = utils.createElement(\n 'button',\n utils.extend(utils.getAttributesFromSelector(this.config.selectors.buttons.loop), {\n type: 'button',\n class: this.config.classNames.control,\n 'data-plyr-loop-action': option,\n }),\n i18n.get(option, this.config)\n );\n\n if (['start', 'end'].includes(option)) {\n const badge = controls.createBadge.call(this, '00:00');\n button.appendChild(badge);\n }\n\n item.appendChild(button);\n list.appendChild(item);\n });\n }, */\n\n // Get current selected caption language\n // TODO: rework this to user the getter in the API?\n\n // Set a list of available captions languages\n setCaptionsMenu() {\n // TODO: Captions or language? Currently it's mixed\n const type = 'captions';\n const list = this.elements.settings.panes.captions.querySelector('ul');\n const tracks = captions.getTracks.call(this);\n\n // Toggle the pane and tab\n controls.toggleTab.call(this, type, tracks.length);\n\n // Empty the menu\n utils.emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If there's no captions, bail\n if (!tracks.length) {\n return;\n }\n\n // Generate options data\n const options = tracks.map((track, value) => ({\n value,\n checked: this.captions.active && this.currentTrack === value,\n title: captions.getLabel.call(this, track),\n badge: track.language && controls.createBadge.call(this, track.language.toUpperCase()),\n list,\n type: 'language',\n }));\n\n // Add the \"Disabled\" option to turn off captions\n options.unshift({\n value: -1,\n checked: !this.captions.active,\n title: i18n.get('disabled', this.config),\n list,\n type: 'language',\n });\n\n // Generate options\n options.forEach(controls.createMenuItem.bind(this));\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Set a list of available captions languages\n setSpeedMenu(options) {\n // Do nothing if not selected\n if (!this.config.controls.includes('settings') || !this.config.settings.includes('speed')) {\n return;\n }\n\n // Menu required\n if (!utils.is.element(this.elements.settings.panes.speed)) {\n return;\n }\n\n const type = 'speed';\n\n // Set the speed options\n if (utils.is.array(options)) {\n this.options.speed = options;\n } else if (this.isHTML5 || this.isVimeo) {\n this.options.speed = [\n 0.5,\n 0.75,\n 1,\n 1.25,\n 1.5,\n 1.75,\n 2,\n ];\n }\n\n // Set options if passed and filter based on config\n this.options.speed = this.options.speed.filter(speed => this.config.speed.options.includes(speed));\n\n // Toggle the pane and tab\n const toggle = !utils.is.empty(this.options.speed) && this.options.speed.length > 1;\n controls.toggleTab.call(this, type, toggle);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If we're hiding, nothing more to do\n if (!toggle) {\n return;\n }\n\n // Get the list to populate\n const list = this.elements.settings.panes.speed.querySelector('ul');\n\n // Empty the menu\n utils.emptyElement(list);\n\n // Create items\n this.options.speed.forEach(speed => {\n controls.createMenuItem.call(this, {\n value: speed,\n list,\n type,\n title: controls.getLabel.call(this, 'speed', speed),\n });\n });\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Check if we need to hide/show the settings menu\n checkMenu() {\n const { tabs } = this.elements.settings;\n const visible = !utils.is.empty(tabs) && Object.values(tabs).some(tab => !tab.hidden);\n\n utils.toggleHidden(this.elements.settings.menu, !visible);\n },\n\n // Show/hide menu\n toggleMenu(event) {\n const { form } = this.elements.settings;\n const button = this.elements.buttons.settings;\n\n // Menu and button are required\n if (!utils.is.element(form) || !utils.is.element(button)) {\n return;\n }\n\n const show = utils.is.boolean(event) ? event : utils.is.element(form) && form.hasAttribute('hidden');\n\n if (utils.is.event(event)) {\n const isMenuItem = utils.is.element(form) && form.contains(event.target);\n const isButton = event.target === this.elements.buttons.settings;\n\n // If the click was inside the form or if the click\n // wasn't the button or menu item and we're trying to\n // show the menu (a doc click shouldn't show the menu)\n if (isMenuItem || (!isMenuItem && !isButton && show)) {\n return;\n }\n\n // Prevent the toggle being caught by the doc listener\n if (isButton) {\n event.stopPropagation();\n }\n }\n\n // Set form and button attributes\n if (utils.is.element(button)) {\n button.setAttribute('aria-expanded', show);\n }\n\n if (utils.is.element(form)) {\n utils.toggleHidden(form, !show);\n utils.toggleClass(this.elements.container, this.config.classNames.menu.open, show);\n\n if (show) {\n form.removeAttribute('tabindex');\n } else {\n form.setAttribute('tabindex', -1);\n }\n }\n },\n\n // Get the natural size of a tab\n getTabSize(tab) {\n const clone = tab.cloneNode(true);\n clone.style.position = 'absolute';\n clone.style.opacity = 0;\n clone.removeAttribute('hidden');\n\n // Prevent input's being unchecked due to the name being identical\n Array.from(clone.querySelectorAll('input[name]')).forEach(input => {\n const name = input.getAttribute('name');\n input.setAttribute('name', `${name}-clone`);\n });\n\n // Append to parent so we get the \"real\" size\n tab.parentNode.appendChild(clone);\n\n // Get the sizes before we remove\n const width = clone.scrollWidth;\n const height = clone.scrollHeight;\n\n // Remove from the DOM\n utils.removeElement(clone);\n\n return {\n width,\n height,\n };\n },\n\n // Toggle Menu\n showTab(target = '') {\n const { menu } = this.elements.settings;\n const pane = document.getElementById(target);\n\n // Nothing to show, bail\n if (!utils.is.element(pane)) {\n return;\n }\n\n // Are we targetting a tab? If not, bail\n const isTab = pane.getAttribute('role') === 'tabpanel';\n if (!isTab) {\n return;\n }\n\n // Hide all other tabs\n // Get other tabs\n const current = menu.querySelector('[role=\"tabpanel\"]:not([hidden])');\n const container = current.parentNode;\n\n // Set other toggles to be expanded false\n Array.from(menu.querySelectorAll(`[aria-controls=\"${current.getAttribute('id')}\"]`)).forEach(toggle => {\n toggle.setAttribute('aria-expanded', false);\n });\n\n // If we can do fancy animations, we'll animate the height/width\n if (support.transitions && !support.reducedMotion) {\n // Set the current width as a base\n container.style.width = `${current.scrollWidth}px`;\n container.style.height = `${current.scrollHeight}px`;\n\n // Get potential sizes\n const size = controls.getTabSize.call(this, pane);\n\n // Restore auto height/width\n const restore = e => {\n // We're only bothered about height and width on the container\n if (e.target !== container || ![\n 'width',\n 'height',\n ].includes(e.propertyName)) {\n return;\n }\n\n // Revert back to auto\n container.style.width = '';\n container.style.height = '';\n\n // Only listen once\n utils.off(container, utils.transitionEndEvent, restore);\n };\n\n // Listen for the transition finishing and restore auto height/width\n utils.on(container, utils.transitionEndEvent, restore);\n\n // Set dimensions to target\n container.style.width = `${size.width}px`;\n container.style.height = `${size.height}px`;\n }\n\n // Set attributes on current tab\n utils.toggleHidden(current, true);\n current.setAttribute('tabindex', -1);\n\n // Set attributes on target\n utils.toggleHidden(pane, false);\n\n const tabs = utils.getElements.call(this, `[aria-controls=\"${target}\"]`);\n Array.from(tabs).forEach(tab => {\n tab.setAttribute('aria-expanded', true);\n });\n pane.removeAttribute('tabindex');\n\n // Focus the first item\n pane.querySelectorAll('button:not(:disabled), input:not(:disabled), [tabindex]')[0].focus();\n },\n\n // Build the default HTML\n // TODO: Set order based on order in the config.controls array?\n create(data) {\n // Do nothing if we want no controls\n if (utils.is.empty(this.config.controls)) {\n return null;\n }\n\n // Create the container\n const container = utils.createElement('div', utils.getAttributesFromSelector(this.config.selectors.controls.wrapper));\n\n // Restart button\n if (this.config.controls.includes('restart')) {\n container.appendChild(controls.createButton.call(this, 'restart'));\n }\n\n // Rewind button\n if (this.config.controls.includes('rewind')) {\n container.appendChild(controls.createButton.call(this, 'rewind'));\n }\n\n // Play/Pause button\n if (this.config.controls.includes('play')) {\n container.appendChild(controls.createButton.call(this, 'play'));\n }\n\n // Fast forward button\n if (this.config.controls.includes('fast-forward')) {\n container.appendChild(controls.createButton.call(this, 'fast-forward'));\n }\n\n // Progress\n if (this.config.controls.includes('progress')) {\n const progress = utils.createElement('div', utils.getAttributesFromSelector(this.config.selectors.progress));\n\n // Seek range slider\n progress.appendChild(\n controls.createRange.call(this, 'seek', {\n id: `plyr-seek-${data.id}`,\n }),\n );\n\n // Buffer progress\n progress.appendChild(controls.createProgress.call(this, 'buffer'));\n\n // TODO: Add loop display indicator\n\n // Seek tooltip\n if (this.config.tooltips.seek) {\n const tooltip = utils.createElement(\n 'span',\n {\n class: this.config.classNames.tooltip,\n },\n '00:00',\n );\n\n progress.appendChild(tooltip);\n this.elements.display.seekTooltip = tooltip;\n }\n\n this.elements.progress = progress;\n container.appendChild(this.elements.progress);\n }\n\n // Media current time display\n if (this.config.controls.includes('current-time')) {\n container.appendChild(controls.createTime.call(this, 'currentTime'));\n }\n\n // Media duration display\n if (this.config.controls.includes('duration')) {\n container.appendChild(controls.createTime.call(this, 'duration'));\n }\n\n // Toggle mute button\n if (this.config.controls.includes('mute')) {\n container.appendChild(controls.createButton.call(this, 'mute'));\n }\n\n // Volume range control\n if (this.config.controls.includes('volume')) {\n const volume = utils.createElement('div', {\n class: 'plyr__volume',\n });\n\n // Set the attributes\n const attributes = {\n max: 1,\n step: 0.05,\n value: this.config.volume,\n };\n\n // Create the volume range slider\n volume.appendChild(\n controls.createRange.call(\n this,\n 'volume',\n utils.extend(attributes, {\n id: `plyr-volume-${data.id}`,\n }),\n ),\n );\n\n this.elements.volume = volume;\n\n container.appendChild(volume);\n }\n\n // Toggle captions button\n if (this.config.controls.includes('captions')) {\n container.appendChild(controls.createButton.call(this, 'captions'));\n }\n\n // Settings button / menu\n if (this.config.controls.includes('settings') && !utils.is.empty(this.config.settings)) {\n const menu = utils.createElement('div', {\n class: 'plyr__menu',\n hidden: '',\n });\n\n menu.appendChild(\n controls.createButton.call(this, 'settings', {\n id: `plyr-settings-toggle-${data.id}`,\n 'aria-haspopup': true,\n 'aria-controls': `plyr-settings-${data.id}`,\n 'aria-expanded': false,\n }),\n );\n\n const form = utils.createElement('form', {\n class: 'plyr__menu__container',\n id: `plyr-settings-${data.id}`,\n hidden: '',\n 'aria-labelled-by': `plyr-settings-toggle-${data.id}`,\n role: 'tablist',\n tabindex: -1,\n });\n\n const inner = utils.createElement('div');\n\n const home = utils.createElement('div', {\n id: `plyr-settings-${data.id}-home`,\n 'aria-labelled-by': `plyr-settings-toggle-${data.id}`,\n role: 'tabpanel',\n });\n\n // Create the tab list\n const tabs = utils.createElement('ul', {\n role: 'tablist',\n });\n\n // Build the tabs\n this.config.settings.forEach(type => {\n const tab = utils.createElement('li', {\n role: 'tab',\n hidden: '',\n });\n\n const button = utils.createElement(\n 'button',\n utils.extend(utils.getAttributesFromSelector(this.config.selectors.buttons.settings), {\n type: 'button',\n class: `${this.config.classNames.control} ${this.config.classNames.control}--forward`,\n id: `plyr-settings-${data.id}-${type}-tab`,\n 'aria-haspopup': true,\n 'aria-controls': `plyr-settings-${data.id}-${type}`,\n 'aria-expanded': false,\n }),\n i18n.get(type, this.config),\n );\n\n const value = utils.createElement('span', {\n class: this.config.classNames.menu.value,\n });\n\n // Speed contains HTML entities\n value.innerHTML = data[type];\n\n button.appendChild(value);\n tab.appendChild(button);\n tabs.appendChild(tab);\n\n this.elements.settings.tabs[type] = tab;\n });\n\n home.appendChild(tabs);\n inner.appendChild(home);\n\n // Build the panes\n this.config.settings.forEach(type => {\n const pane = utils.createElement('div', {\n id: `plyr-settings-${data.id}-${type}`,\n hidden: '',\n 'aria-labelled-by': `plyr-settings-${data.id}-${type}-tab`,\n role: 'tabpanel',\n tabindex: -1,\n });\n\n const back = utils.createElement(\n 'button',\n {\n type: 'button',\n class: `${this.config.classNames.control} ${this.config.classNames.control}--back`,\n 'aria-haspopup': true,\n 'aria-controls': `plyr-settings-${data.id}-home`,\n 'aria-expanded': false,\n },\n i18n.get(type, this.config),\n );\n\n pane.appendChild(back);\n\n const options = utils.createElement('ul');\n\n pane.appendChild(options);\n inner.appendChild(pane);\n\n this.elements.settings.panes[type] = pane;\n });\n\n form.appendChild(inner);\n menu.appendChild(form);\n container.appendChild(menu);\n\n this.elements.settings.form = form;\n this.elements.settings.menu = menu;\n }\n\n // Picture in picture button\n if (this.config.controls.includes('pip') && support.pip) {\n container.appendChild(controls.createButton.call(this, 'pip'));\n }\n\n // Airplay button\n if (this.config.controls.includes('airplay') && support.airplay) {\n container.appendChild(controls.createButton.call(this, 'airplay'));\n }\n\n // Toggle fullscreen button\n if (this.config.controls.includes('fullscreen')) {\n container.appendChild(controls.createButton.call(this, 'fullscreen'));\n }\n\n // Larger overlaid play button\n if (this.config.controls.includes('play-large')) {\n this.elements.container.appendChild(controls.createButton.call(this, 'play-large'));\n }\n\n this.elements.controls = container;\n\n if (this.isHTML5) {\n controls.setQualityMenu.call(this, html5.getQualityOptions.call(this));\n }\n\n controls.setSpeedMenu.call(this);\n\n return container;\n },\n\n // Insert controls\n inject() {\n // Sprite\n if (this.config.loadSprite) {\n const icon = controls.getIconUrl.call(this);\n\n // Only load external sprite using AJAX\n if (icon.cors) {\n utils.loadSprite(icon.url, 'sprite-plyr');\n }\n }\n\n // Create a unique ID\n this.id = Math.floor(Math.random() * 10000);\n\n // Null by default\n let container = null;\n this.elements.controls = null;\n\n // Set template properties\n const props = {\n id: this.id,\n seektime: this.config.seekTime,\n title: this.config.title,\n };\n let update = true;\n\n if (utils.is.string(this.config.controls) || utils.is.element(this.config.controls)) {\n // String or HTMLElement passed as the option\n container = this.config.controls;\n } else if (utils.is.function(this.config.controls)) {\n // A custom function to build controls\n // The function can return a HTMLElement or String\n container = this.config.controls.call(this, props);\n } else {\n // Create controls\n container = controls.create.call(this, {\n id: this.id,\n seektime: this.config.seekTime,\n speed: this.speed,\n quality: this.quality,\n captions: captions.getLabel.call(this),\n // TODO: Looping\n // loop: 'None',\n });\n update = false;\n }\n\n // Replace props with their value\n const replace = input => {\n let result = input;\n\n Object.entries(props).forEach(([\n key,\n value,\n ]) => {\n result = utils.replaceAll(result, `{${key}}`, value);\n });\n\n return result;\n };\n\n // Update markup\n if (update) {\n if (utils.is.string(this.config.controls)) {\n container = replace(container);\n } else if (utils.is.element(container)) {\n container.innerHTML = replace(container.innerHTML);\n }\n }\n\n // Controls container\n let target;\n\n // Inject to custom location\n if (utils.is.string(this.config.selectors.controls.container)) {\n target = document.querySelector(this.config.selectors.controls.container);\n }\n\n // Inject into the container by default\n if (!utils.is.element(target)) {\n target = this.elements.container;\n }\n\n // Inject controls HTML\n if (utils.is.element(container)) {\n target.appendChild(container);\n } else if (container) {\n target.insertAdjacentHTML('beforeend', container);\n }\n\n // Find the elements if need be\n if (!utils.is.element(this.elements.controls)) {\n controls.findElements.call(this);\n }\n\n // Edge sometimes doesn't finish the paint so force a redraw\n if (window.navigator.userAgent.includes('Edge')) {\n utils.repaint(target);\n }\n\n // Setup tooltips\n if (this.config.tooltips.controls) {\n const labels = utils.getElements.call(\n this,\n [\n this.config.selectors.controls.wrapper,\n ' ',\n this.config.selectors.labels,\n ' .',\n this.config.classNames.hidden,\n ].join(''),\n );\n\n Array.from(labels).forEach(label => {\n utils.toggleClass(label, this.config.classNames.hidden, false);\n utils.toggleClass(label, this.config.classNames.tooltip, true);\n });\n }\n },\n};\n\nexport default controls;\n","// ==========================================================================\n// Plyr Captions\n// TODO: Create as class\n// ==========================================================================\n\nimport controls from './controls';\nimport i18n from './i18n';\nimport support from './support';\nimport utils from './utils';\n\nconst captions = {\n // Setup captions\n setup() {\n // Requires UI support\n if (!this.supported.ui) {\n return;\n }\n\n // Only Vimeo and HTML5 video supported at this point\n if (!this.isVideo || this.isYouTube || (this.isHTML5 && !support.textTracks)) {\n // Clear menu and hide\n if (utils.is.array(this.config.controls) && this.config.controls.includes('settings') && this.config.settings.includes('captions')) {\n controls.setCaptionsMenu.call(this);\n }\n\n return;\n }\n\n // Inject the container\n if (!utils.is.element(this.elements.captions)) {\n this.elements.captions = utils.createElement('div', utils.getAttributesFromSelector(this.config.selectors.captions));\n\n utils.insertAfter(this.elements.captions, this.elements.wrapper);\n }\n\n // Get browser info\n const browser = utils.getBrowser();\n\n // Fix IE captions if CORS is used\n // Fetch captions and inject as blobs instead (data URIs not supported!)\n if (browser.isIE && window.URL) {\n const elements = this.media.querySelectorAll('track');\n\n Array.from(elements).forEach(track => {\n const src = track.getAttribute('src');\n const href = utils.parseUrl(src);\n\n if (href.hostname !== window.location.href.hostname && [\n 'http:',\n 'https:',\n ].includes(href.protocol)) {\n utils\n .fetch(src, 'blob')\n .then(blob => {\n track.setAttribute('src', window.URL.createObjectURL(blob));\n })\n .catch(() => {\n utils.removeElement(track);\n });\n }\n });\n }\n\n // Try to load the value from storage\n let active = this.storage.get('captions');\n\n // Otherwise fall back to the default config\n if (!utils.is.boolean(active)) {\n ({ active } = this.config.captions);\n }\n\n // Get language from storage, fallback to config\n let language = this.storage.get('language') || this.config.captions.language;\n if (language === 'auto') {\n [ language ] = (navigator.language || navigator.userLanguage).split('-');\n }\n // Set language and show if active\n captions.setLanguage.call(this, language, active);\n\n // Watch changes to textTracks and update captions menu\n if (this.isHTML5) {\n const trackEvents = this.config.captions.update ? 'addtrack removetrack' : 'removetrack';\n utils.on(this.media.textTracks, trackEvents, captions.update.bind(this));\n }\n\n // Update available languages in list next tick (the event must not be triggered before the listeners)\n setTimeout(captions.update.bind(this), 0);\n },\n\n update() {\n const tracks = captions.getTracks.call(this, true);\n // Get the wanted language\n const { language, meta } = this.captions;\n\n // Handle tracks (add event listener and \"pseudo\"-default)\n if (this.isHTML5 && this.isVideo) {\n tracks\n .filter(track => !meta.get(track))\n .forEach(track => {\n this.debug.log('Track added', track);\n // Attempt to store if the original dom element was \"default\"\n meta.set(track, {\n default: track.mode === 'showing',\n });\n\n // Turn off native caption rendering to avoid double captions\n track.mode = 'hidden';\n\n // Add event listener for cue changes\n utils.on(track, 'cuechange', () => captions.updateCues.call(this));\n });\n }\n\n const trackRemoved = !tracks.find(track => track === this.captions.currentTrackNode);\n const firstMatch = this.language !== language && tracks.find(track => track.language === language);\n\n // Update language if removed or first matching track added\n if (trackRemoved || firstMatch) {\n captions.setLanguage.call(this, language, this.config.captions.active);\n }\n\n // Enable or disable captions based on track length\n utils.toggleClass(this.elements.container, this.config.classNames.captions.enabled, !utils.is.empty(tracks));\n\n // Update available languages in list\n if ((this.config.controls || []).includes('settings') && this.config.settings.includes('captions')) {\n controls.setCaptionsMenu.call(this);\n }\n },\n\n set(index, setLanguage = true, show = true) {\n const tracks = captions.getTracks.call(this);\n\n // Disable captions if setting to -1\n if (index === -1) {\n this.toggleCaptions(false);\n return;\n }\n\n if (!utils.is.number(index)) {\n this.debug.warn('Invalid caption argument', index);\n return;\n }\n\n if (!(index in tracks)) {\n this.debug.warn('Track not found', index);\n return;\n }\n\n if (this.captions.currentTrack !== index) {\n this.captions.currentTrack = index;\n const track = captions.getCurrentTrack.call(this);\n const { language } = track || {};\n\n // Store reference to node for invalidation on remove\n this.captions.currentTrackNode = track;\n\n // Prevent setting language in some cases, since it can violate user's intentions\n if (setLanguage) {\n this.captions.language = language;\n }\n\n // Handle Vimeo captions\n if (this.isVimeo) {\n this.embed.enableTextTrack(language);\n }\n\n // Trigger event\n utils.dispatchEvent.call(this, this.media, 'languagechange');\n }\n\n if (this.isHTML5 && this.isVideo) {\n // If we change the active track while a cue is already displayed we need to update it\n captions.updateCues.call(this);\n }\n\n // Show captions\n if (show) {\n this.toggleCaptions(true);\n }\n },\n\n setLanguage(language, show = true) {\n if (!utils.is.string(language)) {\n this.debug.warn('Invalid language argument', language);\n return;\n }\n // Normalize\n this.captions.language = language.toLowerCase();\n\n // Set currentTrack\n const tracks = captions.getTracks.call(this);\n const track = captions.getCurrentTrack.call(this, true);\n captions.set.call(this, tracks.indexOf(track), false, show);\n },\n\n // Get current valid caption tracks\n // If update is false it will also ignore tracks without metadata\n // This is used to \"freeze\" the language options when captions.update is false\n getTracks(update = false) {\n // Handle media or textTracks missing or null\n const tracks = Array.from((this.media || {}).textTracks || []);\n // For HTML5, use cache instead of current tracks when it exists (if captions.update is false)\n // Filter out removed tracks and tracks that aren't captions/subtitles (for example metadata)\n return tracks\n .filter(track => !this.isHTML5 || update || this.captions.meta.has(track))\n .filter(track => [\n 'captions',\n 'subtitles',\n ].includes(track.kind));\n },\n\n // Get the current track for the current language\n getCurrentTrack(fromLanguage = false) {\n const tracks = captions.getTracks.call(this);\n const sortIsDefault = track => Number((this.captions.meta.get(track) || {}).default);\n const sorted = Array.from(tracks).sort((a, b) => sortIsDefault(b) - sortIsDefault(a));\n return (!fromLanguage && tracks[this.currentTrack]) || sorted.find(track => track.language === this.captions.language) || sorted[0];\n },\n\n // Get UI label for track\n getLabel(track) {\n let currentTrack = track;\n\n if (!utils.is.track(currentTrack) && support.textTracks && this.captions.active) {\n currentTrack = captions.getCurrentTrack.call(this);\n }\n\n if (utils.is.track(currentTrack)) {\n if (!utils.is.empty(currentTrack.label)) {\n return currentTrack.label;\n }\n\n if (!utils.is.empty(currentTrack.language)) {\n return track.language.toUpperCase();\n }\n\n return i18n.get('enabled', this.config);\n }\n\n return i18n.get('disabled', this.config);\n },\n\n // Update captions using current track's active cues\n // Also optional array argument in case there isn't any track (ex: vimeo)\n updateCues(input) {\n // Requires UI\n if (!this.supported.ui) {\n return;\n }\n\n if (!utils.is.element(this.elements.captions)) {\n this.debug.warn('No captions element to render to');\n return;\n }\n\n // Only accept array or empty input\n if (!utils.is.nullOrUndefined(input) && !Array.isArray(input)) {\n this.debug.warn('updateCues: Invalid input', input);\n return;\n }\n\n let cues = input;\n\n // Get cues from track\n if (!cues) {\n const track = captions.getCurrentTrack.call(this);\n cues = Array.from((track || {}).activeCues || [])\n .map(cue => cue.getCueAsHTML())\n .map(utils.getHTML);\n }\n\n // Set new caption text\n const content = cues.map(cueText => cueText.trim()).join('\\n');\n const changed = content !== this.elements.captions.innerHTML;\n\n if (changed) {\n // Empty the container and create a new child element\n utils.emptyElement(this.elements.captions);\n const caption = utils.createElement('span', utils.getAttributesFromSelector(this.config.selectors.caption));\n caption.innerHTML = content;\n this.elements.captions.appendChild(caption);\n\n // Trigger event\n utils.dispatchEvent.call(this, this.media, 'cuechange');\n }\n },\n};\n\nexport default captions;\n","// ==========================================================================\n// Console wrapper\n// ==========================================================================\n\nconst noop = () => {};\n\nexport default class Console {\n constructor(enabled = false) {\n this.enabled = window.console && enabled;\n\n if (this.enabled) {\n this.log('Debugging enabled');\n }\n }\n\n get log() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.log, console) : noop;\n }\n get warn() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.warn, console) : noop;\n }\n get error() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.error, console) : noop;\n }\n}\n","// ==========================================================================\n// Plyr default config\n// ==========================================================================\n\nconst defaults = {\n // Disable\n enabled: true,\n\n // Custom media title\n title: '',\n\n // Logging to console\n debug: false,\n\n // Auto play (if supported)\n autoplay: false,\n\n // Only allow one media playing at once (vimeo only)\n autopause: true,\n\n // Allow inline playback on iOS (this effects YouTube/Vimeo - HTML5 requires the attribute present)\n // TODO: Remove iosNative fullscreen option in favour of this (logic needs work)\n playsinline: true,\n\n // Default time to skip when rewind/fast forward\n seekTime: 10,\n\n // Default volume\n volume: 1,\n muted: false,\n\n // Pass a custom duration\n duration: null,\n\n // Display the media duration on load in the current time position\n // If you have opted to display both duration and currentTime, this is ignored\n displayDuration: true,\n\n // Invert the current time to be a countdown\n invertTime: true,\n\n // Clicking the currentTime inverts it's value to show time left rather than elapsed\n toggleInvert: true,\n\n // Aspect ratio (for embeds)\n ratio: '16:9',\n\n // Click video container to play/pause\n clickToPlay: true,\n\n // Auto hide the controls\n hideControls: true,\n\n // Reset to start when playback ended\n resetOnEnd: false,\n\n // Disable the standard context menu\n disableContextMenu: true,\n\n // Sprite (for icons)\n loadSprite: true,\n iconPrefix: 'plyr',\n iconUrl: 'https://cdn.plyr.io/3.3.12/plyr.svg',\n\n // Blank video (used to prevent errors on source change)\n blankVideo: 'https://cdn.plyr.io/static/blank.mp4',\n\n // Quality default\n quality: {\n default: 576,\n options: [\n 4320,\n 2880,\n 2160,\n 1440,\n 1080,\n 720,\n 576,\n 480,\n 360,\n 240,\n 'default', // YouTube's \"auto\"\n ],\n },\n\n // Set loops\n loop: {\n active: false,\n // start: null,\n // end: null,\n },\n\n // Speed default and options to display\n speed: {\n selected: 1,\n options: [\n 0.5,\n 0.75,\n 1,\n 1.25,\n 1.5,\n 1.75,\n 2,\n ],\n },\n\n // Keyboard shortcut settings\n keyboard: {\n focused: true,\n global: false,\n },\n\n // Display tooltips\n tooltips: {\n controls: false,\n seek: true,\n },\n\n // Captions settings\n captions: {\n active: false,\n language: 'auto',\n // Listen to new tracks added after Plyr is initialized.\n // This is needed for streaming captions, but may result in unselectable options\n update: false,\n },\n\n // Fullscreen settings\n fullscreen: {\n enabled: true, // Allow fullscreen?\n fallback: true, // Fallback for vintage browsers\n iosNative: false, // Use the native fullscreen in iOS (disables custom controls)\n },\n\n // Local storage\n storage: {\n enabled: true,\n key: 'plyr',\n },\n\n // Default controls\n controls: [\n 'play-large',\n // 'restart',\n // 'rewind',\n 'play',\n // 'fast-forward',\n 'progress',\n 'current-time',\n 'mute',\n 'volume',\n 'captions',\n 'settings',\n 'pip',\n 'airplay',\n 'fullscreen',\n ],\n settings: [\n 'captions',\n 'quality',\n 'speed',\n ],\n\n // Localisation\n i18n: {\n restart: 'Restart',\n rewind: 'Rewind {seektime}s',\n play: 'Play',\n pause: 'Pause',\n fastForward: 'Forward {seektime}s',\n seek: 'Seek',\n seekLabel: '{currentTime} of {duration}',\n played: 'Played',\n buffered: 'Buffered',\n currentTime: 'Current time',\n duration: 'Duration',\n volume: 'Volume',\n mute: 'Mute',\n unmute: 'Unmute',\n enableCaptions: 'Enable captions',\n disableCaptions: 'Disable captions',\n enterFullscreen: 'Enter fullscreen',\n exitFullscreen: 'Exit fullscreen',\n frameTitle: 'Player for {title}',\n captions: 'Captions',\n settings: 'Settings',\n menuBack: 'Go back to previous menu',\n speed: 'Speed',\n normal: 'Normal',\n quality: 'Quality',\n loop: 'Loop',\n start: 'Start',\n end: 'End',\n all: 'All',\n reset: 'Reset',\n disabled: 'Disabled',\n enabled: 'Enabled',\n advertisement: 'Ad',\n qualityBadge: {\n 2160: '4K',\n 1440: 'HD',\n 1080: 'HD',\n 720: 'HD',\n 576: 'SD',\n 480: 'SD',\n },\n },\n\n // URLs\n urls: {\n vimeo: {\n sdk: 'https://player.vimeo.com/api/player.js',\n iframe: 'https://player.vimeo.com/video/{0}?{1}',\n api: 'https://vimeo.com/api/v2/video/{0}.json',\n },\n youtube: {\n sdk: 'https://www.youtube.com/iframe_api',\n api: 'https://www.googleapis.com/youtube/v3/videos?id={0}&key={1}&fields=items(snippet(title))&part=snippet',\n },\n googleIMA: {\n sdk: 'https://imasdk.googleapis.com/js/sdkloader/ima3.js',\n },\n },\n\n // Custom control listeners\n listeners: {\n seek: null,\n play: null,\n pause: null,\n restart: null,\n rewind: null,\n fastForward: null,\n mute: null,\n volume: null,\n captions: null,\n fullscreen: null,\n pip: null,\n airplay: null,\n speed: null,\n quality: null,\n loop: null,\n language: null,\n },\n\n // Events to watch and bubble\n events: [\n // Events to watch on HTML5 media elements and bubble\n // https://developer.mozilla.org/en/docs/Web/Guide/Events/Media_events\n 'ended',\n 'progress',\n 'stalled',\n 'playing',\n 'waiting',\n 'canplay',\n 'canplaythrough',\n 'loadstart',\n 'loadeddata',\n 'loadedmetadata',\n 'timeupdate',\n 'volumechange',\n 'play',\n 'pause',\n 'error',\n 'seeking',\n 'seeked',\n 'emptied',\n 'ratechange',\n 'cuechange',\n\n // Custom events\n 'enterfullscreen',\n 'exitfullscreen',\n 'captionsenabled',\n 'captionsdisabled',\n 'languagechange',\n 'controlshidden',\n 'controlsshown',\n 'ready',\n\n // YouTube\n 'statechange',\n 'qualitychange',\n 'qualityrequested',\n\n // Ads\n 'adsloaded',\n 'adscontentpause',\n 'adscontentresume',\n 'adstarted',\n 'adsmidpoint',\n 'adscomplete',\n 'adsallcomplete',\n 'adsimpression',\n 'adsclick',\n ],\n\n // Selectors\n // Change these to match your template if using custom HTML\n selectors: {\n editable: 'input, textarea, select, [contenteditable]',\n container: '.plyr',\n controls: {\n container: null,\n wrapper: '.plyr__controls',\n },\n labels: '[data-plyr]',\n buttons: {\n play: '[data-plyr=\"play\"]',\n pause: '[data-plyr=\"pause\"]',\n restart: '[data-plyr=\"restart\"]',\n rewind: '[data-plyr=\"rewind\"]',\n fastForward: '[data-plyr=\"fast-forward\"]',\n mute: '[data-plyr=\"mute\"]',\n captions: '[data-plyr=\"captions\"]',\n fullscreen: '[data-plyr=\"fullscreen\"]',\n pip: '[data-plyr=\"pip\"]',\n airplay: '[data-plyr=\"airplay\"]',\n settings: '[data-plyr=\"settings\"]',\n loop: '[data-plyr=\"loop\"]',\n },\n inputs: {\n seek: '[data-plyr=\"seek\"]',\n volume: '[data-plyr=\"volume\"]',\n speed: '[data-plyr=\"speed\"]',\n language: '[data-plyr=\"language\"]',\n quality: '[data-plyr=\"quality\"]',\n },\n display: {\n currentTime: '.plyr__time--current',\n duration: '.plyr__time--duration',\n buffer: '.plyr__progress__buffer',\n loop: '.plyr__progress__loop', // Used later\n volume: '.plyr__volume--display',\n },\n progress: '.plyr__progress',\n captions: '.plyr__captions',\n caption: '.plyr__caption',\n menu: {\n quality: '.js-plyr__menu__list--quality',\n },\n },\n\n // Class hooks added to the player in different states\n classNames: {\n type: 'plyr--{0}',\n provider: 'plyr--{0}',\n video: 'plyr__video-wrapper',\n embed: 'plyr__video-embed',\n embedContainer: 'plyr__video-embed__container',\n poster: 'plyr__poster',\n posterEnabled: 'plyr__poster-enabled',\n ads: 'plyr__ads',\n control: 'plyr__control',\n controlPressed: 'plyr__control--pressed',\n playing: 'plyr--playing',\n paused: 'plyr--paused',\n stopped: 'plyr--stopped',\n loading: 'plyr--loading',\n hover: 'plyr--hover',\n tooltip: 'plyr__tooltip',\n cues: 'plyr__cues',\n hidden: 'plyr__sr-only',\n hideControls: 'plyr--hide-controls',\n isIos: 'plyr--is-ios',\n isTouch: 'plyr--is-touch',\n uiSupported: 'plyr--full-ui',\n noTransition: 'plyr--no-transition',\n menu: {\n value: 'plyr__menu__value',\n badge: 'plyr__badge',\n open: 'plyr--menu-open',\n },\n captions: {\n enabled: 'plyr--captions-enabled',\n active: 'plyr--captions-active',\n },\n fullscreen: {\n enabled: 'plyr--fullscreen-enabled',\n fallback: 'plyr--fullscreen-fallback',\n },\n pip: {\n supported: 'plyr--pip-supported',\n active: 'plyr--pip-active',\n },\n airplay: {\n supported: 'plyr--airplay-supported',\n active: 'plyr--airplay-active',\n },\n tabFocus: 'plyr__tab-focus',\n },\n\n // Embed attributes\n attributes: {\n embed: {\n provider: 'data-plyr-provider',\n id: 'data-plyr-embed-id',\n },\n },\n\n // API keys\n keys: {\n google: null,\n },\n\n // Advertisements plugin\n // Register for an account here: http://vi.ai/publisher-video-monetization/?aid=plyrio\n ads: {\n enabled: false,\n publisherId: '',\n },\n};\n\nexport default defaults;\n","// ==========================================================================\n// Fullscreen wrapper\n// https://developer.mozilla.org/en-US/docs/Web/API/Fullscreen_API#prefixing\n// ==========================================================================\n\nimport utils from './utils';\n\nconst browser = utils.getBrowser();\n\nfunction onChange() {\n if (!this.enabled) {\n return;\n }\n\n // Update toggle button\n const button = this.player.elements.buttons.fullscreen;\n if (utils.is.element(button)) {\n button.pressed = this.active;\n }\n\n // Trigger an event\n utils.dispatchEvent.call(this.player, this.target, this.active ? 'enterfullscreen' : 'exitfullscreen', true);\n\n // Trap focus in container\n if (!browser.isIos) {\n utils.trapFocus.call(this.player, this.target, this.active);\n }\n}\n\nfunction toggleFallback(toggle = false) {\n // Store or restore scroll position\n if (toggle) {\n this.scrollPosition = {\n x: window.scrollX || 0,\n y: window.scrollY || 0,\n };\n } else {\n window.scrollTo(this.scrollPosition.x, this.scrollPosition.y);\n }\n\n // Toggle scroll\n document.body.style.overflow = toggle ? 'hidden' : '';\n\n // Toggle class hook\n utils.toggleClass(this.target, this.player.config.classNames.fullscreen.fallback, toggle);\n\n // Toggle button and fire events\n onChange.call(this);\n}\n\nclass Fullscreen {\n constructor(player) {\n // Keep reference to parent\n this.player = player;\n\n // Get prefix\n this.prefix = Fullscreen.prefix;\n this.property = Fullscreen.property;\n\n // Scroll position\n this.scrollPosition = { x: 0, y: 0 };\n\n // Register event listeners\n // Handle event (incase user presses escape etc)\n utils.on(document, this.prefix === 'ms' ? 'MSFullscreenChange' : `${this.prefix}fullscreenchange`, () => {\n // TODO: Filter for target??\n onChange.call(this);\n });\n\n // Fullscreen toggle on double click\n utils.on(this.player.elements.container, 'dblclick', event => {\n // Ignore double click in controls\n if (utils.is.element(this.player.elements.controls) && this.player.elements.controls.contains(event.target)) {\n return;\n }\n\n this.toggle();\n });\n\n // Update the UI\n this.update();\n }\n\n // Determine if native supported\n static get native() {\n return !!(document.fullscreenEnabled || document.webkitFullscreenEnabled || document.mozFullScreenEnabled || document.msFullscreenEnabled);\n }\n\n // Get the prefix for handlers\n static get prefix() {\n // No prefix\n if (utils.is.function(document.exitFullscreen)) {\n return '';\n }\n\n // Check for fullscreen support by vendor prefix\n let value = '';\n const prefixes = [\n 'webkit',\n 'moz',\n 'ms',\n ];\n\n prefixes.some(pre => {\n if (utils.is.function(document[`${pre}ExitFullscreen`]) || utils.is.function(document[`${pre}CancelFullScreen`])) {\n value = pre;\n return true;\n }\n\n return false;\n });\n\n return value;\n }\n\n static get property() {\n return this.prefix === 'moz' ? 'FullScreen' : 'Fullscreen';\n }\n\n // Determine if fullscreen is enabled\n get enabled() {\n return (\n (Fullscreen.native || this.player.config.fullscreen.fallback) &&\n this.player.config.fullscreen.enabled &&\n this.player.supported.ui &&\n this.player.isVideo\n );\n }\n\n // Get active state\n get active() {\n if (!this.enabled) {\n return false;\n }\n\n // Fallback using classname\n if (!Fullscreen.native) {\n return utils.hasClass(this.target, this.player.config.classNames.fullscreen.fallback);\n }\n\n const element = !this.prefix ? document.fullscreenElement : document[`${this.prefix}${this.property}Element`];\n\n return element === this.target;\n }\n\n // Get target element\n get target() {\n return browser.isIos && this.player.config.fullscreen.iosNative ? this.player.media : this.player.elements.container;\n }\n\n // Update UI\n update() {\n if (this.enabled) {\n this.player.debug.log(`${Fullscreen.native ? 'Native' : 'Fallback'} fullscreen enabled`);\n } else {\n this.player.debug.log('Fullscreen not supported and fallback disabled');\n }\n\n // Add styling hook to show button\n utils.toggleClass(this.player.elements.container, this.player.config.classNames.fullscreen.enabled, this.enabled);\n }\n\n // Make an element fullscreen\n enter() {\n if (!this.enabled) {\n return;\n }\n\n // iOS native fullscreen doesn't need the request step\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n if (this.player.playing) {\n this.target.webkitEnterFullscreen();\n }\n } else if (!Fullscreen.native) {\n toggleFallback.call(this, true);\n } else if (!this.prefix) {\n this.target.requestFullscreen();\n } else if (!utils.is.empty(this.prefix)) {\n this.target[`${this.prefix}Request${this.property}`]();\n }\n }\n\n // Bail from fullscreen\n exit() {\n if (!this.enabled) {\n return;\n }\n\n // iOS native fullscreen\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n this.target.webkitExitFullscreen();\n this.player.play();\n } else if (!Fullscreen.native) {\n toggleFallback.call(this, false);\n } else if (!this.prefix) {\n (document.cancelFullScreen || document.exitFullscreen).call(document);\n } else if (!utils.is.empty(this.prefix)) {\n const action = this.prefix === 'moz' ? 'Cancel' : 'Exit';\n document[`${this.prefix}${action}${this.property}`]();\n }\n }\n\n // Toggle state\n toggle() {\n if (!this.active) {\n this.enter();\n } else {\n this.exit();\n }\n }\n}\n\nexport default Fullscreen;\n","// ==========================================================================\n// Plyr UI\n// ==========================================================================\n\nimport captions from './captions';\nimport controls from './controls';\nimport i18n from './i18n';\nimport support from './support';\nimport utils from './utils';\n\n// Sniff out the browser\nconst browser = utils.getBrowser();\n\nconst ui = {\n addStyleHook() {\n utils.toggleClass(this.elements.container, this.config.selectors.container.replace('.', ''), true);\n utils.toggleClass(this.elements.container, this.config.classNames.uiSupported, this.supported.ui);\n },\n\n // Toggle native HTML5 media controls\n toggleNativeControls(toggle = false) {\n if (toggle && this.isHTML5) {\n this.media.setAttribute('controls', '');\n } else {\n this.media.removeAttribute('controls');\n }\n },\n\n // Setup the UI\n build() {\n // Re-attach media element listeners\n // TODO: Use event bubbling?\n this.listeners.media();\n\n // Don't setup interface if no support\n if (!this.supported.ui) {\n this.debug.warn(`Basic support only for ${this.provider} ${this.type}`);\n\n // Restore native controls\n ui.toggleNativeControls.call(this, true);\n\n // Bail\n return;\n }\n\n // Inject custom controls if not present\n if (!utils.is.element(this.elements.controls)) {\n // Inject custom controls\n controls.inject.call(this);\n\n // Re-attach control listeners\n this.listeners.controls();\n }\n\n // Remove native controls\n ui.toggleNativeControls.call(this);\n\n // Setup captions for HTML5\n if (this.isHTML5) {\n captions.setup.call(this);\n }\n\n // Reset volume\n this.volume = null;\n\n // Reset mute state\n this.muted = null;\n\n // Reset speed\n this.speed = null;\n\n // Reset loop state\n this.loop = null;\n\n // Reset quality setting\n this.quality = null;\n\n // Reset volume display\n controls.updateVolume.call(this);\n\n // Reset time display\n controls.timeUpdate.call(this);\n\n // Update the UI\n ui.checkPlaying.call(this);\n\n // Check for picture-in-picture support\n utils.toggleClass(this.elements.container, this.config.classNames.pip.supported, support.pip && this.isHTML5 && this.isVideo);\n\n // Check for airplay support\n utils.toggleClass(this.elements.container, this.config.classNames.airplay.supported, support.airplay && this.isHTML5);\n\n // Add iOS class\n utils.toggleClass(this.elements.container, this.config.classNames.isIos, browser.isIos);\n\n // Add touch class\n utils.toggleClass(this.elements.container, this.config.classNames.isTouch, this.touch);\n\n // Ready for API calls\n this.ready = true;\n\n // Ready event at end of execution stack\n setTimeout(() => {\n utils.dispatchEvent.call(this, this.media, 'ready');\n }, 0);\n\n // Set the title\n ui.setTitle.call(this);\n\n // Assure the poster image is set, if the property was added before the element was created\n if (this.poster && this.elements.poster && !this.elements.poster.style.backgroundImage) {\n ui.setPoster.call(this, this.poster);\n }\n\n // Manually set the duration if user has overridden it.\n // The event listeners for it doesn't get called if preload is disabled (#701)\n if (this.config.duration) {\n controls.durationUpdate.call(this);\n }\n },\n\n // Setup aria attribute for play and iframe title\n setTitle() {\n // Find the current text\n let label = i18n.get('play', this.config);\n\n // If there's a media title set, use that for the label\n if (utils.is.string(this.config.title) && !utils.is.empty(this.config.title)) {\n label += `, ${this.config.title}`;\n }\n\n // If there's a play button, set label\n if (utils.is.nodeList(this.elements.buttons.play)) {\n Array.from(this.elements.buttons.play).forEach(button => {\n button.setAttribute('aria-label', label);\n });\n }\n\n // Set iframe title\n // https://github.com/sampotts/plyr/issues/124\n if (this.isEmbed) {\n const iframe = utils.getElement.call(this, 'iframe');\n\n if (!utils.is.element(iframe)) {\n return;\n }\n\n // Default to media type\n const title = !utils.is.empty(this.config.title) ? this.config.title : 'video';\n const format = i18n.get('frameTitle', this.config);\n\n iframe.setAttribute('title', format.replace('{title}', title));\n }\n },\n\n // Toggle poster\n togglePoster(enable) {\n utils.toggleClass(this.elements.container, this.config.classNames.posterEnabled, enable);\n },\n\n // Set the poster image (async)\n setPoster(poster) {\n // Set property regardless of validity\n this.media.setAttribute('poster', poster);\n\n // Bail if element is missing\n if (!utils.is.element(this.elements.poster)) {\n return Promise.reject();\n }\n\n // Load the image, and set poster if successful\n const loadPromise = utils.loadImage(poster).then(() => {\n this.elements.poster.style.backgroundImage = `url('${poster}')`;\n Object.assign(this.elements.poster.style, {\n backgroundImage: `url('${poster}')`,\n // Reset backgroundSize as well (since it can be set to \"cover\" for padded thumbnails for youtube)\n backgroundSize: '',\n });\n ui.togglePoster.call(this, true);\n return poster;\n });\n\n // Hide the element if the poster can't be loaded (otherwise it will just be a black element covering the video)\n loadPromise.catch(() => ui.togglePoster.call(this, false));\n\n // Return the promise so the caller can use it as well\n return loadPromise;\n },\n\n // Check playing state\n checkPlaying(event) {\n // Class hooks\n utils.toggleClass(this.elements.container, this.config.classNames.playing, this.playing);\n utils.toggleClass(this.elements.container, this.config.classNames.paused, this.paused);\n utils.toggleClass(this.elements.container, this.config.classNames.stopped, this.stopped);\n\n // Set state\n Array.from(this.elements.buttons.play).forEach(target => {\n target.pressed = this.playing;\n });\n\n // Only update controls on non timeupdate events\n if (utils.is.event(event) && event.type === 'timeupdate') {\n return;\n }\n\n // Toggle controls\n ui.toggleControls.call(this);\n },\n\n // Check if media is loading\n checkLoading(event) {\n this.loading = [\n 'stalled',\n 'waiting',\n ].includes(event.type);\n\n // Clear timer\n clearTimeout(this.timers.loading);\n\n // Timer to prevent flicker when seeking\n this.timers.loading = setTimeout(() => {\n // Update progress bar loading class state\n utils.toggleClass(this.elements.container, this.config.classNames.loading, this.loading);\n\n // Update controls visibility\n ui.toggleControls.call(this);\n }, this.loading ? 250 : 0);\n },\n\n // Toggle controls based on state and `force` argument\n toggleControls(force) {\n const { controls } = this.elements;\n\n if (controls && this.config.hideControls) {\n // Show controls if force, loading, paused, or button interaction, otherwise hide\n this.toggleControls(Boolean(force || this.loading || this.paused || controls.pressed || controls.hover));\n }\n },\n};\n\nexport default ui;\n","// ==========================================================================\n// Plyr Event Listeners\n// ==========================================================================\n\nimport controls from './controls';\nimport ui from './ui';\nimport utils from './utils';\n\n// Sniff out the browser\nconst browser = utils.getBrowser();\n\nclass Listeners {\n constructor(player) {\n this.player = player;\n this.lastKey = null;\n\n this.handleKey = this.handleKey.bind(this);\n this.toggleMenu = this.toggleMenu.bind(this);\n this.firstTouch = this.firstTouch.bind(this);\n }\n\n // Handle key presses\n handleKey(event) {\n const code = event.keyCode ? event.keyCode : event.which;\n const pressed = event.type === 'keydown';\n const repeat = pressed && code === this.lastKey;\n\n // Bail if a modifier key is set\n if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) {\n return;\n }\n\n // If the event is bubbled from the media element\n // Firefox doesn't get the keycode for whatever reason\n if (!utils.is.number(code)) {\n return;\n }\n\n // Seek by the number keys\n const seekByKey = () => {\n // Divide the max duration into 10th's and times by the number value\n this.player.currentTime = this.player.duration / 10 * (code - 48);\n };\n\n // Handle the key on keydown\n // Reset on keyup\n if (pressed) {\n // Which keycodes should we prevent default\n const preventDefault = [\n 48,\n 49,\n 50,\n 51,\n 52,\n 53,\n 54,\n 56,\n 57,\n 32,\n 75,\n 38,\n 40,\n 77,\n 39,\n 37,\n 70,\n 67,\n 73,\n 76,\n 79,\n ];\n\n // Check focused element\n // and if the focused element is not editable (e.g. text input)\n // and any that accept key input http://webaim.org/techniques/keyboard/\n const focused = utils.getFocusElement();\n if (utils.is.element(focused) && (\n focused !== this.player.elements.inputs.seek &&\n utils.matches(focused, this.player.config.selectors.editable))\n ) {\n return;\n }\n\n // If the code is found prevent default (e.g. prevent scrolling for arrows)\n if (preventDefault.includes(code)) {\n event.preventDefault();\n event.stopPropagation();\n }\n\n switch (code) {\n case 48:\n case 49:\n case 50:\n case 51:\n case 52:\n case 53:\n case 54:\n case 55:\n case 56:\n case 57:\n // 0-9\n if (!repeat) {\n seekByKey();\n }\n break;\n\n case 32:\n case 75:\n // Space and K key\n if (!repeat) {\n this.player.togglePlay();\n }\n break;\n\n case 38:\n // Arrow up\n this.player.increaseVolume(0.1);\n break;\n\n case 40:\n // Arrow down\n this.player.decreaseVolume(0.1);\n break;\n\n case 77:\n // M key\n if (!repeat) {\n this.player.muted = !this.player.muted;\n }\n break;\n\n case 39:\n // Arrow forward\n this.player.forward();\n break;\n\n case 37:\n // Arrow back\n this.player.rewind();\n break;\n\n case 70:\n // F key\n this.player.fullscreen.toggle();\n break;\n\n case 67:\n // C key\n if (!repeat) {\n this.player.toggleCaptions();\n }\n break;\n\n case 76:\n // L key\n this.player.loop = !this.player.loop;\n break;\n\n /* case 73:\n this.setLoop('start');\n break;\n\n case 76:\n this.setLoop();\n break;\n\n case 79:\n this.setLoop('end');\n break; */\n\n default:\n break;\n }\n\n // Escape is handle natively when in full screen\n // So we only need to worry about non native\n if (!this.player.fullscreen.enabled && this.player.fullscreen.active && code === 27) {\n this.player.fullscreen.toggle();\n }\n\n // Store last code for next cycle\n this.lastKey = code;\n } else {\n this.lastKey = null;\n }\n }\n\n // Toggle menu\n toggleMenu(event) {\n controls.toggleMenu.call(this.player, event);\n }\n\n // Device is touch enabled\n firstTouch() {\n this.player.touch = true;\n\n // Add touch class\n utils.toggleClass(this.player.elements.container, this.player.config.classNames.isTouch, true);\n\n // Clean up\n utils.off(document.body, 'touchstart', this.firstTouch);\n }\n\n // Global window & document listeners\n global(toggle = true) {\n // Keyboard shortcuts\n if (this.player.config.keyboard.global) {\n utils.toggleListener(window, 'keydown keyup', this.handleKey, toggle, false);\n }\n\n // Click anywhere closes menu\n utils.toggleListener(document.body, 'click', this.toggleMenu, toggle);\n\n // Detect touch by events\n utils.on(document.body, 'touchstart', this.firstTouch);\n }\n\n // Container listeners\n container() {\n // Keyboard shortcuts\n if (!this.player.config.keyboard.global && this.player.config.keyboard.focused) {\n utils.on(this.player.elements.container, 'keydown keyup', this.handleKey, false);\n }\n\n // Detect tab focus\n // Remove class on blur/focusout\n utils.on(this.player.elements.container, 'focusout', event => {\n utils.toggleClass(event.target, this.player.config.classNames.tabFocus, false);\n });\n\n // Add classname to tabbed elements\n utils.on(this.player.elements.container, 'keydown', event => {\n if (event.keyCode !== 9) {\n return;\n }\n\n // Delay the adding of classname until the focus has changed\n // This event fires before the focusin event\n setTimeout(() => {\n utils.toggleClass(utils.getFocusElement(), this.player.config.classNames.tabFocus, true);\n }, 0);\n });\n\n // Toggle controls on mouse events and entering fullscreen\n utils.on(this.player.elements.container, 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen', event => {\n const { controls } = this.player.elements;\n\n // Remove button states for fullscreen\n if (event.type === 'enterfullscreen') {\n controls.pressed = false;\n controls.hover = false;\n }\n\n // Show, then hide after a timeout unless another control event occurs\n const show = [\n 'touchstart',\n 'touchmove',\n 'mousemove',\n ].includes(event.type);\n\n let delay = 0;\n\n if (show) {\n ui.toggleControls.call(this.player, true);\n // Use longer timeout for touch devices\n delay = this.player.touch ? 3000 : 2000;\n }\n\n // Clear timer\n clearTimeout(this.player.timers.controls);\n // Timer to prevent flicker when seeking\n this.player.timers.controls = setTimeout(() => ui.toggleControls.call(this.player, false), delay);\n });\n }\n\n // Listen for media events\n media() {\n // Time change on media\n utils.on(this.player.media, 'timeupdate seeking seeked', event => controls.timeUpdate.call(this.player, event));\n\n // Display duration\n utils.on(this.player.media, 'durationchange loadeddata loadedmetadata', event => controls.durationUpdate.call(this.player, event));\n\n // Check for audio tracks on load\n // We can't use `loadedmetadata` as it doesn't seem to have audio tracks at that point\n utils.on(this.player.media, 'loadeddata', () => {\n utils.toggleHidden(this.player.elements.volume, !this.player.hasAudio);\n utils.toggleHidden(this.player.elements.buttons.mute, !this.player.hasAudio);\n });\n\n // Handle the media finishing\n utils.on(this.player.media, 'ended', () => {\n // Show poster on end\n if (this.player.isHTML5 && this.player.isVideo && this.player.config.resetOnEnd) {\n // Restart\n this.player.restart();\n }\n });\n\n // Check for buffer progress\n utils.on(this.player.media, 'progress playing seeking seeked', event => controls.updateProgress.call(this.player, event));\n\n // Handle volume changes\n utils.on(this.player.media, 'volumechange', event => controls.updateVolume.call(this.player, event));\n\n // Handle play/pause\n utils.on(this.player.media, 'playing play pause ended emptied timeupdate', event => ui.checkPlaying.call(this.player, event));\n\n // Loading state\n utils.on(this.player.media, 'waiting canplay seeked playing', event => ui.checkLoading.call(this.player, event));\n\n // If autoplay, then load advertisement if required\n // TODO: Show some sort of loading state while the ad manager loads else there's a delay before ad shows\n utils.on(this.player.media, 'playing', () => {\n if (!this.player.ads) {\n return;\n }\n\n // If ads are enabled, wait for them first\n if (this.player.ads.enabled && !this.player.ads.initialized) {\n // Wait for manager response\n this.player.ads.managerPromise.then(() => this.player.ads.play()).catch(() => this.player.play());\n }\n });\n\n // Click video\n if (this.player.supported.ui && this.player.config.clickToPlay && !this.player.isAudio) {\n // Re-fetch the wrapper\n const wrapper = utils.getElement.call(this.player, `.${this.player.config.classNames.video}`);\n\n // Bail if there's no wrapper (this should never happen)\n if (!utils.is.element(wrapper)) {\n return;\n }\n\n // On click play, pause ore restart\n utils.on(wrapper, 'click', () => {\n // Touch devices will just show controls (if we're hiding controls)\n if (this.player.config.hideControls && this.player.touch && !this.player.paused) {\n return;\n }\n\n if (this.player.paused) {\n this.player.play();\n } else if (this.player.ended) {\n this.player.restart();\n this.player.play();\n } else {\n this.player.pause();\n }\n });\n }\n\n // Disable right click\n if (this.player.supported.ui && this.player.config.disableContextMenu) {\n utils.on(\n this.player.elements.wrapper,\n 'contextmenu',\n event => {\n event.preventDefault();\n },\n false,\n );\n }\n\n // Volume change\n utils.on(this.player.media, 'volumechange', () => {\n // Save to storage\n this.player.storage.set({ volume: this.player.volume, muted: this.player.muted });\n });\n\n // Speed change\n utils.on(this.player.media, 'ratechange', () => {\n // Update UI\n controls.updateSetting.call(this.player, 'speed');\n\n // Save to storage\n this.player.storage.set({ speed: this.player.speed });\n });\n\n // Quality request\n utils.on(this.player.media, 'qualityrequested', event => {\n // Save to storage\n this.player.storage.set({ quality: event.detail.quality });\n });\n\n // Quality change\n utils.on(this.player.media, 'qualitychange', event => {\n // Update UI\n controls.updateSetting.call(this.player, 'quality', null, event.detail.quality);\n });\n\n // Caption language change\n utils.on(this.player.media, 'languagechange', () => {\n // Update UI\n controls.updateSetting.call(this.player, 'captions');\n\n // Save to storage\n this.player.storage.set({ language: this.player.language });\n });\n\n // Captions toggle\n utils.on(this.player.media, 'captionsenabled captionsdisabled', () => {\n // Update UI\n controls.updateSetting.call(this.player, 'captions');\n\n // Save to storage\n this.player.storage.set({ captions: this.player.captions.active });\n });\n\n // Proxy events to container\n // Bubble up key events for Edge\n utils.on(this.player.media, this.player.config.events.concat([\n 'keyup',\n 'keydown',\n ]).join(' '), event => {\n let {detail = {}} = event;\n\n // Get error details from media\n if (event.type === 'error') {\n detail = this.player.media.error;\n }\n\n utils.dispatchEvent.call(this.player, this.player.elements.container, event.type, true, detail);\n });\n }\n\n // Listen for control events\n controls() {\n // IE doesn't support input event, so we fallback to change\n const inputEvent = browser.isIE ? 'change' : 'input';\n\n // Run default and custom handlers\n const proxy = (event, defaultHandler, customHandlerKey) => {\n const customHandler = this.player.config.listeners[customHandlerKey];\n const hasCustomHandler = utils.is.function(customHandler);\n let returned = true;\n\n // Execute custom handler\n if (hasCustomHandler) {\n returned = customHandler.call(this.player, event);\n }\n\n // Only call default handler if not prevented in custom handler\n if (returned && utils.is.function(defaultHandler)) {\n defaultHandler.call(this.player, event);\n }\n };\n\n // Trigger custom and default handlers\n const on = (element, type, defaultHandler, customHandlerKey, passive = true) => {\n const customHandler = this.player.config.listeners[customHandlerKey];\n const hasCustomHandler = utils.is.function(customHandler);\n\n utils.on(element, type, event => proxy(event, defaultHandler, customHandlerKey), passive && !hasCustomHandler);\n };\n\n // Play/pause toggle\n on(this.player.elements.buttons.play, 'click', this.player.togglePlay, 'play');\n\n // Pause\n on(this.player.elements.buttons.restart, 'click', this.player.restart, 'restart');\n\n // Rewind\n on(this.player.elements.buttons.rewind, 'click', this.player.rewind, 'rewind');\n\n // Rewind\n on(this.player.elements.buttons.fastForward, 'click', this.player.forward, 'fastForward');\n\n // Mute toggle\n on(\n this.player.elements.buttons.mute,\n 'click',\n () => {\n this.player.muted = !this.player.muted;\n },\n 'mute',\n );\n\n // Captions toggle\n on(this.player.elements.buttons.captions, 'click', this.player.toggleCaptions);\n\n // Fullscreen toggle\n on(\n this.player.elements.buttons.fullscreen,\n 'click',\n () => {\n this.player.fullscreen.toggle();\n },\n 'fullscreen',\n );\n\n // Picture-in-Picture\n on(\n this.player.elements.buttons.pip,\n 'click',\n () => {\n this.player.pip = 'toggle';\n },\n 'pip',\n );\n\n // Airplay\n on(this.player.elements.buttons.airplay, 'click', this.player.airplay, 'airplay');\n\n // Settings menu\n on(this.player.elements.buttons.settings, 'click', event => {\n controls.toggleMenu.call(this.player, event);\n });\n\n // Settings menu\n on(this.player.elements.settings.form, 'click', event => {\n event.stopPropagation();\n\n // Go back to home tab on click\n const showHomeTab = () => {\n const id = `plyr-settings-${this.player.id}-home`;\n controls.showTab.call(this.player, id);\n };\n\n // Settings menu items - use event delegation as items are added/removed\n if (utils.matches(event.target, this.player.config.selectors.inputs.language)) {\n proxy(\n event,\n () => {\n this.player.currentTrack = Number(event.target.value);\n showHomeTab();\n },\n 'language',\n );\n } else if (utils.matches(event.target, this.player.config.selectors.inputs.quality)) {\n proxy(\n event,\n () => {\n this.player.quality = event.target.value;\n showHomeTab();\n },\n 'quality',\n );\n } else if (utils.matches(event.target, this.player.config.selectors.inputs.speed)) {\n proxy(\n event,\n () => {\n this.player.speed = parseFloat(event.target.value);\n showHomeTab();\n },\n 'speed',\n );\n } else {\n const tab = event.target;\n controls.showTab.call(this.player, tab.getAttribute('aria-controls'));\n }\n });\n\n // Set range input alternative \"value\", which matches the tooltip time (#954)\n on(this.player.elements.inputs.seek, 'mousedown mousemove', event => {\n const clientRect = this.player.elements.progress.getBoundingClientRect();\n const percent = 100 / clientRect.width * (event.pageX - clientRect.left);\n event.currentTarget.setAttribute('seek-value', percent);\n });\n\n // Pause while seeking\n on(this.player.elements.inputs.seek, 'mousedown mouseup keydown keyup touchstart touchend', event => {\n const seek = event.currentTarget;\n\n const code = event.keyCode ? event.keyCode : event.which;\n const eventType = event.type;\n\n if ((eventType === 'keydown' || eventType === 'keyup') && (code !== 39 && code !== 37)) {\n return;\n }\n // Was playing before?\n const play = seek.hasAttribute('play-on-seeked');\n\n // Done seeking\n const done = [\n 'mouseup',\n 'touchend',\n 'keyup',\n ].includes(event.type);\n\n // If we're done seeking and it was playing, resume playback\n if (play && done) {\n seek.removeAttribute('play-on-seeked');\n this.player.play();\n } else if (!done && this.player.playing) {\n seek.setAttribute('play-on-seeked', '');\n this.player.pause();\n }\n });\n\n // Seek\n on(\n this.player.elements.inputs.seek,\n inputEvent,\n event => {\n const seek = event.currentTarget;\n\n // If it exists, use seek-value instead of \"value\" for consistency with tooltip time (#954)\n let seekTo = seek.getAttribute('seek-value');\n\n if (utils.is.empty(seekTo)) {\n seekTo = seek.value;\n }\n\n seek.removeAttribute('seek-value');\n\n this.player.currentTime = seekTo / seek.max * this.player.duration;\n },\n 'seek',\n );\n\n // Current time invert\n // Only if one time element is used for both currentTime and duration\n if (this.player.config.toggleInvert && !utils.is.element(this.player.elements.display.duration)) {\n on(this.player.elements.display.currentTime, 'click', () => {\n // Do nothing if we're at the start\n if (this.player.currentTime === 0) {\n return;\n }\n\n this.player.config.invertTime = !this.player.config.invertTime;\n\n controls.timeUpdate.call(this.player);\n });\n }\n\n // Volume\n on(\n this.player.elements.inputs.volume,\n inputEvent,\n event => {\n this.player.volume = event.target.value;\n },\n 'volume',\n );\n\n // Polyfill for lower fill in <input type=\"range\"> for webkit\n if (browser.isWebkit) {\n on(utils.getElements.call(this.player, 'input[type=\"range\"]'), 'input', event => {\n controls.updateRangeFill.call(this.player, event.target);\n });\n }\n\n // Seek tooltip\n on(this.player.elements.progress, 'mouseenter mouseleave mousemove', event => controls.updateSeekTooltip.call(this.player, event));\n\n // Update controls.hover state (used for ui.toggleControls to avoid hiding when interacting)\n on(this.player.elements.controls, 'mouseenter mouseleave', event => {\n this.player.elements.controls.hover = !this.player.touch && event.type === 'mouseenter';\n });\n\n // Update controls.pressed state (used for ui.toggleControls to avoid hiding when interacting)\n on(this.player.elements.controls, 'mousedown mouseup touchstart touchend touchcancel', event => {\n this.player.elements.controls.pressed = [\n 'mousedown',\n 'touchstart',\n ].includes(event.type);\n });\n\n // Focus in/out on controls\n on(this.player.elements.controls, 'focusin focusout', event => {\n const { config, elements, timers } = this.player;\n\n // Skip transition to prevent focus from scrolling the parent element\n utils.toggleClass(elements.controls, config.classNames.noTransition, event.type === 'focusin');\n\n // Toggle\n ui.toggleControls.call(this.player, event.type === 'focusin');\n\n // If focusin, hide again after delay\n if (event.type === 'focusin') {\n // Restore transition\n setTimeout(() => {\n utils.toggleClass(elements.controls, config.classNames.noTransition, false);\n }, 0);\n\n // Delay a little more for keyboard users\n const delay = this.touch ? 3000 : 4000;\n\n // Clear timer\n clearTimeout(timers.controls);\n // Hide\n timers.controls = setTimeout(() => ui.toggleControls.call(this.player, false), delay);\n }\n });\n\n // Mouse wheel for volume\n on(\n this.player.elements.inputs.volume,\n 'wheel',\n event => {\n // Detect \"natural\" scroll - suppored on OS X Safari only\n // Other browsers on OS X will be inverted until support improves\n const inverted = event.webkitDirectionInvertedFromDevice;\n const step = 1 / 50;\n let direction = 0;\n\n // Scroll down (or up on natural) to decrease\n if (event.deltaY < 0 || event.deltaX > 0) {\n if (inverted) {\n this.player.decreaseVolume(step);\n direction = -1;\n } else {\n this.player.increaseVolume(step);\n direction = 1;\n }\n }\n\n // Scroll up (or down on natural) to increase\n if (event.deltaY > 0 || event.deltaX < 0) {\n if (inverted) {\n this.player.increaseVolume(step);\n direction = 1;\n } else {\n this.player.decreaseVolume(step);\n direction = -1;\n }\n }\n\n // Don't break page scrolling at max and min\n if ((direction === 1 && this.player.media.volume < 1) || (direction === -1 && this.player.media.volume > 0)) {\n event.preventDefault();\n }\n },\n 'volume',\n false,\n );\n }\n\n // Reset on destroy\n clear() {\n this.global(false);\n }\n}\n\nexport default Listeners;\n","// ==========================================================================\n// Vimeo plugin\n// ==========================================================================\n\nimport captions from './../captions';\nimport controls from './../controls';\nimport ui from './../ui';\nimport utils from './../utils';\n\n// Set playback state and trigger change (only on actual change)\nfunction assurePlaybackState(play) {\n if (play && !this.embed.hasPlayed) {\n this.embed.hasPlayed = true;\n }\n if (this.media.paused === play) {\n this.media.paused = !play;\n utils.dispatchEvent.call(this, this.media, play ? 'play' : 'pause');\n }\n}\n\nconst vimeo = {\n setup() {\n // Add embed class for responsive\n utils.toggleClass(this.elements.wrapper, this.config.classNames.embed, true);\n\n // Set intial ratio\n vimeo.setAspectRatio.call(this);\n\n // Load the API if not already\n if (!utils.is.object(window.Vimeo)) {\n utils\n .loadScript(this.config.urls.vimeo.sdk)\n .then(() => {\n vimeo.ready.call(this);\n })\n .catch(error => {\n this.debug.warn('Vimeo API failed to load', error);\n });\n } else {\n vimeo.ready.call(this);\n }\n },\n\n // Set aspect ratio\n // For Vimeo we have an extra 300% height <div> to hide the standard controls and UI\n setAspectRatio(input) {\n const ratio = utils.is.string(input) ? input.split(':') : this.config.ratio.split(':');\n const padding = 100 / ratio[0] * ratio[1];\n this.elements.wrapper.style.paddingBottom = `${padding}%`;\n\n if (this.supported.ui) {\n const height = 240;\n const offset = (height - padding) / (height / 50);\n\n this.media.style.transform = `translateY(-${offset}%)`;\n }\n },\n\n // API Ready\n ready() {\n const player = this;\n\n // Get Vimeo params for the iframe\n const options = {\n loop: player.config.loop.active,\n autoplay: player.autoplay,\n // muted: player.muted,\n byline: false,\n portrait: false,\n title: false,\n speed: true,\n transparent: 0,\n gesture: 'media',\n playsinline: !this.config.fullscreen.iosNative,\n };\n const params = utils.buildUrlParams(options);\n\n // Get the source URL or ID\n let source = player.media.getAttribute('src');\n\n // Get from <div> if needed\n if (utils.is.empty(source)) {\n source = player.media.getAttribute(player.config.attributes.embed.id);\n }\n\n const id = utils.parseVimeoId(source);\n\n // Build an iframe\n const iframe = utils.createElement('iframe');\n const src = utils.format(player.config.urls.vimeo.iframe, id, params);\n iframe.setAttribute('src', src);\n iframe.setAttribute('allowfullscreen', '');\n iframe.setAttribute('allowtransparency', '');\n iframe.setAttribute('allow', 'autoplay');\n\n // Inject the package\n const wrapper = utils.createElement('div', { class: player.config.classNames.embedContainer });\n wrapper.appendChild(iframe);\n player.media = utils.replaceElement(wrapper, player.media);\n\n // Get poster image\n utils.fetch(utils.format(player.config.urls.vimeo.api, id), 'json').then(response => {\n if (utils.is.empty(response)) {\n return;\n }\n\n // Get the URL for thumbnail\n const url = new URL(response[0].thumbnail_large);\n\n // Get original image\n url.pathname = `${url.pathname.split('_')[0]}.jpg`;\n\n // Set and show poster\n ui.setPoster.call(player, url.href);\n });\n\n // Setup instance\n // https://github.com/vimeo/player.js\n player.embed = new window.Vimeo.Player(iframe, {\n autopause: player.config.autopause,\n muted: player.muted,\n });\n\n player.media.paused = true;\n player.media.currentTime = 0;\n\n // Disable native text track rendering\n if (player.supported.ui) {\n player.embed.disableTextTrack();\n }\n\n // Create a faux HTML5 API using the Vimeo API\n player.media.play = () => {\n assurePlaybackState.call(player, true);\n return player.embed.play();\n };\n\n player.media.pause = () => {\n assurePlaybackState.call(player, false);\n return player.embed.pause();\n };\n\n player.media.stop = () => {\n player.pause();\n player.currentTime = 0;\n };\n\n // Seeking\n let { currentTime } = player.media;\n Object.defineProperty(player.media, 'currentTime', {\n get() {\n return currentTime;\n },\n set(time) {\n // Vimeo will automatically play on seek if the video hasn't been played before\n\n // Get current paused state and volume etc\n const { embed, media, paused, volume } = player;\n const restorePause = paused && !embed.hasPlayed;\n\n // Set seeking state and trigger event\n media.seeking = true;\n utils.dispatchEvent.call(player, media, 'seeking');\n\n // If paused, mute until seek is complete\n Promise.resolve(restorePause && embed.setVolume(0))\n // Seek\n .then(() => embed.setCurrentTime(time))\n // Restore paused\n .then(() => restorePause && embed.pause())\n // Restore volume\n .then(() => restorePause && embed.setVolume(volume))\n .catch(() => {\n // Do nothing\n });\n },\n });\n\n // Playback speed\n let speed = player.config.speed.selected;\n Object.defineProperty(player.media, 'playbackRate', {\n get() {\n return speed;\n },\n set(input) {\n player.embed\n .setPlaybackRate(input)\n .then(() => {\n speed = input;\n utils.dispatchEvent.call(player, player.media, 'ratechange');\n })\n .catch(error => {\n // Hide menu item (and menu if empty)\n if (error.name === 'Error') {\n controls.setSpeedMenu.call(player, []);\n }\n });\n },\n });\n\n // Volume\n let { volume } = player.config;\n Object.defineProperty(player.media, 'volume', {\n get() {\n return volume;\n },\n set(input) {\n player.embed.setVolume(input).then(() => {\n volume = input;\n utils.dispatchEvent.call(player, player.media, 'volumechange');\n });\n },\n });\n\n // Muted\n let { muted } = player.config;\n Object.defineProperty(player.media, 'muted', {\n get() {\n return muted;\n },\n set(input) {\n const toggle = utils.is.boolean(input) ? input : false;\n\n player.embed.setVolume(toggle ? 0 : player.config.volume).then(() => {\n muted = toggle;\n utils.dispatchEvent.call(player, player.media, 'volumechange');\n });\n },\n });\n\n // Loop\n let { loop } = player.config;\n Object.defineProperty(player.media, 'loop', {\n get() {\n return loop;\n },\n set(input) {\n const toggle = utils.is.boolean(input) ? input : player.config.loop.active;\n\n player.embed.setLoop(toggle).then(() => {\n loop = toggle;\n });\n },\n });\n\n // Source\n let currentSrc;\n player.embed\n .getVideoUrl()\n .then(value => {\n currentSrc = value;\n })\n .catch(error => {\n this.debug.warn(error);\n });\n\n Object.defineProperty(player.media, 'currentSrc', {\n get() {\n return currentSrc;\n },\n });\n\n // Ended\n Object.defineProperty(player.media, 'ended', {\n get() {\n return player.currentTime === player.duration;\n },\n });\n\n // Set aspect ratio based on video size\n Promise.all([\n player.embed.getVideoWidth(),\n player.embed.getVideoHeight(),\n ]).then(dimensions => {\n const ratio = utils.getAspectRatio(dimensions[0], dimensions[1]);\n vimeo.setAspectRatio.call(this, ratio);\n });\n\n // Set autopause\n player.embed.setAutopause(player.config.autopause).then(state => {\n player.config.autopause = state;\n });\n\n // Get title\n player.embed.getVideoTitle().then(title => {\n player.config.title = title;\n ui.setTitle.call(this);\n });\n\n // Get current time\n player.embed.getCurrentTime().then(value => {\n currentTime = value;\n utils.dispatchEvent.call(player, player.media, 'timeupdate');\n });\n\n // Get duration\n player.embed.getDuration().then(value => {\n player.media.duration = value;\n utils.dispatchEvent.call(player, player.media, 'durationchange');\n });\n\n // Get captions\n player.embed.getTextTracks().then(tracks => {\n player.media.textTracks = tracks;\n captions.setup.call(player);\n });\n\n player.embed.on('cuechange', ({ cues = [] }) => {\n const strippedCues = cues.map(cue => utils.stripHTML(cue.text));\n captions.updateCues.call(player, strippedCues);\n });\n\n player.embed.on('loaded', () => {\n // Assure state and events are updated on autoplay\n player.embed.getPaused().then(paused => {\n assurePlaybackState.call(player, !paused);\n if (!paused) {\n utils.dispatchEvent.call(player, player.media, 'playing');\n }\n });\n\n if (utils.is.element(player.embed.element) && player.supported.ui) {\n const frame = player.embed.element;\n\n // Fix keyboard focus issues\n // https://github.com/sampotts/plyr/issues/317\n frame.setAttribute('tabindex', -1);\n }\n });\n\n player.embed.on('play', () => {\n assurePlaybackState.call(player, true);\n utils.dispatchEvent.call(player, player.media, 'playing');\n });\n\n player.embed.on('pause', () => {\n assurePlaybackState.call(player, false);\n });\n\n player.embed.on('timeupdate', data => {\n player.media.seeking = false;\n currentTime = data.seconds;\n utils.dispatchEvent.call(player, player.media, 'timeupdate');\n });\n\n player.embed.on('progress', data => {\n player.media.buffered = data.percent;\n utils.dispatchEvent.call(player, player.media, 'progress');\n\n // Check all loaded\n if (parseInt(data.percent, 10) === 1) {\n utils.dispatchEvent.call(player, player.media, 'canplaythrough');\n }\n\n // Get duration as if we do it before load, it gives an incorrect value\n // https://github.com/sampotts/plyr/issues/891\n player.embed.getDuration().then(value => {\n if (value !== player.media.duration) {\n player.media.duration = value;\n utils.dispatchEvent.call(player, player.media, 'durationchange');\n }\n });\n });\n\n player.embed.on('seeked', () => {\n player.media.seeking = false;\n utils.dispatchEvent.call(player, player.media, 'seeked');\n });\n\n player.embed.on('ended', () => {\n player.media.paused = true;\n utils.dispatchEvent.call(player, player.media, 'ended');\n });\n\n player.embed.on('error', detail => {\n player.media.error = detail;\n utils.dispatchEvent.call(player, player.media, 'error');\n });\n\n // Rebuild UI\n setTimeout(() => ui.build.call(player), 0);\n },\n};\n\nexport default vimeo;\n","// ==========================================================================\n// YouTube plugin\n// ==========================================================================\n\nimport controls from './../controls';\nimport ui from './../ui';\nimport utils from './../utils';\n\n// Standardise YouTube quality unit\nfunction mapQualityUnit(input) {\n switch (input) {\n case 'hd2160':\n return 2160;\n\n case 2160:\n return 'hd2160';\n\n case 'hd1440':\n return 1440;\n\n case 1440:\n return 'hd1440';\n\n case 'hd1080':\n return 1080;\n\n case 1080:\n return 'hd1080';\n\n case 'hd720':\n return 720;\n\n case 720:\n return 'hd720';\n\n case 'large':\n return 480;\n\n case 480:\n return 'large';\n\n case 'medium':\n return 360;\n\n case 360:\n return 'medium';\n\n case 'small':\n return 240;\n\n case 240:\n return 'small';\n\n default:\n return 'default';\n }\n}\n\nfunction mapQualityUnits(levels) {\n if (utils.is.empty(levels)) {\n return levels;\n }\n\n return utils.dedupe(levels.map(level => mapQualityUnit(level)));\n}\n\n// Set playback state and trigger change (only on actual change)\nfunction assurePlaybackState(play) {\n if (play && !this.embed.hasPlayed) {\n this.embed.hasPlayed = true;\n }\n if (this.media.paused === play) {\n this.media.paused = !play;\n utils.dispatchEvent.call(this, this.media, play ? 'play' : 'pause');\n }\n}\n\nconst youtube = {\n setup() {\n // Add embed class for responsive\n utils.toggleClass(this.elements.wrapper, this.config.classNames.embed, true);\n\n // Set aspect ratio\n youtube.setAspectRatio.call(this);\n\n // Setup API\n if (utils.is.object(window.YT) && utils.is.function(window.YT.Player)) {\n youtube.ready.call(this);\n } else {\n // Load the API\n utils.loadScript(this.config.urls.youtube.sdk).catch(error => {\n this.debug.warn('YouTube API failed to load', error);\n });\n\n // Setup callback for the API\n // YouTube has it's own system of course...\n window.onYouTubeReadyCallbacks = window.onYouTubeReadyCallbacks || [];\n\n // Add to queue\n window.onYouTubeReadyCallbacks.push(() => {\n youtube.ready.call(this);\n });\n\n // Set callback to process queue\n window.onYouTubeIframeAPIReady = () => {\n window.onYouTubeReadyCallbacks.forEach(callback => {\n callback();\n });\n };\n }\n },\n\n // Get the media title\n getTitle(videoId) {\n // Try via undocumented API method first\n // This method disappears now and then though...\n // https://github.com/sampotts/plyr/issues/709\n if (utils.is.function(this.embed.getVideoData)) {\n const { title } = this.embed.getVideoData();\n\n if (utils.is.empty(title)) {\n this.config.title = title;\n ui.setTitle.call(this);\n return;\n }\n }\n\n // Or via Google API\n const key = this.config.keys.google;\n if (utils.is.string(key) && !utils.is.empty(key)) {\n const url = utils.format(this.config.urls.youtube.api, videoId, key);\n\n utils\n .fetch(url)\n .then(result => {\n if (utils.is.object(result)) {\n this.config.title = result.items[0].snippet.title;\n ui.setTitle.call(this);\n }\n })\n .catch(() => {});\n }\n },\n\n // Set aspect ratio\n setAspectRatio() {\n const ratio = this.config.ratio.split(':');\n this.elements.wrapper.style.paddingBottom = `${100 / ratio[0] * ratio[1]}%`;\n },\n\n // API ready\n ready() {\n const player = this;\n\n // Ignore already setup (race condition)\n const currentId = player.media.getAttribute('id');\n if (!utils.is.empty(currentId) && currentId.startsWith('youtube-')) {\n return;\n }\n\n // Get the source URL or ID\n let source = player.media.getAttribute('src');\n\n // Get from <div> if needed\n if (utils.is.empty(source)) {\n source = player.media.getAttribute(this.config.attributes.embed.id);\n }\n\n // Replace the <iframe> with a <div> due to YouTube API issues\n const videoId = utils.parseYouTubeId(source);\n const id = utils.generateId(player.provider);\n const container = utils.createElement('div', { id });\n player.media = utils.replaceElement(container, player.media);\n\n // Set poster image\n const posterSrc = format => `https://img.youtube.com/vi/${videoId}/${format}default.jpg`;\n\n // Check thumbnail images in order of quality, but reject fallback thumbnails (120px wide)\n utils.loadImage(posterSrc('maxres'), 121) // Higest quality and unpadded\n .catch(() => utils.loadImage(posterSrc('sd'), 121)) // 480p padded 4:3\n .catch(() => utils.loadImage(posterSrc('hq'))) // 360p padded 4:3. Always exists\n .then(image => ui.setPoster.call(player, image.src))\n .then(posterSrc => {\n // If the image is padded, use background-size \"cover\" instead (like youtube does too with their posters)\n if (!posterSrc.includes('maxres')) {\n player.elements.poster.style.backgroundSize = 'cover';\n }\n });\n\n // Setup instance\n // https://developers.google.com/youtube/iframe_api_reference\n player.embed = new window.YT.Player(id, {\n videoId,\n playerVars: {\n autoplay: player.config.autoplay ? 1 : 0, // Autoplay\n controls: player.supported.ui ? 0 : 1, // Only show controls if not fully supported\n rel: 0, // No related vids\n showinfo: 0, // Hide info\n iv_load_policy: 3, // Hide annotations\n modestbranding: 1, // Hide logos as much as possible (they still show one in the corner when paused)\n disablekb: 1, // Disable keyboard as we handle it\n playsinline: 1, // Allow iOS inline playback\n\n // Tracking for stats\n // origin: window ? `${window.location.protocol}//${window.location.host}` : null,\n widget_referrer: window ? window.location.href : null,\n\n // Captions are flaky on YouTube\n cc_load_policy: player.captions.active ? 1 : 0,\n cc_lang_pref: player.config.captions.language,\n },\n events: {\n onError(event) {\n // If we've already fired an error, don't do it again\n // YouTube fires onError twice\n if (utils.is.object(player.media.error)) {\n return;\n }\n\n const detail = {\n code: event.data,\n };\n\n // Messages copied from https://developers.google.com/youtube/iframe_api_reference#onError\n switch (event.data) {\n case 2:\n detail.message =\n 'The request contains an invalid parameter value. For example, this error occurs if you specify a video ID that does not have 11 characters, or if the video ID contains invalid characters, such as exclamation points or asterisks.';\n break;\n\n case 5:\n detail.message =\n 'The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.';\n break;\n\n case 100:\n detail.message =\n 'The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.';\n break;\n\n case 101:\n case 150:\n detail.message = 'The owner of the requested video does not allow it to be played in embedded players.';\n break;\n\n default:\n detail.message = 'An unknown error occured';\n break;\n }\n\n player.media.error = detail;\n\n utils.dispatchEvent.call(player, player.media, 'error');\n },\n onPlaybackQualityChange() {\n utils.dispatchEvent.call(player, player.media, 'qualitychange', false, {\n quality: player.media.quality,\n });\n },\n onPlaybackRateChange(event) {\n // Get the instance\n const instance = event.target;\n\n // Get current speed\n player.media.playbackRate = instance.getPlaybackRate();\n\n utils.dispatchEvent.call(player, player.media, 'ratechange');\n },\n onReady(event) {\n // Get the instance\n const instance = event.target;\n\n // Get the title\n youtube.getTitle.call(player, videoId);\n\n // Create a faux HTML5 API using the YouTube API\n player.media.play = () => {\n assurePlaybackState.call(player, true);\n instance.playVideo();\n };\n\n player.media.pause = () => {\n assurePlaybackState.call(player, false);\n instance.pauseVideo();\n };\n\n player.media.stop = () => {\n instance.stopVideo();\n };\n\n player.media.duration = instance.getDuration();\n player.media.paused = true;\n\n // Seeking\n player.media.currentTime = 0;\n Object.defineProperty(player.media, 'currentTime', {\n get() {\n return Number(instance.getCurrentTime());\n },\n set(time) {\n // If paused, mute audio preventively (YouTube starts playing on seek if the video hasn't been played yet).\n if (player.paused) {\n player.embed.mute();\n }\n\n // Set seeking state and trigger event\n player.media.seeking = true;\n utils.dispatchEvent.call(player, player.media, 'seeking');\n\n // Seek after events sent\n instance.seekTo(time);\n },\n });\n\n // Playback speed\n Object.defineProperty(player.media, 'playbackRate', {\n get() {\n return instance.getPlaybackRate();\n },\n set(input) {\n instance.setPlaybackRate(input);\n },\n });\n\n // Quality\n Object.defineProperty(player.media, 'quality', {\n get() {\n return mapQualityUnit(instance.getPlaybackQuality());\n },\n set(input) {\n const quality = input;\n\n // Set via API\n instance.setPlaybackQuality(mapQualityUnit(quality));\n\n // Trigger request event\n utils.dispatchEvent.call(player, player.media, 'qualityrequested', false, {\n quality,\n });\n },\n });\n\n // Volume\n let { volume } = player.config;\n Object.defineProperty(player.media, 'volume', {\n get() {\n return volume;\n },\n set(input) {\n volume = input;\n instance.setVolume(volume * 100);\n utils.dispatchEvent.call(player, player.media, 'volumechange');\n },\n });\n\n // Muted\n let { muted } = player.config;\n Object.defineProperty(player.media, 'muted', {\n get() {\n return muted;\n },\n set(input) {\n const toggle = utils.is.boolean(input) ? input : muted;\n muted = toggle;\n instance[toggle ? 'mute' : 'unMute']();\n utils.dispatchEvent.call(player, player.media, 'volumechange');\n },\n });\n\n // Source\n Object.defineProperty(player.media, 'currentSrc', {\n get() {\n return instance.getVideoUrl();\n },\n });\n\n // Ended\n Object.defineProperty(player.media, 'ended', {\n get() {\n return player.currentTime === player.duration;\n },\n });\n\n // Get available speeds\n player.options.speed = instance.getAvailablePlaybackRates();\n\n // Set the tabindex to avoid focus entering iframe\n if (player.supported.ui) {\n player.media.setAttribute('tabindex', -1);\n }\n\n utils.dispatchEvent.call(player, player.media, 'timeupdate');\n utils.dispatchEvent.call(player, player.media, 'durationchange');\n\n // Reset timer\n clearInterval(player.timers.buffering);\n\n // Setup buffering\n player.timers.buffering = setInterval(() => {\n // Get loaded % from YouTube\n player.media.buffered = instance.getVideoLoadedFraction();\n\n // Trigger progress only when we actually buffer something\n if (player.media.lastBuffered === null || player.media.lastBuffered < player.media.buffered) {\n utils.dispatchEvent.call(player, player.media, 'progress');\n }\n\n // Set last buffer point\n player.media.lastBuffered = player.media.buffered;\n\n // Bail if we're at 100%\n if (player.media.buffered === 1) {\n clearInterval(player.timers.buffering);\n\n // Trigger event\n utils.dispatchEvent.call(player, player.media, 'canplaythrough');\n }\n }, 200);\n\n // Rebuild UI\n setTimeout(() => ui.build.call(player), 50);\n },\n onStateChange(event) {\n // Get the instance\n const instance = event.target;\n\n // Reset timer\n clearInterval(player.timers.playing);\n\n const seeked = player.media.seeking && [\n 1,\n 2,\n ].includes(event.data);\n\n if (seeked) {\n // Unset seeking and fire seeked event\n player.media.seeking = false;\n utils.dispatchEvent.call(player, player.media, 'seeked');\n }\n\n // Handle events\n // -1 Unstarted\n // 0 Ended\n // 1 Playing\n // 2 Paused\n // 3 Buffering\n // 5 Video cued\n switch (event.data) {\n case -1:\n // Update scrubber\n utils.dispatchEvent.call(player, player.media, 'timeupdate');\n\n // Get loaded % from YouTube\n player.media.buffered = instance.getVideoLoadedFraction();\n utils.dispatchEvent.call(player, player.media, 'progress');\n\n break;\n\n case 0:\n assurePlaybackState.call(player, false);\n\n // YouTube doesn't support loop for a single video, so mimick it.\n if (player.media.loop) {\n // YouTube needs a call to `stopVideo` before playing again\n instance.stopVideo();\n instance.playVideo();\n } else {\n utils.dispatchEvent.call(player, player.media, 'ended');\n }\n\n break;\n\n case 1:\n // Restore paused state (YouTube starts playing on seek if the video hasn't been played yet)\n if (player.media.paused && !player.embed.hasPlayed) {\n player.media.pause();\n } else {\n assurePlaybackState.call(player, true);\n\n utils.dispatchEvent.call(player, player.media, 'playing');\n\n // Poll to get playback progress\n player.timers.playing = setInterval(() => {\n utils.dispatchEvent.call(player, player.media, 'timeupdate');\n }, 50);\n\n // Check duration again due to YouTube bug\n // https://github.com/sampotts/plyr/issues/374\n // https://code.google.com/p/gdata-issues/issues/detail?id=8690\n if (player.media.duration !== instance.getDuration()) {\n player.media.duration = instance.getDuration();\n utils.dispatchEvent.call(player, player.media, 'durationchange');\n }\n\n // Get quality\n controls.setQualityMenu.call(player, mapQualityUnits(instance.getAvailableQualityLevels()));\n }\n\n break;\n\n case 2:\n // Restore audio (YouTube starts playing on seek if the video hasn't been played yet)\n if (!player.muted) {\n player.embed.unMute();\n }\n assurePlaybackState.call(player, false);\n\n break;\n\n default:\n break;\n }\n\n utils.dispatchEvent.call(player, player.elements.container, 'statechange', false, {\n code: event.data,\n });\n },\n },\n });\n },\n};\n\nexport default youtube;\n","// ==========================================================================\n// Plyr Media\n// ==========================================================================\n\nimport html5 from './html5';\nimport vimeo from './plugins/vimeo';\nimport youtube from './plugins/youtube';\nimport utils from './utils';\n\nconst media = {\n // Setup media\n setup() {\n // If there's no media, bail\n if (!this.media) {\n this.debug.warn('No media element found!');\n return;\n }\n\n // Add type class\n utils.toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', this.type), true);\n\n // Add provider class\n utils.toggleClass(this.elements.container, this.config.classNames.provider.replace('{0}', this.provider), true);\n\n // Add video class for embeds\n // This will require changes if audio embeds are added\n if (this.isEmbed) {\n utils.toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', 'video'), true);\n }\n\n // Inject the player wrapper\n if (this.isVideo) {\n // Create the wrapper div\n this.elements.wrapper = utils.createElement('div', {\n class: this.config.classNames.video,\n });\n\n // Wrap the video in a container\n utils.wrap(this.media, this.elements.wrapper);\n\n // Faux poster container\n this.elements.poster = utils.createElement('div', {\n class: this.config.classNames.poster,\n });\n\n this.elements.wrapper.appendChild(this.elements.poster);\n }\n\n if (this.isEmbed) {\n switch (this.provider) {\n case 'youtube':\n youtube.setup.call(this);\n break;\n\n case 'vimeo':\n vimeo.setup.call(this);\n break;\n\n default:\n break;\n }\n } else if (this.isHTML5) {\n html5.extend.call(this);\n }\n },\n};\n\nexport default media;\n","// ==========================================================================\n// Advertisement plugin using Google IMA HTML5 SDK\n// Create an account with our ad partner, vi here:\n// https://www.vi.ai/publisher-video-monetization/\n// ==========================================================================\n\n/* global google */\n\nimport i18n from '../i18n';\nimport utils from '../utils';\n\nclass Ads {\n /**\n * Ads constructor.\n * @param {object} player\n * @return {Ads}\n */\n constructor(player) {\n this.player = player;\n this.publisherId = player.config.ads.publisherId;\n this.playing = false;\n this.initialized = false;\n this.elements = {\n container: null,\n displayContainer: null,\n };\n this.manager = null;\n this.loader = null;\n this.cuePoints = null;\n this.events = {};\n this.safetyTimer = null;\n this.countdownTimer = null;\n\n // Setup a promise to resolve when the IMA manager is ready\n this.managerPromise = new Promise((resolve, reject) => {\n // The ad is loaded and ready\n this.on('loaded', resolve);\n\n // Ads failed\n this.on('error', reject);\n });\n\n this.load();\n }\n\n get enabled() {\n return this.player.isVideo && this.player.config.ads.enabled && !utils.is.empty(this.publisherId);\n }\n\n /**\n * Load the IMA SDK\n */\n load() {\n if (this.enabled) {\n // Check if the Google IMA3 SDK is loaded or load it ourselves\n if (!utils.is.object(window.google) || !utils.is.object(window.google.ima)) {\n utils\n .loadScript(this.player.config.urls.googleIMA.sdk)\n .then(() => {\n this.ready();\n })\n .catch(() => {\n // Script failed to load or is blocked\n this.trigger('error', new Error('Google IMA SDK failed to load'));\n });\n } else {\n this.ready();\n }\n }\n }\n\n /**\n * Get the ads instance ready\n */\n ready() {\n // Start ticking our safety timer. If the whole advertisement\n // thing doesn't resolve within our set time; we bail\n this.startSafetyTimer(12000, 'ready()');\n\n // Clear the safety timer\n this.managerPromise.then(() => {\n this.clearSafetyTimer('onAdsManagerLoaded()');\n });\n\n // Set listeners on the Plyr instance\n this.listeners();\n\n // Setup the IMA SDK\n this.setupIMA();\n }\n\n // Build the default tag URL\n get tagUrl() {\n const params = {\n AV_PUBLISHERID: '58c25bb0073ef448b1087ad6',\n AV_CHANNELID: '5a0458dc28a06145e4519d21',\n AV_URL: location.hostname,\n cb: Date.now(),\n AV_WIDTH: 640,\n AV_HEIGHT: 480,\n AV_CDIM2: this.publisherId,\n };\n\n const base = 'https://go.aniview.com/api/adserver6/vast/';\n\n return `${base}?${utils.buildUrlParams(params)}`;\n }\n\n /**\n * In order for the SDK to display ads for our video, we need to tell it where to put them,\n * so here we define our ad container. This div is set up to render on top of the video player.\n * Using the code below, we tell the SDK to render ads within that div. We also provide a\n * handle to the content video player - the SDK will poll the current time of our player to\n * properly place mid-rolls. After we create the ad display container, we initialize it. On\n * mobile devices, this initialization is done as the result of a user action.\n */\n setupIMA() {\n // Create the container for our advertisements\n this.elements.container = utils.createElement('div', {\n class: this.player.config.classNames.ads,\n });\n this.player.elements.container.appendChild(this.elements.container);\n\n // So we can run VPAID2\n google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED);\n\n // Set language\n google.ima.settings.setLocale(this.player.config.ads.language);\n\n // We assume the adContainer is the video container of the plyr element\n // that will house the ads\n this.elements.displayContainer = new google.ima.AdDisplayContainer(this.elements.container);\n\n // Request video ads to be pre-loaded\n this.requestAds();\n }\n\n /**\n * Request advertisements\n */\n requestAds() {\n const { container } = this.player.elements;\n\n try {\n // Create ads loader\n this.loader = new google.ima.AdsLoader(this.elements.displayContainer);\n\n // Listen and respond to ads loaded and error events\n this.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, event => this.onAdsManagerLoaded(event), false);\n this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, error => this.onAdError(error), false);\n\n // Request video ads\n const request = new google.ima.AdsRequest();\n request.adTagUrl = this.tagUrl;\n\n // Specify the linear and nonlinear slot sizes. This helps the SDK\n // to select the correct creative if multiple are returned\n request.linearAdSlotWidth = container.offsetWidth;\n request.linearAdSlotHeight = container.offsetHeight;\n request.nonLinearAdSlotWidth = container.offsetWidth;\n request.nonLinearAdSlotHeight = container.offsetHeight;\n\n // We only overlay ads as we only support video.\n request.forceNonLinearFullSlot = false;\n\n // Mute based on current state\n request.setAdWillPlayMuted(!this.player.muted);\n\n this.loader.requestAds(request);\n } catch (e) {\n this.onAdError(e);\n }\n }\n\n /**\n * Update the ad countdown\n * @param {boolean} start\n */\n pollCountdown(start = false) {\n if (!start) {\n clearInterval(this.countdownTimer);\n this.elements.container.removeAttribute('data-badge-text');\n return;\n }\n\n const update = () => {\n const time = utils.formatTime(Math.max(this.manager.getRemainingTime(), 0));\n const label = `${i18n.get('advertisement', this.player.config)} - ${time}`;\n this.elements.container.setAttribute('data-badge-text', label);\n };\n\n this.countdownTimer = setInterval(update, 100);\n }\n\n /**\n * This method is called whenever the ads are ready inside the AdDisplayContainer\n * @param {Event} adsManagerLoadedEvent\n */\n onAdsManagerLoaded(event) {\n // Get the ads manager\n const settings = new google.ima.AdsRenderingSettings();\n\n // Tell the SDK to save and restore content video state on our behalf\n settings.restoreCustomPlaybackStateOnAdBreakComplete = true;\n settings.enablePreloading = true;\n\n // The SDK is polling currentTime on the contentPlayback. And needs a duration\n // so it can determine when to start the mid- and post-roll\n this.manager = event.getAdsManager(this.player, settings);\n\n // Get the cue points for any mid-rolls by filtering out the pre- and post-roll\n this.cuePoints = this.manager.getCuePoints();\n\n // Add advertisement cue's within the time line if available\n if (!utils.is.empty(this.cuePoints)) {\n this.cuePoints.forEach(cuePoint => {\n if (cuePoint !== 0 && cuePoint !== -1 && cuePoint < this.player.duration) {\n const seekElement = this.player.elements.progress;\n\n if (utils.is.element(seekElement)) {\n const cuePercentage = 100 / this.player.duration * cuePoint;\n const cue = utils.createElement('span', {\n class: this.player.config.classNames.cues,\n });\n\n cue.style.left = `${cuePercentage.toString()}%`;\n seekElement.appendChild(cue);\n }\n }\n });\n }\n\n // Get skippable state\n // TODO: Skip button\n // this.player.debug.warn(this.manager.getAdSkippableState());\n\n // Set volume to match player\n this.manager.setVolume(this.player.volume);\n\n // Add listeners to the required events\n // Advertisement error events\n this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, error => this.onAdError(error));\n\n // Advertisement regular events\n Object.keys(google.ima.AdEvent.Type).forEach(type => {\n this.manager.addEventListener(google.ima.AdEvent.Type[type], event => this.onAdEvent(event));\n });\n\n // Resolve our adsManager\n this.trigger('loaded');\n }\n\n /**\n * This is where all the event handling takes place. Retrieve the ad from the event. Some\n * events (e.g. ALL_ADS_COMPLETED) don't have the ad object associated\n * https://developers.google.com/interactive-media-ads/docs/sdks/html5/v3/apis#ima.AdEvent.Type\n * @param {Event} event\n */\n onAdEvent(event) {\n const { container } = this.player.elements;\n\n // Retrieve the ad from the event. Some events (e.g. ALL_ADS_COMPLETED)\n // don't have ad object associated\n const ad = event.getAd();\n\n // Proxy event\n const dispatchEvent = type => {\n const event = `ads${type.replace(/_/g, '').toLowerCase()}`;\n utils.dispatchEvent.call(this.player, this.player.media, event);\n };\n\n switch (event.type) {\n case google.ima.AdEvent.Type.LOADED:\n // This is the first event sent for an ad - it is possible to determine whether the\n // ad is a video ad or an overlay\n this.trigger('loaded');\n\n // Bubble event\n dispatchEvent(event.type);\n\n // Start countdown\n this.pollCountdown(true);\n\n if (!ad.isLinear()) {\n // Position AdDisplayContainer correctly for overlay\n ad.width = container.offsetWidth;\n ad.height = container.offsetHeight;\n }\n\n // console.info('Ad type: ' + event.getAd().getAdPodInfo().getPodIndex());\n // console.info('Ad time: ' + event.getAd().getAdPodInfo().getTimeOffset());\n break;\n\n case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:\n // All ads for the current videos are done. We can now request new advertisements\n // in case the video is re-played\n\n // Fire event\n dispatchEvent(event.type);\n\n // TODO: Example for what happens when a next video in a playlist would be loaded.\n // So here we load a new video when all ads are done.\n // Then we load new ads within a new adsManager. When the video\n // Is started - after - the ads are loaded, then we get ads.\n // You can also easily test cancelling and reloading by running\n // player.ads.cancel() and player.ads.play from the console I guess.\n // this.player.source = {\n // type: 'video',\n // title: 'View From A Blue Moon',\n // sources: [{\n // src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.mp4', type:\n // 'video/mp4', }], poster:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg', tracks:\n // [ { kind: 'captions', label: 'English', srclang: 'en', src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt',\n // default: true, }, { kind: 'captions', label: 'French', srclang: 'fr', src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt', }, ],\n // };\n\n // TODO: So there is still this thing where a video should only be allowed to start\n // playing when the IMA SDK is ready or has failed\n\n this.loadAds();\n break;\n\n case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:\n // This event indicates the ad has started - the video player can adjust the UI,\n // for example display a pause button and remaining time. Fired when content should\n // be paused. This usually happens right before an ad is about to cover the content\n\n dispatchEvent(event.type);\n\n this.pauseContent();\n\n break;\n\n case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:\n // This event indicates the ad has finished - the video player can perform\n // appropriate UI actions, such as removing the timer for remaining time detection.\n // Fired when content should be resumed. This usually happens when an ad finishes\n // or collapses\n\n dispatchEvent(event.type);\n\n this.pollCountdown();\n\n this.resumeContent();\n\n break;\n\n case google.ima.AdEvent.Type.STARTED:\n case google.ima.AdEvent.Type.MIDPOINT:\n case google.ima.AdEvent.Type.COMPLETE:\n case google.ima.AdEvent.Type.IMPRESSION:\n case google.ima.AdEvent.Type.CLICK:\n dispatchEvent(event.type);\n break;\n\n default:\n break;\n }\n }\n\n /**\n * Any ad error handling comes through here\n * @param {Event} event\n */\n onAdError(event) {\n this.cancel();\n this.player.debug.warn('Ads error', event);\n }\n\n /**\n * Setup hooks for Plyr and window events. This ensures\n * the mid- and post-roll launch at the correct time. And\n * resize the advertisement when the player resizes\n */\n listeners() {\n const { container } = this.player.elements;\n let time;\n\n // Add listeners to the required events\n this.player.on('ended', () => {\n this.loader.contentComplete();\n });\n\n this.player.on('seeking', () => {\n time = this.player.currentTime;\n return time;\n });\n\n this.player.on('seeked', () => {\n const seekedTime = this.player.currentTime;\n\n if (utils.is.empty(this.cuePoints)) {\n return;\n }\n\n this.cuePoints.forEach((cuePoint, index) => {\n if (time < cuePoint && cuePoint < seekedTime) {\n this.manager.discardAdBreak();\n this.cuePoints.splice(index, 1);\n }\n });\n });\n\n // Listen to the resizing of the window. And resize ad accordingly\n // TODO: eventually implement ResizeObserver\n window.addEventListener('resize', () => {\n if (this.manager) {\n this.manager.resize(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);\n }\n });\n }\n\n /**\n * Initialize the adsManager and start playing advertisements\n */\n play() {\n const { container } = this.player.elements;\n\n if (!this.managerPromise) {\n this.resumeContent();\n }\n\n // Play the requested advertisement whenever the adsManager is ready\n this.managerPromise\n .then(() => {\n // Initialize the container. Must be done via a user action on mobile devices\n this.elements.displayContainer.initialize();\n\n try {\n if (!this.initialized) {\n // Initialize the ads manager. Ad rules playlist will start at this time\n this.manager.init(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);\n\n // Call play to start showing the ad. Single video and overlay ads will\n // start at this time; the call will be ignored for ad rules\n this.manager.start();\n }\n\n this.initialized = true;\n } catch (adError) {\n // An error may be thrown if there was a problem with the\n // VAST response\n this.onAdError(adError);\n }\n })\n .catch(() => {});\n }\n\n /**\n * Resume our video\n */\n resumeContent() {\n // Hide the advertisement container\n this.elements.container.style.zIndex = '';\n\n // Ad is stopped\n this.playing = false;\n\n // Play our video\n if (this.player.currentTime < this.player.duration) {\n this.player.play();\n }\n }\n\n /**\n * Pause our video\n */\n pauseContent() {\n // Show the advertisement container\n this.elements.container.style.zIndex = 3;\n\n // Ad is playing.\n this.playing = true;\n\n // Pause our video.\n this.player.pause();\n }\n\n /**\n * Destroy the adsManager so we can grab new ads after this. If we don't then we're not\n * allowed to call new ads based on google policies, as they interpret this as an accidental\n * video requests. https://developers.google.com/interactive-\n * media-ads/docs/sdks/android/faq#8\n */\n cancel() {\n // Pause our video\n if (this.initialized) {\n this.resumeContent();\n }\n\n // Tell our instance that we're done for now\n this.trigger('error');\n\n // Re-create our adsManager\n this.loadAds();\n }\n\n /**\n * Re-create our adsManager\n */\n loadAds() {\n // Tell our adsManager to go bye bye\n this.managerPromise\n .then(() => {\n // Destroy our adsManager\n if (this.manager) {\n this.manager.destroy();\n }\n\n // Re-set our adsManager promises\n this.managerPromise = new Promise(resolve => {\n this.on('loaded', resolve);\n this.player.debug.log(this.manager);\n });\n\n // Now request some new advertisements\n this.requestAds();\n })\n .catch(() => {});\n }\n\n /**\n * Handles callbacks after an ad event was invoked\n * @param {string} event - Event type\n */\n trigger(event, ...args) {\n const handlers = this.events[event];\n\n if (utils.is.array(handlers)) {\n handlers.forEach(handler => {\n if (utils.is.function(handler)) {\n handler.apply(this, args);\n }\n });\n }\n }\n\n /**\n * Add event listeners\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n * @return {Ads}\n */\n on(event, callback) {\n if (!utils.is.array(this.events[event])) {\n this.events[event] = [];\n }\n\n this.events[event].push(callback);\n\n return this;\n }\n\n /**\n * Setup a safety timer for when the ad network doesn't respond for whatever reason.\n * The advertisement has 12 seconds to get its things together. We stop this timer when the\n * advertisement is playing, or when a user action is required to start, then we clear the\n * timer on ad ready\n * @param {number} time\n * @param {string} from\n */\n startSafetyTimer(time, from) {\n this.player.debug.log(`Safety timer invoked from: ${from}`);\n\n this.safetyTimer = setTimeout(() => {\n this.cancel();\n this.clearSafetyTimer('startSafetyTimer()');\n }, time);\n }\n\n /**\n * Clear our safety timer(s)\n * @param {string} from\n */\n clearSafetyTimer(from) {\n if (!utils.is.nullOrUndefined(this.safetyTimer)) {\n this.player.debug.log(`Safety timer cleared from: ${from}`);\n\n clearTimeout(this.safetyTimer);\n this.safetyTimer = null;\n }\n }\n}\n\nexport default Ads;\n","// ==========================================================================\n// Plyr source update\n// ==========================================================================\n\nimport html5 from './html5';\nimport media from './media';\nimport support from './support';\nimport { providers } from './types';\nimport ui from './ui';\nimport utils from './utils';\n\nconst source = {\n // Add elements to HTML5 media (source, tracks, etc)\n insertElements(type, attributes) {\n if (utils.is.string(attributes)) {\n utils.insertElement(type, this.media, {\n src: attributes,\n });\n } else if (utils.is.array(attributes)) {\n attributes.forEach(attribute => {\n utils.insertElement(type, this.media, attribute);\n });\n }\n },\n\n // Update source\n // Sources are not checked for support so be careful\n change(input) {\n if (!utils.is.object(input) || !('sources' in input) || !input.sources.length) {\n this.debug.warn('Invalid source format');\n return;\n }\n\n // Cancel current network requests\n html5.cancelRequests.call(this);\n\n // Destroy instance and re-setup\n this.destroy.call(\n this,\n () => {\n // Reset quality options\n this.options.quality = [];\n\n // Remove elements\n utils.removeElement(this.media);\n this.media = null;\n\n // Reset class name\n if (utils.is.element(this.elements.container)) {\n this.elements.container.removeAttribute('class');\n }\n\n // Set the type and provider\n this.type = input.type;\n this.provider = !utils.is.empty(input.sources[0].provider) ? input.sources[0].provider : providers.html5;\n\n // Check for support\n this.supported = support.check(this.type, this.provider, this.config.playsinline);\n\n // Create new markup\n switch (`${this.provider}:${this.type}`) {\n case 'html5:video':\n this.media = utils.createElement('video');\n break;\n\n case 'html5:audio':\n this.media = utils.createElement('audio');\n break;\n\n case 'youtube:video':\n case 'vimeo:video':\n this.media = utils.createElement('div', {\n src: input.sources[0].src,\n });\n break;\n\n default:\n break;\n }\n\n // Inject the new element\n this.elements.container.appendChild(this.media);\n\n // Autoplay the new source?\n if (utils.is.boolean(input.autoplay)) {\n this.config.autoplay = input.autoplay;\n }\n\n // Set attributes for audio and video\n if (this.isHTML5) {\n if (this.config.crossorigin) {\n this.media.setAttribute('crossorigin', '');\n }\n if (this.config.autoplay) {\n this.media.setAttribute('autoplay', '');\n }\n if (!utils.is.empty(input.poster)) {\n this.poster = input.poster;\n }\n if (this.config.loop.active) {\n this.media.setAttribute('loop', '');\n }\n if (this.config.muted) {\n this.media.setAttribute('muted', '');\n }\n if (this.config.playsinline) {\n this.media.setAttribute('playsinline', '');\n }\n }\n\n // Restore class hook\n ui.addStyleHook.call(this);\n\n // Set new sources for html5\n if (this.isHTML5) {\n source.insertElements.call(this, 'source', input.sources);\n }\n\n // Set video title\n this.config.title = input.title;\n\n // Set up from scratch\n media.setup.call(this);\n\n // HTML5 stuff\n if (this.isHTML5) {\n // Setup captions\n if ('tracks' in input) {\n source.insertElements.call(this, 'track', input.tracks);\n }\n\n // Load HTML5 sources\n this.media.load();\n }\n\n // If HTML5 or embed but not fully supported, setupInterface and call ready now\n if (this.isHTML5 || (this.isEmbed && !this.supported.ui)) {\n // Setup interface\n ui.build.call(this);\n }\n\n // Update the fullscreen support\n this.fullscreen.update();\n },\n true,\n );\n },\n};\n\nexport default source;\n","// ==========================================================================\n// Plyr\n// plyr.js v3.3.12\n// https://github.com/sampotts/plyr\n// License: The MIT License (MIT)\n// ==========================================================================\n\nimport captions from './captions';\nimport Console from './console';\nimport controls from './controls';\nimport defaults from './defaults';\nimport Fullscreen from './fullscreen';\nimport Listeners from './listeners';\nimport media from './media';\nimport Ads from './plugins/ads';\nimport source from './source';\nimport Storage from './storage';\nimport support from './support';\nimport { providers, types } from './types';\nimport ui from './ui';\nimport utils from './utils';\n\n// Private properties\n// TODO: Use a WeakMap for private globals\n// const globals = new WeakMap();\n\n// Plyr instance\nclass Plyr {\n constructor(target, options) {\n this.timers = {};\n\n // State\n this.ready = false;\n this.loading = false;\n this.failed = false;\n\n // Touch device\n this.touch = support.touch;\n\n // Set the media element\n this.media = target;\n\n // String selector passed\n if (utils.is.string(this.media)) {\n this.media = document.querySelectorAll(this.media);\n }\n\n // jQuery, NodeList or Array passed, use first element\n if ((window.jQuery && this.media instanceof jQuery) || utils.is.nodeList(this.media) || utils.is.array(this.media)) {\n // eslint-disable-next-line\n this.media = this.media[0];\n }\n\n // Set config\n this.config = utils.extend(\n {},\n defaults,\n Plyr.defaults,\n options || {},\n (() => {\n try {\n return JSON.parse(this.media.getAttribute('data-plyr-config'));\n } catch (e) {\n return {};\n }\n })(),\n );\n\n // Elements cache\n this.elements = {\n container: null,\n buttons: {},\n display: {},\n progress: {},\n inputs: {},\n settings: {\n menu: null,\n panes: {},\n tabs: {},\n },\n captions: null,\n };\n\n // Captions\n this.captions = {\n active: null,\n currentTrack: -1,\n meta: new WeakMap(),\n };\n\n // Fullscreen\n this.fullscreen = {\n active: false,\n };\n\n // Options\n this.options = {\n speed: [],\n quality: [],\n };\n\n // Debugging\n // TODO: move to globals\n this.debug = new Console(this.config.debug);\n\n // Log config options and support\n this.debug.log('Config', this.config);\n this.debug.log('Support', support);\n\n // We need an element to setup\n if (utils.is.nullOrUndefined(this.media) || !utils.is.element(this.media)) {\n this.debug.error('Setup failed: no suitable element passed');\n return;\n }\n\n // Bail if the element is initialized\n if (this.media.plyr) {\n this.debug.warn('Target already setup');\n return;\n }\n\n // Bail if not enabled\n if (!this.config.enabled) {\n this.debug.error('Setup failed: disabled by config');\n return;\n }\n\n // Bail if disabled or no basic support\n // You may want to disable certain UAs etc\n if (!support.check().api) {\n this.debug.error('Setup failed: no support');\n return;\n }\n\n // Cache original element state for .destroy()\n const clone = this.media.cloneNode(true);\n clone.autoplay = false;\n this.elements.original = clone;\n\n // Set media type based on tag or data attribute\n // Supported: video, audio, vimeo, youtube\n const type = this.media.tagName.toLowerCase();\n\n // Embed properties\n let iframe = null;\n let url = null;\n let params = null;\n\n // Different setup based on type\n switch (type) {\n case 'div':\n // Find the frame\n iframe = this.media.querySelector('iframe');\n\n // <iframe> type\n if (utils.is.element(iframe)) {\n // Detect provider\n url = iframe.getAttribute('src');\n this.provider = utils.getProviderByUrl(url);\n\n // Rework elements\n this.elements.container = this.media;\n this.media = iframe;\n\n // Reset classname\n this.elements.container.className = '';\n\n // Get attributes from URL and set config\n params = utils.getUrlParams(url);\n if (!utils.is.empty(params)) {\n const truthy = [\n '1',\n 'true',\n ];\n\n if (truthy.includes(params.autoplay)) {\n this.config.autoplay = true;\n }\n if (truthy.includes(params.loop)) {\n this.config.loop.active = true;\n }\n\n // TODO: replace fullscreen.iosNative with this playsinline config option\n // YouTube requires the playsinline in the URL\n if (this.isYouTube) {\n this.config.playsinline = truthy.includes(params.playsinline);\n } else {\n this.config.playsinline = true;\n }\n }\n } else {\n // <div> with attributes\n this.provider = this.media.getAttribute(this.config.attributes.embed.provider);\n\n // Remove attribute\n this.media.removeAttribute(this.config.attributes.embed.provider);\n }\n\n // Unsupported or missing provider\n if (utils.is.empty(this.provider) || !Object.keys(providers).includes(this.provider)) {\n this.debug.error('Setup failed: Invalid provider');\n return;\n }\n\n // Audio will come later for external providers\n this.type = types.video;\n\n break;\n\n case 'video':\n case 'audio':\n this.type = type;\n this.provider = providers.html5;\n\n // Get config from attributes\n if (this.media.hasAttribute('crossorigin')) {\n this.config.crossorigin = true;\n }\n if (this.media.hasAttribute('autoplay')) {\n this.config.autoplay = true;\n }\n if (this.media.hasAttribute('playsinline')) {\n this.config.playsinline = true;\n }\n if (this.media.hasAttribute('muted')) {\n this.config.muted = true;\n }\n if (this.media.hasAttribute('loop')) {\n this.config.loop.active = true;\n }\n\n break;\n\n default:\n this.debug.error('Setup failed: unsupported type');\n return;\n }\n\n // Check for support again but with type\n this.supported = support.check(this.type, this.provider, this.config.playsinline);\n\n // If no support for even API, bail\n if (!this.supported.api) {\n this.debug.error('Setup failed: no support');\n return;\n }\n\n // Create listeners\n this.listeners = new Listeners(this);\n\n // Setup local storage for user settings\n this.storage = new Storage(this);\n\n // Store reference\n this.media.plyr = this;\n\n // Wrap media\n if (!utils.is.element(this.elements.container)) {\n this.elements.container = utils.createElement('div');\n utils.wrap(this.media, this.elements.container);\n }\n\n // Add style hook\n ui.addStyleHook.call(this);\n\n // Setup media\n media.setup.call(this);\n\n // Listen for events if debugging\n if (this.config.debug) {\n utils.on(this.elements.container, this.config.events.join(' '), event => {\n this.debug.log(`event: ${event.type}`);\n });\n }\n\n // Setup interface\n // If embed but not fully supported, build interface now to avoid flash of controls\n if (this.isHTML5 || (this.isEmbed && !this.supported.ui)) {\n ui.build.call(this);\n }\n\n // Container listeners\n this.listeners.container();\n\n // Global listeners\n this.listeners.global();\n\n // Setup fullscreen\n this.fullscreen = new Fullscreen(this);\n\n // Setup ads if provided\n this.ads = new Ads(this);\n\n // Autoplay if required\n if (this.config.autoplay) {\n this.play();\n }\n }\n\n // ---------------------------------------\n // API\n // ---------------------------------------\n\n /**\n * Types and provider helpers\n */\n get isHTML5() {\n return Boolean(this.provider === providers.html5);\n }\n get isEmbed() {\n return Boolean(this.isYouTube || this.isVimeo);\n }\n get isYouTube() {\n return Boolean(this.provider === providers.youtube);\n }\n get isVimeo() {\n return Boolean(this.provider === providers.vimeo);\n }\n get isVideo() {\n return Boolean(this.type === types.video);\n }\n get isAudio() {\n return Boolean(this.type === types.audio);\n }\n\n /**\n * Play the media, or play the advertisement (if they are not blocked)\n */\n play() {\n if (!utils.is.function(this.media.play)) {\n return null;\n }\n\n // Return the promise (for HTML5)\n return this.media.play();\n }\n\n /**\n * Pause the media\n */\n pause() {\n if (!this.playing || !utils.is.function(this.media.pause)) {\n return;\n }\n\n this.media.pause();\n }\n\n /**\n * Get playing state\n */\n get playing() {\n return Boolean(this.ready && !this.paused && !this.ended);\n }\n\n /**\n * Get paused state\n */\n get paused() {\n return Boolean(this.media.paused);\n }\n\n /**\n * Get stopped state\n */\n get stopped() {\n return Boolean(this.paused && this.currentTime === 0);\n }\n\n /**\n * Get ended state\n */\n get ended() {\n return Boolean(this.media.ended);\n }\n\n /**\n * Toggle playback based on current status\n * @param {boolean} input\n */\n togglePlay(input) {\n // Toggle based on current state if nothing passed\n const toggle = utils.is.boolean(input) ? input : !this.playing;\n\n if (toggle) {\n this.play();\n } else {\n this.pause();\n }\n }\n\n /**\n * Stop playback\n */\n stop() {\n if (this.isHTML5) {\n this.pause();\n this.restart();\n } else if (utils.is.function(this.media.stop)) {\n this.media.stop();\n }\n }\n\n /**\n * Restart playback\n */\n restart() {\n this.currentTime = 0;\n }\n\n /**\n * Rewind\n * @param {number} seekTime - how far to rewind in seconds. Defaults to the config.seekTime\n */\n rewind(seekTime) {\n this.currentTime = this.currentTime - (utils.is.number(seekTime) ? seekTime : this.config.seekTime);\n }\n\n /**\n * Fast forward\n * @param {number} seekTime - how far to fast forward in seconds. Defaults to the config.seekTime\n */\n forward(seekTime) {\n this.currentTime = this.currentTime + (utils.is.number(seekTime) ? seekTime : this.config.seekTime);\n }\n\n /**\n * Seek to a time\n * @param {number} input - where to seek to in seconds. Defaults to 0 (the start)\n */\n set currentTime(input) {\n // Bail if media duration isn't available yet\n if (!this.duration) {\n return;\n }\n\n // Validate input\n const inputIsValid = utils.is.number(input) && input > 0;\n\n // Set\n this.media.currentTime = inputIsValid ? Math.min(input, this.duration) : 0;\n\n // Logging\n this.debug.log(`Seeking to ${this.currentTime} seconds`);\n }\n\n /**\n * Get current time\n */\n get currentTime() {\n return Number(this.media.currentTime);\n }\n\n /**\n * Get buffered\n */\n get buffered() {\n const { buffered } = this.media;\n\n // YouTube / Vimeo return a float between 0-1\n if (utils.is.number(buffered)) {\n return buffered;\n }\n\n // HTML5\n // TODO: Handle buffered chunks of the media\n // (i.e. seek to another section buffers only that section)\n if (buffered && buffered.length && this.duration > 0) {\n return buffered.end(0) / this.duration;\n }\n\n return 0;\n }\n\n /**\n * Get seeking status\n */\n get seeking() {\n return Boolean(this.media.seeking);\n }\n\n /**\n * Get the duration of the current media\n */\n get duration() {\n // Faux duration set via config\n const fauxDuration = parseFloat(this.config.duration);\n\n // Media duration can be NaN before the media has loaded\n const duration = (this.media || {}).duration || 0;\n\n // If config duration is funky, use regular duration\n return fauxDuration || duration;\n }\n\n /**\n * Set the player volume\n * @param {number} value - must be between 0 and 1. Defaults to the value from local storage and config.volume if not set in storage\n */\n set volume(value) {\n let volume = value;\n const max = 1;\n const min = 0;\n\n if (utils.is.string(volume)) {\n volume = Number(volume);\n }\n\n // Load volume from storage if no value specified\n if (!utils.is.number(volume)) {\n volume = this.storage.get('volume');\n }\n\n // Use config if all else fails\n if (!utils.is.number(volume)) {\n ({ volume } = this.config);\n }\n\n // Maximum is volumeMax\n if (volume > max) {\n volume = max;\n }\n // Minimum is volumeMin\n if (volume < min) {\n volume = min;\n }\n\n // Update config\n this.config.volume = volume;\n\n // Set the player volume\n this.media.volume = volume;\n\n // If muted, and we're increasing volume manually, reset muted state\n if (!utils.is.empty(value) && this.muted && volume > 0) {\n this.muted = false;\n }\n }\n\n /**\n * Get the current player volume\n */\n get volume() {\n return Number(this.media.volume);\n }\n\n /**\n * Increase volume\n * @param {boolean} step - How much to decrease by (between 0 and 1)\n */\n increaseVolume(step) {\n const volume = this.media.muted ? 0 : this.volume;\n this.volume = volume + (utils.is.number(step) ? step : 1);\n }\n\n /**\n * Decrease volume\n * @param {boolean} step - How much to decrease by (between 0 and 1)\n */\n decreaseVolume(step) {\n const volume = this.media.muted ? 0 : this.volume;\n this.volume = volume - (utils.is.number(step) ? step : 1);\n }\n\n /**\n * Set muted state\n * @param {boolean} mute\n */\n set muted(mute) {\n let toggle = mute;\n\n // Load muted state from storage\n if (!utils.is.boolean(toggle)) {\n toggle = this.storage.get('muted');\n }\n\n // Use config if all else fails\n if (!utils.is.boolean(toggle)) {\n toggle = this.config.muted;\n }\n\n // Update config\n this.config.muted = toggle;\n\n // Set mute on the player\n this.media.muted = toggle;\n }\n\n /**\n * Get current muted state\n */\n get muted() {\n return Boolean(this.media.muted);\n }\n\n /**\n * Check if the media has audio\n */\n get hasAudio() {\n // Assume yes for all non HTML5 (as we can't tell...)\n if (!this.isHTML5) {\n return true;\n }\n\n if (this.isAudio) {\n return true;\n }\n\n // Get audio tracks\n return (\n Boolean(this.media.mozHasAudio) ||\n Boolean(this.media.webkitAudioDecodedByteCount) ||\n Boolean(this.media.audioTracks && this.media.audioTracks.length)\n );\n }\n\n /**\n * Set playback speed\n * @param {number} speed - the speed of playback (0.5-2.0)\n */\n set speed(input) {\n let speed = null;\n\n if (utils.is.number(input)) {\n speed = input;\n }\n\n if (!utils.is.number(speed)) {\n speed = this.storage.get('speed');\n }\n\n if (!utils.is.number(speed)) {\n speed = this.config.speed.selected;\n }\n\n // Set min/max\n if (speed < 0.1) {\n speed = 0.1;\n }\n if (speed > 2.0) {\n speed = 2.0;\n }\n\n if (!this.config.speed.options.includes(speed)) {\n this.debug.warn(`Unsupported speed (${speed})`);\n return;\n }\n\n // Update config\n this.config.speed.selected = speed;\n\n // Set media speed\n this.media.playbackRate = speed;\n }\n\n /**\n * Get current playback speed\n */\n get speed() {\n return Number(this.media.playbackRate);\n }\n\n /**\n * Set playback quality\n * Currently HTML5 & YouTube only\n * @param {number} input - Quality level\n */\n set quality(input) {\n let quality = null;\n\n if (!utils.is.empty(input)) {\n quality = Number(input);\n }\n\n if (!utils.is.number(quality)) {\n quality = this.storage.get('quality');\n }\n\n if (!utils.is.number(quality)) {\n quality = this.config.quality.selected;\n }\n\n if (!utils.is.number(quality)) {\n quality = this.config.quality.default;\n }\n\n if (!this.options.quality.length) {\n return;\n }\n\n if (!this.options.quality.includes(quality)) {\n const closest = utils.closest(this.options.quality, quality);\n this.debug.warn(`Unsupported quality option: ${quality}, using ${closest} instead`);\n quality = closest;\n }\n\n // Update config\n this.config.quality.selected = quality;\n\n // Set quality\n this.media.quality = quality;\n }\n\n /**\n * Get current quality level\n */\n get quality() {\n return this.media.quality;\n }\n\n /**\n * Toggle loop\n * TODO: Finish fancy new logic. Set the indicator on load as user may pass loop as config\n * @param {boolean} input - Whether to loop or not\n */\n set loop(input) {\n const toggle = utils.is.boolean(input) ? input : this.config.loop.active;\n this.config.loop.active = toggle;\n this.media.loop = toggle;\n\n // Set default to be a true toggle\n /* const type = ['start', 'end', 'all', 'none', 'toggle'].includes(input) ? input : 'toggle';\n\n switch (type) {\n case 'start':\n if (this.config.loop.end && this.config.loop.end <= this.currentTime) {\n this.config.loop.end = null;\n }\n this.config.loop.start = this.currentTime;\n // this.config.loop.indicator.start = this.elements.display.played.value;\n break;\n\n case 'end':\n if (this.config.loop.start >= this.currentTime) {\n return this;\n }\n this.config.loop.end = this.currentTime;\n // this.config.loop.indicator.end = this.elements.display.played.value;\n break;\n\n case 'all':\n this.config.loop.start = 0;\n this.config.loop.end = this.duration - 2;\n this.config.loop.indicator.start = 0;\n this.config.loop.indicator.end = 100;\n break;\n\n case 'toggle':\n if (this.config.loop.active) {\n this.config.loop.start = 0;\n this.config.loop.end = null;\n } else {\n this.config.loop.start = 0;\n this.config.loop.end = this.duration - 2;\n }\n break;\n\n default:\n this.config.loop.start = 0;\n this.config.loop.end = null;\n break;\n } */\n }\n\n /**\n * Get current loop state\n */\n get loop() {\n return Boolean(this.media.loop);\n }\n\n /**\n * Set new media source\n * @param {object} input - The new source object (see docs)\n */\n set source(input) {\n source.change.call(this, input);\n }\n\n /**\n * Get current source\n */\n get source() {\n return this.media.currentSrc;\n }\n\n /**\n * Set the poster image for a video\n * @param {input} - the URL for the new poster image\n */\n set poster(input) {\n if (!this.isVideo) {\n this.debug.warn('Poster can only be set for video');\n return;\n }\n\n ui.setPoster.call(this, input);\n }\n\n /**\n * Get the current poster image\n */\n get poster() {\n if (!this.isVideo) {\n return null;\n }\n\n return this.media.getAttribute('poster');\n }\n\n /**\n * Set the autoplay state\n * @param {boolean} input - Whether to autoplay or not\n */\n set autoplay(input) {\n const toggle = utils.is.boolean(input) ? input : this.config.autoplay;\n this.config.autoplay = toggle;\n }\n\n /**\n * Get the current autoplay state\n */\n get autoplay() {\n return Boolean(this.config.autoplay);\n }\n\n /**\n * Toggle captions\n * @param {boolean} input - Whether to enable captions\n */\n toggleCaptions(input) {\n // If there's no full support\n if (!this.supported.ui) {\n return;\n }\n\n // If the method is called without parameter, toggle based on current value\n const active = utils.is.boolean(input) ? input : !this.elements.container.classList.contains(this.config.classNames.captions.active);\n\n // Toggle state\n this.elements.buttons.captions.pressed = active;\n\n // Add class hook\n utils.toggleClass(this.elements.container, this.config.classNames.captions.active, active);\n\n // Update state and trigger event\n if (active !== this.captions.active) {\n this.captions.active = active;\n utils.dispatchEvent.call(this, this.media, this.captions.active ? 'captionsenabled' : 'captionsdisabled');\n }\n }\n\n /**\n * Set the caption track by index\n * @param {number} - Caption index\n */\n set currentTrack(input) {\n captions.set.call(this, input);\n }\n\n /**\n * Get the current caption track index (-1 if disabled)\n */\n get currentTrack() {\n const { active, currentTrack } = this.captions;\n return active ? currentTrack : -1;\n }\n\n /**\n * Set the wanted language for captions\n * Since tracks can be added later it won't update the actual caption track until there is a matching track\n * @param {string} - Two character ISO language code (e.g. EN, FR, PT, etc)\n */\n set language(input) {\n captions.setLanguage.call(this, input);\n }\n\n /**\n * Get the current track's language\n */\n get language() {\n return (captions.getCurrentTrack.call(this) || {}).language;\n }\n\n /**\n * Toggle picture-in-picture playback on WebKit/MacOS\n * TODO: update player with state, support, enabled\n * TODO: detect outside changes\n */\n set pip(input) {\n const states = {\n pip: 'picture-in-picture',\n inline: 'inline',\n };\n\n // Bail if no support\n if (!support.pip) {\n return;\n }\n\n // Toggle based on current state if not passed\n const toggle = utils.is.boolean(input) ? input : this.pip === states.inline;\n\n // Toggle based on current state\n this.media.webkitSetPresentationMode(toggle ? states.pip : states.inline);\n }\n\n /**\n * Get the current picture-in-picture state\n */\n get pip() {\n if (!support.pip) {\n return null;\n }\n\n return this.media.webkitPresentationMode;\n }\n\n /**\n * Trigger the airplay dialog\n * TODO: update player with state, support, enabled\n */\n airplay() {\n // Show dialog if supported\n if (support.airplay) {\n this.media.webkitShowPlaybackTargetPicker();\n }\n }\n\n /**\n * Toggle the player controls\n * @param {boolean} [toggle] - Whether to show the controls\n */\n toggleControls(toggle) {\n // Don't toggle if missing UI support or if it's audio\n if (this.supported.ui && !this.isAudio) {\n // Get state before change\n const isHidden = utils.hasClass(this.elements.container, this.config.classNames.hideControls);\n\n // Negate the argument if not undefined since adding the class to hides the controls\n const force = typeof toggle === 'undefined' ? undefined : !toggle;\n\n // Apply and get updated state\n const hiding = utils.toggleClass(this.elements.container, this.config.classNames.hideControls, force);\n\n // Close menu\n if (hiding && this.config.controls.includes('settings') && !utils.is.empty(this.config.settings)) {\n controls.toggleMenu.call(this, false);\n }\n // Trigger event on change\n if (hiding !== isHidden) {\n const eventName = hiding ? 'controlshidden' : 'controlsshown';\n utils.dispatchEvent.call(this, this.media, eventName);\n }\n return !hiding;\n }\n return false;\n }\n\n /**\n * Add event listeners\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n */\n on(event, callback) {\n utils.on(this.elements.container, event, callback);\n }\n\n /**\n * Remove event listeners\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n */\n off(event, callback) {\n utils.off(this.elements.container, event, callback);\n }\n\n /**\n * Destroy an instance\n * Event listeners are removed when elements are removed\n * http://stackoverflow.com/questions/12528049/if-a-dom-element-is-removed-are-its-listeners-also-removed-from-memory\n * @param {function} callback - Callback for when destroy is complete\n * @param {boolean} soft - Whether it's a soft destroy (for source changes etc)\n */\n destroy(callback, soft = false) {\n if (!this.ready) {\n return;\n }\n\n const done = () => {\n // Reset overflow (incase destroyed while in fullscreen)\n document.body.style.overflow = '';\n\n // GC for embed\n this.embed = null;\n\n // If it's a soft destroy, make minimal changes\n if (soft) {\n if (Object.keys(this.elements).length) {\n // Remove elements\n utils.removeElement(this.elements.buttons.play);\n utils.removeElement(this.elements.captions);\n utils.removeElement(this.elements.controls);\n utils.removeElement(this.elements.wrapper);\n\n // Clear for GC\n this.elements.buttons.play = null;\n this.elements.captions = null;\n this.elements.controls = null;\n this.elements.wrapper = null;\n }\n\n // Callback\n if (utils.is.function(callback)) {\n callback();\n }\n } else {\n // Unbind listeners\n this.listeners.clear();\n\n // Replace the container with the original element provided\n utils.replaceElement(this.elements.original, this.elements.container);\n\n // Event\n utils.dispatchEvent.call(this, this.elements.original, 'destroyed', true);\n\n // Callback\n if (utils.is.function(callback)) {\n callback.call(this.elements.original);\n }\n\n // Reset state\n this.ready = false;\n\n // Clear for garbage collection\n setTimeout(() => {\n this.elements = null;\n this.media = null;\n }, 200);\n }\n };\n\n // Stop playback\n this.stop();\n\n // Type specific stuff\n switch (`${this.provider}:${this.type}`) {\n case 'html5:video':\n case 'html5:audio':\n // Clear timeout\n clearTimeout(this.timers.loading);\n\n // Restore native video controls\n ui.toggleNativeControls.call(this, true);\n\n // Clean up\n done();\n\n break;\n\n case 'youtube:video':\n // Clear timers\n clearInterval(this.timers.buffering);\n clearInterval(this.timers.playing);\n\n // Destroy YouTube API\n if (this.embed !== null && utils.is.function(this.embed.destroy)) {\n this.embed.destroy();\n }\n\n // Clean up\n done();\n\n break;\n\n case 'vimeo:video':\n // Destroy Vimeo API\n // then clean up (wait, to prevent postmessage errors)\n if (this.embed !== null) {\n this.embed.unload().then(done);\n }\n\n // Vimeo does not always return\n setTimeout(done, 200);\n\n break;\n\n default:\n break;\n }\n }\n\n /**\n * Check for support for a mime type (HTML5 only)\n * @param {string} type - Mime type\n */\n supports(type) {\n return support.mime.call(this, type);\n }\n\n /**\n * Check for support\n * @param {string} type - Player type (audio/video)\n * @param {string} provider - Provider (html5/youtube/vimeo)\n * @param {bool} inline - Where player has `playsinline` sttribute\n */\n static supported(type, provider, inline) {\n return support.check(type, provider, inline);\n }\n\n /**\n * Load an SVG sprite into the page\n * @param {string} url - URL for the SVG sprite\n * @param {string} [id] - Unique ID\n */\n static loadSprite(url, id) {\n return utils.loadSprite(url, id);\n }\n\n /**\n * Setup multiple instances\n * @param {*} selector\n * @param {object} options\n */\n static setup(selector, options = {}) {\n let targets = null;\n\n if (utils.is.string(selector)) {\n targets = Array.from(document.querySelectorAll(selector));\n } else if (utils.is.nodeList(selector)) {\n targets = Array.from(selector);\n } else if (utils.is.array(selector)) {\n targets = selector.filter(utils.is.element);\n }\n\n if (utils.is.empty(targets)) {\n return null;\n }\n\n return targets.map(t => new Plyr(t, options));\n }\n}\n\nPlyr.defaults = utils.cloneDeep(defaults);\n\nexport default Plyr;\n","// ==========================================================================\n// Plyr Polyfilled Build\n// plyr.js v3.3.12\n// https://github.com/sampotts/plyr\n// License: The MIT License (MIT)\n// ==========================================================================\n\nimport 'babel-polyfill';\nimport 'custom-event-polyfill';\nimport 'url-polyfill';\nimport Plyr from './plyr';\n\nexport default Plyr;\n"]} \ No newline at end of file
+{"version":3,"sources":["node_modules/core-js/modules/_global.js","node_modules/core-js/modules/_core.js","node_modules/core-js/modules/_is-object.js","node_modules/core-js/modules/_an-object.js","node_modules/core-js/modules/_fails.js","node_modules/core-js/modules/_descriptors.js","node_modules/core-js/modules/_dom-create.js","node_modules/core-js/modules/_ie8-dom-define.js","node_modules/core-js/modules/_to-primitive.js","node_modules/core-js/modules/_object-dp.js","node_modules/core-js/modules/_property-desc.js","node_modules/core-js/modules/_hide.js","node_modules/core-js/modules/_has.js","node_modules/core-js/modules/_uid.js","node_modules/core-js/modules/_redefine.js","node_modules/core-js/modules/_a-function.js","node_modules/core-js/modules/_ctx.js","node_modules/core-js/modules/_export.js","node_modules/core-js/modules/_typed.js","node_modules/core-js/modules/_library.js","node_modules/core-js/modules/_redefine-all.js","node_modules/core-js/modules/_an-instance.js","node_modules/core-js/modules/_to-integer.js","node_modules/core-js/modules/_to-length.js","node_modules/core-js/modules/_to-index.js","node_modules/core-js/modules/_cof.js","node_modules/core-js/modules/_iobject.js","node_modules/core-js/modules/_defined.js","node_modules/core-js/modules/_to-iobject.js","node_modules/core-js/modules/_to-absolute-index.js","node_modules/core-js/modules/_array-includes.js","node_modules/core-js/modules/_shared.js","node_modules/core-js/modules/_shared-key.js","node_modules/core-js/modules/_object-keys-internal.js","node_modules/core-js/modules/_enum-bug-keys.js","node_modules/core-js/modules/_object-gopn.js","node_modules/core-js/modules/_to-object.js","node_modules/core-js/modules/_array-fill.js","node_modules/core-js/modules/_wks.js","node_modules/core-js/modules/_set-to-string-tag.js","node_modules/core-js/modules/_typed-buffer.js","node_modules/core-js/modules/_species-constructor.js","node_modules/core-js/modules/_set-species.js","node_modules/core-js/modules/es6.typed.array-buffer.js","node_modules/core-js/modules/_classof.js","node_modules/core-js/modules/_iterators.js","node_modules/core-js/modules/_is-array-iter.js","node_modules/core-js/modules/_object-keys.js","node_modules/core-js/modules/_object-dps.js","node_modules/core-js/modules/_html.js","node_modules/core-js/modules/_object-create.js","node_modules/core-js/modules/_object-gpo.js","node_modules/core-js/modules/core.get-iterator-method.js","node_modules/core-js/modules/_is-array.js","node_modules/core-js/modules/_array-species-constructor.js","node_modules/core-js/modules/_array-species-create.js","node_modules/core-js/modules/_array-methods.js","node_modules/core-js/modules/_add-to-unscopables.js","node_modules/core-js/modules/_iter-step.js","node_modules/core-js/modules/_iter-create.js","node_modules/core-js/modules/_iter-define.js","node_modules/core-js/modules/es6.array.iterator.js","node_modules/core-js/modules/_iter-detect.js","node_modules/core-js/modules/_array-copy-within.js","node_modules/core-js/modules/_object-pie.js","node_modules/core-js/modules/_object-gopd.js","node_modules/core-js/modules/_typed-array.js","node_modules/core-js/modules/es6.typed.int8-array.js","node_modules/core-js/modules/es6.typed.uint8-array.js","node_modules/core-js/modules/es6.typed.uint8-clamped-array.js","node_modules/core-js/modules/es6.typed.int16-array.js","node_modules/core-js/modules/es6.typed.uint16-array.js","node_modules/core-js/modules/es6.typed.int32-array.js","node_modules/core-js/modules/es6.typed.uint32-array.js","node_modules/core-js/modules/es6.typed.float32-array.js","node_modules/core-js/modules/es6.typed.float64-array.js","node_modules/core-js/modules/_iter-call.js","node_modules/core-js/modules/_for-of.js","node_modules/core-js/modules/_meta.js","node_modules/core-js/modules/_validate-collection.js","node_modules/core-js/modules/_collection-strong.js","node_modules/core-js/modules/_set-proto.js","node_modules/core-js/modules/_inherit-if-required.js","node_modules/core-js/modules/_collection.js","node_modules/core-js/modules/es6.map.js","node_modules/core-js/modules/es6.set.js","node_modules/core-js/modules/_object-gops.js","node_modules/core-js/modules/_object-assign.js","node_modules/core-js/modules/_collection-weak.js","node_modules/core-js/modules/es6.weak-map.js","node_modules/core-js/modules/es6.weak-set.js","node_modules/core-js/modules/es6.reflect.apply.js","node_modules/core-js/modules/_invoke.js","node_modules/core-js/modules/_bind.js","node_modules/core-js/modules/es6.reflect.construct.js","node_modules/core-js/modules/es6.reflect.define-property.js","node_modules/core-js/modules/es6.reflect.delete-property.js","node_modules/core-js/modules/es6.reflect.get.js","node_modules/core-js/modules/es6.reflect.get-own-property-descriptor.js","node_modules/core-js/modules/es6.reflect.get-prototype-of.js","node_modules/core-js/modules/es6.reflect.has.js","node_modules/core-js/modules/es6.reflect.is-extensible.js","node_modules/core-js/modules/_own-keys.js","node_modules/core-js/modules/es6.reflect.own-keys.js","node_modules/core-js/modules/es6.reflect.prevent-extensions.js","node_modules/core-js/modules/es6.reflect.set.js","node_modules/core-js/modules/es6.reflect.set-prototype-of.js","node_modules/core-js/modules/_task.js","node_modules/core-js/modules/_microtask.js","node_modules/core-js/modules/_new-promise-capability.js","node_modules/core-js/modules/_perform.js","node_modules/core-js/modules/_promise-resolve.js","node_modules/core-js/modules/es6.promise.js","node_modules/core-js/modules/_wks-ext.js","node_modules/core-js/modules/_wks-define.js","node_modules/core-js/modules/_enum-keys.js","node_modules/core-js/modules/_object-gopn-ext.js","node_modules/core-js/modules/es6.symbol.js","node_modules/core-js/modules/_object-sap.js","node_modules/core-js/modules/es6.object.freeze.js","node_modules/core-js/modules/es6.object.seal.js","node_modules/core-js/modules/es6.object.prevent-extensions.js","node_modules/core-js/modules/es6.object.is-frozen.js","node_modules/core-js/modules/es6.object.is-sealed.js","node_modules/core-js/modules/es6.object.is-extensible.js","node_modules/core-js/modules/es6.object.get-own-property-descriptor.js","node_modules/core-js/modules/es6.object.get-prototype-of.js","node_modules/core-js/modules/es6.object.keys.js","node_modules/core-js/modules/es6.object.get-own-property-names.js","node_modules/core-js/modules/es6.object.assign.js","node_modules/core-js/modules/_same-value.js","node_modules/core-js/modules/es6.object.is.js","node_modules/core-js/modules/es6.function.name.js","node_modules/core-js/modules/es6.string.raw.js","node_modules/core-js/modules/es6.string.from-code-point.js","node_modules/core-js/modules/_string-at.js","node_modules/core-js/modules/es6.string.code-point-at.js","node_modules/core-js/modules/_string-repeat.js","node_modules/core-js/modules/es6.string.repeat.js","node_modules/core-js/modules/_is-regexp.js","node_modules/core-js/modules/_string-context.js","node_modules/core-js/modules/_fails-is-regexp.js","node_modules/core-js/modules/es6.string.starts-with.js","node_modules/core-js/modules/es6.string.ends-with.js","node_modules/core-js/modules/es6.string.includes.js","node_modules/core-js/modules/_flags.js","node_modules/core-js/modules/es6.regexp.flags.js","node_modules/core-js/modules/_fix-re-wks.js","node_modules/core-js/modules/es6.regexp.match.js","node_modules/core-js/modules/es6.regexp.replace.js","node_modules/core-js/modules/es6.regexp.split.js","node_modules/core-js/modules/es6.regexp.search.js","node_modules/core-js/modules/_create-property.js","node_modules/core-js/modules/es6.array.from.js","node_modules/core-js/modules/es6.array.of.js","node_modules/core-js/modules/es6.array.copy-within.js","node_modules/core-js/modules/es6.array.find.js","node_modules/core-js/modules/es6.array.find-index.js","node_modules/core-js/modules/es6.array.fill.js","node_modules/core-js/modules/es6.number.is-finite.js","node_modules/core-js/modules/_is-integer.js","node_modules/core-js/modules/es6.number.is-integer.js","node_modules/core-js/modules/es6.number.is-safe-integer.js","node_modules/core-js/modules/es6.number.is-nan.js","node_modules/core-js/modules/es6.number.epsilon.js","node_modules/core-js/modules/es6.number.min-safe-integer.js","node_modules/core-js/modules/es6.number.max-safe-integer.js","node_modules/core-js/modules/_math-log1p.js","node_modules/core-js/modules/es6.math.acosh.js","node_modules/core-js/modules/es6.math.asinh.js","node_modules/core-js/modules/es6.math.atanh.js","node_modules/core-js/modules/_math-sign.js","node_modules/core-js/modules/es6.math.cbrt.js","node_modules/core-js/modules/es6.math.clz32.js","node_modules/core-js/modules/es6.math.cosh.js","node_modules/core-js/modules/_math-expm1.js","node_modules/core-js/modules/es6.math.expm1.js","node_modules/core-js/modules/_math-fround.js","node_modules/core-js/modules/es6.math.fround.js","node_modules/core-js/modules/es6.math.hypot.js","node_modules/core-js/modules/es6.math.imul.js","node_modules/core-js/modules/es6.math.log1p.js","node_modules/core-js/modules/es6.math.log10.js","node_modules/core-js/modules/es6.math.log2.js","node_modules/core-js/modules/es6.math.sign.js","node_modules/core-js/modules/es6.math.sinh.js","node_modules/core-js/modules/es6.math.tanh.js","node_modules/core-js/modules/es6.math.trunc.js","node_modules/core-js/modules/es7.array.includes.js","node_modules/core-js/modules/_object-to-array.js","node_modules/core-js/modules/es7.object.values.js","node_modules/core-js/modules/es7.object.entries.js","node_modules/core-js/modules/es7.object.get-own-property-descriptors.js","node_modules/core-js/modules/_string-pad.js","node_modules/core-js/modules/_user-agent.js","node_modules/core-js/modules/es7.string.pad-start.js","node_modules/core-js/modules/es7.string.pad-end.js","node_modules/core-js/modules/web.timers.js","node_modules/core-js/modules/web.immediate.js","node_modules/core-js/modules/web.dom.iterable.js","node_modules/regenerator-runtime/runtime.js","node_modules/custom-event-polyfill/custom-event-polyfill.js","node_modules/url-polyfill/url-polyfill.js","src/js/utils/is.js","src/js/utils/events.js","src/js/utils/elements.js","src/js/utils/animation.js","src/js/utils/browser.js","src/js/support.js","src/js/html5.js","src/js/utils/objects.js","src/js/utils/strings.js","src/js/i18n.js","src/js/utils/arrays.js","src/js/storage.js","src/js/utils/loadSprite.js","src/js/utils/time.js","src/js/controls.js","src/js/utils/fetch.js","src/js/utils/urls.js","src/js/captions.js","src/js/config/defaults.js","src/js/config/types.js","src/js/console.js","src/js/fullscreen.js","src/js/utils/loadImage.js","src/js/ui.js","src/js/listeners.js","node_modules/loadjs/dist/loadjs.umd.js","src/js/utils/loadScript.js","src/js/plugins/vimeo.js","src/js/plugins/youtube.js","src/js/media.js","src/js/plugins/ads.js","src/js/source.js","src/js/plyr.js","src/js/plyr.polyfilled.js"],"names":["isObject","require$$0","document","require$$1","require$$2","anObject","toPrimitive","IE8_DOM_DEFINE","dP","createDesc","has","hide","global","aFunction","core","ctx","redefine","uid","toInteger","toLength","cof","IObject","defined","min","toIObject","toAbsoluteIndex","$keys","toObject","DESCRIPTORS","toIndex","$typed","anInstance","arrayFill","redefineAll","fails","setToStringTag","SPECIES","buffer","VIEW","$export","speciesConstructor","TAG","Iterators","enumBugKeys","getKeys","IE_PROTO","PROTOTYPE","dPs","ITERATOR","classof","isArray","asc","ArrayProto","create","descriptor","$iterCreate","getPrototypeOf","step","addToUnscopables","pIE","require$$3","require$$4","require$$5","require$$6","require$$7","require$$8","require$$9","require$$10","require$$11","require$$12","require$$13","require$$14","require$$15","require$$16","require$$17","require$$18","require$$19","require$$20","require$$21","require$$22","require$$23","require$$24","require$$25","require$$26","require$$27","require$$28","require$$29","require$$30","require$$31","require$$32","require$$33","require$$34","require$$35","require$$36","require$$37","require$$38","getIterFn","isArrayIter","call","forOf","validate","$iterDefine","setSpecies","meta","$iterDetect","inheritIfRequired","strong","gOPS","createArrayMethod","id","$has","weak","assign","invoke","bind","gOPD","getProto","Reflect","gOPN","setProto","cel","html","process","Promise","newPromiseCapability","TypeError","isNode","newPromiseCapabilityModule","perform","promiseResolve","LIBRARY","wksExt","toString","$GOPD","$DP","gOPNExt","wks","shared","ObjectProto","USE_NATIVE","$fails","_create","enumKeys","wksDefine","$getOwnPropertyDescriptor","$getPrototypeOf","isRegExp","MATCH","context","$defineProperty","createProperty","$find","KEY","forced","floor","isInteger","log1p","sign","$expm1","abs","exp","expm1","isEnum","ownKeys","repeat","navigator","userAgent","$pad","wrap","$task","i","NAME","$iterators","this","CustomEvent","getConstructor","input","constructor","instanceOf","Boolean","is","object","Object","number","Number","isNaN","string","String","boolean","function","Function","array","nullOrUndefined","Array","weakMap","WeakMap","nodeList","NodeList","element","Element","textNode","Text","event","Event","cue","window","TextTrackCue","VTTCue","track","TextTrack","kind","url","test","empty","length","keys","supportsPassiveListeners","supported","options","defineProperty","get","addEventListener","removeEventListener","e","toggleListener","callback","toggle","passive","capture","events","split","forEach","eventListeners","push","type","on","off","once","onceCallback","args","apply","triggerEvent","bubbles","detail","plyr","dispatchEvent","unbindListeners","item","ready","setTimeout","resolve","elements","container","then","wrapper","targets","from","reverse","index","child","cloneNode","parent","parentNode","sibling","nextSibling","appendChild","insertBefore","setAttributes","attributes","entries","filter","value","key","setAttribute","createElement","text","innerText","insertAfter","target","insertElement","removeElement","removeChild","emptyElement","childNodes","lastChild","replaceElement","newChild","oldChild","replaceChild","getAttributesFromSelector","sel","existingAttributes","existing","selector","s","trim","className","replace","stripped","parts","start","charAt","class","toggleHidden","hidden","hasAttribute","removeAttribute","toggleClass","force","method","classList","contains","hasClass","matches","prototype","match","querySelectorAll","includes","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","getElements","getElement","querySelector","getFocusElement","focused","activeElement","body","trapFocus","focusable","first","last","trap","keyCode","shiftKey","focus","preventDefault","transitionEndEvent","WebkitTransition","MozTransition","OTransition","transition","find","style","undefined","repaint","offsetHeight","browser","isIE","documentMode","isWebkit","documentElement","isIPhone","platform","isIos","defaultCodecs","support","audio","video","check","provider","playsinline","canPlayInline","api","ui","rangeInput","pip","webkitSetPresentationMode","airplay","WebKitPlaybackTargetAvailabilityEvent","mime","inputType","mediaType","isHTML5","media","canPlayType","err","textTracks","range","touch","transitions","reducedMotion","matchMedia","html5","getSources","sources","source","getAttribute","getQualityOptions","map","extend","player","set","currentTime","playing","src","onLoadedMetaData","load","play","quality","cancelRequests","config","blankVideo","debug","log","cloneDeep","JSON","parse","stringify","getDeep","path","reduce","obj","shift","generateId","prefix","Math","random","format","getPercentage","current","max","toFixed","replaceAll","RegExp","toTitleCase","toUpperCase","substr","toLowerCase","toPascalCase","toCamelCase","slice","stripHTML","fragment","createDocumentFragment","innerHTML","firstChild","getHTML","i18n","seekTime","title","dedupe","indexOf","closest","prev","curr","Storage","enabled","storage","store","localStorage","getItem","json","setItem","removeItem","loadSprite","hasId","isCached","exists","getElementById","update","data","insertAdjacentElement","useStorage","cached","content","fetch","result","catch","getHours","parseInt","getMinutes","getSeconds","formatTime","time","displayHours","inverted","hours","mins","secs","controls","getIconUrl","URL","iconUrl","location","cors","host","svg4everybody","findElements","selectors","buttons","pause","restart","rewind","fastForward","mute","settings","captions","fullscreen","progress","inputs","seek","volume","display","duration","seekTooltip","classNames","tooltip","error","warn","toggleNativeControls","createIcon","namespace","iconPath","iconPrefix","icon","createElementNS","role","use","setAttributeNS","createLabel","attr","universals","join","createBadge","badge","menu","createButton","buttonType","button","label","labelPressed","iconPressed","control","controlPressed","enumerable","pressed","createRange","autocomplete","updateRangeFill","createProgress","suffixKey","played","suffix","createTime","createMenuItem","list","checked","radio","name","faux","insertAdjacentHTML","forceHours","updateTimeDisplay","updateVolume","setRange","muted","updateProgress","setProgress","getElementsByTagName","nodeValue","buffered","percent","setProperty","updateSeekTooltip","tooltips","clientRect","getBoundingClientRect","visible","width","pageX","left","parseFloat","timeUpdate","invert","invertTime","seeking","durationUpdate","hasDuration","displayDuration","paused","toggleTab","setting","tabs","setQualityMenu","panes","checkMenu","getBadge","sort","a","b","sorting","getLabel","updateSetting","pane","currentTrack","default","setCaptionsMenu","tracks","getTracks","toggled","language","unshift","setSpeedMenu","speed","isVimeo","values","some","tab","toggleMenu","form","show","isMenuItem","isButton","stopPropagation","open","getTabSize","clone","position","opacity","scrollWidth","height","scrollHeight","showTab","isTab","size","restore","propertyName","tabindex","inner","home","back","inject","props","seektime","labels","responseType","reject","request","XMLHttpRequest","responseText","response","Error","statusText","send","parseUrl","safe","parser","href","buildUrlParams","params","URLSearchParams","setup","isVideo","isYouTube","hostname","protocol","createObjectURL","blob","languages","userLanguage","active","trackEvents","currentTrackNode","languageExists","mode","updateCues","setLanguage","activeClass","findTrack","embed","enableTextTrack","sortIsDefault","sorted","every","getCurrentTrack","cues","activeCues","getCueAsHTML","cueText","changed","caption","defaults","autoplay","autopause","toggleInvert","ratio","clickToPlay","hideControls","resetOnEnd","disableContextMenu","loop","selected","keyboard","fallback","iosNative","seekLabel","unmute","enableCaptions","disableCaptions","enterFullscreen","exitFullscreen","frameTitle","menuBack","normal","end","all","reset","disabled","advertisement","qualityBadge","urls","vimeo","sdk","iframe","youtube","googleIMA","listeners","editable","embedContainer","poster","posterEnabled","ads","stopped","loading","hover","isTouch","uiSupported","noTransition","tabFocus","google","publisherId","providers","types","getProviderByUrl","noop","Console","console","onChange","toggleFallback","scrollPosition","x","scrollX","y","scrollY","scrollTo","overflow","Fullscreen","property","native","webkitEnterFullscreen","requestFullscreen","webkitExitFullscreen","cancelFullScreen","action","enter","exit","fullscreenElement","fullscreenEnabled","webkitFullscreenEnabled","mozFullScreenEnabled","msFullscreenEnabled","prefixes","pre","loadImage","minWidth","image","Image","handler","onload","onerror","naturalWidth","addStyleHook","build","checkPlaying","setTitle","setPoster","isEmbed","togglePoster","enable","backgroundImage","backgroundSize","toggleControls","checkLoading","clearTimeout","timers","Listeners","lastKey","handleKey","firstTouch","code","which","altKey","ctrlKey","metaKey","seekByKey","togglePlay","increaseVolume","decreaseVolume","forward","toggleCaptions","delay","hasAudio","initialized","managerPromise","isAudio","ended","proxyEvents","concat","inputEvent","proxy","defaultHandler","customHandlerKey","customHandler","hasCustomHandler","returned","showHomeTab","currentTarget","eventType","done","seekTo","webkitDirectionInvertedFromDevice","direction","deltaY","deltaX","define","loadScript","loadjs","success","parseId","regex","$2","getAspectRatio","getRatio","w","h","assurePlaybackState","hasPlayed","setAspectRatio","Vimeo","padding","paddingBottom","offset","transform","byline","portrait","transparent","gesture","thumbnail_large","pathname","Player","disableTextTrack","stop","restorePause","setVolume","setCurrentTime","setPlaybackRate","setLoop","currentSrc","getVideoUrl","getVideoWidth","getVideoHeight","dimensions","setAutopause","state","getVideoTitle","getCurrentTime","getDuration","getTextTracks","strippedCues","getPaused","frame","seconds","mapQualityUnit","qualities","hd2160","hd1440","hd1080","hd720","large","medium","small","tiny","entry","mapQualityUnits","levels","level","YT","onYouTubeReadyCallbacks","onYouTubeIframeAPIReady","getTitle","videoId","getVideoData","items","snippet","currentId","startsWith","posterSrc","playerVars","rel","showinfo","iv_load_policy","modestbranding","disablekb","widget_referrer","cc_load_policy","cc_lang_pref","onError","message","onPlaybackQualityChange","onPlaybackRateChange","instance","playbackRate","getPlaybackRate","onReady","playVideo","pauseVideo","stopVideo","getPlaybackQuality","setPlaybackQuality","getAvailablePlaybackRates","clearInterval","buffering","setInterval","getVideoLoadedFraction","lastBuffered","onStateChange","seeked","getAvailableQualityLevels","unMute","Ads","displayContainer","manager","loader","cuePoints","safetyTimer","countdownTimer","ima","trigger","startSafetyTimer","clearSafetyTimer","setupIMA","setVpaidMode","ImaSdkSettings","VpaidMode","ENABLED","setLocale","AdDisplayContainer","requestAds","AdsLoader","AdsManagerLoadedEvent","Type","ADS_MANAGER_LOADED","onAdsManagerLoaded","AdErrorEvent","AD_ERROR","onAdError","AdsRequest","adTagUrl","tagUrl","linearAdSlotWidth","offsetWidth","linearAdSlotHeight","nonLinearAdSlotWidth","nonLinearAdSlotHeight","forceNonLinearFullSlot","setAdWillPlayMuted","getRemainingTime","AdsRenderingSettings","restoreCustomPlaybackStateOnAdBreakComplete","enablePreloading","getAdsManager","getCuePoints","cuePoint","seekElement","cuePercentage","AdEvent","onAdEvent","ad","getAd","LOADED","pollCountdown","isLinear","ALL_ADS_COMPLETED","loadAds","CONTENT_PAUSE_REQUESTED","pauseContent","CONTENT_RESUME_REQUESTED","resumeContent","STARTED","MIDPOINT","COMPLETE","IMPRESSION","CLICK","cancel","contentComplete","seekedTime","discardAdBreak","splice","resize","ViewMode","NORMAL","initialize","init","adError","zIndex","destroy","handlers","AV_PUBLISHERID","AV_CHANNELID","AV_URL","cb","Date","now","AV_WIDTH","AV_HEIGHT","AV_CDIM2","base","insertElements","attribute","change","tagName","crossorigin","Plyr","failed","jQuery","original","searchParams","truthy","webkitShowPlaybackTargetPicker","isHidden","hiding","eventName","soft","unload","inputIsValid","fauxDuration","mozHasAudio","webkitAudioDecodedByteCount","audioTracks","states","inline","webkitPresentationMode","t"],"mappings":"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","file":"plyr.polyfilled.js","sourcesContent":["// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nvar global = module.exports = typeof window != 'undefined' && window.Math == Math\n ? window : typeof self != 'undefined' && self.Math == Math ? self\n // eslint-disable-next-line no-new-func\n : Function('return this')();\nif (typeof __g == 'number') __g = global; // eslint-disable-line no-undef\n","var core = module.exports = { version: '2.5.3' };\nif (typeof __e == 'number') __e = core; // eslint-disable-line no-undef\n","module.exports = function (it) {\n return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n","var isObject = require('./_is-object');\nmodule.exports = function (it) {\n if (!isObject(it)) throw TypeError(it + ' is not an object!');\n return it;\n};\n","module.exports = function (exec) {\n try {\n return !!exec();\n } catch (e) {\n return true;\n }\n};\n","// Thank's IE8 for his funny defineProperty\nmodule.exports = !require('./_fails')(function () {\n return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;\n});\n","var isObject = require('./_is-object');\nvar document = require('./_global').document;\n// typeof document.createElement is 'object' in old IE\nvar is = isObject(document) && isObject(document.createElement);\nmodule.exports = function (it) {\n return is ? document.createElement(it) : {};\n};\n","module.exports = !require('./_descriptors') && !require('./_fails')(function () {\n return Object.defineProperty(require('./_dom-create')('div'), 'a', { get: function () { return 7; } }).a != 7;\n});\n","// 7.1.1 ToPrimitive(input [, PreferredType])\nvar isObject = require('./_is-object');\n// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n// and the second argument - flag - preferred type is a string\nmodule.exports = function (it, S) {\n if (!isObject(it)) return it;\n var fn, val;\n if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;\n if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n throw TypeError(\"Can't convert object to primitive value\");\n};\n","var anObject = require('./_an-object');\nvar IE8_DOM_DEFINE = require('./_ie8-dom-define');\nvar toPrimitive = require('./_to-primitive');\nvar dP = Object.defineProperty;\n\nexports.f = require('./_descriptors') ? Object.defineProperty : function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPrimitive(P, true);\n anObject(Attributes);\n if (IE8_DOM_DEFINE) try {\n return dP(O, P, Attributes);\n } catch (e) { /* empty */ }\n if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');\n if ('value' in Attributes) O[P] = Attributes.value;\n return O;\n};\n","module.exports = function (bitmap, value) {\n return {\n enumerable: !(bitmap & 1),\n configurable: !(bitmap & 2),\n writable: !(bitmap & 4),\n value: value\n };\n};\n","var dP = require('./_object-dp');\nvar createDesc = require('./_property-desc');\nmodule.exports = require('./_descriptors') ? function (object, key, value) {\n return dP.f(object, key, createDesc(1, value));\n} : function (object, key, value) {\n object[key] = value;\n return object;\n};\n","var hasOwnProperty = {}.hasOwnProperty;\nmodule.exports = function (it, key) {\n return hasOwnProperty.call(it, key);\n};\n","var id = 0;\nvar px = Math.random();\nmodule.exports = function (key) {\n return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));\n};\n","var global = require('./_global');\nvar hide = require('./_hide');\nvar has = require('./_has');\nvar SRC = require('./_uid')('src');\nvar TO_STRING = 'toString';\nvar $toString = Function[TO_STRING];\nvar TPL = ('' + $toString).split(TO_STRING);\n\nrequire('./_core').inspectSource = function (it) {\n return $toString.call(it);\n};\n\n(module.exports = function (O, key, val, safe) {\n var isFunction = typeof val == 'function';\n if (isFunction) has(val, 'name') || hide(val, 'name', key);\n if (O[key] === val) return;\n if (isFunction) has(val, SRC) || hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key)));\n if (O === global) {\n O[key] = val;\n } else if (!safe) {\n delete O[key];\n hide(O, key, val);\n } else if (O[key]) {\n O[key] = val;\n } else {\n hide(O, key, val);\n }\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n})(Function.prototype, TO_STRING, function toString() {\n return typeof this == 'function' && this[SRC] || $toString.call(this);\n});\n","module.exports = function (it) {\n if (typeof it != 'function') throw TypeError(it + ' is not a function!');\n return it;\n};\n","// optional / simple context binding\nvar aFunction = require('./_a-function');\nmodule.exports = function (fn, that, length) {\n aFunction(fn);\n if (that === undefined) return fn;\n switch (length) {\n case 1: return function (a) {\n return fn.call(that, a);\n };\n case 2: return function (a, b) {\n return fn.call(that, a, b);\n };\n case 3: return function (a, b, c) {\n return fn.call(that, a, b, c);\n };\n }\n return function (/* ...args */) {\n return fn.apply(that, arguments);\n };\n};\n","var global = require('./_global');\nvar core = require('./_core');\nvar hide = require('./_hide');\nvar redefine = require('./_redefine');\nvar ctx = require('./_ctx');\nvar PROTOTYPE = 'prototype';\n\nvar $export = function (type, name, source) {\n var IS_FORCED = type & $export.F;\n var IS_GLOBAL = type & $export.G;\n var IS_STATIC = type & $export.S;\n var IS_PROTO = type & $export.P;\n var IS_BIND = type & $export.B;\n var target = IS_GLOBAL ? global : IS_STATIC ? global[name] || (global[name] = {}) : (global[name] || {})[PROTOTYPE];\n var exports = IS_GLOBAL ? core : core[name] || (core[name] = {});\n var expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {});\n var key, own, out, exp;\n if (IS_GLOBAL) source = name;\n for (key in source) {\n // contains in native\n own = !IS_FORCED && target && target[key] !== undefined;\n // export native or passed\n out = (own ? target : source)[key];\n // bind timers to global for call from export context\n exp = IS_BIND && own ? ctx(out, global) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;\n // extend global\n if (target) redefine(target, key, out, type & $export.U);\n // export\n if (exports[key] != out) hide(exports, key, exp);\n if (IS_PROTO && expProto[key] != out) expProto[key] = out;\n }\n};\nglobal.core = core;\n// type bitmap\n$export.F = 1; // forced\n$export.G = 2; // global\n$export.S = 4; // static\n$export.P = 8; // proto\n$export.B = 16; // bind\n$export.W = 32; // wrap\n$export.U = 64; // safe\n$export.R = 128; // real proto method for `library`\nmodule.exports = $export;\n","var global = require('./_global');\nvar hide = require('./_hide');\nvar uid = require('./_uid');\nvar TYPED = uid('typed_array');\nvar VIEW = uid('view');\nvar ABV = !!(global.ArrayBuffer && global.DataView);\nvar CONSTR = ABV;\nvar i = 0;\nvar l = 9;\nvar Typed;\n\nvar TypedArrayConstructors = (\n 'Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array'\n).split(',');\n\nwhile (i < l) {\n if (Typed = global[TypedArrayConstructors[i++]]) {\n hide(Typed.prototype, TYPED, true);\n hide(Typed.prototype, VIEW, true);\n } else CONSTR = false;\n}\n\nmodule.exports = {\n ABV: ABV,\n CONSTR: CONSTR,\n TYPED: TYPED,\n VIEW: VIEW\n};\n","module.exports = false;\n","var redefine = require('./_redefine');\nmodule.exports = function (target, src, safe) {\n for (var key in src) redefine(target, key, src[key], safe);\n return target;\n};\n","module.exports = function (it, Constructor, name, forbiddenField) {\n if (!(it instanceof Constructor) || (forbiddenField !== undefined && forbiddenField in it)) {\n throw TypeError(name + ': incorrect invocation!');\n } return it;\n};\n","// 7.1.4 ToInteger\nvar ceil = Math.ceil;\nvar floor = Math.floor;\nmodule.exports = function (it) {\n return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);\n};\n","// 7.1.15 ToLength\nvar toInteger = require('./_to-integer');\nvar min = Math.min;\nmodule.exports = function (it) {\n return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991\n};\n","// https://tc39.github.io/ecma262/#sec-toindex\nvar toInteger = require('./_to-integer');\nvar toLength = require('./_to-length');\nmodule.exports = function (it) {\n if (it === undefined) return 0;\n var number = toInteger(it);\n var length = toLength(number);\n if (number !== length) throw RangeError('Wrong length!');\n return length;\n};\n","var toString = {}.toString;\n\nmodule.exports = function (it) {\n return toString.call(it).slice(8, -1);\n};\n","// fallback for non-array-like ES3 and non-enumerable old V8 strings\nvar cof = require('./_cof');\n// eslint-disable-next-line no-prototype-builtins\nmodule.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) {\n return cof(it) == 'String' ? it.split('') : Object(it);\n};\n","// 7.2.1 RequireObjectCoercible(argument)\nmodule.exports = function (it) {\n if (it == undefined) throw TypeError(\"Can't call method on \" + it);\n return it;\n};\n","// to indexed object, toObject with fallback for non-array-like ES3 strings\nvar IObject = require('./_iobject');\nvar defined = require('./_defined');\nmodule.exports = function (it) {\n return IObject(defined(it));\n};\n","var toInteger = require('./_to-integer');\nvar max = Math.max;\nvar min = Math.min;\nmodule.exports = function (index, length) {\n index = toInteger(index);\n return index < 0 ? max(index + length, 0) : min(index, length);\n};\n","// false -> Array#indexOf\n// true -> Array#includes\nvar toIObject = require('./_to-iobject');\nvar toLength = require('./_to-length');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nmodule.exports = function (IS_INCLUDES) {\n return function ($this, el, fromIndex) {\n var O = toIObject($this);\n var length = toLength(O.length);\n var index = toAbsoluteIndex(fromIndex, length);\n var value;\n // Array#includes uses SameValueZero equality algorithm\n // eslint-disable-next-line no-self-compare\n if (IS_INCLUDES && el != el) while (length > index) {\n value = O[index++];\n // eslint-disable-next-line no-self-compare\n if (value != value) return true;\n // Array#indexOf ignores holes, Array#includes - not\n } else for (;length > index; index++) if (IS_INCLUDES || index in O) {\n if (O[index] === el) return IS_INCLUDES || index || 0;\n } return !IS_INCLUDES && -1;\n };\n};\n","var global = require('./_global');\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || (global[SHARED] = {});\nmodule.exports = function (key) {\n return store[key] || (store[key] = {});\n};\n","var shared = require('./_shared')('keys');\nvar uid = require('./_uid');\nmodule.exports = function (key) {\n return shared[key] || (shared[key] = uid(key));\n};\n","var has = require('./_has');\nvar toIObject = require('./_to-iobject');\nvar arrayIndexOf = require('./_array-includes')(false);\nvar IE_PROTO = require('./_shared-key')('IE_PROTO');\n\nmodule.exports = function (object, names) {\n var O = toIObject(object);\n var i = 0;\n var result = [];\n var key;\n for (key in O) if (key != IE_PROTO) has(O, key) && result.push(key);\n // Don't enum bug & hidden keys\n while (names.length > i) if (has(O, key = names[i++])) {\n ~arrayIndexOf(result, key) || result.push(key);\n }\n return result;\n};\n","// IE 8- don't enum bug keys\nmodule.exports = (\n 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'\n).split(',');\n","// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)\nvar $keys = require('./_object-keys-internal');\nvar hiddenKeys = require('./_enum-bug-keys').concat('length', 'prototype');\n\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n return $keys(O, hiddenKeys);\n};\n","// 7.1.13 ToObject(argument)\nvar defined = require('./_defined');\nmodule.exports = function (it) {\n return Object(defined(it));\n};\n","// 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length)\n'use strict';\nvar toObject = require('./_to-object');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nvar toLength = require('./_to-length');\nmodule.exports = function fill(value /* , start = 0, end = @length */) {\n var O = toObject(this);\n var length = toLength(O.length);\n var aLen = arguments.length;\n var index = toAbsoluteIndex(aLen > 1 ? arguments[1] : undefined, length);\n var end = aLen > 2 ? arguments[2] : undefined;\n var endPos = end === undefined ? length : toAbsoluteIndex(end, length);\n while (endPos > index) O[index++] = value;\n return O;\n};\n","var store = require('./_shared')('wks');\nvar uid = require('./_uid');\nvar Symbol = require('./_global').Symbol;\nvar USE_SYMBOL = typeof Symbol == 'function';\n\nvar $exports = module.exports = function (name) {\n return store[name] || (store[name] =\n USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name));\n};\n\n$exports.store = store;\n","var def = require('./_object-dp').f;\nvar has = require('./_has');\nvar TAG = require('./_wks')('toStringTag');\n\nmodule.exports = function (it, tag, stat) {\n if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag });\n};\n","'use strict';\nvar global = require('./_global');\nvar DESCRIPTORS = require('./_descriptors');\nvar LIBRARY = require('./_library');\nvar $typed = require('./_typed');\nvar hide = require('./_hide');\nvar redefineAll = require('./_redefine-all');\nvar fails = require('./_fails');\nvar anInstance = require('./_an-instance');\nvar toInteger = require('./_to-integer');\nvar toLength = require('./_to-length');\nvar toIndex = require('./_to-index');\nvar gOPN = require('./_object-gopn').f;\nvar dP = require('./_object-dp').f;\nvar arrayFill = require('./_array-fill');\nvar setToStringTag = require('./_set-to-string-tag');\nvar ARRAY_BUFFER = 'ArrayBuffer';\nvar DATA_VIEW = 'DataView';\nvar PROTOTYPE = 'prototype';\nvar WRONG_LENGTH = 'Wrong length!';\nvar WRONG_INDEX = 'Wrong index!';\nvar $ArrayBuffer = global[ARRAY_BUFFER];\nvar $DataView = global[DATA_VIEW];\nvar Math = global.Math;\nvar RangeError = global.RangeError;\n// eslint-disable-next-line no-shadow-restricted-names\nvar Infinity = global.Infinity;\nvar BaseBuffer = $ArrayBuffer;\nvar abs = Math.abs;\nvar pow = Math.pow;\nvar floor = Math.floor;\nvar log = Math.log;\nvar LN2 = Math.LN2;\nvar BUFFER = 'buffer';\nvar BYTE_LENGTH = 'byteLength';\nvar BYTE_OFFSET = 'byteOffset';\nvar $BUFFER = DESCRIPTORS ? '_b' : BUFFER;\nvar $LENGTH = DESCRIPTORS ? '_l' : BYTE_LENGTH;\nvar $OFFSET = DESCRIPTORS ? '_o' : BYTE_OFFSET;\n\n// IEEE754 conversions based on https://github.com/feross/ieee754\nfunction packIEEE754(value, mLen, nBytes) {\n var buffer = new Array(nBytes);\n var eLen = nBytes * 8 - mLen - 1;\n var eMax = (1 << eLen) - 1;\n var eBias = eMax >> 1;\n var rt = mLen === 23 ? pow(2, -24) - pow(2, -77) : 0;\n var i = 0;\n var s = value < 0 || value === 0 && 1 / value < 0 ? 1 : 0;\n var e, m, c;\n value = abs(value);\n // eslint-disable-next-line no-self-compare\n if (value != value || value === Infinity) {\n // eslint-disable-next-line no-self-compare\n m = value != value ? 1 : 0;\n e = eMax;\n } else {\n e = floor(log(value) / LN2);\n if (value * (c = pow(2, -e)) < 1) {\n e--;\n c *= 2;\n }\n if (e + eBias >= 1) {\n value += rt / c;\n } else {\n value += rt * pow(2, 1 - eBias);\n }\n if (value * c >= 2) {\n e++;\n c /= 2;\n }\n if (e + eBias >= eMax) {\n m = 0;\n e = eMax;\n } else if (e + eBias >= 1) {\n m = (value * c - 1) * pow(2, mLen);\n e = e + eBias;\n } else {\n m = value * pow(2, eBias - 1) * pow(2, mLen);\n e = 0;\n }\n }\n for (; mLen >= 8; buffer[i++] = m & 255, m /= 256, mLen -= 8);\n e = e << mLen | m;\n eLen += mLen;\n for (; eLen > 0; buffer[i++] = e & 255, e /= 256, eLen -= 8);\n buffer[--i] |= s * 128;\n return buffer;\n}\nfunction unpackIEEE754(buffer, mLen, nBytes) {\n var eLen = nBytes * 8 - mLen - 1;\n var eMax = (1 << eLen) - 1;\n var eBias = eMax >> 1;\n var nBits = eLen - 7;\n var i = nBytes - 1;\n var s = buffer[i--];\n var e = s & 127;\n var m;\n s >>= 7;\n for (; nBits > 0; e = e * 256 + buffer[i], i--, nBits -= 8);\n m = e & (1 << -nBits) - 1;\n e >>= -nBits;\n nBits += mLen;\n for (; nBits > 0; m = m * 256 + buffer[i], i--, nBits -= 8);\n if (e === 0) {\n e = 1 - eBias;\n } else if (e === eMax) {\n return m ? NaN : s ? -Infinity : Infinity;\n } else {\n m = m + pow(2, mLen);\n e = e - eBias;\n } return (s ? -1 : 1) * m * pow(2, e - mLen);\n}\n\nfunction unpackI32(bytes) {\n return bytes[3] << 24 | bytes[2] << 16 | bytes[1] << 8 | bytes[0];\n}\nfunction packI8(it) {\n return [it & 0xff];\n}\nfunction packI16(it) {\n return [it & 0xff, it >> 8 & 0xff];\n}\nfunction packI32(it) {\n return [it & 0xff, it >> 8 & 0xff, it >> 16 & 0xff, it >> 24 & 0xff];\n}\nfunction packF64(it) {\n return packIEEE754(it, 52, 8);\n}\nfunction packF32(it) {\n return packIEEE754(it, 23, 4);\n}\n\nfunction addGetter(C, key, internal) {\n dP(C[PROTOTYPE], key, { get: function () { return this[internal]; } });\n}\n\nfunction get(view, bytes, index, isLittleEndian) {\n var numIndex = +index;\n var intIndex = toIndex(numIndex);\n if (intIndex + bytes > view[$LENGTH]) throw RangeError(WRONG_INDEX);\n var store = view[$BUFFER]._b;\n var start = intIndex + view[$OFFSET];\n var pack = store.slice(start, start + bytes);\n return isLittleEndian ? pack : pack.reverse();\n}\nfunction set(view, bytes, index, conversion, value, isLittleEndian) {\n var numIndex = +index;\n var intIndex = toIndex(numIndex);\n if (intIndex + bytes > view[$LENGTH]) throw RangeError(WRONG_INDEX);\n var store = view[$BUFFER]._b;\n var start = intIndex + view[$OFFSET];\n var pack = conversion(+value);\n for (var i = 0; i < bytes; i++) store[start + i] = pack[isLittleEndian ? i : bytes - i - 1];\n}\n\nif (!$typed.ABV) {\n $ArrayBuffer = function ArrayBuffer(length) {\n anInstance(this, $ArrayBuffer, ARRAY_BUFFER);\n var byteLength = toIndex(length);\n this._b = arrayFill.call(new Array(byteLength), 0);\n this[$LENGTH] = byteLength;\n };\n\n $DataView = function DataView(buffer, byteOffset, byteLength) {\n anInstance(this, $DataView, DATA_VIEW);\n anInstance(buffer, $ArrayBuffer, DATA_VIEW);\n var bufferLength = buffer[$LENGTH];\n var offset = toInteger(byteOffset);\n if (offset < 0 || offset > bufferLength) throw RangeError('Wrong offset!');\n byteLength = byteLength === undefined ? bufferLength - offset : toLength(byteLength);\n if (offset + byteLength > bufferLength) throw RangeError(WRONG_LENGTH);\n this[$BUFFER] = buffer;\n this[$OFFSET] = offset;\n this[$LENGTH] = byteLength;\n };\n\n if (DESCRIPTORS) {\n addGetter($ArrayBuffer, BYTE_LENGTH, '_l');\n addGetter($DataView, BUFFER, '_b');\n addGetter($DataView, BYTE_LENGTH, '_l');\n addGetter($DataView, BYTE_OFFSET, '_o');\n }\n\n redefineAll($DataView[PROTOTYPE], {\n getInt8: function getInt8(byteOffset) {\n return get(this, 1, byteOffset)[0] << 24 >> 24;\n },\n getUint8: function getUint8(byteOffset) {\n return get(this, 1, byteOffset)[0];\n },\n getInt16: function getInt16(byteOffset /* , littleEndian */) {\n var bytes = get(this, 2, byteOffset, arguments[1]);\n return (bytes[1] << 8 | bytes[0]) << 16 >> 16;\n },\n getUint16: function getUint16(byteOffset /* , littleEndian */) {\n var bytes = get(this, 2, byteOffset, arguments[1]);\n return bytes[1] << 8 | bytes[0];\n },\n getInt32: function getInt32(byteOffset /* , littleEndian */) {\n return unpackI32(get(this, 4, byteOffset, arguments[1]));\n },\n getUint32: function getUint32(byteOffset /* , littleEndian */) {\n return unpackI32(get(this, 4, byteOffset, arguments[1])) >>> 0;\n },\n getFloat32: function getFloat32(byteOffset /* , littleEndian */) {\n return unpackIEEE754(get(this, 4, byteOffset, arguments[1]), 23, 4);\n },\n getFloat64: function getFloat64(byteOffset /* , littleEndian */) {\n return unpackIEEE754(get(this, 8, byteOffset, arguments[1]), 52, 8);\n },\n setInt8: function setInt8(byteOffset, value) {\n set(this, 1, byteOffset, packI8, value);\n },\n setUint8: function setUint8(byteOffset, value) {\n set(this, 1, byteOffset, packI8, value);\n },\n setInt16: function setInt16(byteOffset, value /* , littleEndian */) {\n set(this, 2, byteOffset, packI16, value, arguments[2]);\n },\n setUint16: function setUint16(byteOffset, value /* , littleEndian */) {\n set(this, 2, byteOffset, packI16, value, arguments[2]);\n },\n setInt32: function setInt32(byteOffset, value /* , littleEndian */) {\n set(this, 4, byteOffset, packI32, value, arguments[2]);\n },\n setUint32: function setUint32(byteOffset, value /* , littleEndian */) {\n set(this, 4, byteOffset, packI32, value, arguments[2]);\n },\n setFloat32: function setFloat32(byteOffset, value /* , littleEndian */) {\n set(this, 4, byteOffset, packF32, value, arguments[2]);\n },\n setFloat64: function setFloat64(byteOffset, value /* , littleEndian */) {\n set(this, 8, byteOffset, packF64, value, arguments[2]);\n }\n });\n} else {\n if (!fails(function () {\n $ArrayBuffer(1);\n }) || !fails(function () {\n new $ArrayBuffer(-1); // eslint-disable-line no-new\n }) || fails(function () {\n new $ArrayBuffer(); // eslint-disable-line no-new\n new $ArrayBuffer(1.5); // eslint-disable-line no-new\n new $ArrayBuffer(NaN); // eslint-disable-line no-new\n return $ArrayBuffer.name != ARRAY_BUFFER;\n })) {\n $ArrayBuffer = function ArrayBuffer(length) {\n anInstance(this, $ArrayBuffer);\n return new BaseBuffer(toIndex(length));\n };\n var ArrayBufferProto = $ArrayBuffer[PROTOTYPE] = BaseBuffer[PROTOTYPE];\n for (var keys = gOPN(BaseBuffer), j = 0, key; keys.length > j;) {\n if (!((key = keys[j++]) in $ArrayBuffer)) hide($ArrayBuffer, key, BaseBuffer[key]);\n }\n if (!LIBRARY) ArrayBufferProto.constructor = $ArrayBuffer;\n }\n // iOS Safari 7.x bug\n var view = new $DataView(new $ArrayBuffer(2));\n var $setInt8 = $DataView[PROTOTYPE].setInt8;\n view.setInt8(0, 2147483648);\n view.setInt8(1, 2147483649);\n if (view.getInt8(0) || !view.getInt8(1)) redefineAll($DataView[PROTOTYPE], {\n setInt8: function setInt8(byteOffset, value) {\n $setInt8.call(this, byteOffset, value << 24 >> 24);\n },\n setUint8: function setUint8(byteOffset, value) {\n $setInt8.call(this, byteOffset, value << 24 >> 24);\n }\n }, true);\n}\nsetToStringTag($ArrayBuffer, ARRAY_BUFFER);\nsetToStringTag($DataView, DATA_VIEW);\nhide($DataView[PROTOTYPE], $typed.VIEW, true);\nexports[ARRAY_BUFFER] = $ArrayBuffer;\nexports[DATA_VIEW] = $DataView;\n","// 7.3.20 SpeciesConstructor(O, defaultConstructor)\nvar anObject = require('./_an-object');\nvar aFunction = require('./_a-function');\nvar SPECIES = require('./_wks')('species');\nmodule.exports = function (O, D) {\n var C = anObject(O).constructor;\n var S;\n return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? D : aFunction(S);\n};\n","'use strict';\nvar global = require('./_global');\nvar dP = require('./_object-dp');\nvar DESCRIPTORS = require('./_descriptors');\nvar SPECIES = require('./_wks')('species');\n\nmodule.exports = function (KEY) {\n var C = global[KEY];\n if (DESCRIPTORS && C && !C[SPECIES]) dP.f(C, SPECIES, {\n configurable: true,\n get: function () { return this; }\n });\n};\n","'use strict';\nvar $export = require('./_export');\nvar $typed = require('./_typed');\nvar buffer = require('./_typed-buffer');\nvar anObject = require('./_an-object');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nvar toLength = require('./_to-length');\nvar isObject = require('./_is-object');\nvar ArrayBuffer = require('./_global').ArrayBuffer;\nvar speciesConstructor = require('./_species-constructor');\nvar $ArrayBuffer = buffer.ArrayBuffer;\nvar $DataView = buffer.DataView;\nvar $isView = $typed.ABV && ArrayBuffer.isView;\nvar $slice = $ArrayBuffer.prototype.slice;\nvar VIEW = $typed.VIEW;\nvar ARRAY_BUFFER = 'ArrayBuffer';\n\n$export($export.G + $export.W + $export.F * (ArrayBuffer !== $ArrayBuffer), { ArrayBuffer: $ArrayBuffer });\n\n$export($export.S + $export.F * !$typed.CONSTR, ARRAY_BUFFER, {\n // 24.1.3.1 ArrayBuffer.isView(arg)\n isView: function isView(it) {\n return $isView && $isView(it) || isObject(it) && VIEW in it;\n }\n});\n\n$export($export.P + $export.U + $export.F * require('./_fails')(function () {\n return !new $ArrayBuffer(2).slice(1, undefined).byteLength;\n}), ARRAY_BUFFER, {\n // 24.1.4.3 ArrayBuffer.prototype.slice(start, end)\n slice: function slice(start, end) {\n if ($slice !== undefined && end === undefined) return $slice.call(anObject(this), start); // FF fix\n var len = anObject(this).byteLength;\n var first = toAbsoluteIndex(start, len);\n var final = toAbsoluteIndex(end === undefined ? len : end, len);\n var result = new (speciesConstructor(this, $ArrayBuffer))(toLength(final - first));\n var viewS = new $DataView(this);\n var viewT = new $DataView(result);\n var index = 0;\n while (first < final) {\n viewT.setUint8(index++, viewS.getUint8(first++));\n } return result;\n }\n});\n\nrequire('./_set-species')(ARRAY_BUFFER);\n","// getting tag from 19.1.3.6 Object.prototype.toString()\nvar cof = require('./_cof');\nvar TAG = require('./_wks')('toStringTag');\n// ES3 wrong here\nvar ARG = cof(function () { return arguments; }()) == 'Arguments';\n\n// fallback for IE11 Script Access Denied error\nvar tryGet = function (it, key) {\n try {\n return it[key];\n } catch (e) { /* empty */ }\n};\n\nmodule.exports = function (it) {\n var O, T, B;\n return it === undefined ? 'Undefined' : it === null ? 'Null'\n // @@toStringTag case\n : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T\n // builtinTag case\n : ARG ? cof(O)\n // ES3 arguments fallback\n : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;\n};\n","module.exports = {};\n","// check on default Array iterator\nvar Iterators = require('./_iterators');\nvar ITERATOR = require('./_wks')('iterator');\nvar ArrayProto = Array.prototype;\n\nmodule.exports = function (it) {\n return it !== undefined && (Iterators.Array === it || ArrayProto[ITERATOR] === it);\n};\n","// 19.1.2.14 / 15.2.3.14 Object.keys(O)\nvar $keys = require('./_object-keys-internal');\nvar enumBugKeys = require('./_enum-bug-keys');\n\nmodule.exports = Object.keys || function keys(O) {\n return $keys(O, enumBugKeys);\n};\n","var dP = require('./_object-dp');\nvar anObject = require('./_an-object');\nvar getKeys = require('./_object-keys');\n\nmodule.exports = require('./_descriptors') ? Object.defineProperties : function defineProperties(O, Properties) {\n anObject(O);\n var keys = getKeys(Properties);\n var length = keys.length;\n var i = 0;\n var P;\n while (length > i) dP.f(O, P = keys[i++], Properties[P]);\n return O;\n};\n","var document = require('./_global').document;\nmodule.exports = document && document.documentElement;\n","// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])\nvar anObject = require('./_an-object');\nvar dPs = require('./_object-dps');\nvar enumBugKeys = require('./_enum-bug-keys');\nvar IE_PROTO = require('./_shared-key')('IE_PROTO');\nvar Empty = function () { /* empty */ };\nvar PROTOTYPE = 'prototype';\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar createDict = function () {\n // Thrash, waste and sodomy: IE GC bug\n var iframe = require('./_dom-create')('iframe');\n var i = enumBugKeys.length;\n var lt = '<';\n var gt = '>';\n var iframeDocument;\n iframe.style.display = 'none';\n require('./_html').appendChild(iframe);\n iframe.src = 'javascript:'; // eslint-disable-line no-script-url\n // createDict = iframe.contentWindow.Object;\n // html.removeChild(iframe);\n iframeDocument = iframe.contentWindow.document;\n iframeDocument.open();\n iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);\n iframeDocument.close();\n createDict = iframeDocument.F;\n while (i--) delete createDict[PROTOTYPE][enumBugKeys[i]];\n return createDict();\n};\n\nmodule.exports = Object.create || function create(O, Properties) {\n var result;\n if (O !== null) {\n Empty[PROTOTYPE] = anObject(O);\n result = new Empty();\n Empty[PROTOTYPE] = null;\n // add \"__proto__\" for Object.getPrototypeOf polyfill\n result[IE_PROTO] = O;\n } else result = createDict();\n return Properties === undefined ? result : dPs(result, Properties);\n};\n","// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)\nvar has = require('./_has');\nvar toObject = require('./_to-object');\nvar IE_PROTO = require('./_shared-key')('IE_PROTO');\nvar ObjectProto = Object.prototype;\n\nmodule.exports = Object.getPrototypeOf || function (O) {\n O = toObject(O);\n if (has(O, IE_PROTO)) return O[IE_PROTO];\n if (typeof O.constructor == 'function' && O instanceof O.constructor) {\n return O.constructor.prototype;\n } return O instanceof Object ? ObjectProto : null;\n};\n","var classof = require('./_classof');\nvar ITERATOR = require('./_wks')('iterator');\nvar Iterators = require('./_iterators');\nmodule.exports = require('./_core').getIteratorMethod = function (it) {\n if (it != undefined) return it[ITERATOR]\n || it['@@iterator']\n || Iterators[classof(it)];\n};\n","// 7.2.2 IsArray(argument)\nvar cof = require('./_cof');\nmodule.exports = Array.isArray || function isArray(arg) {\n return cof(arg) == 'Array';\n};\n","var isObject = require('./_is-object');\nvar isArray = require('./_is-array');\nvar SPECIES = require('./_wks')('species');\n\nmodule.exports = function (original) {\n var C;\n if (isArray(original)) {\n C = original.constructor;\n // cross-realm fallback\n if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;\n if (isObject(C)) {\n C = C[SPECIES];\n if (C === null) C = undefined;\n }\n } return C === undefined ? Array : C;\n};\n","// 9.4.2.3 ArraySpeciesCreate(originalArray, length)\nvar speciesConstructor = require('./_array-species-constructor');\n\nmodule.exports = function (original, length) {\n return new (speciesConstructor(original))(length);\n};\n","// 0 -> Array#forEach\n// 1 -> Array#map\n// 2 -> Array#filter\n// 3 -> Array#some\n// 4 -> Array#every\n// 5 -> Array#find\n// 6 -> Array#findIndex\nvar ctx = require('./_ctx');\nvar IObject = require('./_iobject');\nvar toObject = require('./_to-object');\nvar toLength = require('./_to-length');\nvar asc = require('./_array-species-create');\nmodule.exports = function (TYPE, $create) {\n var IS_MAP = TYPE == 1;\n var IS_FILTER = TYPE == 2;\n var IS_SOME = TYPE == 3;\n var IS_EVERY = TYPE == 4;\n var IS_FIND_INDEX = TYPE == 6;\n var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;\n var create = $create || asc;\n return function ($this, callbackfn, that) {\n var O = toObject($this);\n var self = IObject(O);\n var f = ctx(callbackfn, that, 3);\n var length = toLength(self.length);\n var index = 0;\n var result = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined;\n var val, res;\n for (;length > index; index++) if (NO_HOLES || index in self) {\n val = self[index];\n res = f(val, index, O);\n if (TYPE) {\n if (IS_MAP) result[index] = res; // map\n else if (res) switch (TYPE) {\n case 3: return true; // some\n case 5: return val; // find\n case 6: return index; // findIndex\n case 2: result.push(val); // filter\n } else if (IS_EVERY) return false; // every\n }\n }\n return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : result;\n };\n};\n","// 22.1.3.31 Array.prototype[@@unscopables]\nvar UNSCOPABLES = require('./_wks')('unscopables');\nvar ArrayProto = Array.prototype;\nif (ArrayProto[UNSCOPABLES] == undefined) require('./_hide')(ArrayProto, UNSCOPABLES, {});\nmodule.exports = function (key) {\n ArrayProto[UNSCOPABLES][key] = true;\n};\n","module.exports = function (done, value) {\n return { value: value, done: !!done };\n};\n","'use strict';\nvar create = require('./_object-create');\nvar descriptor = require('./_property-desc');\nvar setToStringTag = require('./_set-to-string-tag');\nvar IteratorPrototype = {};\n\n// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\nrequire('./_hide')(IteratorPrototype, require('./_wks')('iterator'), function () { return this; });\n\nmodule.exports = function (Constructor, NAME, next) {\n Constructor.prototype = create(IteratorPrototype, { next: descriptor(1, next) });\n setToStringTag(Constructor, NAME + ' Iterator');\n};\n","'use strict';\nvar LIBRARY = require('./_library');\nvar $export = require('./_export');\nvar redefine = require('./_redefine');\nvar hide = require('./_hide');\nvar has = require('./_has');\nvar Iterators = require('./_iterators');\nvar $iterCreate = require('./_iter-create');\nvar setToStringTag = require('./_set-to-string-tag');\nvar getPrototypeOf = require('./_object-gpo');\nvar ITERATOR = require('./_wks')('iterator');\nvar BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next`\nvar FF_ITERATOR = '@@iterator';\nvar KEYS = 'keys';\nvar VALUES = 'values';\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {\n $iterCreate(Constructor, NAME, next);\n var getMethod = function (kind) {\n if (!BUGGY && kind in proto) return proto[kind];\n switch (kind) {\n case KEYS: return function keys() { return new Constructor(this, kind); };\n case VALUES: return function values() { return new Constructor(this, kind); };\n } return function entries() { return new Constructor(this, kind); };\n };\n var TAG = NAME + ' Iterator';\n var DEF_VALUES = DEFAULT == VALUES;\n var VALUES_BUG = false;\n var proto = Base.prototype;\n var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT];\n var $default = (!BUGGY && $native) || getMethod(DEFAULT);\n var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined;\n var $anyNative = NAME == 'Array' ? proto.entries || $native : $native;\n var methods, key, IteratorPrototype;\n // Fix native\n if ($anyNative) {\n IteratorPrototype = getPrototypeOf($anyNative.call(new Base()));\n if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) {\n // Set @@toStringTag to native iterators\n setToStringTag(IteratorPrototype, TAG, true);\n // fix for some old engines\n if (!LIBRARY && !has(IteratorPrototype, ITERATOR)) hide(IteratorPrototype, ITERATOR, returnThis);\n }\n }\n // fix Array#{values, @@iterator}.name in V8 / FF\n if (DEF_VALUES && $native && $native.name !== VALUES) {\n VALUES_BUG = true;\n $default = function values() { return $native.call(this); };\n }\n // Define iterator\n if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) {\n hide(proto, ITERATOR, $default);\n }\n // Plug for library\n Iterators[NAME] = $default;\n Iterators[TAG] = returnThis;\n if (DEFAULT) {\n methods = {\n values: DEF_VALUES ? $default : getMethod(VALUES),\n keys: IS_SET ? $default : getMethod(KEYS),\n entries: $entries\n };\n if (FORCED) for (key in methods) {\n if (!(key in proto)) redefine(proto, key, methods[key]);\n } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods);\n }\n return methods;\n};\n","'use strict';\nvar addToUnscopables = require('./_add-to-unscopables');\nvar step = require('./_iter-step');\nvar Iterators = require('./_iterators');\nvar toIObject = require('./_to-iobject');\n\n// 22.1.3.4 Array.prototype.entries()\n// 22.1.3.13 Array.prototype.keys()\n// 22.1.3.29 Array.prototype.values()\n// 22.1.3.30 Array.prototype[@@iterator]()\nmodule.exports = require('./_iter-define')(Array, 'Array', function (iterated, kind) {\n this._t = toIObject(iterated); // target\n this._i = 0; // next index\n this._k = kind; // kind\n// 22.1.5.2.1 %ArrayIteratorPrototype%.next()\n}, function () {\n var O = this._t;\n var kind = this._k;\n var index = this._i++;\n if (!O || index >= O.length) {\n this._t = undefined;\n return step(1);\n }\n if (kind == 'keys') return step(0, index);\n if (kind == 'values') return step(0, O[index]);\n return step(0, [index, O[index]]);\n}, 'values');\n\n// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)\nIterators.Arguments = Iterators.Array;\n\naddToUnscopables('keys');\naddToUnscopables('values');\naddToUnscopables('entries');\n","var ITERATOR = require('./_wks')('iterator');\nvar SAFE_CLOSING = false;\n\ntry {\n var riter = [7][ITERATOR]();\n riter['return'] = function () { SAFE_CLOSING = true; };\n // eslint-disable-next-line no-throw-literal\n Array.from(riter, function () { throw 2; });\n} catch (e) { /* empty */ }\n\nmodule.exports = function (exec, skipClosing) {\n if (!skipClosing && !SAFE_CLOSING) return false;\n var safe = false;\n try {\n var arr = [7];\n var iter = arr[ITERATOR]();\n iter.next = function () { return { done: safe = true }; };\n arr[ITERATOR] = function () { return iter; };\n exec(arr);\n } catch (e) { /* empty */ }\n return safe;\n};\n","// 22.1.3.3 Array.prototype.copyWithin(target, start, end = this.length)\n'use strict';\nvar toObject = require('./_to-object');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nvar toLength = require('./_to-length');\n\nmodule.exports = [].copyWithin || function copyWithin(target /* = 0 */, start /* = 0, end = @length */) {\n var O = toObject(this);\n var len = toLength(O.length);\n var to = toAbsoluteIndex(target, len);\n var from = toAbsoluteIndex(start, len);\n var end = arguments.length > 2 ? arguments[2] : undefined;\n var count = Math.min((end === undefined ? len : toAbsoluteIndex(end, len)) - from, len - to);\n var inc = 1;\n if (from < to && to < from + count) {\n inc = -1;\n from += count - 1;\n to += count - 1;\n }\n while (count-- > 0) {\n if (from in O) O[to] = O[from];\n else delete O[to];\n to += inc;\n from += inc;\n } return O;\n};\n","exports.f = {}.propertyIsEnumerable;\n","var pIE = require('./_object-pie');\nvar createDesc = require('./_property-desc');\nvar toIObject = require('./_to-iobject');\nvar toPrimitive = require('./_to-primitive');\nvar has = require('./_has');\nvar IE8_DOM_DEFINE = require('./_ie8-dom-define');\nvar gOPD = Object.getOwnPropertyDescriptor;\n\nexports.f = require('./_descriptors') ? gOPD : function getOwnPropertyDescriptor(O, P) {\n O = toIObject(O);\n P = toPrimitive(P, true);\n if (IE8_DOM_DEFINE) try {\n return gOPD(O, P);\n } catch (e) { /* empty */ }\n if (has(O, P)) return createDesc(!pIE.f.call(O, P), O[P]);\n};\n","'use strict';\nif (require('./_descriptors')) {\n var LIBRARY = require('./_library');\n var global = require('./_global');\n var fails = require('./_fails');\n var $export = require('./_export');\n var $typed = require('./_typed');\n var $buffer = require('./_typed-buffer');\n var ctx = require('./_ctx');\n var anInstance = require('./_an-instance');\n var propertyDesc = require('./_property-desc');\n var hide = require('./_hide');\n var redefineAll = require('./_redefine-all');\n var toInteger = require('./_to-integer');\n var toLength = require('./_to-length');\n var toIndex = require('./_to-index');\n var toAbsoluteIndex = require('./_to-absolute-index');\n var toPrimitive = require('./_to-primitive');\n var has = require('./_has');\n var classof = require('./_classof');\n var isObject = require('./_is-object');\n var toObject = require('./_to-object');\n var isArrayIter = require('./_is-array-iter');\n var create = require('./_object-create');\n var getPrototypeOf = require('./_object-gpo');\n var gOPN = require('./_object-gopn').f;\n var getIterFn = require('./core.get-iterator-method');\n var uid = require('./_uid');\n var wks = require('./_wks');\n var createArrayMethod = require('./_array-methods');\n var createArrayIncludes = require('./_array-includes');\n var speciesConstructor = require('./_species-constructor');\n var ArrayIterators = require('./es6.array.iterator');\n var Iterators = require('./_iterators');\n var $iterDetect = require('./_iter-detect');\n var setSpecies = require('./_set-species');\n var arrayFill = require('./_array-fill');\n var arrayCopyWithin = require('./_array-copy-within');\n var $DP = require('./_object-dp');\n var $GOPD = require('./_object-gopd');\n var dP = $DP.f;\n var gOPD = $GOPD.f;\n var RangeError = global.RangeError;\n var TypeError = global.TypeError;\n var Uint8Array = global.Uint8Array;\n var ARRAY_BUFFER = 'ArrayBuffer';\n var SHARED_BUFFER = 'Shared' + ARRAY_BUFFER;\n var BYTES_PER_ELEMENT = 'BYTES_PER_ELEMENT';\n var PROTOTYPE = 'prototype';\n var ArrayProto = Array[PROTOTYPE];\n var $ArrayBuffer = $buffer.ArrayBuffer;\n var $DataView = $buffer.DataView;\n var arrayForEach = createArrayMethod(0);\n var arrayFilter = createArrayMethod(2);\n var arraySome = createArrayMethod(3);\n var arrayEvery = createArrayMethod(4);\n var arrayFind = createArrayMethod(5);\n var arrayFindIndex = createArrayMethod(6);\n var arrayIncludes = createArrayIncludes(true);\n var arrayIndexOf = createArrayIncludes(false);\n var arrayValues = ArrayIterators.values;\n var arrayKeys = ArrayIterators.keys;\n var arrayEntries = ArrayIterators.entries;\n var arrayLastIndexOf = ArrayProto.lastIndexOf;\n var arrayReduce = ArrayProto.reduce;\n var arrayReduceRight = ArrayProto.reduceRight;\n var arrayJoin = ArrayProto.join;\n var arraySort = ArrayProto.sort;\n var arraySlice = ArrayProto.slice;\n var arrayToString = ArrayProto.toString;\n var arrayToLocaleString = ArrayProto.toLocaleString;\n var ITERATOR = wks('iterator');\n var TAG = wks('toStringTag');\n var TYPED_CONSTRUCTOR = uid('typed_constructor');\n var DEF_CONSTRUCTOR = uid('def_constructor');\n var ALL_CONSTRUCTORS = $typed.CONSTR;\n var TYPED_ARRAY = $typed.TYPED;\n var VIEW = $typed.VIEW;\n var WRONG_LENGTH = 'Wrong length!';\n\n var $map = createArrayMethod(1, function (O, length) {\n return allocate(speciesConstructor(O, O[DEF_CONSTRUCTOR]), length);\n });\n\n var LITTLE_ENDIAN = fails(function () {\n // eslint-disable-next-line no-undef\n return new Uint8Array(new Uint16Array([1]).buffer)[0] === 1;\n });\n\n var FORCED_SET = !!Uint8Array && !!Uint8Array[PROTOTYPE].set && fails(function () {\n new Uint8Array(1).set({});\n });\n\n var toOffset = function (it, BYTES) {\n var offset = toInteger(it);\n if (offset < 0 || offset % BYTES) throw RangeError('Wrong offset!');\n return offset;\n };\n\n var validate = function (it) {\n if (isObject(it) && TYPED_ARRAY in it) return it;\n throw TypeError(it + ' is not a typed array!');\n };\n\n var allocate = function (C, length) {\n if (!(isObject(C) && TYPED_CONSTRUCTOR in C)) {\n throw TypeError('It is not a typed array constructor!');\n } return new C(length);\n };\n\n var speciesFromList = function (O, list) {\n return fromList(speciesConstructor(O, O[DEF_CONSTRUCTOR]), list);\n };\n\n var fromList = function (C, list) {\n var index = 0;\n var length = list.length;\n var result = allocate(C, length);\n while (length > index) result[index] = list[index++];\n return result;\n };\n\n var addGetter = function (it, key, internal) {\n dP(it, key, { get: function () { return this._d[internal]; } });\n };\n\n var $from = function from(source /* , mapfn, thisArg */) {\n var O = toObject(source);\n var aLen = arguments.length;\n var mapfn = aLen > 1 ? arguments[1] : undefined;\n var mapping = mapfn !== undefined;\n var iterFn = getIterFn(O);\n var i, length, values, result, step, iterator;\n if (iterFn != undefined && !isArrayIter(iterFn)) {\n for (iterator = iterFn.call(O), values = [], i = 0; !(step = iterator.next()).done; i++) {\n values.push(step.value);\n } O = values;\n }\n if (mapping && aLen > 2) mapfn = ctx(mapfn, arguments[2], 2);\n for (i = 0, length = toLength(O.length), result = allocate(this, length); length > i; i++) {\n result[i] = mapping ? mapfn(O[i], i) : O[i];\n }\n return result;\n };\n\n var $of = function of(/* ...items */) {\n var index = 0;\n var length = arguments.length;\n var result = allocate(this, length);\n while (length > index) result[index] = arguments[index++];\n return result;\n };\n\n // iOS Safari 6.x fails here\n var TO_LOCALE_BUG = !!Uint8Array && fails(function () { arrayToLocaleString.call(new Uint8Array(1)); });\n\n var $toLocaleString = function toLocaleString() {\n return arrayToLocaleString.apply(TO_LOCALE_BUG ? arraySlice.call(validate(this)) : validate(this), arguments);\n };\n\n var proto = {\n copyWithin: function copyWithin(target, start /* , end */) {\n return arrayCopyWithin.call(validate(this), target, start, arguments.length > 2 ? arguments[2] : undefined);\n },\n every: function every(callbackfn /* , thisArg */) {\n return arrayEvery(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n },\n fill: function fill(value /* , start, end */) { // eslint-disable-line no-unused-vars\n return arrayFill.apply(validate(this), arguments);\n },\n filter: function filter(callbackfn /* , thisArg */) {\n return speciesFromList(this, arrayFilter(validate(this), callbackfn,\n arguments.length > 1 ? arguments[1] : undefined));\n },\n find: function find(predicate /* , thisArg */) {\n return arrayFind(validate(this), predicate, arguments.length > 1 ? arguments[1] : undefined);\n },\n findIndex: function findIndex(predicate /* , thisArg */) {\n return arrayFindIndex(validate(this), predicate, arguments.length > 1 ? arguments[1] : undefined);\n },\n forEach: function forEach(callbackfn /* , thisArg */) {\n arrayForEach(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n },\n indexOf: function indexOf(searchElement /* , fromIndex */) {\n return arrayIndexOf(validate(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);\n },\n includes: function includes(searchElement /* , fromIndex */) {\n return arrayIncludes(validate(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);\n },\n join: function join(separator) { // eslint-disable-line no-unused-vars\n return arrayJoin.apply(validate(this), arguments);\n },\n lastIndexOf: function lastIndexOf(searchElement /* , fromIndex */) { // eslint-disable-line no-unused-vars\n return arrayLastIndexOf.apply(validate(this), arguments);\n },\n map: function map(mapfn /* , thisArg */) {\n return $map(validate(this), mapfn, arguments.length > 1 ? arguments[1] : undefined);\n },\n reduce: function reduce(callbackfn /* , initialValue */) { // eslint-disable-line no-unused-vars\n return arrayReduce.apply(validate(this), arguments);\n },\n reduceRight: function reduceRight(callbackfn /* , initialValue */) { // eslint-disable-line no-unused-vars\n return arrayReduceRight.apply(validate(this), arguments);\n },\n reverse: function reverse() {\n var that = this;\n var length = validate(that).length;\n var middle = Math.floor(length / 2);\n var index = 0;\n var value;\n while (index < middle) {\n value = that[index];\n that[index++] = that[--length];\n that[length] = value;\n } return that;\n },\n some: function some(callbackfn /* , thisArg */) {\n return arraySome(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n },\n sort: function sort(comparefn) {\n return arraySort.call(validate(this), comparefn);\n },\n subarray: function subarray(begin, end) {\n var O = validate(this);\n var length = O.length;\n var $begin = toAbsoluteIndex(begin, length);\n return new (speciesConstructor(O, O[DEF_CONSTRUCTOR]))(\n O.buffer,\n O.byteOffset + $begin * O.BYTES_PER_ELEMENT,\n toLength((end === undefined ? length : toAbsoluteIndex(end, length)) - $begin)\n );\n }\n };\n\n var $slice = function slice(start, end) {\n return speciesFromList(this, arraySlice.call(validate(this), start, end));\n };\n\n var $set = function set(arrayLike /* , offset */) {\n validate(this);\n var offset = toOffset(arguments[1], 1);\n var length = this.length;\n var src = toObject(arrayLike);\n var len = toLength(src.length);\n var index = 0;\n if (len + offset > length) throw RangeError(WRONG_LENGTH);\n while (index < len) this[offset + index] = src[index++];\n };\n\n var $iterators = {\n entries: function entries() {\n return arrayEntries.call(validate(this));\n },\n keys: function keys() {\n return arrayKeys.call(validate(this));\n },\n values: function values() {\n return arrayValues.call(validate(this));\n }\n };\n\n var isTAIndex = function (target, key) {\n return isObject(target)\n && target[TYPED_ARRAY]\n && typeof key != 'symbol'\n && key in target\n && String(+key) == String(key);\n };\n var $getDesc = function getOwnPropertyDescriptor(target, key) {\n return isTAIndex(target, key = toPrimitive(key, true))\n ? propertyDesc(2, target[key])\n : gOPD(target, key);\n };\n var $setDesc = function defineProperty(target, key, desc) {\n if (isTAIndex(target, key = toPrimitive(key, true))\n && isObject(desc)\n && has(desc, 'value')\n && !has(desc, 'get')\n && !has(desc, 'set')\n // TODO: add validation descriptor w/o calling accessors\n && !desc.configurable\n && (!has(desc, 'writable') || desc.writable)\n && (!has(desc, 'enumerable') || desc.enumerable)\n ) {\n target[key] = desc.value;\n return target;\n } return dP(target, key, desc);\n };\n\n if (!ALL_CONSTRUCTORS) {\n $GOPD.f = $getDesc;\n $DP.f = $setDesc;\n }\n\n $export($export.S + $export.F * !ALL_CONSTRUCTORS, 'Object', {\n getOwnPropertyDescriptor: $getDesc,\n defineProperty: $setDesc\n });\n\n if (fails(function () { arrayToString.call({}); })) {\n arrayToString = arrayToLocaleString = function toString() {\n return arrayJoin.call(this);\n };\n }\n\n var $TypedArrayPrototype$ = redefineAll({}, proto);\n redefineAll($TypedArrayPrototype$, $iterators);\n hide($TypedArrayPrototype$, ITERATOR, $iterators.values);\n redefineAll($TypedArrayPrototype$, {\n slice: $slice,\n set: $set,\n constructor: function () { /* noop */ },\n toString: arrayToString,\n toLocaleString: $toLocaleString\n });\n addGetter($TypedArrayPrototype$, 'buffer', 'b');\n addGetter($TypedArrayPrototype$, 'byteOffset', 'o');\n addGetter($TypedArrayPrototype$, 'byteLength', 'l');\n addGetter($TypedArrayPrototype$, 'length', 'e');\n dP($TypedArrayPrototype$, TAG, {\n get: function () { return this[TYPED_ARRAY]; }\n });\n\n // eslint-disable-next-line max-statements\n module.exports = function (KEY, BYTES, wrapper, CLAMPED) {\n CLAMPED = !!CLAMPED;\n var NAME = KEY + (CLAMPED ? 'Clamped' : '') + 'Array';\n var GETTER = 'get' + KEY;\n var SETTER = 'set' + KEY;\n var TypedArray = global[NAME];\n var Base = TypedArray || {};\n var TAC = TypedArray && getPrototypeOf(TypedArray);\n var FORCED = !TypedArray || !$typed.ABV;\n var O = {};\n var TypedArrayPrototype = TypedArray && TypedArray[PROTOTYPE];\n var getter = function (that, index) {\n var data = that._d;\n return data.v[GETTER](index * BYTES + data.o, LITTLE_ENDIAN);\n };\n var setter = function (that, index, value) {\n var data = that._d;\n if (CLAMPED) value = (value = Math.round(value)) < 0 ? 0 : value > 0xff ? 0xff : value & 0xff;\n data.v[SETTER](index * BYTES + data.o, value, LITTLE_ENDIAN);\n };\n var addElement = function (that, index) {\n dP(that, index, {\n get: function () {\n return getter(this, index);\n },\n set: function (value) {\n return setter(this, index, value);\n },\n enumerable: true\n });\n };\n if (FORCED) {\n TypedArray = wrapper(function (that, data, $offset, $length) {\n anInstance(that, TypedArray, NAME, '_d');\n var index = 0;\n var offset = 0;\n var buffer, byteLength, length, klass;\n if (!isObject(data)) {\n length = toIndex(data);\n byteLength = length * BYTES;\n buffer = new $ArrayBuffer(byteLength);\n } else if (data instanceof $ArrayBuffer || (klass = classof(data)) == ARRAY_BUFFER || klass == SHARED_BUFFER) {\n buffer = data;\n offset = toOffset($offset, BYTES);\n var $len = data.byteLength;\n if ($length === undefined) {\n if ($len % BYTES) throw RangeError(WRONG_LENGTH);\n byteLength = $len - offset;\n if (byteLength < 0) throw RangeError(WRONG_LENGTH);\n } else {\n byteLength = toLength($length) * BYTES;\n if (byteLength + offset > $len) throw RangeError(WRONG_LENGTH);\n }\n length = byteLength / BYTES;\n } else if (TYPED_ARRAY in data) {\n return fromList(TypedArray, data);\n } else {\n return $from.call(TypedArray, data);\n }\n hide(that, '_d', {\n b: buffer,\n o: offset,\n l: byteLength,\n e: length,\n v: new $DataView(buffer)\n });\n while (index < length) addElement(that, index++);\n });\n TypedArrayPrototype = TypedArray[PROTOTYPE] = create($TypedArrayPrototype$);\n hide(TypedArrayPrototype, 'constructor', TypedArray);\n } else if (!fails(function () {\n TypedArray(1);\n }) || !fails(function () {\n new TypedArray(-1); // eslint-disable-line no-new\n }) || !$iterDetect(function (iter) {\n new TypedArray(); // eslint-disable-line no-new\n new TypedArray(null); // eslint-disable-line no-new\n new TypedArray(1.5); // eslint-disable-line no-new\n new TypedArray(iter); // eslint-disable-line no-new\n }, true)) {\n TypedArray = wrapper(function (that, data, $offset, $length) {\n anInstance(that, TypedArray, NAME);\n var klass;\n // `ws` module bug, temporarily remove validation length for Uint8Array\n // https://github.com/websockets/ws/pull/645\n if (!isObject(data)) return new Base(toIndex(data));\n if (data instanceof $ArrayBuffer || (klass = classof(data)) == ARRAY_BUFFER || klass == SHARED_BUFFER) {\n return $length !== undefined\n ? new Base(data, toOffset($offset, BYTES), $length)\n : $offset !== undefined\n ? new Base(data, toOffset($offset, BYTES))\n : new Base(data);\n }\n if (TYPED_ARRAY in data) return fromList(TypedArray, data);\n return $from.call(TypedArray, data);\n });\n arrayForEach(TAC !== Function.prototype ? gOPN(Base).concat(gOPN(TAC)) : gOPN(Base), function (key) {\n if (!(key in TypedArray)) hide(TypedArray, key, Base[key]);\n });\n TypedArray[PROTOTYPE] = TypedArrayPrototype;\n if (!LIBRARY) TypedArrayPrototype.constructor = TypedArray;\n }\n var $nativeIterator = TypedArrayPrototype[ITERATOR];\n var CORRECT_ITER_NAME = !!$nativeIterator\n && ($nativeIterator.name == 'values' || $nativeIterator.name == undefined);\n var $iterator = $iterators.values;\n hide(TypedArray, TYPED_CONSTRUCTOR, true);\n hide(TypedArrayPrototype, TYPED_ARRAY, NAME);\n hide(TypedArrayPrototype, VIEW, true);\n hide(TypedArrayPrototype, DEF_CONSTRUCTOR, TypedArray);\n\n if (CLAMPED ? new TypedArray(1)[TAG] != NAME : !(TAG in TypedArrayPrototype)) {\n dP(TypedArrayPrototype, TAG, {\n get: function () { return NAME; }\n });\n }\n\n O[NAME] = TypedArray;\n\n $export($export.G + $export.W + $export.F * (TypedArray != Base), O);\n\n $export($export.S, NAME, {\n BYTES_PER_ELEMENT: BYTES\n });\n\n $export($export.S + $export.F * fails(function () { Base.of.call(TypedArray, 1); }), NAME, {\n from: $from,\n of: $of\n });\n\n if (!(BYTES_PER_ELEMENT in TypedArrayPrototype)) hide(TypedArrayPrototype, BYTES_PER_ELEMENT, BYTES);\n\n $export($export.P, NAME, proto);\n\n setSpecies(NAME);\n\n $export($export.P + $export.F * FORCED_SET, NAME, { set: $set });\n\n $export($export.P + $export.F * !CORRECT_ITER_NAME, NAME, $iterators);\n\n if (!LIBRARY && TypedArrayPrototype.toString != arrayToString) TypedArrayPrototype.toString = arrayToString;\n\n $export($export.P + $export.F * fails(function () {\n new TypedArray(1).slice();\n }), NAME, { slice: $slice });\n\n $export($export.P + $export.F * (fails(function () {\n return [1, 2].toLocaleString() != new TypedArray([1, 2]).toLocaleString();\n }) || !fails(function () {\n TypedArrayPrototype.toLocaleString.call([1, 2]);\n })), NAME, { toLocaleString: $toLocaleString });\n\n Iterators[NAME] = CORRECT_ITER_NAME ? $nativeIterator : $iterator;\n if (!LIBRARY && !CORRECT_ITER_NAME) hide(TypedArrayPrototype, ITERATOR, $iterator);\n };\n} else module.exports = function () { /* empty */ };\n","require('./_typed-array')('Int8', 1, function (init) {\n return function Int8Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Uint8', 1, function (init) {\n return function Uint8Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Uint8', 1, function (init) {\n return function Uint8ClampedArray(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n}, true);\n","require('./_typed-array')('Int16', 2, function (init) {\n return function Int16Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Uint16', 2, function (init) {\n return function Uint16Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Int32', 4, function (init) {\n return function Int32Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Uint32', 4, function (init) {\n return function Uint32Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Float32', 4, function (init) {\n return function Float32Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Float64', 8, function (init) {\n return function Float64Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","// call something on iterator step with safe closing on error\nvar anObject = require('./_an-object');\nmodule.exports = function (iterator, fn, value, entries) {\n try {\n return entries ? fn(anObject(value)[0], value[1]) : fn(value);\n // 7.4.6 IteratorClose(iterator, completion)\n } catch (e) {\n var ret = iterator['return'];\n if (ret !== undefined) anObject(ret.call(iterator));\n throw e;\n }\n};\n","var ctx = require('./_ctx');\nvar call = require('./_iter-call');\nvar isArrayIter = require('./_is-array-iter');\nvar anObject = require('./_an-object');\nvar toLength = require('./_to-length');\nvar getIterFn = require('./core.get-iterator-method');\nvar BREAK = {};\nvar RETURN = {};\nvar exports = module.exports = function (iterable, entries, fn, that, ITERATOR) {\n var iterFn = ITERATOR ? function () { return iterable; } : getIterFn(iterable);\n var f = ctx(fn, that, entries ? 2 : 1);\n var index = 0;\n var length, step, iterator, result;\n if (typeof iterFn != 'function') throw TypeError(iterable + ' is not iterable!');\n // fast case for arrays with default iterator\n if (isArrayIter(iterFn)) for (length = toLength(iterable.length); length > index; index++) {\n result = entries ? f(anObject(step = iterable[index])[0], step[1]) : f(iterable[index]);\n if (result === BREAK || result === RETURN) return result;\n } else for (iterator = iterFn.call(iterable); !(step = iterator.next()).done;) {\n result = call(iterator, f, step.value, entries);\n if (result === BREAK || result === RETURN) return result;\n }\n};\nexports.BREAK = BREAK;\nexports.RETURN = RETURN;\n","var META = require('./_uid')('meta');\nvar isObject = require('./_is-object');\nvar has = require('./_has');\nvar setDesc = require('./_object-dp').f;\nvar id = 0;\nvar isExtensible = Object.isExtensible || function () {\n return true;\n};\nvar FREEZE = !require('./_fails')(function () {\n return isExtensible(Object.preventExtensions({}));\n});\nvar setMeta = function (it) {\n setDesc(it, META, { value: {\n i: 'O' + ++id, // object ID\n w: {} // weak collections IDs\n } });\n};\nvar fastKey = function (it, create) {\n // return primitive with prefix\n if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;\n if (!has(it, META)) {\n // can't set metadata to uncaught frozen object\n if (!isExtensible(it)) return 'F';\n // not necessary to add metadata\n if (!create) return 'E';\n // add missing metadata\n setMeta(it);\n // return object ID\n } return it[META].i;\n};\nvar getWeak = function (it, create) {\n if (!has(it, META)) {\n // can't set metadata to uncaught frozen object\n if (!isExtensible(it)) return true;\n // not necessary to add metadata\n if (!create) return false;\n // add missing metadata\n setMeta(it);\n // return hash weak collections IDs\n } return it[META].w;\n};\n// add metadata on freeze-family methods calling\nvar onFreeze = function (it) {\n if (FREEZE && meta.NEED && isExtensible(it) && !has(it, META)) setMeta(it);\n return it;\n};\nvar meta = module.exports = {\n KEY: META,\n NEED: false,\n fastKey: fastKey,\n getWeak: getWeak,\n onFreeze: onFreeze\n};\n","var isObject = require('./_is-object');\nmodule.exports = function (it, TYPE) {\n if (!isObject(it) || it._t !== TYPE) throw TypeError('Incompatible receiver, ' + TYPE + ' required!');\n return it;\n};\n","'use strict';\nvar dP = require('./_object-dp').f;\nvar create = require('./_object-create');\nvar redefineAll = require('./_redefine-all');\nvar ctx = require('./_ctx');\nvar anInstance = require('./_an-instance');\nvar forOf = require('./_for-of');\nvar $iterDefine = require('./_iter-define');\nvar step = require('./_iter-step');\nvar setSpecies = require('./_set-species');\nvar DESCRIPTORS = require('./_descriptors');\nvar fastKey = require('./_meta').fastKey;\nvar validate = require('./_validate-collection');\nvar SIZE = DESCRIPTORS ? '_s' : 'size';\n\nvar getEntry = function (that, key) {\n // fast case\n var index = fastKey(key);\n var entry;\n if (index !== 'F') return that._i[index];\n // frozen object case\n for (entry = that._f; entry; entry = entry.n) {\n if (entry.k == key) return entry;\n }\n};\n\nmodule.exports = {\n getConstructor: function (wrapper, NAME, IS_MAP, ADDER) {\n var C = wrapper(function (that, iterable) {\n anInstance(that, C, NAME, '_i');\n that._t = NAME; // collection type\n that._i = create(null); // index\n that._f = undefined; // first entry\n that._l = undefined; // last entry\n that[SIZE] = 0; // size\n if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n });\n redefineAll(C.prototype, {\n // 23.1.3.1 Map.prototype.clear()\n // 23.2.3.2 Set.prototype.clear()\n clear: function clear() {\n for (var that = validate(this, NAME), data = that._i, entry = that._f; entry; entry = entry.n) {\n entry.r = true;\n if (entry.p) entry.p = entry.p.n = undefined;\n delete data[entry.i];\n }\n that._f = that._l = undefined;\n that[SIZE] = 0;\n },\n // 23.1.3.3 Map.prototype.delete(key)\n // 23.2.3.4 Set.prototype.delete(value)\n 'delete': function (key) {\n var that = validate(this, NAME);\n var entry = getEntry(that, key);\n if (entry) {\n var next = entry.n;\n var prev = entry.p;\n delete that._i[entry.i];\n entry.r = true;\n if (prev) prev.n = next;\n if (next) next.p = prev;\n if (that._f == entry) that._f = next;\n if (that._l == entry) that._l = prev;\n that[SIZE]--;\n } return !!entry;\n },\n // 23.2.3.6 Set.prototype.forEach(callbackfn, thisArg = undefined)\n // 23.1.3.5 Map.prototype.forEach(callbackfn, thisArg = undefined)\n forEach: function forEach(callbackfn /* , that = undefined */) {\n validate(this, NAME);\n var f = ctx(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3);\n var entry;\n while (entry = entry ? entry.n : this._f) {\n f(entry.v, entry.k, this);\n // revert to the last existing entry\n while (entry && entry.r) entry = entry.p;\n }\n },\n // 23.1.3.7 Map.prototype.has(key)\n // 23.2.3.7 Set.prototype.has(value)\n has: function has(key) {\n return !!getEntry(validate(this, NAME), key);\n }\n });\n if (DESCRIPTORS) dP(C.prototype, 'size', {\n get: function () {\n return validate(this, NAME)[SIZE];\n }\n });\n return C;\n },\n def: function (that, key, value) {\n var entry = getEntry(that, key);\n var prev, index;\n // change existing entry\n if (entry) {\n entry.v = value;\n // create new entry\n } else {\n that._l = entry = {\n i: index = fastKey(key, true), // <- index\n k: key, // <- key\n v: value, // <- value\n p: prev = that._l, // <- previous entry\n n: undefined, // <- next entry\n r: false // <- removed\n };\n if (!that._f) that._f = entry;\n if (prev) prev.n = entry;\n that[SIZE]++;\n // add to index\n if (index !== 'F') that._i[index] = entry;\n } return that;\n },\n getEntry: getEntry,\n setStrong: function (C, NAME, IS_MAP) {\n // add .keys, .values, .entries, [@@iterator]\n // 23.1.3.4, 23.1.3.8, 23.1.3.11, 23.1.3.12, 23.2.3.5, 23.2.3.8, 23.2.3.10, 23.2.3.11\n $iterDefine(C, NAME, function (iterated, kind) {\n this._t = validate(iterated, NAME); // target\n this._k = kind; // kind\n this._l = undefined; // previous\n }, function () {\n var that = this;\n var kind = that._k;\n var entry = that._l;\n // revert to the last existing entry\n while (entry && entry.r) entry = entry.p;\n // get next entry\n if (!that._t || !(that._l = entry = entry ? entry.n : that._t._f)) {\n // or finish the iteration\n that._t = undefined;\n return step(1);\n }\n // return step by kind\n if (kind == 'keys') return step(0, entry.k);\n if (kind == 'values') return step(0, entry.v);\n return step(0, [entry.k, entry.v]);\n }, IS_MAP ? 'entries' : 'values', !IS_MAP, true);\n\n // add [@@species], 23.1.2.2, 23.2.2.2\n setSpecies(NAME);\n }\n};\n","// Works with __proto__ only. Old v8 can't work with null proto objects.\n/* eslint-disable no-proto */\nvar isObject = require('./_is-object');\nvar anObject = require('./_an-object');\nvar check = function (O, proto) {\n anObject(O);\n if (!isObject(proto) && proto !== null) throw TypeError(proto + \": can't set as prototype!\");\n};\nmodule.exports = {\n set: Object.setPrototypeOf || ('__proto__' in {} ? // eslint-disable-line\n function (test, buggy, set) {\n try {\n set = require('./_ctx')(Function.call, require('./_object-gopd').f(Object.prototype, '__proto__').set, 2);\n set(test, []);\n buggy = !(test instanceof Array);\n } catch (e) { buggy = true; }\n return function setPrototypeOf(O, proto) {\n check(O, proto);\n if (buggy) O.__proto__ = proto;\n else set(O, proto);\n return O;\n };\n }({}, false) : undefined),\n check: check\n};\n","var isObject = require('./_is-object');\nvar setPrototypeOf = require('./_set-proto').set;\nmodule.exports = function (that, target, C) {\n var S = target.constructor;\n var P;\n if (S !== C && typeof S == 'function' && (P = S.prototype) !== C.prototype && isObject(P) && setPrototypeOf) {\n setPrototypeOf(that, P);\n } return that;\n};\n","'use strict';\nvar global = require('./_global');\nvar $export = require('./_export');\nvar redefine = require('./_redefine');\nvar redefineAll = require('./_redefine-all');\nvar meta = require('./_meta');\nvar forOf = require('./_for-of');\nvar anInstance = require('./_an-instance');\nvar isObject = require('./_is-object');\nvar fails = require('./_fails');\nvar $iterDetect = require('./_iter-detect');\nvar setToStringTag = require('./_set-to-string-tag');\nvar inheritIfRequired = require('./_inherit-if-required');\n\nmodule.exports = function (NAME, wrapper, methods, common, IS_MAP, IS_WEAK) {\n var Base = global[NAME];\n var C = Base;\n var ADDER = IS_MAP ? 'set' : 'add';\n var proto = C && C.prototype;\n var O = {};\n var fixMethod = function (KEY) {\n var fn = proto[KEY];\n redefine(proto, KEY,\n KEY == 'delete' ? function (a) {\n return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);\n } : KEY == 'has' ? function has(a) {\n return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);\n } : KEY == 'get' ? function get(a) {\n return IS_WEAK && !isObject(a) ? undefined : fn.call(this, a === 0 ? 0 : a);\n } : KEY == 'add' ? function add(a) { fn.call(this, a === 0 ? 0 : a); return this; }\n : function set(a, b) { fn.call(this, a === 0 ? 0 : a, b); return this; }\n );\n };\n if (typeof C != 'function' || !(IS_WEAK || proto.forEach && !fails(function () {\n new C().entries().next();\n }))) {\n // create collection constructor\n C = common.getConstructor(wrapper, NAME, IS_MAP, ADDER);\n redefineAll(C.prototype, methods);\n meta.NEED = true;\n } else {\n var instance = new C();\n // early implementations not supports chaining\n var HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) != instance;\n // V8 ~ Chromium 40- weak-collections throws on primitives, but should return false\n var THROWS_ON_PRIMITIVES = fails(function () { instance.has(1); });\n // most early implementations doesn't supports iterables, most modern - not close it correctly\n var ACCEPT_ITERABLES = $iterDetect(function (iter) { new C(iter); }); // eslint-disable-line no-new\n // for early implementations -0 and +0 not the same\n var BUGGY_ZERO = !IS_WEAK && fails(function () {\n // V8 ~ Chromium 42- fails only with 5+ elements\n var $instance = new C();\n var index = 5;\n while (index--) $instance[ADDER](index, index);\n return !$instance.has(-0);\n });\n if (!ACCEPT_ITERABLES) {\n C = wrapper(function (target, iterable) {\n anInstance(target, C, NAME);\n var that = inheritIfRequired(new Base(), target, C);\n if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n return that;\n });\n C.prototype = proto;\n proto.constructor = C;\n }\n if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) {\n fixMethod('delete');\n fixMethod('has');\n IS_MAP && fixMethod('get');\n }\n if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER);\n // weak collections should not contains .clear method\n if (IS_WEAK && proto.clear) delete proto.clear;\n }\n\n setToStringTag(C, NAME);\n\n O[NAME] = C;\n $export($export.G + $export.W + $export.F * (C != Base), O);\n\n if (!IS_WEAK) common.setStrong(C, NAME, IS_MAP);\n\n return C;\n};\n","'use strict';\nvar strong = require('./_collection-strong');\nvar validate = require('./_validate-collection');\nvar MAP = 'Map';\n\n// 23.1 Map Objects\nmodule.exports = require('./_collection')(MAP, function (get) {\n return function Map() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };\n}, {\n // 23.1.3.6 Map.prototype.get(key)\n get: function get(key) {\n var entry = strong.getEntry(validate(this, MAP), key);\n return entry && entry.v;\n },\n // 23.1.3.9 Map.prototype.set(key, value)\n set: function set(key, value) {\n return strong.def(validate(this, MAP), key === 0 ? 0 : key, value);\n }\n}, strong, true);\n","'use strict';\nvar strong = require('./_collection-strong');\nvar validate = require('./_validate-collection');\nvar SET = 'Set';\n\n// 23.2 Set Objects\nmodule.exports = require('./_collection')(SET, function (get) {\n return function Set() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };\n}, {\n // 23.2.3.1 Set.prototype.add(value)\n add: function add(value) {\n return strong.def(validate(this, SET), value = value === 0 ? 0 : value, value);\n }\n}, strong);\n","exports.f = Object.getOwnPropertySymbols;\n","'use strict';\n// 19.1.2.1 Object.assign(target, source, ...)\nvar getKeys = require('./_object-keys');\nvar gOPS = require('./_object-gops');\nvar pIE = require('./_object-pie');\nvar toObject = require('./_to-object');\nvar IObject = require('./_iobject');\nvar $assign = Object.assign;\n\n// should work with symbols and should have deterministic property order (V8 bug)\nmodule.exports = !$assign || require('./_fails')(function () {\n var A = {};\n var B = {};\n // eslint-disable-next-line no-undef\n var S = Symbol();\n var K = 'abcdefghijklmnopqrst';\n A[S] = 7;\n K.split('').forEach(function (k) { B[k] = k; });\n return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K;\n}) ? function assign(target, source) { // eslint-disable-line no-unused-vars\n var T = toObject(target);\n var aLen = arguments.length;\n var index = 1;\n var getSymbols = gOPS.f;\n var isEnum = pIE.f;\n while (aLen > index) {\n var S = IObject(arguments[index++]);\n var keys = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S);\n var length = keys.length;\n var j = 0;\n var key;\n while (length > j) if (isEnum.call(S, key = keys[j++])) T[key] = S[key];\n } return T;\n} : $assign;\n","'use strict';\nvar redefineAll = require('./_redefine-all');\nvar getWeak = require('./_meta').getWeak;\nvar anObject = require('./_an-object');\nvar isObject = require('./_is-object');\nvar anInstance = require('./_an-instance');\nvar forOf = require('./_for-of');\nvar createArrayMethod = require('./_array-methods');\nvar $has = require('./_has');\nvar validate = require('./_validate-collection');\nvar arrayFind = createArrayMethod(5);\nvar arrayFindIndex = createArrayMethod(6);\nvar id = 0;\n\n// fallback for uncaught frozen keys\nvar uncaughtFrozenStore = function (that) {\n return that._l || (that._l = new UncaughtFrozenStore());\n};\nvar UncaughtFrozenStore = function () {\n this.a = [];\n};\nvar findUncaughtFrozen = function (store, key) {\n return arrayFind(store.a, function (it) {\n return it[0] === key;\n });\n};\nUncaughtFrozenStore.prototype = {\n get: function (key) {\n var entry = findUncaughtFrozen(this, key);\n if (entry) return entry[1];\n },\n has: function (key) {\n return !!findUncaughtFrozen(this, key);\n },\n set: function (key, value) {\n var entry = findUncaughtFrozen(this, key);\n if (entry) entry[1] = value;\n else this.a.push([key, value]);\n },\n 'delete': function (key) {\n var index = arrayFindIndex(this.a, function (it) {\n return it[0] === key;\n });\n if (~index) this.a.splice(index, 1);\n return !!~index;\n }\n};\n\nmodule.exports = {\n getConstructor: function (wrapper, NAME, IS_MAP, ADDER) {\n var C = wrapper(function (that, iterable) {\n anInstance(that, C, NAME, '_i');\n that._t = NAME; // collection type\n that._i = id++; // collection id\n that._l = undefined; // leak store for uncaught frozen objects\n if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n });\n redefineAll(C.prototype, {\n // 23.3.3.2 WeakMap.prototype.delete(key)\n // 23.4.3.3 WeakSet.prototype.delete(value)\n 'delete': function (key) {\n if (!isObject(key)) return false;\n var data = getWeak(key);\n if (data === true) return uncaughtFrozenStore(validate(this, NAME))['delete'](key);\n return data && $has(data, this._i) && delete data[this._i];\n },\n // 23.3.3.4 WeakMap.prototype.has(key)\n // 23.4.3.4 WeakSet.prototype.has(value)\n has: function has(key) {\n if (!isObject(key)) return false;\n var data = getWeak(key);\n if (data === true) return uncaughtFrozenStore(validate(this, NAME)).has(key);\n return data && $has(data, this._i);\n }\n });\n return C;\n },\n def: function (that, key, value) {\n var data = getWeak(anObject(key), true);\n if (data === true) uncaughtFrozenStore(that).set(key, value);\n else data[that._i] = value;\n return that;\n },\n ufstore: uncaughtFrozenStore\n};\n","'use strict';\nvar each = require('./_array-methods')(0);\nvar redefine = require('./_redefine');\nvar meta = require('./_meta');\nvar assign = require('./_object-assign');\nvar weak = require('./_collection-weak');\nvar isObject = require('./_is-object');\nvar fails = require('./_fails');\nvar validate = require('./_validate-collection');\nvar WEAK_MAP = 'WeakMap';\nvar getWeak = meta.getWeak;\nvar isExtensible = Object.isExtensible;\nvar uncaughtFrozenStore = weak.ufstore;\nvar tmp = {};\nvar InternalMap;\n\nvar wrapper = function (get) {\n return function WeakMap() {\n return get(this, arguments.length > 0 ? arguments[0] : undefined);\n };\n};\n\nvar methods = {\n // 23.3.3.3 WeakMap.prototype.get(key)\n get: function get(key) {\n if (isObject(key)) {\n var data = getWeak(key);\n if (data === true) return uncaughtFrozenStore(validate(this, WEAK_MAP)).get(key);\n return data ? data[this._i] : undefined;\n }\n },\n // 23.3.3.5 WeakMap.prototype.set(key, value)\n set: function set(key, value) {\n return weak.def(validate(this, WEAK_MAP), key, value);\n }\n};\n\n// 23.3 WeakMap Objects\nvar $WeakMap = module.exports = require('./_collection')(WEAK_MAP, wrapper, methods, weak, true, true);\n\n// IE11 WeakMap frozen keys fix\nif (fails(function () { return new $WeakMap().set((Object.freeze || Object)(tmp), 7).get(tmp) != 7; })) {\n InternalMap = weak.getConstructor(wrapper, WEAK_MAP);\n assign(InternalMap.prototype, methods);\n meta.NEED = true;\n each(['delete', 'has', 'get', 'set'], function (key) {\n var proto = $WeakMap.prototype;\n var method = proto[key];\n redefine(proto, key, function (a, b) {\n // store frozen objects on internal weakmap shim\n if (isObject(a) && !isExtensible(a)) {\n if (!this._f) this._f = new InternalMap();\n var result = this._f[key](a, b);\n return key == 'set' ? this : result;\n // store all the rest on native weakmap\n } return method.call(this, a, b);\n });\n });\n}\n","'use strict';\nvar weak = require('./_collection-weak');\nvar validate = require('./_validate-collection');\nvar WEAK_SET = 'WeakSet';\n\n// 23.4 WeakSet Objects\nrequire('./_collection')(WEAK_SET, function (get) {\n return function WeakSet() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };\n}, {\n // 23.4.3.1 WeakSet.prototype.add(value)\n add: function add(value) {\n return weak.def(validate(this, WEAK_SET), value, true);\n }\n}, weak, false, true);\n","// 26.1.1 Reflect.apply(target, thisArgument, argumentsList)\nvar $export = require('./_export');\nvar aFunction = require('./_a-function');\nvar anObject = require('./_an-object');\nvar rApply = (require('./_global').Reflect || {}).apply;\nvar fApply = Function.apply;\n// MS Edge argumentsList argument is optional\n$export($export.S + $export.F * !require('./_fails')(function () {\n rApply(function () { /* empty */ });\n}), 'Reflect', {\n apply: function apply(target, thisArgument, argumentsList) {\n var T = aFunction(target);\n var L = anObject(argumentsList);\n return rApply ? rApply(T, thisArgument, L) : fApply.call(T, thisArgument, L);\n }\n});\n","// fast apply, http://jsperf.lnkit.com/fast-apply/5\nmodule.exports = function (fn, args, that) {\n var un = that === undefined;\n switch (args.length) {\n case 0: return un ? fn()\n : fn.call(that);\n case 1: return un ? fn(args[0])\n : fn.call(that, args[0]);\n case 2: return un ? fn(args[0], args[1])\n : fn.call(that, args[0], args[1]);\n case 3: return un ? fn(args[0], args[1], args[2])\n : fn.call(that, args[0], args[1], args[2]);\n case 4: return un ? fn(args[0], args[1], args[2], args[3])\n : fn.call(that, args[0], args[1], args[2], args[3]);\n } return fn.apply(that, args);\n};\n","'use strict';\nvar aFunction = require('./_a-function');\nvar isObject = require('./_is-object');\nvar invoke = require('./_invoke');\nvar arraySlice = [].slice;\nvar factories = {};\n\nvar construct = function (F, len, args) {\n if (!(len in factories)) {\n for (var n = [], i = 0; i < len; i++) n[i] = 'a[' + i + ']';\n // eslint-disable-next-line no-new-func\n factories[len] = Function('F,a', 'return new F(' + n.join(',') + ')');\n } return factories[len](F, args);\n};\n\nmodule.exports = Function.bind || function bind(that /* , ...args */) {\n var fn = aFunction(this);\n var partArgs = arraySlice.call(arguments, 1);\n var bound = function (/* args... */) {\n var args = partArgs.concat(arraySlice.call(arguments));\n return this instanceof bound ? construct(fn, args.length, args) : invoke(fn, args, that);\n };\n if (isObject(fn.prototype)) bound.prototype = fn.prototype;\n return bound;\n};\n","// 26.1.2 Reflect.construct(target, argumentsList [, newTarget])\nvar $export = require('./_export');\nvar create = require('./_object-create');\nvar aFunction = require('./_a-function');\nvar anObject = require('./_an-object');\nvar isObject = require('./_is-object');\nvar fails = require('./_fails');\nvar bind = require('./_bind');\nvar rConstruct = (require('./_global').Reflect || {}).construct;\n\n// MS Edge supports only 2 arguments and argumentsList argument is optional\n// FF Nightly sets third argument as `new.target`, but does not create `this` from it\nvar NEW_TARGET_BUG = fails(function () {\n function F() { /* empty */ }\n return !(rConstruct(function () { /* empty */ }, [], F) instanceof F);\n});\nvar ARGS_BUG = !fails(function () {\n rConstruct(function () { /* empty */ });\n});\n\n$export($export.S + $export.F * (NEW_TARGET_BUG || ARGS_BUG), 'Reflect', {\n construct: function construct(Target, args /* , newTarget */) {\n aFunction(Target);\n anObject(args);\n var newTarget = arguments.length < 3 ? Target : aFunction(arguments[2]);\n if (ARGS_BUG && !NEW_TARGET_BUG) return rConstruct(Target, args, newTarget);\n if (Target == newTarget) {\n // w/o altered newTarget, optimization for 0-4 arguments\n switch (args.length) {\n case 0: return new Target();\n case 1: return new Target(args[0]);\n case 2: return new Target(args[0], args[1]);\n case 3: return new Target(args[0], args[1], args[2]);\n case 4: return new Target(args[0], args[1], args[2], args[3]);\n }\n // w/o altered newTarget, lot of arguments case\n var $args = [null];\n $args.push.apply($args, args);\n return new (bind.apply(Target, $args))();\n }\n // with altered newTarget, not support built-in constructors\n var proto = newTarget.prototype;\n var instance = create(isObject(proto) ? proto : Object.prototype);\n var result = Function.apply.call(Target, instance, args);\n return isObject(result) ? result : instance;\n }\n});\n","// 26.1.3 Reflect.defineProperty(target, propertyKey, attributes)\nvar dP = require('./_object-dp');\nvar $export = require('./_export');\nvar anObject = require('./_an-object');\nvar toPrimitive = require('./_to-primitive');\n\n// MS Edge has broken Reflect.defineProperty - throwing instead of returning false\n$export($export.S + $export.F * require('./_fails')(function () {\n // eslint-disable-next-line no-undef\n Reflect.defineProperty(dP.f({}, 1, { value: 1 }), 1, { value: 2 });\n}), 'Reflect', {\n defineProperty: function defineProperty(target, propertyKey, attributes) {\n anObject(target);\n propertyKey = toPrimitive(propertyKey, true);\n anObject(attributes);\n try {\n dP.f(target, propertyKey, attributes);\n return true;\n } catch (e) {\n return false;\n }\n }\n});\n","// 26.1.4 Reflect.deleteProperty(target, propertyKey)\nvar $export = require('./_export');\nvar gOPD = require('./_object-gopd').f;\nvar anObject = require('./_an-object');\n\n$export($export.S, 'Reflect', {\n deleteProperty: function deleteProperty(target, propertyKey) {\n var desc = gOPD(anObject(target), propertyKey);\n return desc && !desc.configurable ? false : delete target[propertyKey];\n }\n});\n","// 26.1.6 Reflect.get(target, propertyKey [, receiver])\nvar gOPD = require('./_object-gopd');\nvar getPrototypeOf = require('./_object-gpo');\nvar has = require('./_has');\nvar $export = require('./_export');\nvar isObject = require('./_is-object');\nvar anObject = require('./_an-object');\n\nfunction get(target, propertyKey /* , receiver */) {\n var receiver = arguments.length < 3 ? target : arguments[2];\n var desc, proto;\n if (anObject(target) === receiver) return target[propertyKey];\n if (desc = gOPD.f(target, propertyKey)) return has(desc, 'value')\n ? desc.value\n : desc.get !== undefined\n ? desc.get.call(receiver)\n : undefined;\n if (isObject(proto = getPrototypeOf(target))) return get(proto, propertyKey, receiver);\n}\n\n$export($export.S, 'Reflect', { get: get });\n","// 26.1.7 Reflect.getOwnPropertyDescriptor(target, propertyKey)\nvar gOPD = require('./_object-gopd');\nvar $export = require('./_export');\nvar anObject = require('./_an-object');\n\n$export($export.S, 'Reflect', {\n getOwnPropertyDescriptor: function getOwnPropertyDescriptor(target, propertyKey) {\n return gOPD.f(anObject(target), propertyKey);\n }\n});\n","// 26.1.8 Reflect.getPrototypeOf(target)\nvar $export = require('./_export');\nvar getProto = require('./_object-gpo');\nvar anObject = require('./_an-object');\n\n$export($export.S, 'Reflect', {\n getPrototypeOf: function getPrototypeOf(target) {\n return getProto(anObject(target));\n }\n});\n","// 26.1.9 Reflect.has(target, propertyKey)\nvar $export = require('./_export');\n\n$export($export.S, 'Reflect', {\n has: function has(target, propertyKey) {\n return propertyKey in target;\n }\n});\n","// 26.1.10 Reflect.isExtensible(target)\nvar $export = require('./_export');\nvar anObject = require('./_an-object');\nvar $isExtensible = Object.isExtensible;\n\n$export($export.S, 'Reflect', {\n isExtensible: function isExtensible(target) {\n anObject(target);\n return $isExtensible ? $isExtensible(target) : true;\n }\n});\n","// all object keys, includes non-enumerable and symbols\nvar gOPN = require('./_object-gopn');\nvar gOPS = require('./_object-gops');\nvar anObject = require('./_an-object');\nvar Reflect = require('./_global').Reflect;\nmodule.exports = Reflect && Reflect.ownKeys || function ownKeys(it) {\n var keys = gOPN.f(anObject(it));\n var getSymbols = gOPS.f;\n return getSymbols ? keys.concat(getSymbols(it)) : keys;\n};\n","// 26.1.11 Reflect.ownKeys(target)\nvar $export = require('./_export');\n\n$export($export.S, 'Reflect', { ownKeys: require('./_own-keys') });\n","// 26.1.12 Reflect.preventExtensions(target)\nvar $export = require('./_export');\nvar anObject = require('./_an-object');\nvar $preventExtensions = Object.preventExtensions;\n\n$export($export.S, 'Reflect', {\n preventExtensions: function preventExtensions(target) {\n anObject(target);\n try {\n if ($preventExtensions) $preventExtensions(target);\n return true;\n } catch (e) {\n return false;\n }\n }\n});\n","// 26.1.13 Reflect.set(target, propertyKey, V [, receiver])\nvar dP = require('./_object-dp');\nvar gOPD = require('./_object-gopd');\nvar getPrototypeOf = require('./_object-gpo');\nvar has = require('./_has');\nvar $export = require('./_export');\nvar createDesc = require('./_property-desc');\nvar anObject = require('./_an-object');\nvar isObject = require('./_is-object');\n\nfunction set(target, propertyKey, V /* , receiver */) {\n var receiver = arguments.length < 4 ? target : arguments[3];\n var ownDesc = gOPD.f(anObject(target), propertyKey);\n var existingDescriptor, proto;\n if (!ownDesc) {\n if (isObject(proto = getPrototypeOf(target))) {\n return set(proto, propertyKey, V, receiver);\n }\n ownDesc = createDesc(0);\n }\n if (has(ownDesc, 'value')) {\n if (ownDesc.writable === false || !isObject(receiver)) return false;\n existingDescriptor = gOPD.f(receiver, propertyKey) || createDesc(0);\n existingDescriptor.value = V;\n dP.f(receiver, propertyKey, existingDescriptor);\n return true;\n }\n return ownDesc.set === undefined ? false : (ownDesc.set.call(receiver, V), true);\n}\n\n$export($export.S, 'Reflect', { set: set });\n","// 26.1.14 Reflect.setPrototypeOf(target, proto)\nvar $export = require('./_export');\nvar setProto = require('./_set-proto');\n\nif (setProto) $export($export.S, 'Reflect', {\n setPrototypeOf: function setPrototypeOf(target, proto) {\n setProto.check(target, proto);\n try {\n setProto.set(target, proto);\n return true;\n } catch (e) {\n return false;\n }\n }\n});\n","var ctx = require('./_ctx');\nvar invoke = require('./_invoke');\nvar html = require('./_html');\nvar cel = require('./_dom-create');\nvar global = require('./_global');\nvar process = global.process;\nvar setTask = global.setImmediate;\nvar clearTask = global.clearImmediate;\nvar MessageChannel = global.MessageChannel;\nvar Dispatch = global.Dispatch;\nvar counter = 0;\nvar queue = {};\nvar ONREADYSTATECHANGE = 'onreadystatechange';\nvar defer, channel, port;\nvar run = function () {\n var id = +this;\n // eslint-disable-next-line no-prototype-builtins\n if (queue.hasOwnProperty(id)) {\n var fn = queue[id];\n delete queue[id];\n fn();\n }\n};\nvar listener = function (event) {\n run.call(event.data);\n};\n// Node.js 0.9+ & IE10+ has setImmediate, otherwise:\nif (!setTask || !clearTask) {\n setTask = function setImmediate(fn) {\n var args = [];\n var i = 1;\n while (arguments.length > i) args.push(arguments[i++]);\n queue[++counter] = function () {\n // eslint-disable-next-line no-new-func\n invoke(typeof fn == 'function' ? fn : Function(fn), args);\n };\n defer(counter);\n return counter;\n };\n clearTask = function clearImmediate(id) {\n delete queue[id];\n };\n // Node.js 0.8-\n if (require('./_cof')(process) == 'process') {\n defer = function (id) {\n process.nextTick(ctx(run, id, 1));\n };\n // Sphere (JS game engine) Dispatch API\n } else if (Dispatch && Dispatch.now) {\n defer = function (id) {\n Dispatch.now(ctx(run, id, 1));\n };\n // Browsers with MessageChannel, includes WebWorkers\n } else if (MessageChannel) {\n channel = new MessageChannel();\n port = channel.port2;\n channel.port1.onmessage = listener;\n defer = ctx(port.postMessage, port, 1);\n // Browsers with postMessage, skip WebWorkers\n // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'\n } else if (global.addEventListener && typeof postMessage == 'function' && !global.importScripts) {\n defer = function (id) {\n global.postMessage(id + '', '*');\n };\n global.addEventListener('message', listener, false);\n // IE8-\n } else if (ONREADYSTATECHANGE in cel('script')) {\n defer = function (id) {\n html.appendChild(cel('script'))[ONREADYSTATECHANGE] = function () {\n html.removeChild(this);\n run.call(id);\n };\n };\n // Rest old browsers\n } else {\n defer = function (id) {\n setTimeout(ctx(run, id, 1), 0);\n };\n }\n}\nmodule.exports = {\n set: setTask,\n clear: clearTask\n};\n","var global = require('./_global');\nvar macrotask = require('./_task').set;\nvar Observer = global.MutationObserver || global.WebKitMutationObserver;\nvar process = global.process;\nvar Promise = global.Promise;\nvar isNode = require('./_cof')(process) == 'process';\n\nmodule.exports = function () {\n var head, last, notify;\n\n var flush = function () {\n var parent, fn;\n if (isNode && (parent = process.domain)) parent.exit();\n while (head) {\n fn = head.fn;\n head = head.next;\n try {\n fn();\n } catch (e) {\n if (head) notify();\n else last = undefined;\n throw e;\n }\n } last = undefined;\n if (parent) parent.enter();\n };\n\n // Node.js\n if (isNode) {\n notify = function () {\n process.nextTick(flush);\n };\n // browsers with MutationObserver, except iOS Safari - https://github.com/zloirock/core-js/issues/339\n } else if (Observer && !(global.navigator && global.navigator.standalone)) {\n var toggle = true;\n var node = document.createTextNode('');\n new Observer(flush).observe(node, { characterData: true }); // eslint-disable-line no-new\n notify = function () {\n node.data = toggle = !toggle;\n };\n // environments with maybe non-completely correct, but existent Promise\n } else if (Promise && Promise.resolve) {\n var promise = Promise.resolve();\n notify = function () {\n promise.then(flush);\n };\n // for other environments - macrotask based on:\n // - setImmediate\n // - MessageChannel\n // - window.postMessag\n // - onreadystatechange\n // - setTimeout\n } else {\n notify = function () {\n // strange IE + webpack dev server bug - use .call(global)\n macrotask.call(global, flush);\n };\n }\n\n return function (fn) {\n var task = { fn: fn, next: undefined };\n if (last) last.next = task;\n if (!head) {\n head = task;\n notify();\n } last = task;\n };\n};\n","'use strict';\n// 25.4.1.5 NewPromiseCapability(C)\nvar aFunction = require('./_a-function');\n\nfunction PromiseCapability(C) {\n var resolve, reject;\n this.promise = new C(function ($$resolve, $$reject) {\n if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor');\n resolve = $$resolve;\n reject = $$reject;\n });\n this.resolve = aFunction(resolve);\n this.reject = aFunction(reject);\n}\n\nmodule.exports.f = function (C) {\n return new PromiseCapability(C);\n};\n","module.exports = function (exec) {\n try {\n return { e: false, v: exec() };\n } catch (e) {\n return { e: true, v: e };\n }\n};\n","var anObject = require('./_an-object');\nvar isObject = require('./_is-object');\nvar newPromiseCapability = require('./_new-promise-capability');\n\nmodule.exports = function (C, x) {\n anObject(C);\n if (isObject(x) && x.constructor === C) return x;\n var promiseCapability = newPromiseCapability.f(C);\n var resolve = promiseCapability.resolve;\n resolve(x);\n return promiseCapability.promise;\n};\n","'use strict';\nvar LIBRARY = require('./_library');\nvar global = require('./_global');\nvar ctx = require('./_ctx');\nvar classof = require('./_classof');\nvar $export = require('./_export');\nvar isObject = require('./_is-object');\nvar aFunction = require('./_a-function');\nvar anInstance = require('./_an-instance');\nvar forOf = require('./_for-of');\nvar speciesConstructor = require('./_species-constructor');\nvar task = require('./_task').set;\nvar microtask = require('./_microtask')();\nvar newPromiseCapabilityModule = require('./_new-promise-capability');\nvar perform = require('./_perform');\nvar promiseResolve = require('./_promise-resolve');\nvar PROMISE = 'Promise';\nvar TypeError = global.TypeError;\nvar process = global.process;\nvar $Promise = global[PROMISE];\nvar isNode = classof(process) == 'process';\nvar empty = function () { /* empty */ };\nvar Internal, newGenericPromiseCapability, OwnPromiseCapability, Wrapper;\nvar newPromiseCapability = newGenericPromiseCapability = newPromiseCapabilityModule.f;\n\nvar USE_NATIVE = !!function () {\n try {\n // correct subclassing with @@species support\n var promise = $Promise.resolve(1);\n var FakePromise = (promise.constructor = {})[require('./_wks')('species')] = function (exec) {\n exec(empty, empty);\n };\n // unhandled rejections tracking support, NodeJS Promise without it fails @@species test\n return (isNode || typeof PromiseRejectionEvent == 'function') && promise.then(empty) instanceof FakePromise;\n } catch (e) { /* empty */ }\n}();\n\n// helpers\nvar isThenable = function (it) {\n var then;\n return isObject(it) && typeof (then = it.then) == 'function' ? then : false;\n};\nvar notify = function (promise, isReject) {\n if (promise._n) return;\n promise._n = true;\n var chain = promise._c;\n microtask(function () {\n var value = promise._v;\n var ok = promise._s == 1;\n var i = 0;\n var run = function (reaction) {\n var handler = ok ? reaction.ok : reaction.fail;\n var resolve = reaction.resolve;\n var reject = reaction.reject;\n var domain = reaction.domain;\n var result, then;\n try {\n if (handler) {\n if (!ok) {\n if (promise._h == 2) onHandleUnhandled(promise);\n promise._h = 1;\n }\n if (handler === true) result = value;\n else {\n if (domain) domain.enter();\n result = handler(value);\n if (domain) domain.exit();\n }\n if (result === reaction.promise) {\n reject(TypeError('Promise-chain cycle'));\n } else if (then = isThenable(result)) {\n then.call(result, resolve, reject);\n } else resolve(result);\n } else reject(value);\n } catch (e) {\n reject(e);\n }\n };\n while (chain.length > i) run(chain[i++]); // variable length - can't use forEach\n promise._c = [];\n promise._n = false;\n if (isReject && !promise._h) onUnhandled(promise);\n });\n};\nvar onUnhandled = function (promise) {\n task.call(global, function () {\n var value = promise._v;\n var unhandled = isUnhandled(promise);\n var result, handler, console;\n if (unhandled) {\n result = perform(function () {\n if (isNode) {\n process.emit('unhandledRejection', value, promise);\n } else if (handler = global.onunhandledrejection) {\n handler({ promise: promise, reason: value });\n } else if ((console = global.console) && console.error) {\n console.error('Unhandled promise rejection', value);\n }\n });\n // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should\n promise._h = isNode || isUnhandled(promise) ? 2 : 1;\n } promise._a = undefined;\n if (unhandled && result.e) throw result.v;\n });\n};\nvar isUnhandled = function (promise) {\n return promise._h !== 1 && (promise._a || promise._c).length === 0;\n};\nvar onHandleUnhandled = function (promise) {\n task.call(global, function () {\n var handler;\n if (isNode) {\n process.emit('rejectionHandled', promise);\n } else if (handler = global.onrejectionhandled) {\n handler({ promise: promise, reason: promise._v });\n }\n });\n};\nvar $reject = function (value) {\n var promise = this;\n if (promise._d) return;\n promise._d = true;\n promise = promise._w || promise; // unwrap\n promise._v = value;\n promise._s = 2;\n if (!promise._a) promise._a = promise._c.slice();\n notify(promise, true);\n};\nvar $resolve = function (value) {\n var promise = this;\n var then;\n if (promise._d) return;\n promise._d = true;\n promise = promise._w || promise; // unwrap\n try {\n if (promise === value) throw TypeError(\"Promise can't be resolved itself\");\n if (then = isThenable(value)) {\n microtask(function () {\n var wrapper = { _w: promise, _d: false }; // wrap\n try {\n then.call(value, ctx($resolve, wrapper, 1), ctx($reject, wrapper, 1));\n } catch (e) {\n $reject.call(wrapper, e);\n }\n });\n } else {\n promise._v = value;\n promise._s = 1;\n notify(promise, false);\n }\n } catch (e) {\n $reject.call({ _w: promise, _d: false }, e); // wrap\n }\n};\n\n// constructor polyfill\nif (!USE_NATIVE) {\n // 25.4.3.1 Promise(executor)\n $Promise = function Promise(executor) {\n anInstance(this, $Promise, PROMISE, '_h');\n aFunction(executor);\n Internal.call(this);\n try {\n executor(ctx($resolve, this, 1), ctx($reject, this, 1));\n } catch (err) {\n $reject.call(this, err);\n }\n };\n // eslint-disable-next-line no-unused-vars\n Internal = function Promise(executor) {\n this._c = []; // <- awaiting reactions\n this._a = undefined; // <- checked in isUnhandled reactions\n this._s = 0; // <- state\n this._d = false; // <- done\n this._v = undefined; // <- value\n this._h = 0; // <- rejection state, 0 - default, 1 - handled, 2 - unhandled\n this._n = false; // <- notify\n };\n Internal.prototype = require('./_redefine-all')($Promise.prototype, {\n // 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected)\n then: function then(onFulfilled, onRejected) {\n var reaction = newPromiseCapability(speciesConstructor(this, $Promise));\n reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;\n reaction.fail = typeof onRejected == 'function' && onRejected;\n reaction.domain = isNode ? process.domain : undefined;\n this._c.push(reaction);\n if (this._a) this._a.push(reaction);\n if (this._s) notify(this, false);\n return reaction.promise;\n },\n // 25.4.5.1 Promise.prototype.catch(onRejected)\n 'catch': function (onRejected) {\n return this.then(undefined, onRejected);\n }\n });\n OwnPromiseCapability = function () {\n var promise = new Internal();\n this.promise = promise;\n this.resolve = ctx($resolve, promise, 1);\n this.reject = ctx($reject, promise, 1);\n };\n newPromiseCapabilityModule.f = newPromiseCapability = function (C) {\n return C === $Promise || C === Wrapper\n ? new OwnPromiseCapability(C)\n : newGenericPromiseCapability(C);\n };\n}\n\n$export($export.G + $export.W + $export.F * !USE_NATIVE, { Promise: $Promise });\nrequire('./_set-to-string-tag')($Promise, PROMISE);\nrequire('./_set-species')(PROMISE);\nWrapper = require('./_core')[PROMISE];\n\n// statics\n$export($export.S + $export.F * !USE_NATIVE, PROMISE, {\n // 25.4.4.5 Promise.reject(r)\n reject: function reject(r) {\n var capability = newPromiseCapability(this);\n var $$reject = capability.reject;\n $$reject(r);\n return capability.promise;\n }\n});\n$export($export.S + $export.F * (LIBRARY || !USE_NATIVE), PROMISE, {\n // 25.4.4.6 Promise.resolve(x)\n resolve: function resolve(x) {\n return promiseResolve(LIBRARY && this === Wrapper ? $Promise : this, x);\n }\n});\n$export($export.S + $export.F * !(USE_NATIVE && require('./_iter-detect')(function (iter) {\n $Promise.all(iter)['catch'](empty);\n})), PROMISE, {\n // 25.4.4.1 Promise.all(iterable)\n all: function all(iterable) {\n var C = this;\n var capability = newPromiseCapability(C);\n var resolve = capability.resolve;\n var reject = capability.reject;\n var result = perform(function () {\n var values = [];\n var index = 0;\n var remaining = 1;\n forOf(iterable, false, function (promise) {\n var $index = index++;\n var alreadyCalled = false;\n values.push(undefined);\n remaining++;\n C.resolve(promise).then(function (value) {\n if (alreadyCalled) return;\n alreadyCalled = true;\n values[$index] = value;\n --remaining || resolve(values);\n }, reject);\n });\n --remaining || resolve(values);\n });\n if (result.e) reject(result.v);\n return capability.promise;\n },\n // 25.4.4.4 Promise.race(iterable)\n race: function race(iterable) {\n var C = this;\n var capability = newPromiseCapability(C);\n var reject = capability.reject;\n var result = perform(function () {\n forOf(iterable, false, function (promise) {\n C.resolve(promise).then(capability.resolve, reject);\n });\n });\n if (result.e) reject(result.v);\n return capability.promise;\n }\n});\n","exports.f = require('./_wks');\n","var global = require('./_global');\nvar core = require('./_core');\nvar LIBRARY = require('./_library');\nvar wksExt = require('./_wks-ext');\nvar defineProperty = require('./_object-dp').f;\nmodule.exports = function (name) {\n var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {});\n if (name.charAt(0) != '_' && !(name in $Symbol)) defineProperty($Symbol, name, { value: wksExt.f(name) });\n};\n","// all enumerable object keys, includes symbols\nvar getKeys = require('./_object-keys');\nvar gOPS = require('./_object-gops');\nvar pIE = require('./_object-pie');\nmodule.exports = function (it) {\n var result = getKeys(it);\n var getSymbols = gOPS.f;\n if (getSymbols) {\n var symbols = getSymbols(it);\n var isEnum = pIE.f;\n var i = 0;\n var key;\n while (symbols.length > i) if (isEnum.call(it, key = symbols[i++])) result.push(key);\n } return result;\n};\n","// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window\nvar toIObject = require('./_to-iobject');\nvar gOPN = require('./_object-gopn').f;\nvar toString = {}.toString;\n\nvar windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames\n ? Object.getOwnPropertyNames(window) : [];\n\nvar getWindowNames = function (it) {\n try {\n return gOPN(it);\n } catch (e) {\n return windowNames.slice();\n }\n};\n\nmodule.exports.f = function getOwnPropertyNames(it) {\n return windowNames && toString.call(it) == '[object Window]' ? getWindowNames(it) : gOPN(toIObject(it));\n};\n","'use strict';\n// ECMAScript 6 symbols shim\nvar global = require('./_global');\nvar has = require('./_has');\nvar DESCRIPTORS = require('./_descriptors');\nvar $export = require('./_export');\nvar redefine = require('./_redefine');\nvar META = require('./_meta').KEY;\nvar $fails = require('./_fails');\nvar shared = require('./_shared');\nvar setToStringTag = require('./_set-to-string-tag');\nvar uid = require('./_uid');\nvar wks = require('./_wks');\nvar wksExt = require('./_wks-ext');\nvar wksDefine = require('./_wks-define');\nvar enumKeys = require('./_enum-keys');\nvar isArray = require('./_is-array');\nvar anObject = require('./_an-object');\nvar isObject = require('./_is-object');\nvar toIObject = require('./_to-iobject');\nvar toPrimitive = require('./_to-primitive');\nvar createDesc = require('./_property-desc');\nvar _create = require('./_object-create');\nvar gOPNExt = require('./_object-gopn-ext');\nvar $GOPD = require('./_object-gopd');\nvar $DP = require('./_object-dp');\nvar $keys = require('./_object-keys');\nvar gOPD = $GOPD.f;\nvar dP = $DP.f;\nvar gOPN = gOPNExt.f;\nvar $Symbol = global.Symbol;\nvar $JSON = global.JSON;\nvar _stringify = $JSON && $JSON.stringify;\nvar PROTOTYPE = 'prototype';\nvar HIDDEN = wks('_hidden');\nvar TO_PRIMITIVE = wks('toPrimitive');\nvar isEnum = {}.propertyIsEnumerable;\nvar SymbolRegistry = shared('symbol-registry');\nvar AllSymbols = shared('symbols');\nvar OPSymbols = shared('op-symbols');\nvar ObjectProto = Object[PROTOTYPE];\nvar USE_NATIVE = typeof $Symbol == 'function';\nvar QObject = global.QObject;\n// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173\nvar setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;\n\n// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687\nvar setSymbolDesc = DESCRIPTORS && $fails(function () {\n return _create(dP({}, 'a', {\n get: function () { return dP(this, 'a', { value: 7 }).a; }\n })).a != 7;\n}) ? function (it, key, D) {\n var protoDesc = gOPD(ObjectProto, key);\n if (protoDesc) delete ObjectProto[key];\n dP(it, key, D);\n if (protoDesc && it !== ObjectProto) dP(ObjectProto, key, protoDesc);\n} : dP;\n\nvar wrap = function (tag) {\n var sym = AllSymbols[tag] = _create($Symbol[PROTOTYPE]);\n sym._k = tag;\n return sym;\n};\n\nvar isSymbol = USE_NATIVE && typeof $Symbol.iterator == 'symbol' ? function (it) {\n return typeof it == 'symbol';\n} : function (it) {\n return it instanceof $Symbol;\n};\n\nvar $defineProperty = function defineProperty(it, key, D) {\n if (it === ObjectProto) $defineProperty(OPSymbols, key, D);\n anObject(it);\n key = toPrimitive(key, true);\n anObject(D);\n if (has(AllSymbols, key)) {\n if (!D.enumerable) {\n if (!has(it, HIDDEN)) dP(it, HIDDEN, createDesc(1, {}));\n it[HIDDEN][key] = true;\n } else {\n if (has(it, HIDDEN) && it[HIDDEN][key]) it[HIDDEN][key] = false;\n D = _create(D, { enumerable: createDesc(0, false) });\n } return setSymbolDesc(it, key, D);\n } return dP(it, key, D);\n};\nvar $defineProperties = function defineProperties(it, P) {\n anObject(it);\n var keys = enumKeys(P = toIObject(P));\n var i = 0;\n var l = keys.length;\n var key;\n while (l > i) $defineProperty(it, key = keys[i++], P[key]);\n return it;\n};\nvar $create = function create(it, P) {\n return P === undefined ? _create(it) : $defineProperties(_create(it), P);\n};\nvar $propertyIsEnumerable = function propertyIsEnumerable(key) {\n var E = isEnum.call(this, key = toPrimitive(key, true));\n if (this === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return false;\n return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true;\n};\nvar $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key) {\n it = toIObject(it);\n key = toPrimitive(key, true);\n if (it === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return;\n var D = gOPD(it, key);\n if (D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) D.enumerable = true;\n return D;\n};\nvar $getOwnPropertyNames = function getOwnPropertyNames(it) {\n var names = gOPN(toIObject(it));\n var result = [];\n var i = 0;\n var key;\n while (names.length > i) {\n if (!has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META) result.push(key);\n } return result;\n};\nvar $getOwnPropertySymbols = function getOwnPropertySymbols(it) {\n var IS_OP = it === ObjectProto;\n var names = gOPN(IS_OP ? OPSymbols : toIObject(it));\n var result = [];\n var i = 0;\n var key;\n while (names.length > i) {\n if (has(AllSymbols, key = names[i++]) && (IS_OP ? has(ObjectProto, key) : true)) result.push(AllSymbols[key]);\n } return result;\n};\n\n// 19.4.1.1 Symbol([description])\nif (!USE_NATIVE) {\n $Symbol = function Symbol() {\n if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor!');\n var tag = uid(arguments.length > 0 ? arguments[0] : undefined);\n var $set = function (value) {\n if (this === ObjectProto) $set.call(OPSymbols, value);\n if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;\n setSymbolDesc(this, tag, createDesc(1, value));\n };\n if (DESCRIPTORS && setter) setSymbolDesc(ObjectProto, tag, { configurable: true, set: $set });\n return wrap(tag);\n };\n redefine($Symbol[PROTOTYPE], 'toString', function toString() {\n return this._k;\n });\n\n $GOPD.f = $getOwnPropertyDescriptor;\n $DP.f = $defineProperty;\n require('./_object-gopn').f = gOPNExt.f = $getOwnPropertyNames;\n require('./_object-pie').f = $propertyIsEnumerable;\n require('./_object-gops').f = $getOwnPropertySymbols;\n\n if (DESCRIPTORS && !require('./_library')) {\n redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true);\n }\n\n wksExt.f = function (name) {\n return wrap(wks(name));\n };\n}\n\n$export($export.G + $export.W + $export.F * !USE_NATIVE, { Symbol: $Symbol });\n\nfor (var es6Symbols = (\n // 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14\n 'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'\n).split(','), j = 0; es6Symbols.length > j;)wks(es6Symbols[j++]);\n\nfor (var wellKnownSymbols = $keys(wks.store), k = 0; wellKnownSymbols.length > k;) wksDefine(wellKnownSymbols[k++]);\n\n$export($export.S + $export.F * !USE_NATIVE, 'Symbol', {\n // 19.4.2.1 Symbol.for(key)\n 'for': function (key) {\n return has(SymbolRegistry, key += '')\n ? SymbolRegistry[key]\n : SymbolRegistry[key] = $Symbol(key);\n },\n // 19.4.2.5 Symbol.keyFor(sym)\n keyFor: function keyFor(sym) {\n if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol!');\n for (var key in SymbolRegistry) if (SymbolRegistry[key] === sym) return key;\n },\n useSetter: function () { setter = true; },\n useSimple: function () { setter = false; }\n});\n\n$export($export.S + $export.F * !USE_NATIVE, 'Object', {\n // 19.1.2.2 Object.create(O [, Properties])\n create: $create,\n // 19.1.2.4 Object.defineProperty(O, P, Attributes)\n defineProperty: $defineProperty,\n // 19.1.2.3 Object.defineProperties(O, Properties)\n defineProperties: $defineProperties,\n // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)\n getOwnPropertyDescriptor: $getOwnPropertyDescriptor,\n // 19.1.2.7 Object.getOwnPropertyNames(O)\n getOwnPropertyNames: $getOwnPropertyNames,\n // 19.1.2.8 Object.getOwnPropertySymbols(O)\n getOwnPropertySymbols: $getOwnPropertySymbols\n});\n\n// 24.3.2 JSON.stringify(value [, replacer [, space]])\n$JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function () {\n var S = $Symbol();\n // MS Edge converts symbol values to JSON as {}\n // WebKit converts symbol values to JSON as null\n // V8 throws on boxed symbols\n return _stringify([S]) != '[null]' || _stringify({ a: S }) != '{}' || _stringify(Object(S)) != '{}';\n})), 'JSON', {\n stringify: function stringify(it) {\n var args = [it];\n var i = 1;\n var replacer, $replacer;\n while (arguments.length > i) args.push(arguments[i++]);\n $replacer = replacer = args[1];\n if (!isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined\n if (!isArray(replacer)) replacer = function (key, value) {\n if (typeof $replacer == 'function') value = $replacer.call(this, key, value);\n if (!isSymbol(value)) return value;\n };\n args[1] = replacer;\n return _stringify.apply($JSON, args);\n }\n});\n\n// 19.4.3.4 Symbol.prototype[@@toPrimitive](hint)\n$Symbol[PROTOTYPE][TO_PRIMITIVE] || require('./_hide')($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf);\n// 19.4.3.5 Symbol.prototype[@@toStringTag]\nsetToStringTag($Symbol, 'Symbol');\n// 20.2.1.9 Math[@@toStringTag]\nsetToStringTag(Math, 'Math', true);\n// 24.3.3 JSON[@@toStringTag]\nsetToStringTag(global.JSON, 'JSON', true);\n","// most Object methods by ES6 should accept primitives\nvar $export = require('./_export');\nvar core = require('./_core');\nvar fails = require('./_fails');\nmodule.exports = function (KEY, exec) {\n var fn = (core.Object || {})[KEY] || Object[KEY];\n var exp = {};\n exp[KEY] = exec(fn);\n $export($export.S + $export.F * fails(function () { fn(1); }), 'Object', exp);\n};\n","// 19.1.2.5 Object.freeze(O)\nvar isObject = require('./_is-object');\nvar meta = require('./_meta').onFreeze;\n\nrequire('./_object-sap')('freeze', function ($freeze) {\n return function freeze(it) {\n return $freeze && isObject(it) ? $freeze(meta(it)) : it;\n };\n});\n","// 19.1.2.17 Object.seal(O)\nvar isObject = require('./_is-object');\nvar meta = require('./_meta').onFreeze;\n\nrequire('./_object-sap')('seal', function ($seal) {\n return function seal(it) {\n return $seal && isObject(it) ? $seal(meta(it)) : it;\n };\n});\n","// 19.1.2.15 Object.preventExtensions(O)\nvar isObject = require('./_is-object');\nvar meta = require('./_meta').onFreeze;\n\nrequire('./_object-sap')('preventExtensions', function ($preventExtensions) {\n return function preventExtensions(it) {\n return $preventExtensions && isObject(it) ? $preventExtensions(meta(it)) : it;\n };\n});\n","// 19.1.2.12 Object.isFrozen(O)\nvar isObject = require('./_is-object');\n\nrequire('./_object-sap')('isFrozen', function ($isFrozen) {\n return function isFrozen(it) {\n return isObject(it) ? $isFrozen ? $isFrozen(it) : false : true;\n };\n});\n","// 19.1.2.13 Object.isSealed(O)\nvar isObject = require('./_is-object');\n\nrequire('./_object-sap')('isSealed', function ($isSealed) {\n return function isSealed(it) {\n return isObject(it) ? $isSealed ? $isSealed(it) : false : true;\n };\n});\n","// 19.1.2.11 Object.isExtensible(O)\nvar isObject = require('./_is-object');\n\nrequire('./_object-sap')('isExtensible', function ($isExtensible) {\n return function isExtensible(it) {\n return isObject(it) ? $isExtensible ? $isExtensible(it) : true : false;\n };\n});\n","// 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)\nvar toIObject = require('./_to-iobject');\nvar $getOwnPropertyDescriptor = require('./_object-gopd').f;\n\nrequire('./_object-sap')('getOwnPropertyDescriptor', function () {\n return function getOwnPropertyDescriptor(it, key) {\n return $getOwnPropertyDescriptor(toIObject(it), key);\n };\n});\n","// 19.1.2.9 Object.getPrototypeOf(O)\nvar toObject = require('./_to-object');\nvar $getPrototypeOf = require('./_object-gpo');\n\nrequire('./_object-sap')('getPrototypeOf', function () {\n return function getPrototypeOf(it) {\n return $getPrototypeOf(toObject(it));\n };\n});\n","// 19.1.2.14 Object.keys(O)\nvar toObject = require('./_to-object');\nvar $keys = require('./_object-keys');\n\nrequire('./_object-sap')('keys', function () {\n return function keys(it) {\n return $keys(toObject(it));\n };\n});\n","// 19.1.2.7 Object.getOwnPropertyNames(O)\nrequire('./_object-sap')('getOwnPropertyNames', function () {\n return require('./_object-gopn-ext').f;\n});\n","// 19.1.3.1 Object.assign(target, source)\nvar $export = require('./_export');\n\n$export($export.S + $export.F, 'Object', { assign: require('./_object-assign') });\n","// 7.2.9 SameValue(x, y)\nmodule.exports = Object.is || function is(x, y) {\n // eslint-disable-next-line no-self-compare\n return x === y ? x !== 0 || 1 / x === 1 / y : x != x && y != y;\n};\n","// 19.1.3.10 Object.is(value1, value2)\nvar $export = require('./_export');\n$export($export.S, 'Object', { is: require('./_same-value') });\n","var dP = require('./_object-dp').f;\nvar FProto = Function.prototype;\nvar nameRE = /^\\s*function ([^ (]*)/;\nvar NAME = 'name';\n\n// 19.2.4.2 name\nNAME in FProto || require('./_descriptors') && dP(FProto, NAME, {\n configurable: true,\n get: function () {\n try {\n return ('' + this).match(nameRE)[1];\n } catch (e) {\n return '';\n }\n }\n});\n","var $export = require('./_export');\nvar toIObject = require('./_to-iobject');\nvar toLength = require('./_to-length');\n\n$export($export.S, 'String', {\n // 21.1.2.4 String.raw(callSite, ...substitutions)\n raw: function raw(callSite) {\n var tpl = toIObject(callSite.raw);\n var len = toLength(tpl.length);\n var aLen = arguments.length;\n var res = [];\n var i = 0;\n while (len > i) {\n res.push(String(tpl[i++]));\n if (i < aLen) res.push(String(arguments[i]));\n } return res.join('');\n }\n});\n","var $export = require('./_export');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nvar fromCharCode = String.fromCharCode;\nvar $fromCodePoint = String.fromCodePoint;\n\n// length should be 1, old FF problem\n$export($export.S + $export.F * (!!$fromCodePoint && $fromCodePoint.length != 1), 'String', {\n // 21.1.2.2 String.fromCodePoint(...codePoints)\n fromCodePoint: function fromCodePoint(x) { // eslint-disable-line no-unused-vars\n var res = [];\n var aLen = arguments.length;\n var i = 0;\n var code;\n while (aLen > i) {\n code = +arguments[i++];\n if (toAbsoluteIndex(code, 0x10ffff) !== code) throw RangeError(code + ' is not a valid code point');\n res.push(code < 0x10000\n ? fromCharCode(code)\n : fromCharCode(((code -= 0x10000) >> 10) + 0xd800, code % 0x400 + 0xdc00)\n );\n } return res.join('');\n }\n});\n","var toInteger = require('./_to-integer');\nvar defined = require('./_defined');\n// true -> String#at\n// false -> String#codePointAt\nmodule.exports = function (TO_STRING) {\n return function (that, pos) {\n var s = String(defined(that));\n var i = toInteger(pos);\n var l = s.length;\n var a, b;\n if (i < 0 || i >= l) return TO_STRING ? '' : undefined;\n a = s.charCodeAt(i);\n return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff\n ? TO_STRING ? s.charAt(i) : a\n : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;\n };\n};\n","'use strict';\nvar $export = require('./_export');\nvar $at = require('./_string-at')(false);\n$export($export.P, 'String', {\n // 21.1.3.3 String.prototype.codePointAt(pos)\n codePointAt: function codePointAt(pos) {\n return $at(this, pos);\n }\n});\n","'use strict';\nvar toInteger = require('./_to-integer');\nvar defined = require('./_defined');\n\nmodule.exports = function repeat(count) {\n var str = String(defined(this));\n var res = '';\n var n = toInteger(count);\n if (n < 0 || n == Infinity) throw RangeError(\"Count can't be negative\");\n for (;n > 0; (n >>>= 1) && (str += str)) if (n & 1) res += str;\n return res;\n};\n","var $export = require('./_export');\n\n$export($export.P, 'String', {\n // 21.1.3.13 String.prototype.repeat(count)\n repeat: require('./_string-repeat')\n});\n","// 7.2.8 IsRegExp(argument)\nvar isObject = require('./_is-object');\nvar cof = require('./_cof');\nvar MATCH = require('./_wks')('match');\nmodule.exports = function (it) {\n var isRegExp;\n return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : cof(it) == 'RegExp');\n};\n","// helper for String#{startsWith, endsWith, includes}\nvar isRegExp = require('./_is-regexp');\nvar defined = require('./_defined');\n\nmodule.exports = function (that, searchString, NAME) {\n if (isRegExp(searchString)) throw TypeError('String#' + NAME + \" doesn't accept regex!\");\n return String(defined(that));\n};\n","var MATCH = require('./_wks')('match');\nmodule.exports = function (KEY) {\n var re = /./;\n try {\n '/./'[KEY](re);\n } catch (e) {\n try {\n re[MATCH] = false;\n return !'/./'[KEY](re);\n } catch (f) { /* empty */ }\n } return true;\n};\n","// 21.1.3.18 String.prototype.startsWith(searchString [, position ])\n'use strict';\nvar $export = require('./_export');\nvar toLength = require('./_to-length');\nvar context = require('./_string-context');\nvar STARTS_WITH = 'startsWith';\nvar $startsWith = ''[STARTS_WITH];\n\n$export($export.P + $export.F * require('./_fails-is-regexp')(STARTS_WITH), 'String', {\n startsWith: function startsWith(searchString /* , position = 0 */) {\n var that = context(this, searchString, STARTS_WITH);\n var index = toLength(Math.min(arguments.length > 1 ? arguments[1] : undefined, that.length));\n var search = String(searchString);\n return $startsWith\n ? $startsWith.call(that, search, index)\n : that.slice(index, index + search.length) === search;\n }\n});\n","// 21.1.3.6 String.prototype.endsWith(searchString [, endPosition])\n'use strict';\nvar $export = require('./_export');\nvar toLength = require('./_to-length');\nvar context = require('./_string-context');\nvar ENDS_WITH = 'endsWith';\nvar $endsWith = ''[ENDS_WITH];\n\n$export($export.P + $export.F * require('./_fails-is-regexp')(ENDS_WITH), 'String', {\n endsWith: function endsWith(searchString /* , endPosition = @length */) {\n var that = context(this, searchString, ENDS_WITH);\n var endPosition = arguments.length > 1 ? arguments[1] : undefined;\n var len = toLength(that.length);\n var end = endPosition === undefined ? len : Math.min(toLength(endPosition), len);\n var search = String(searchString);\n return $endsWith\n ? $endsWith.call(that, search, end)\n : that.slice(end - search.length, end) === search;\n }\n});\n","// 21.1.3.7 String.prototype.includes(searchString, position = 0)\n'use strict';\nvar $export = require('./_export');\nvar context = require('./_string-context');\nvar INCLUDES = 'includes';\n\n$export($export.P + $export.F * require('./_fails-is-regexp')(INCLUDES), 'String', {\n includes: function includes(searchString /* , position = 0 */) {\n return !!~context(this, searchString, INCLUDES)\n .indexOf(searchString, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","'use strict';\n// 21.2.5.3 get RegExp.prototype.flags\nvar anObject = require('./_an-object');\nmodule.exports = function () {\n var that = anObject(this);\n var result = '';\n if (that.global) result += 'g';\n if (that.ignoreCase) result += 'i';\n if (that.multiline) result += 'm';\n if (that.unicode) result += 'u';\n if (that.sticky) result += 'y';\n return result;\n};\n","// 21.2.5.3 get RegExp.prototype.flags()\nif (require('./_descriptors') && /./g.flags != 'g') require('./_object-dp').f(RegExp.prototype, 'flags', {\n configurable: true,\n get: require('./_flags')\n});\n","'use strict';\nvar hide = require('./_hide');\nvar redefine = require('./_redefine');\nvar fails = require('./_fails');\nvar defined = require('./_defined');\nvar wks = require('./_wks');\n\nmodule.exports = function (KEY, length, exec) {\n var SYMBOL = wks(KEY);\n var fns = exec(defined, SYMBOL, ''[KEY]);\n var strfn = fns[0];\n var rxfn = fns[1];\n if (fails(function () {\n var O = {};\n O[SYMBOL] = function () { return 7; };\n return ''[KEY](O) != 7;\n })) {\n redefine(String.prototype, KEY, strfn);\n hide(RegExp.prototype, SYMBOL, length == 2\n // 21.2.5.8 RegExp.prototype[@@replace](string, replaceValue)\n // 21.2.5.11 RegExp.prototype[@@split](string, limit)\n ? function (string, arg) { return rxfn.call(string, this, arg); }\n // 21.2.5.6 RegExp.prototype[@@match](string)\n // 21.2.5.9 RegExp.prototype[@@search](string)\n : function (string) { return rxfn.call(string, this); }\n );\n }\n};\n","// @@match logic\nrequire('./_fix-re-wks')('match', 1, function (defined, MATCH, $match) {\n // 21.1.3.11 String.prototype.match(regexp)\n return [function match(regexp) {\n 'use strict';\n var O = defined(this);\n var fn = regexp == undefined ? undefined : regexp[MATCH];\n return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[MATCH](String(O));\n }, $match];\n});\n","// @@replace logic\nrequire('./_fix-re-wks')('replace', 2, function (defined, REPLACE, $replace) {\n // 21.1.3.14 String.prototype.replace(searchValue, replaceValue)\n return [function replace(searchValue, replaceValue) {\n 'use strict';\n var O = defined(this);\n var fn = searchValue == undefined ? undefined : searchValue[REPLACE];\n return fn !== undefined\n ? fn.call(searchValue, O, replaceValue)\n : $replace.call(String(O), searchValue, replaceValue);\n }, $replace];\n});\n","// @@split logic\nrequire('./_fix-re-wks')('split', 2, function (defined, SPLIT, $split) {\n 'use strict';\n var isRegExp = require('./_is-regexp');\n var _split = $split;\n var $push = [].push;\n var $SPLIT = 'split';\n var LENGTH = 'length';\n var LAST_INDEX = 'lastIndex';\n if (\n 'abbc'[$SPLIT](/(b)*/)[1] == 'c' ||\n 'test'[$SPLIT](/(?:)/, -1)[LENGTH] != 4 ||\n 'ab'[$SPLIT](/(?:ab)*/)[LENGTH] != 2 ||\n '.'[$SPLIT](/(.?)(.?)/)[LENGTH] != 4 ||\n '.'[$SPLIT](/()()/)[LENGTH] > 1 ||\n ''[$SPLIT](/.?/)[LENGTH]\n ) {\n var NPCG = /()??/.exec('')[1] === undefined; // nonparticipating capturing group\n // based on es5-shim implementation, need to rework it\n $split = function (separator, limit) {\n var string = String(this);\n if (separator === undefined && limit === 0) return [];\n // If `separator` is not a regex, use native split\n if (!isRegExp(separator)) return _split.call(string, separator, limit);\n var output = [];\n var flags = (separator.ignoreCase ? 'i' : '') +\n (separator.multiline ? 'm' : '') +\n (separator.unicode ? 'u' : '') +\n (separator.sticky ? 'y' : '');\n var lastLastIndex = 0;\n var splitLimit = limit === undefined ? 4294967295 : limit >>> 0;\n // Make `global` and avoid `lastIndex` issues by working with a copy\n var separatorCopy = new RegExp(separator.source, flags + 'g');\n var separator2, match, lastIndex, lastLength, i;\n // Doesn't need flags gy, but they don't hurt\n if (!NPCG) separator2 = new RegExp('^' + separatorCopy.source + '$(?!\\\\s)', flags);\n while (match = separatorCopy.exec(string)) {\n // `separatorCopy.lastIndex` is not reliable cross-browser\n lastIndex = match.index + match[0][LENGTH];\n if (lastIndex > lastLastIndex) {\n output.push(string.slice(lastLastIndex, match.index));\n // Fix browsers whose `exec` methods don't consistently return `undefined` for NPCG\n // eslint-disable-next-line no-loop-func\n if (!NPCG && match[LENGTH] > 1) match[0].replace(separator2, function () {\n for (i = 1; i < arguments[LENGTH] - 2; i++) if (arguments[i] === undefined) match[i] = undefined;\n });\n if (match[LENGTH] > 1 && match.index < string[LENGTH]) $push.apply(output, match.slice(1));\n lastLength = match[0][LENGTH];\n lastLastIndex = lastIndex;\n if (output[LENGTH] >= splitLimit) break;\n }\n if (separatorCopy[LAST_INDEX] === match.index) separatorCopy[LAST_INDEX]++; // Avoid an infinite loop\n }\n if (lastLastIndex === string[LENGTH]) {\n if (lastLength || !separatorCopy.test('')) output.push('');\n } else output.push(string.slice(lastLastIndex));\n return output[LENGTH] > splitLimit ? output.slice(0, splitLimit) : output;\n };\n // Chakra, V8\n } else if ('0'[$SPLIT](undefined, 0)[LENGTH]) {\n $split = function (separator, limit) {\n return separator === undefined && limit === 0 ? [] : _split.call(this, separator, limit);\n };\n }\n // 21.1.3.17 String.prototype.split(separator, limit)\n return [function split(separator, limit) {\n var O = defined(this);\n var fn = separator == undefined ? undefined : separator[SPLIT];\n return fn !== undefined ? fn.call(separator, O, limit) : $split.call(String(O), separator, limit);\n }, $split];\n});\n","// @@search logic\nrequire('./_fix-re-wks')('search', 1, function (defined, SEARCH, $search) {\n // 21.1.3.15 String.prototype.search(regexp)\n return [function search(regexp) {\n 'use strict';\n var O = defined(this);\n var fn = regexp == undefined ? undefined : regexp[SEARCH];\n return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[SEARCH](String(O));\n }, $search];\n});\n","'use strict';\nvar $defineProperty = require('./_object-dp');\nvar createDesc = require('./_property-desc');\n\nmodule.exports = function (object, index, value) {\n if (index in object) $defineProperty.f(object, index, createDesc(0, value));\n else object[index] = value;\n};\n","'use strict';\nvar ctx = require('./_ctx');\nvar $export = require('./_export');\nvar toObject = require('./_to-object');\nvar call = require('./_iter-call');\nvar isArrayIter = require('./_is-array-iter');\nvar toLength = require('./_to-length');\nvar createProperty = require('./_create-property');\nvar getIterFn = require('./core.get-iterator-method');\n\n$export($export.S + $export.F * !require('./_iter-detect')(function (iter) { Array.from(iter); }), 'Array', {\n // 22.1.2.1 Array.from(arrayLike, mapfn = undefined, thisArg = undefined)\n from: function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {\n var O = toObject(arrayLike);\n var C = typeof this == 'function' ? this : Array;\n var aLen = arguments.length;\n var mapfn = aLen > 1 ? arguments[1] : undefined;\n var mapping = mapfn !== undefined;\n var index = 0;\n var iterFn = getIterFn(O);\n var length, result, step, iterator;\n if (mapping) mapfn = ctx(mapfn, aLen > 2 ? arguments[2] : undefined, 2);\n // if object isn't iterable or it's array with default iterator - use simple case\n if (iterFn != undefined && !(C == Array && isArrayIter(iterFn))) {\n for (iterator = iterFn.call(O), result = new C(); !(step = iterator.next()).done; index++) {\n createProperty(result, index, mapping ? call(iterator, mapfn, [step.value, index], true) : step.value);\n }\n } else {\n length = toLength(O.length);\n for (result = new C(length); length > index; index++) {\n createProperty(result, index, mapping ? mapfn(O[index], index) : O[index]);\n }\n }\n result.length = index;\n return result;\n }\n});\n","'use strict';\nvar $export = require('./_export');\nvar createProperty = require('./_create-property');\n\n// WebKit Array.of isn't generic\n$export($export.S + $export.F * require('./_fails')(function () {\n function F() { /* empty */ }\n return !(Array.of.call(F) instanceof F);\n}), 'Array', {\n // 22.1.2.3 Array.of( ...items)\n of: function of(/* ...args */) {\n var index = 0;\n var aLen = arguments.length;\n var result = new (typeof this == 'function' ? this : Array)(aLen);\n while (aLen > index) createProperty(result, index, arguments[index++]);\n result.length = aLen;\n return result;\n }\n});\n","// 22.1.3.3 Array.prototype.copyWithin(target, start, end = this.length)\nvar $export = require('./_export');\n\n$export($export.P, 'Array', { copyWithin: require('./_array-copy-within') });\n\nrequire('./_add-to-unscopables')('copyWithin');\n","'use strict';\n// 22.1.3.8 Array.prototype.find(predicate, thisArg = undefined)\nvar $export = require('./_export');\nvar $find = require('./_array-methods')(5);\nvar KEY = 'find';\nvar forced = true;\n// Shouldn't skip holes\nif (KEY in []) Array(1)[KEY](function () { forced = false; });\n$export($export.P + $export.F * forced, 'Array', {\n find: function find(callbackfn /* , that = undefined */) {\n return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\nrequire('./_add-to-unscopables')(KEY);\n","'use strict';\n// 22.1.3.9 Array.prototype.findIndex(predicate, thisArg = undefined)\nvar $export = require('./_export');\nvar $find = require('./_array-methods')(6);\nvar KEY = 'findIndex';\nvar forced = true;\n// Shouldn't skip holes\nif (KEY in []) Array(1)[KEY](function () { forced = false; });\n$export($export.P + $export.F * forced, 'Array', {\n findIndex: function findIndex(callbackfn /* , that = undefined */) {\n return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\nrequire('./_add-to-unscopables')(KEY);\n","// 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length)\nvar $export = require('./_export');\n\n$export($export.P, 'Array', { fill: require('./_array-fill') });\n\nrequire('./_add-to-unscopables')('fill');\n","// 20.1.2.2 Number.isFinite(number)\nvar $export = require('./_export');\nvar _isFinite = require('./_global').isFinite;\n\n$export($export.S, 'Number', {\n isFinite: function isFinite(it) {\n return typeof it == 'number' && _isFinite(it);\n }\n});\n","// 20.1.2.3 Number.isInteger(number)\nvar isObject = require('./_is-object');\nvar floor = Math.floor;\nmodule.exports = function isInteger(it) {\n return !isObject(it) && isFinite(it) && floor(it) === it;\n};\n","// 20.1.2.3 Number.isInteger(number)\nvar $export = require('./_export');\n\n$export($export.S, 'Number', { isInteger: require('./_is-integer') });\n","// 20.1.2.5 Number.isSafeInteger(number)\nvar $export = require('./_export');\nvar isInteger = require('./_is-integer');\nvar abs = Math.abs;\n\n$export($export.S, 'Number', {\n isSafeInteger: function isSafeInteger(number) {\n return isInteger(number) && abs(number) <= 0x1fffffffffffff;\n }\n});\n","// 20.1.2.4 Number.isNaN(number)\nvar $export = require('./_export');\n\n$export($export.S, 'Number', {\n isNaN: function isNaN(number) {\n // eslint-disable-next-line no-self-compare\n return number != number;\n }\n});\n","// 20.1.2.1 Number.EPSILON\nvar $export = require('./_export');\n\n$export($export.S, 'Number', { EPSILON: Math.pow(2, -52) });\n","// 20.1.2.10 Number.MIN_SAFE_INTEGER\nvar $export = require('./_export');\n\n$export($export.S, 'Number', { MIN_SAFE_INTEGER: -0x1fffffffffffff });\n","// 20.1.2.6 Number.MAX_SAFE_INTEGER\nvar $export = require('./_export');\n\n$export($export.S, 'Number', { MAX_SAFE_INTEGER: 0x1fffffffffffff });\n","// 20.2.2.20 Math.log1p(x)\nmodule.exports = Math.log1p || function log1p(x) {\n return (x = +x) > -1e-8 && x < 1e-8 ? x - x * x / 2 : Math.log(1 + x);\n};\n","// 20.2.2.3 Math.acosh(x)\nvar $export = require('./_export');\nvar log1p = require('./_math-log1p');\nvar sqrt = Math.sqrt;\nvar $acosh = Math.acosh;\n\n$export($export.S + $export.F * !($acosh\n // V8 bug: https://code.google.com/p/v8/issues/detail?id=3509\n && Math.floor($acosh(Number.MAX_VALUE)) == 710\n // Tor Browser bug: Math.acosh(Infinity) -> NaN\n && $acosh(Infinity) == Infinity\n), 'Math', {\n acosh: function acosh(x) {\n return (x = +x) < 1 ? NaN : x > 94906265.62425156\n ? Math.log(x) + Math.LN2\n : log1p(x - 1 + sqrt(x - 1) * sqrt(x + 1));\n }\n});\n","// 20.2.2.5 Math.asinh(x)\nvar $export = require('./_export');\nvar $asinh = Math.asinh;\n\nfunction asinh(x) {\n return !isFinite(x = +x) || x == 0 ? x : x < 0 ? -asinh(-x) : Math.log(x + Math.sqrt(x * x + 1));\n}\n\n// Tor Browser bug: Math.asinh(0) -> -0\n$export($export.S + $export.F * !($asinh && 1 / $asinh(0) > 0), 'Math', { asinh: asinh });\n","// 20.2.2.7 Math.atanh(x)\nvar $export = require('./_export');\nvar $atanh = Math.atanh;\n\n// Tor Browser bug: Math.atanh(-0) -> 0\n$export($export.S + $export.F * !($atanh && 1 / $atanh(-0) < 0), 'Math', {\n atanh: function atanh(x) {\n return (x = +x) == 0 ? x : Math.log((1 + x) / (1 - x)) / 2;\n }\n});\n","// 20.2.2.28 Math.sign(x)\nmodule.exports = Math.sign || function sign(x) {\n // eslint-disable-next-line no-self-compare\n return (x = +x) == 0 || x != x ? x : x < 0 ? -1 : 1;\n};\n","// 20.2.2.9 Math.cbrt(x)\nvar $export = require('./_export');\nvar sign = require('./_math-sign');\n\n$export($export.S, 'Math', {\n cbrt: function cbrt(x) {\n return sign(x = +x) * Math.pow(Math.abs(x), 1 / 3);\n }\n});\n","// 20.2.2.11 Math.clz32(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n clz32: function clz32(x) {\n return (x >>>= 0) ? 31 - Math.floor(Math.log(x + 0.5) * Math.LOG2E) : 32;\n }\n});\n","// 20.2.2.12 Math.cosh(x)\nvar $export = require('./_export');\nvar exp = Math.exp;\n\n$export($export.S, 'Math', {\n cosh: function cosh(x) {\n return (exp(x = +x) + exp(-x)) / 2;\n }\n});\n","// 20.2.2.14 Math.expm1(x)\nvar $expm1 = Math.expm1;\nmodule.exports = (!$expm1\n // Old FF bug\n || $expm1(10) > 22025.465794806719 || $expm1(10) < 22025.4657948067165168\n // Tor Browser bug\n || $expm1(-2e-17) != -2e-17\n) ? function expm1(x) {\n return (x = +x) == 0 ? x : x > -1e-6 && x < 1e-6 ? x + x * x / 2 : Math.exp(x) - 1;\n} : $expm1;\n","// 20.2.2.14 Math.expm1(x)\nvar $export = require('./_export');\nvar $expm1 = require('./_math-expm1');\n\n$export($export.S + $export.F * ($expm1 != Math.expm1), 'Math', { expm1: $expm1 });\n","// 20.2.2.16 Math.fround(x)\nvar sign = require('./_math-sign');\nvar pow = Math.pow;\nvar EPSILON = pow(2, -52);\nvar EPSILON32 = pow(2, -23);\nvar MAX32 = pow(2, 127) * (2 - EPSILON32);\nvar MIN32 = pow(2, -126);\n\nvar roundTiesToEven = function (n) {\n return n + 1 / EPSILON - 1 / EPSILON;\n};\n\nmodule.exports = Math.fround || function fround(x) {\n var $abs = Math.abs(x);\n var $sign = sign(x);\n var a, result;\n if ($abs < MIN32) return $sign * roundTiesToEven($abs / MIN32 / EPSILON32) * MIN32 * EPSILON32;\n a = (1 + EPSILON32 / EPSILON) * $abs;\n result = a - (a - $abs);\n // eslint-disable-next-line no-self-compare\n if (result > MAX32 || result != result) return $sign * Infinity;\n return $sign * result;\n};\n","// 20.2.2.16 Math.fround(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', { fround: require('./_math-fround') });\n","// 20.2.2.17 Math.hypot([value1[, value2[, … ]]])\nvar $export = require('./_export');\nvar abs = Math.abs;\n\n$export($export.S, 'Math', {\n hypot: function hypot(value1, value2) { // eslint-disable-line no-unused-vars\n var sum = 0;\n var i = 0;\n var aLen = arguments.length;\n var larg = 0;\n var arg, div;\n while (i < aLen) {\n arg = abs(arguments[i++]);\n if (larg < arg) {\n div = larg / arg;\n sum = sum * div * div + 1;\n larg = arg;\n } else if (arg > 0) {\n div = arg / larg;\n sum += div * div;\n } else sum += arg;\n }\n return larg === Infinity ? Infinity : larg * Math.sqrt(sum);\n }\n});\n","// 20.2.2.18 Math.imul(x, y)\nvar $export = require('./_export');\nvar $imul = Math.imul;\n\n// some WebKit versions fails with big numbers, some has wrong arity\n$export($export.S + $export.F * require('./_fails')(function () {\n return $imul(0xffffffff, 5) != -5 || $imul.length != 2;\n}), 'Math', {\n imul: function imul(x, y) {\n var UINT16 = 0xffff;\n var xn = +x;\n var yn = +y;\n var xl = UINT16 & xn;\n var yl = UINT16 & yn;\n return 0 | xl * yl + ((UINT16 & xn >>> 16) * yl + xl * (UINT16 & yn >>> 16) << 16 >>> 0);\n }\n});\n","// 20.2.2.20 Math.log1p(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', { log1p: require('./_math-log1p') });\n","// 20.2.2.21 Math.log10(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n log10: function log10(x) {\n return Math.log(x) * Math.LOG10E;\n }\n});\n","// 20.2.2.22 Math.log2(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n log2: function log2(x) {\n return Math.log(x) / Math.LN2;\n }\n});\n","// 20.2.2.28 Math.sign(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', { sign: require('./_math-sign') });\n","// 20.2.2.30 Math.sinh(x)\nvar $export = require('./_export');\nvar expm1 = require('./_math-expm1');\nvar exp = Math.exp;\n\n// V8 near Chromium 38 has a problem with very small numbers\n$export($export.S + $export.F * require('./_fails')(function () {\n return !Math.sinh(-2e-17) != -2e-17;\n}), 'Math', {\n sinh: function sinh(x) {\n return Math.abs(x = +x) < 1\n ? (expm1(x) - expm1(-x)) / 2\n : (exp(x - 1) - exp(-x - 1)) * (Math.E / 2);\n }\n});\n","// 20.2.2.33 Math.tanh(x)\nvar $export = require('./_export');\nvar expm1 = require('./_math-expm1');\nvar exp = Math.exp;\n\n$export($export.S, 'Math', {\n tanh: function tanh(x) {\n var a = expm1(x = +x);\n var b = expm1(-x);\n return a == Infinity ? 1 : b == Infinity ? -1 : (a - b) / (exp(x) + exp(-x));\n }\n});\n","// 20.2.2.34 Math.trunc(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n trunc: function trunc(it) {\n return (it > 0 ? Math.floor : Math.ceil)(it);\n }\n});\n","'use strict';\n// https://github.com/tc39/Array.prototype.includes\nvar $export = require('./_export');\nvar $includes = require('./_array-includes')(true);\n\n$export($export.P, 'Array', {\n includes: function includes(el /* , fromIndex = 0 */) {\n return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\nrequire('./_add-to-unscopables')('includes');\n","var getKeys = require('./_object-keys');\nvar toIObject = require('./_to-iobject');\nvar isEnum = require('./_object-pie').f;\nmodule.exports = function (isEntries) {\n return function (it) {\n var O = toIObject(it);\n var keys = getKeys(O);\n var length = keys.length;\n var i = 0;\n var result = [];\n var key;\n while (length > i) if (isEnum.call(O, key = keys[i++])) {\n result.push(isEntries ? [key, O[key]] : O[key]);\n } return result;\n };\n};\n","// https://github.com/tc39/proposal-object-values-entries\nvar $export = require('./_export');\nvar $values = require('./_object-to-array')(false);\n\n$export($export.S, 'Object', {\n values: function values(it) {\n return $values(it);\n }\n});\n","// https://github.com/tc39/proposal-object-values-entries\nvar $export = require('./_export');\nvar $entries = require('./_object-to-array')(true);\n\n$export($export.S, 'Object', {\n entries: function entries(it) {\n return $entries(it);\n }\n});\n","// https://github.com/tc39/proposal-object-getownpropertydescriptors\nvar $export = require('./_export');\nvar ownKeys = require('./_own-keys');\nvar toIObject = require('./_to-iobject');\nvar gOPD = require('./_object-gopd');\nvar createProperty = require('./_create-property');\n\n$export($export.S, 'Object', {\n getOwnPropertyDescriptors: function getOwnPropertyDescriptors(object) {\n var O = toIObject(object);\n var getDesc = gOPD.f;\n var keys = ownKeys(O);\n var result = {};\n var i = 0;\n var key, desc;\n while (keys.length > i) {\n desc = getDesc(O, key = keys[i++]);\n if (desc !== undefined) createProperty(result, key, desc);\n }\n return result;\n }\n});\n","// https://github.com/tc39/proposal-string-pad-start-end\nvar toLength = require('./_to-length');\nvar repeat = require('./_string-repeat');\nvar defined = require('./_defined');\n\nmodule.exports = function (that, maxLength, fillString, left) {\n var S = String(defined(that));\n var stringLength = S.length;\n var fillStr = fillString === undefined ? ' ' : String(fillString);\n var intMaxLength = toLength(maxLength);\n if (intMaxLength <= stringLength || fillStr == '') return S;\n var fillLen = intMaxLength - stringLength;\n var stringFiller = repeat.call(fillStr, Math.ceil(fillLen / fillStr.length));\n if (stringFiller.length > fillLen) stringFiller = stringFiller.slice(0, fillLen);\n return left ? stringFiller + S : S + stringFiller;\n};\n","var global = require('./_global');\nvar navigator = global.navigator;\n\nmodule.exports = navigator && navigator.userAgent || '';\n","'use strict';\n// https://github.com/tc39/proposal-string-pad-start-end\nvar $export = require('./_export');\nvar $pad = require('./_string-pad');\nvar userAgent = require('./_user-agent');\n\n// https://github.com/zloirock/core-js/issues/280\n$export($export.P + $export.F * /Version\\/10\\.\\d+(\\.\\d+)? Safari\\//.test(userAgent), 'String', {\n padStart: function padStart(maxLength /* , fillString = ' ' */) {\n return $pad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, true);\n }\n});\n","'use strict';\n// https://github.com/tc39/proposal-string-pad-start-end\nvar $export = require('./_export');\nvar $pad = require('./_string-pad');\nvar userAgent = require('./_user-agent');\n\n// https://github.com/zloirock/core-js/issues/280\n$export($export.P + $export.F * /Version\\/10\\.\\d+(\\.\\d+)? Safari\\//.test(userAgent), 'String', {\n padEnd: function padEnd(maxLength /* , fillString = ' ' */) {\n return $pad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, false);\n }\n});\n","// ie9- setTimeout & setInterval additional parameters fix\nvar global = require('./_global');\nvar $export = require('./_export');\nvar userAgent = require('./_user-agent');\nvar slice = [].slice;\nvar MSIE = /MSIE .\\./.test(userAgent); // <- dirty ie9- check\nvar wrap = function (set) {\n return function (fn, time /* , ...args */) {\n var boundArgs = arguments.length > 2;\n var args = boundArgs ? slice.call(arguments, 2) : false;\n return set(boundArgs ? function () {\n // eslint-disable-next-line no-new-func\n (typeof fn == 'function' ? fn : Function(fn)).apply(this, args);\n } : fn, time);\n };\n};\n$export($export.G + $export.B + $export.F * MSIE, {\n setTimeout: wrap(global.setTimeout),\n setInterval: wrap(global.setInterval)\n});\n","var $export = require('./_export');\nvar $task = require('./_task');\n$export($export.G + $export.B, {\n setImmediate: $task.set,\n clearImmediate: $task.clear\n});\n","var $iterators = require('./es6.array.iterator');\nvar getKeys = require('./_object-keys');\nvar redefine = require('./_redefine');\nvar global = require('./_global');\nvar hide = require('./_hide');\nvar Iterators = require('./_iterators');\nvar wks = require('./_wks');\nvar ITERATOR = wks('iterator');\nvar TO_STRING_TAG = wks('toStringTag');\nvar ArrayValues = Iterators.Array;\n\nvar DOMIterables = {\n CSSRuleList: true, // TODO: Not spec compliant, should be false.\n CSSStyleDeclaration: false,\n CSSValueList: false,\n ClientRectList: false,\n DOMRectList: false,\n DOMStringList: false,\n DOMTokenList: true,\n DataTransferItemList: false,\n FileList: false,\n HTMLAllCollection: false,\n HTMLCollection: false,\n HTMLFormElement: false,\n HTMLSelectElement: false,\n MediaList: true, // TODO: Not spec compliant, should be false.\n MimeTypeArray: false,\n NamedNodeMap: false,\n NodeList: true,\n PaintRequestList: false,\n Plugin: false,\n PluginArray: false,\n SVGLengthList: false,\n SVGNumberList: false,\n SVGPathSegList: false,\n SVGPointList: false,\n SVGStringList: false,\n SVGTransformList: false,\n SourceBufferList: false,\n StyleSheetList: true, // TODO: Not spec compliant, should be false.\n TextTrackCueList: false,\n TextTrackList: false,\n TouchList: false\n};\n\nfor (var collections = getKeys(DOMIterables), i = 0; i < collections.length; i++) {\n var NAME = collections[i];\n var explicit = DOMIterables[NAME];\n var Collection = global[NAME];\n var proto = Collection && Collection.prototype;\n var key;\n if (proto) {\n if (!proto[ITERATOR]) hide(proto, ITERATOR, ArrayValues);\n if (!proto[TO_STRING_TAG]) hide(proto, TO_STRING_TAG, NAME);\n Iterators[NAME] = ArrayValues;\n if (explicit) for (key in $iterators) if (!proto[key]) redefine(proto, key, $iterators[key], true);\n }\n}\n","/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * https://raw.github.com/facebook/regenerator/master/LICENSE file. An\n * additional grant of patent rights can be found in the PATENTS file in\n * the same directory.\n */\n\n!(function(global) {\n \"use strict\";\n\n var Op = Object.prototype;\n var hasOwn = Op.hasOwnProperty;\n var undefined; // More compressible than void 0.\n var $Symbol = typeof Symbol === \"function\" ? Symbol : {};\n var iteratorSymbol = $Symbol.iterator || \"@@iterator\";\n var asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\";\n var toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n\n var inModule = typeof module === \"object\";\n var runtime = global.regeneratorRuntime;\n if (runtime) {\n if (inModule) {\n // If regeneratorRuntime is defined globally and we're in a module,\n // make the exports object identical to regeneratorRuntime.\n module.exports = runtime;\n }\n // Don't bother evaluating the rest of this file if the runtime was\n // already defined globally.\n return;\n }\n\n // Define the runtime globally (as expected by generated code) as either\n // module.exports (if we're in a module) or a new, empty object.\n runtime = global.regeneratorRuntime = inModule ? module.exports : {};\n\n function wrap(innerFn, outerFn, self, tryLocsList) {\n // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.\n var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;\n var generator = Object.create(protoGenerator.prototype);\n var context = new Context(tryLocsList || []);\n\n // The ._invoke method unifies the implementations of the .next,\n // .throw, and .return methods.\n generator._invoke = makeInvokeMethod(innerFn, self, context);\n\n return generator;\n }\n runtime.wrap = wrap;\n\n // Try/catch helper to minimize deoptimizations. Returns a completion\n // record like context.tryEntries[i].completion. This interface could\n // have been (and was previously) designed to take a closure to be\n // invoked without arguments, but in all the cases we care about we\n // already have an existing method we want to call, so there's no need\n // to create a new function object. We can even get away with assuming\n // the method takes exactly one argument, since that happens to be true\n // in every case, so we don't have to touch the arguments object. The\n // only additional allocation required is the completion record, which\n // has a stable shape and so hopefully should be cheap to allocate.\n function tryCatch(fn, obj, arg) {\n try {\n return { type: \"normal\", arg: fn.call(obj, arg) };\n } catch (err) {\n return { type: \"throw\", arg: err };\n }\n }\n\n var GenStateSuspendedStart = \"suspendedStart\";\n var GenStateSuspendedYield = \"suspendedYield\";\n var GenStateExecuting = \"executing\";\n var GenStateCompleted = \"completed\";\n\n // Returning this object from the innerFn has the same effect as\n // breaking out of the dispatch switch statement.\n var ContinueSentinel = {};\n\n // Dummy constructor functions that we use as the .constructor and\n // .constructor.prototype properties for functions that return Generator\n // objects. For full spec compliance, you may wish to configure your\n // minifier not to mangle the names of these two functions.\n function Generator() {}\n function GeneratorFunction() {}\n function GeneratorFunctionPrototype() {}\n\n // This is a polyfill for %IteratorPrototype% for environments that\n // don't natively support it.\n var IteratorPrototype = {};\n IteratorPrototype[iteratorSymbol] = function () {\n return this;\n };\n\n var getProto = Object.getPrototypeOf;\n var NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n if (NativeIteratorPrototype &&\n NativeIteratorPrototype !== Op &&\n hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {\n // This environment has a native %IteratorPrototype%; use it instead\n // of the polyfill.\n IteratorPrototype = NativeIteratorPrototype;\n }\n\n var Gp = GeneratorFunctionPrototype.prototype =\n Generator.prototype = Object.create(IteratorPrototype);\n GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;\n GeneratorFunctionPrototype.constructor = GeneratorFunction;\n GeneratorFunctionPrototype[toStringTagSymbol] =\n GeneratorFunction.displayName = \"GeneratorFunction\";\n\n // Helper for defining the .next, .throw, and .return methods of the\n // Iterator interface in terms of a single ._invoke method.\n function defineIteratorMethods(prototype) {\n [\"next\", \"throw\", \"return\"].forEach(function(method) {\n prototype[method] = function(arg) {\n return this._invoke(method, arg);\n };\n });\n }\n\n runtime.isGeneratorFunction = function(genFun) {\n var ctor = typeof genFun === \"function\" && genFun.constructor;\n return ctor\n ? ctor === GeneratorFunction ||\n // For the native GeneratorFunction constructor, the best we can\n // do is to check its .name property.\n (ctor.displayName || ctor.name) === \"GeneratorFunction\"\n : false;\n };\n\n runtime.mark = function(genFun) {\n if (Object.setPrototypeOf) {\n Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);\n } else {\n genFun.__proto__ = GeneratorFunctionPrototype;\n if (!(toStringTagSymbol in genFun)) {\n genFun[toStringTagSymbol] = \"GeneratorFunction\";\n }\n }\n genFun.prototype = Object.create(Gp);\n return genFun;\n };\n\n // Within the body of any async function, `await x` is transformed to\n // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n // `hasOwn.call(value, \"__await\")` to determine if the yielded value is\n // meant to be awaited.\n runtime.awrap = function(arg) {\n return { __await: arg };\n };\n\n function AsyncIterator(generator) {\n function invoke(method, arg, resolve, reject) {\n var record = tryCatch(generator[method], generator, arg);\n if (record.type === \"throw\") {\n reject(record.arg);\n } else {\n var result = record.arg;\n var value = result.value;\n if (value &&\n typeof value === \"object\" &&\n hasOwn.call(value, \"__await\")) {\n return Promise.resolve(value.__await).then(function(value) {\n invoke(\"next\", value, resolve, reject);\n }, function(err) {\n invoke(\"throw\", err, resolve, reject);\n });\n }\n\n return Promise.resolve(value).then(function(unwrapped) {\n // When a yielded Promise is resolved, its final value becomes\n // the .value of the Promise<{value,done}> result for the\n // current iteration. If the Promise is rejected, however, the\n // result for this iteration will be rejected with the same\n // reason. Note that rejections of yielded Promises are not\n // thrown back into the generator function, as is the case\n // when an awaited Promise is rejected. This difference in\n // behavior between yield and await is important, because it\n // allows the consumer to decide what to do with the yielded\n // rejection (swallow it and continue, manually .throw it back\n // into the generator, abandon iteration, whatever). With\n // await, by contrast, there is no opportunity to examine the\n // rejection reason outside the generator function, so the\n // only option is to throw it from the await expression, and\n // let the generator function handle the exception.\n result.value = unwrapped;\n resolve(result);\n }, reject);\n }\n }\n\n if (typeof global.process === \"object\" && global.process.domain) {\n invoke = global.process.domain.bind(invoke);\n }\n\n var previousPromise;\n\n function enqueue(method, arg) {\n function callInvokeWithMethodAndArg() {\n return new Promise(function(resolve, reject) {\n invoke(method, arg, resolve, reject);\n });\n }\n\n return previousPromise =\n // If enqueue has been called before, then we want to wait until\n // all previous Promises have been resolved before calling invoke,\n // so that results are always delivered in the correct order. If\n // enqueue has not been called before, then it is important to\n // call invoke immediately, without waiting on a callback to fire,\n // so that the async generator function has the opportunity to do\n // any necessary setup in a predictable way. This predictability\n // is why the Promise constructor synchronously invokes its\n // executor callback, and why async functions synchronously\n // execute code before the first await. Since we implement simple\n // async functions in terms of async generators, it is especially\n // important to get this right, even though it requires care.\n previousPromise ? previousPromise.then(\n callInvokeWithMethodAndArg,\n // Avoid propagating failures to Promises returned by later\n // invocations of the iterator.\n callInvokeWithMethodAndArg\n ) : callInvokeWithMethodAndArg();\n }\n\n // Define the unified helper method that is used to implement .next,\n // .throw, and .return (see defineIteratorMethods).\n this._invoke = enqueue;\n }\n\n defineIteratorMethods(AsyncIterator.prototype);\n AsyncIterator.prototype[asyncIteratorSymbol] = function () {\n return this;\n };\n runtime.AsyncIterator = AsyncIterator;\n\n // Note that simple async functions are implemented on top of\n // AsyncIterator objects; they just return a Promise for the value of\n // the final result produced by the iterator.\n runtime.async = function(innerFn, outerFn, self, tryLocsList) {\n var iter = new AsyncIterator(\n wrap(innerFn, outerFn, self, tryLocsList)\n );\n\n return runtime.isGeneratorFunction(outerFn)\n ? iter // If outerFn is a generator, return the full iterator.\n : iter.next().then(function(result) {\n return result.done ? result.value : iter.next();\n });\n };\n\n function makeInvokeMethod(innerFn, self, context) {\n var state = GenStateSuspendedStart;\n\n return function invoke(method, arg) {\n if (state === GenStateExecuting) {\n throw new Error(\"Generator is already running\");\n }\n\n if (state === GenStateCompleted) {\n if (method === \"throw\") {\n throw arg;\n }\n\n // Be forgiving, per 25.3.3.3.3 of the spec:\n // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n return doneResult();\n }\n\n context.method = method;\n context.arg = arg;\n\n while (true) {\n var delegate = context.delegate;\n if (delegate) {\n var delegateResult = maybeInvokeDelegate(delegate, context);\n if (delegateResult) {\n if (delegateResult === ContinueSentinel) continue;\n return delegateResult;\n }\n }\n\n if (context.method === \"next\") {\n // Setting context._sent for legacy support of Babel's\n // function.sent implementation.\n context.sent = context._sent = context.arg;\n\n } else if (context.method === \"throw\") {\n if (state === GenStateSuspendedStart) {\n state = GenStateCompleted;\n throw context.arg;\n }\n\n context.dispatchException(context.arg);\n\n } else if (context.method === \"return\") {\n context.abrupt(\"return\", context.arg);\n }\n\n state = GenStateExecuting;\n\n var record = tryCatch(innerFn, self, context);\n if (record.type === \"normal\") {\n // If an exception is thrown from innerFn, we leave state ===\n // GenStateExecuting and loop back for another invocation.\n state = context.done\n ? GenStateCompleted\n : GenStateSuspendedYield;\n\n if (record.arg === ContinueSentinel) {\n continue;\n }\n\n return {\n value: record.arg,\n done: context.done\n };\n\n } else if (record.type === \"throw\") {\n state = GenStateCompleted;\n // Dispatch the exception by looping back around to the\n // context.dispatchException(context.arg) call above.\n context.method = \"throw\";\n context.arg = record.arg;\n }\n }\n };\n }\n\n // Call delegate.iterator[context.method](context.arg) and handle the\n // result, either by returning a { value, done } result from the\n // delegate iterator, or by modifying context.method and context.arg,\n // setting context.delegate to null, and returning the ContinueSentinel.\n function maybeInvokeDelegate(delegate, context) {\n var method = delegate.iterator[context.method];\n if (method === undefined) {\n // A .throw or .return when the delegate iterator has no .throw\n // method always terminates the yield* loop.\n context.delegate = null;\n\n if (context.method === \"throw\") {\n if (delegate.iterator.return) {\n // If the delegate iterator has a return method, give it a\n // chance to clean up.\n context.method = \"return\";\n context.arg = undefined;\n maybeInvokeDelegate(delegate, context);\n\n if (context.method === \"throw\") {\n // If maybeInvokeDelegate(context) changed context.method from\n // \"return\" to \"throw\", let that override the TypeError below.\n return ContinueSentinel;\n }\n }\n\n context.method = \"throw\";\n context.arg = new TypeError(\n \"The iterator does not provide a 'throw' method\");\n }\n\n return ContinueSentinel;\n }\n\n var record = tryCatch(method, delegate.iterator, context.arg);\n\n if (record.type === \"throw\") {\n context.method = \"throw\";\n context.arg = record.arg;\n context.delegate = null;\n return ContinueSentinel;\n }\n\n var info = record.arg;\n\n if (! info) {\n context.method = \"throw\";\n context.arg = new TypeError(\"iterator result is not an object\");\n context.delegate = null;\n return ContinueSentinel;\n }\n\n if (info.done) {\n // Assign the result of the finished delegate to the temporary\n // variable specified by delegate.resultName (see delegateYield).\n context[delegate.resultName] = info.value;\n\n // Resume execution at the desired location (see delegateYield).\n context.next = delegate.nextLoc;\n\n // If context.method was \"throw\" but the delegate handled the\n // exception, let the outer generator proceed normally. If\n // context.method was \"next\", forget context.arg since it has been\n // \"consumed\" by the delegate iterator. If context.method was\n // \"return\", allow the original .return call to continue in the\n // outer generator.\n if (context.method !== \"return\") {\n context.method = \"next\";\n context.arg = undefined;\n }\n\n } else {\n // Re-yield the result returned by the delegate method.\n return info;\n }\n\n // The delegate iterator is finished, so forget it and continue with\n // the outer generator.\n context.delegate = null;\n return ContinueSentinel;\n }\n\n // Define Generator.prototype.{next,throw,return} in terms of the\n // unified ._invoke helper method.\n defineIteratorMethods(Gp);\n\n Gp[toStringTagSymbol] = \"Generator\";\n\n // A Generator should always return itself as the iterator object when the\n // @@iterator function is called on it. Some browsers' implementations of the\n // iterator prototype chain incorrectly implement this, causing the Generator\n // object to not be returned from this call. This ensures that doesn't happen.\n // See https://github.com/facebook/regenerator/issues/274 for more details.\n Gp[iteratorSymbol] = function() {\n return this;\n };\n\n Gp.toString = function() {\n return \"[object Generator]\";\n };\n\n function pushTryEntry(locs) {\n var entry = { tryLoc: locs[0] };\n\n if (1 in locs) {\n entry.catchLoc = locs[1];\n }\n\n if (2 in locs) {\n entry.finallyLoc = locs[2];\n entry.afterLoc = locs[3];\n }\n\n this.tryEntries.push(entry);\n }\n\n function resetTryEntry(entry) {\n var record = entry.completion || {};\n record.type = \"normal\";\n delete record.arg;\n entry.completion = record;\n }\n\n function Context(tryLocsList) {\n // The root entry object (effectively a try statement without a catch\n // or a finally block) gives us a place to store values thrown from\n // locations where there is no enclosing try statement.\n this.tryEntries = [{ tryLoc: \"root\" }];\n tryLocsList.forEach(pushTryEntry, this);\n this.reset(true);\n }\n\n runtime.keys = function(object) {\n var keys = [];\n for (var key in object) {\n keys.push(key);\n }\n keys.reverse();\n\n // Rather than returning an object with a next method, we keep\n // things simple and return the next function itself.\n return function next() {\n while (keys.length) {\n var key = keys.pop();\n if (key in object) {\n next.value = key;\n next.done = false;\n return next;\n }\n }\n\n // To avoid creating an additional object, we just hang the .value\n // and .done properties off the next function object itself. This\n // also ensures that the minifier will not anonymize the function.\n next.done = true;\n return next;\n };\n };\n\n function values(iterable) {\n if (iterable) {\n var iteratorMethod = iterable[iteratorSymbol];\n if (iteratorMethod) {\n return iteratorMethod.call(iterable);\n }\n\n if (typeof iterable.next === \"function\") {\n return iterable;\n }\n\n if (!isNaN(iterable.length)) {\n var i = -1, next = function next() {\n while (++i < iterable.length) {\n if (hasOwn.call(iterable, i)) {\n next.value = iterable[i];\n next.done = false;\n return next;\n }\n }\n\n next.value = undefined;\n next.done = true;\n\n return next;\n };\n\n return next.next = next;\n }\n }\n\n // Return an iterator with no values.\n return { next: doneResult };\n }\n runtime.values = values;\n\n function doneResult() {\n return { value: undefined, done: true };\n }\n\n Context.prototype = {\n constructor: Context,\n\n reset: function(skipTempReset) {\n this.prev = 0;\n this.next = 0;\n // Resetting context._sent for legacy support of Babel's\n // function.sent implementation.\n this.sent = this._sent = undefined;\n this.done = false;\n this.delegate = null;\n\n this.method = \"next\";\n this.arg = undefined;\n\n this.tryEntries.forEach(resetTryEntry);\n\n if (!skipTempReset) {\n for (var name in this) {\n // Not sure about the optimal order of these conditions:\n if (name.charAt(0) === \"t\" &&\n hasOwn.call(this, name) &&\n !isNaN(+name.slice(1))) {\n this[name] = undefined;\n }\n }\n }\n },\n\n stop: function() {\n this.done = true;\n\n var rootEntry = this.tryEntries[0];\n var rootRecord = rootEntry.completion;\n if (rootRecord.type === \"throw\") {\n throw rootRecord.arg;\n }\n\n return this.rval;\n },\n\n dispatchException: function(exception) {\n if (this.done) {\n throw exception;\n }\n\n var context = this;\n function handle(loc, caught) {\n record.type = \"throw\";\n record.arg = exception;\n context.next = loc;\n\n if (caught) {\n // If the dispatched exception was caught by a catch block,\n // then let that catch block handle the exception normally.\n context.method = \"next\";\n context.arg = undefined;\n }\n\n return !! caught;\n }\n\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n var record = entry.completion;\n\n if (entry.tryLoc === \"root\") {\n // Exception thrown outside of any try block that could handle\n // it, so set the completion value of the entire function to\n // throw the exception.\n return handle(\"end\");\n }\n\n if (entry.tryLoc <= this.prev) {\n var hasCatch = hasOwn.call(entry, \"catchLoc\");\n var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n if (hasCatch && hasFinally) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n } else if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else if (hasCatch) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n }\n\n } else if (hasFinally) {\n if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else {\n throw new Error(\"try statement without catch or finally\");\n }\n }\n }\n },\n\n abrupt: function(type, arg) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc <= this.prev &&\n hasOwn.call(entry, \"finallyLoc\") &&\n this.prev < entry.finallyLoc) {\n var finallyEntry = entry;\n break;\n }\n }\n\n if (finallyEntry &&\n (type === \"break\" ||\n type === \"continue\") &&\n finallyEntry.tryLoc <= arg &&\n arg <= finallyEntry.finallyLoc) {\n // Ignore the finally entry if control is not jumping to a\n // location outside the try/catch block.\n finallyEntry = null;\n }\n\n var record = finallyEntry ? finallyEntry.completion : {};\n record.type = type;\n record.arg = arg;\n\n if (finallyEntry) {\n this.method = \"next\";\n this.next = finallyEntry.finallyLoc;\n return ContinueSentinel;\n }\n\n return this.complete(record);\n },\n\n complete: function(record, afterLoc) {\n if (record.type === \"throw\") {\n throw record.arg;\n }\n\n if (record.type === \"break\" ||\n record.type === \"continue\") {\n this.next = record.arg;\n } else if (record.type === \"return\") {\n this.rval = this.arg = record.arg;\n this.method = \"return\";\n this.next = \"end\";\n } else if (record.type === \"normal\" && afterLoc) {\n this.next = afterLoc;\n }\n\n return ContinueSentinel;\n },\n\n finish: function(finallyLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.finallyLoc === finallyLoc) {\n this.complete(entry.completion, entry.afterLoc);\n resetTryEntry(entry);\n return ContinueSentinel;\n }\n }\n },\n\n \"catch\": function(tryLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc === tryLoc) {\n var record = entry.completion;\n if (record.type === \"throw\") {\n var thrown = record.arg;\n resetTryEntry(entry);\n }\n return thrown;\n }\n }\n\n // The context.catch method must only be called with a location\n // argument that corresponds to a known catch block.\n throw new Error(\"illegal catch attempt\");\n },\n\n delegateYield: function(iterable, resultName, nextLoc) {\n this.delegate = {\n iterator: values(iterable),\n resultName: resultName,\n nextLoc: nextLoc\n };\n\n if (this.method === \"next\") {\n // Deliberately forget the last sent value so that we don't\n // accidentally pass it on to the delegate.\n this.arg = undefined;\n }\n\n return ContinueSentinel;\n }\n };\n})(\n // Among the various tricks for obtaining a reference to the global\n // object, this seems to be the most reliable technique that does not\n // use indirect eval (which violates Content Security Policy).\n typeof global === \"object\" ? global :\n typeof window === \"object\" ? window :\n typeof self === \"object\" ? self : this\n);\n","// Polyfill for creating CustomEvents on IE9/10/11\n\n// code pulled from:\n// https://github.com/d4tocchini/customevent-polyfill\n// https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent#Polyfill\n\ntry {\n var ce = new window.CustomEvent('test');\n ce.preventDefault();\n if (ce.defaultPrevented !== true) {\n // IE has problems with .preventDefault() on custom events\n // http://stackoverflow.com/questions/23349191\n throw new Error('Could not prevent default');\n }\n} catch(e) {\n var CustomEvent = function(event, params) {\n var evt, origPrevent;\n params = params || {\n bubbles: false,\n cancelable: false,\n detail: undefined\n };\n\n evt = document.createEvent(\"CustomEvent\");\n evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);\n origPrevent = evt.preventDefault;\n evt.preventDefault = function () {\n origPrevent.call(this);\n try {\n Object.defineProperty(this, 'defaultPrevented', {\n get: function () {\n return true;\n }\n });\n } catch(e) {\n this.defaultPrevented = true;\n }\n };\n return evt;\n };\n\n CustomEvent.prototype = window.Event.prototype;\n window.CustomEvent = CustomEvent; // expose definition to window\n}\n","(function(global) {\r\n /**\r\n * Polyfill URLSearchParams\r\n *\r\n * Inspired from : https://github.com/WebReflection/url-search-params/blob/master/src/url-search-params.js\r\n */\r\n\r\n var checkIfIteratorIsSupported = function() {\r\n try {\r\n return !!Symbol.iterator;\r\n } catch(error) {\r\n return false;\r\n }\r\n };\r\n\r\n\r\n var iteratorSupported = checkIfIteratorIsSupported();\r\n\r\n var createIterator = function(items) {\r\n var iterator = {\r\n next: function() {\r\n var value = items.shift();\r\n return { done: value === void 0, value: value };\r\n }\r\n };\r\n\r\n if(iteratorSupported) {\r\n iterator[Symbol.iterator] = function() {\r\n return iterator;\r\n };\r\n }\r\n\r\n return iterator;\r\n };\r\n\r\n /**\r\n * Search param name and values should be encoded according to https://url.spec.whatwg.org/#urlencoded-serializing\r\n * encodeURIComponent() produces the same result except encoding spaces as `%20` instead of `+`.\r\n */\r\n var serializeParam = function(value) {\r\n return encodeURIComponent(value).replace(/%20/g, '+');\r\n };\r\n\r\n var deserializeParam = function(value) {\r\n return decodeURIComponent(value).replace(/\\+/g, ' ');\r\n };\r\n\r\n var polyfillURLSearchParams= function() {\r\n\r\n var URLSearchParams = function(searchString) {\r\n Object.defineProperty(this, '_entries', { value: {} });\r\n\r\n if(typeof searchString === 'string') {\r\n if(searchString !== '') {\r\n searchString = searchString.replace(/^\\?/, '');\r\n var attributes = searchString.split('&');\r\n var attribute;\r\n for(var i = 0; i < attributes.length; i++) {\r\n attribute = attributes[i].split('=');\r\n this.append(\r\n deserializeParam(attribute[0]),\r\n (attribute.length > 1) ? deserializeParam(attribute[1]) : ''\r\n );\r\n }\r\n }\r\n } else if(searchString instanceof URLSearchParams) {\r\n var _this = this;\r\n searchString.forEach(function(value, name) {\r\n _this.append(value, name);\r\n });\r\n }\r\n };\r\n\r\n var proto = URLSearchParams.prototype;\r\n\r\n proto.append = function(name, value) {\r\n if(name in this._entries) {\r\n this._entries[name].push(value.toString());\r\n } else {\r\n this._entries[name] = [value.toString()];\r\n }\r\n };\r\n\r\n proto.delete = function(name) {\r\n delete this._entries[name];\r\n };\r\n\r\n proto.get = function(name) {\r\n return (name in this._entries) ? this._entries[name][0] : null;\r\n };\r\n\r\n proto.getAll = function(name) {\r\n return (name in this._entries) ? this._entries[name].slice(0) : [];\r\n };\r\n\r\n proto.has = function(name) {\r\n return (name in this._entries);\r\n };\r\n\r\n proto.set = function(name, value) {\r\n this._entries[name] = [value.toString()];\r\n };\r\n\r\n proto.forEach = function(callback, thisArg) {\r\n var entries;\r\n for(var name in this._entries) {\r\n if(this._entries.hasOwnProperty(name)) {\r\n entries = this._entries[name];\r\n for(var i = 0; i < entries.length; i++) {\r\n callback.call(thisArg, entries[i], name, this);\r\n }\r\n }\r\n }\r\n };\r\n\r\n proto.keys = function() {\r\n var items = [];\r\n this.forEach(function(value, name) { items.push(name); });\r\n return createIterator(items);\r\n };\r\n\r\n proto.values = function() {\r\n var items = [];\r\n this.forEach(function(value) { items.push(value); });\r\n return createIterator(items);\r\n };\r\n\r\n proto.entries = function() {\r\n var items = [];\r\n this.forEach(function(value, name) { items.push([name, value]); });\r\n return createIterator(items);\r\n };\r\n\r\n if(iteratorSupported) {\r\n proto[Symbol.iterator] = proto.entries;\r\n }\r\n\r\n proto.toString = function() {\r\n var searchString = '';\r\n this.forEach(function(value, name) {\r\n if(searchString.length > 0) searchString+= '&';\r\n searchString += serializeParam(name) + '=' + serializeParam(value);\r\n });\r\n return searchString;\r\n };\r\n\r\n global.URLSearchParams = URLSearchParams;\r\n };\r\n\r\n if(!('URLSearchParams' in global) || (new URLSearchParams('?a=1').toString() !== 'a=1')) {\r\n polyfillURLSearchParams();\r\n }\r\n\r\n // HTMLAnchorElement\r\n\r\n})(\r\n (typeof global !== 'undefined') ? global\r\n : ((typeof window !== 'undefined') ? window\r\n : ((typeof self !== 'undefined') ? self : this))\r\n);\r\n\r\n(function(global) {\r\n /**\r\n * Polyfill URL\r\n *\r\n * Inspired from : https://github.com/arv/DOM-URL-Polyfill/blob/master/src/url.js\r\n */\r\n\r\n var checkIfURLIsSupported = function() {\r\n try {\r\n var u = new URL('b', 'http://a');\r\n u.pathname = 'c%20d';\r\n return (u.href === 'http://a/c%20d') && u.searchParams;\r\n } catch(e) {\r\n return false;\r\n }\r\n };\r\n\r\n\r\n var polyfillURL = function() {\r\n var _URL = global.URL;\r\n\r\n var URL = function(url, base) {\r\n if(typeof url !== 'string') url = String(url);\r\n\r\n var doc = document.implementation.createHTMLDocument('');\r\n window.doc = doc;\r\n if(base) {\r\n var baseElement = doc.createElement('base');\r\n baseElement.href = base;\r\n doc.head.appendChild(baseElement);\r\n }\r\n\r\n var anchorElement = doc.createElement('a');\r\n anchorElement.href = url;\r\n doc.body.appendChild(anchorElement);\r\n anchorElement.href = anchorElement.href; // force href to refresh\r\n\r\n if(anchorElement.protocol === ':' || !/:/.test(anchorElement.href)) {\r\n throw new TypeError('Invalid URL');\r\n }\r\n\r\n Object.defineProperty(this, '_anchorElement', {\r\n value: anchorElement\r\n });\r\n };\r\n\r\n var proto = URL.prototype;\r\n\r\n var linkURLWithAnchorAttribute = function(attributeName) {\r\n Object.defineProperty(proto, attributeName, {\r\n get: function() {\r\n return this._anchorElement[attributeName];\r\n },\r\n set: function(value) {\r\n this._anchorElement[attributeName] = value;\r\n },\r\n enumerable: true\r\n });\r\n };\r\n\r\n ['hash', 'host', 'hostname', 'port', 'protocol', 'search']\r\n .forEach(function(attributeName) {\r\n linkURLWithAnchorAttribute(attributeName);\r\n });\r\n\r\n Object.defineProperties(proto, {\r\n\r\n 'toString': {\r\n get: function() {\r\n var _this = this;\r\n return function() {\r\n return _this.href;\r\n };\r\n }\r\n },\r\n\r\n 'href' : {\r\n get: function() {\r\n return this._anchorElement.href.replace(/\\?$/,'');\r\n },\r\n set: function(value) {\r\n this._anchorElement.href = value;\r\n },\r\n enumerable: true\r\n },\r\n\r\n 'pathname' : {\r\n get: function() {\r\n return this._anchorElement.pathname.replace(/(^\\/?)/,'/');\r\n },\r\n set: function(value) {\r\n this._anchorElement.pathname = value;\r\n },\r\n enumerable: true\r\n },\r\n\r\n 'origin': {\r\n get: function() {\r\n // get expected port from protocol\r\n var expectedPort = {'http:': 80, 'https:': 443, 'ftp:': 21}[this._anchorElement.protocol];\r\n // add port to origin if, expected port is different than actual port\r\n // and it is not empty f.e http://foo:8080\r\n // 8080 != 80 && 8080 != ''\r\n var addPortToOrigin = this._anchorElement.port != expectedPort &&\r\n this._anchorElement.port !== ''\r\n\r\n return this._anchorElement.protocol +\r\n '//' +\r\n this._anchorElement.hostname +\r\n (addPortToOrigin ? (':' + this._anchorElement.port) : '');\r\n },\r\n enumerable: true\r\n },\r\n\r\n 'password': { // TODO\r\n get: function() {\r\n return '';\r\n },\r\n set: function(value) {\r\n },\r\n enumerable: true\r\n },\r\n\r\n 'username': { // TODO\r\n get: function() {\r\n return '';\r\n },\r\n set: function(value) {\r\n },\r\n enumerable: true\r\n },\r\n\r\n 'searchParams': {\r\n get: function() {\r\n var searchParams = new URLSearchParams(this.search);\r\n var _this = this;\r\n ['append', 'delete', 'set'].forEach(function(methodName) {\r\n var method = searchParams[methodName];\r\n searchParams[methodName] = function() {\r\n method.apply(searchParams, arguments);\r\n _this.search = searchParams.toString();\r\n };\r\n });\r\n return searchParams;\r\n },\r\n enumerable: true\r\n }\r\n });\r\n\r\n URL.createObjectURL = function(blob) {\r\n return _URL.createObjectURL.apply(_URL, arguments);\r\n };\r\n\r\n URL.revokeObjectURL = function(url) {\r\n return _URL.revokeObjectURL.apply(_URL, arguments);\r\n };\r\n\r\n global.URL = URL;\r\n\r\n };\r\n\r\n if(!checkIfURLIsSupported()) {\r\n polyfillURL();\r\n }\r\n\r\n if((global.location !== void 0) && !('origin' in global.location)) {\r\n var getOrigin = function() {\r\n return global.location.protocol + '//' + global.location.hostname + (global.location.port ? (':' + global.location.port) : '');\r\n };\r\n\r\n try {\r\n Object.defineProperty(global.location, 'origin', {\r\n get: getOrigin,\r\n enumerable: true\r\n });\r\n } catch(e) {\r\n setInterval(function() {\r\n global.location.origin = getOrigin();\r\n }, 100);\r\n }\r\n }\r\n\r\n})(\r\n (typeof global !== 'undefined') ? global\r\n : ((typeof window !== 'undefined') ? window\r\n : ((typeof self !== 'undefined') ? self : this))\r\n);\r\n","// ==========================================================================\n// Type checking utils\n// ==========================================================================\n\nconst getConstructor = input => (input !== null && typeof input !== 'undefined' ? input.constructor : null);\n\nconst instanceOf = (input, constructor) => Boolean(input && constructor && input instanceof constructor);\n\nconst is = {\n object(input) {\n return getConstructor(input) === Object;\n },\n number(input) {\n return getConstructor(input) === Number && !Number.isNaN(input);\n },\n string(input) {\n return getConstructor(input) === String;\n },\n boolean(input) {\n return getConstructor(input) === Boolean;\n },\n function(input) {\n return getConstructor(input) === Function;\n },\n array(input) {\n return !is.nullOrUndefined(input) && Array.isArray(input);\n },\n weakMap(input) {\n return instanceOf(input, WeakMap);\n },\n nodeList(input) {\n return instanceOf(input, NodeList);\n },\n element(input) {\n return instanceOf(input, Element);\n },\n textNode(input) {\n return getConstructor(input) === Text;\n },\n event(input) {\n return instanceOf(input, Event);\n },\n cue(input) {\n return instanceOf(input, window.TextTrackCue) || instanceOf(input, window.VTTCue);\n },\n track(input) {\n return instanceOf(input, TextTrack) || (!is.nullOrUndefined(input) && is.string(input.kind));\n },\n url(input) {\n return (\n !is.nullOrUndefined(input) &&\n /(ftp|http|https):\\/\\/(\\w+:{0,1}\\w*@)?(\\S+)(:[0-9]+)?(\\/|\\/([\\w#!:.?+=&%@!\\-/]))?/.test(input)\n );\n },\n nullOrUndefined(input) {\n return input === null || typeof input === 'undefined';\n },\n empty(input) {\n return (\n is.nullOrUndefined(input) ||\n ((is.string(input) || is.array(input) || is.nodeList(input)) && !input.length) ||\n (is.object(input) && !Object.keys(input).length)\n );\n },\n};\n\nexport default is;\n","// ==========================================================================\n// Event utils\n// ==========================================================================\n\nimport is from './is';\n\n// Check for passive event listener support\n// https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md\n// https://www.youtube.com/watch?v=NPM6172J22g\nconst supportsPassiveListeners = (() => {\n // Test via a getter in the options object to see if the passive property is accessed\n let supported = false;\n try {\n const options = Object.defineProperty({}, 'passive', {\n get() {\n supported = true;\n return null;\n },\n });\n window.addEventListener('test', null, options);\n window.removeEventListener('test', null, options);\n } catch (e) {\n // Do nothing\n }\n\n return supported;\n})();\n\n// Toggle event listener\nexport function toggleListener(element, event, callback, toggle = false, passive = true, capture = false) {\n // Bail if no element, event, or callback\n if (!element || !('addEventListener' in element) || is.empty(event) || !is.function(callback)) {\n return;\n }\n\n // Allow multiple events\n const events = event.split(' ');\n\n // Build options\n // Default to just the capture boolean for browsers with no passive listener support\n let options = capture;\n\n // If passive events listeners are supported\n if (supportsPassiveListeners) {\n options = {\n // Whether the listener can be passive (i.e. default never prevented)\n passive,\n // Whether the listener is a capturing listener or not\n capture,\n };\n }\n\n // If a single node is passed, bind the event listener\n events.forEach(type => {\n if (this && this.eventListeners && toggle) {\n // Cache event listener\n this.eventListeners.push({ element, type, callback, options });\n }\n\n element[toggle ? 'addEventListener' : 'removeEventListener'](type, callback, options);\n });\n}\n\n// Bind event handler\nexport function on(element, events = '', callback, passive = true, capture = false) {\n toggleListener.call(this, element, events, callback, true, passive, capture);\n}\n\n// Unbind event handler\nexport function off(element, events = '', callback, passive = true, capture = false) {\n toggleListener.call(this, element, events, callback, false, passive, capture);\n}\n\n// Bind once-only event handler\nexport function once(element, events = '', callback, passive = true, capture = false) {\n function onceCallback(...args) {\n off(element, events, onceCallback, passive, capture);\n callback.apply(this, args);\n }\n\n toggleListener.call(this, element, events, onceCallback, true, passive, capture);\n}\n\n// Trigger event\nexport function triggerEvent(element, type = '', bubbles = false, detail = {}) {\n // Bail if no element\n if (!is.element(element) || is.empty(type)) {\n return;\n }\n\n // Create and dispatch the event\n const event = new CustomEvent(type, {\n bubbles,\n detail: Object.assign({}, detail, {\n plyr: this,\n }),\n });\n\n // Dispatch the event\n element.dispatchEvent(event);\n}\n\n// Unbind all cached event listeners\nexport function unbindListeners() {\n if (this && this.eventListeners) {\n this.eventListeners.forEach(item => {\n const { element, type, callback, options } = item;\n element.removeEventListener(type, callback, options);\n });\n\n this.eventListeners = [];\n }\n}\n\n// Run method when / if player is ready\nexport function ready() {\n return new Promise(\n resolve => (this.ready ? setTimeout(resolve, 0) : on.call(this, this.elements.container, 'ready', resolve)),\n ).then(() => {});\n}\n","// ==========================================================================\n// Element utils\n// ==========================================================================\n\nimport { toggleListener } from './events';\nimport is from './is';\n\n// Wrap an element\nexport function wrap(elements, wrapper) {\n // Convert `elements` to an array, if necessary.\n const targets = elements.length ? elements : [elements];\n\n // Loops backwards to prevent having to clone the wrapper on the\n // first element (see `child` below).\n Array.from(targets)\n .reverse()\n .forEach((element, index) => {\n const child = index > 0 ? wrapper.cloneNode(true) : wrapper;\n\n // Cache the current parent and sibling.\n const parent = element.parentNode;\n const sibling = element.nextSibling;\n\n // Wrap the element (is automatically removed from its current\n // parent).\n child.appendChild(element);\n\n // If the element had a sibling, insert the wrapper before\n // the sibling to maintain the HTML structure; otherwise, just\n // append it to the parent.\n if (sibling) {\n parent.insertBefore(child, sibling);\n } else {\n parent.appendChild(child);\n }\n });\n}\n\n// Set attributes\nexport function setAttributes(element, attributes) {\n if (!is.element(element) || is.empty(attributes)) {\n return;\n }\n\n // Assume null and undefined attributes should be left out,\n // Setting them would otherwise convert them to \"null\" and \"undefined\"\n Object.entries(attributes)\n .filter(([, value]) => !is.nullOrUndefined(value))\n .forEach(([key, value]) => element.setAttribute(key, value));\n}\n\n// Create a DocumentFragment\nexport function createElement(type, attributes, text) {\n // Create a new <element>\n const element = document.createElement(type);\n\n // Set all passed attributes\n if (is.object(attributes)) {\n setAttributes(element, attributes);\n }\n\n // Add text node\n if (is.string(text)) {\n element.innerText = text;\n }\n\n // Return built element\n return element;\n}\n\n// Inaert an element after another\nexport function insertAfter(element, target) {\n target.parentNode.insertBefore(element, target.nextSibling);\n}\n\n// Insert a DocumentFragment\nexport function insertElement(type, parent, attributes, text) {\n // Inject the new <element>\n parent.appendChild(createElement(type, attributes, text));\n}\n\n// Remove element(s)\nexport function removeElement(element) {\n if (is.nodeList(element) || is.array(element)) {\n Array.from(element).forEach(removeElement);\n return;\n }\n\n if (!is.element(element) || !is.element(element.parentNode)) {\n return;\n }\n\n element.parentNode.removeChild(element);\n}\n\n// Remove all child elements\nexport function emptyElement(element) {\n let { length } = element.childNodes;\n\n while (length > 0) {\n element.removeChild(element.lastChild);\n length -= 1;\n }\n}\n\n// Replace element\nexport function replaceElement(newChild, oldChild) {\n if (!is.element(oldChild) || !is.element(oldChild.parentNode) || !is.element(newChild)) {\n return null;\n }\n\n oldChild.parentNode.replaceChild(newChild, oldChild);\n\n return newChild;\n}\n\n// Get an attribute object from a string selector\nexport function getAttributesFromSelector(sel, existingAttributes) {\n // For example:\n // '.test' to { class: 'test' }\n // '#test' to { id: 'test' }\n // '[data-test=\"test\"]' to { 'data-test': 'test' }\n\n if (!is.string(sel) || is.empty(sel)) {\n return {};\n }\n\n const attributes = {};\n const existing = existingAttributes;\n\n sel.split(',').forEach(s => {\n // Remove whitespace\n const selector = s.trim();\n const className = selector.replace('.', '');\n const stripped = selector.replace(/[[\\]]/g, '');\n\n // Get the parts and value\n const parts = stripped.split('=');\n const key = parts[0];\n const value = parts.length > 1 ? parts[1].replace(/[\"']/g, '') : '';\n\n // Get the first character\n const start = selector.charAt(0);\n\n switch (start) {\n case '.':\n // Add to existing classname\n if (is.object(existing) && is.string(existing.class)) {\n existing.class += ` ${className}`;\n }\n\n attributes.class = className;\n break;\n\n case '#':\n // ID selector\n attributes.id = selector.replace('#', '');\n break;\n\n case '[':\n // Attribute selector\n attributes[key] = value;\n\n break;\n\n default:\n break;\n }\n });\n\n return attributes;\n}\n\n// Toggle hidden\nexport function toggleHidden(element, hidden) {\n if (!is.element(element)) {\n return;\n }\n\n let hide = hidden;\n\n if (!is.boolean(hide)) {\n hide = !element.hasAttribute('hidden');\n }\n\n if (hide) {\n element.setAttribute('hidden', '');\n } else {\n element.removeAttribute('hidden');\n }\n}\n\n// Mirror Element.classList.toggle, with IE compatibility for \"force\" argument\nexport function toggleClass(element, className, force) {\n if (is.element(element)) {\n let method = 'toggle';\n if (typeof force !== 'undefined') {\n method = force ? 'add' : 'remove';\n }\n\n element.classList[method](className);\n return element.classList.contains(className);\n }\n\n return null;\n}\n\n// Has class name\nexport function hasClass(element, className) {\n return is.element(element) && element.classList.contains(className);\n}\n\n// Element matches selector\nexport function matches(element, selector) {\n const prototype = { Element };\n\n function match() {\n return Array.from(document.querySelectorAll(selector)).includes(this);\n }\n\n const matches =\n prototype.matches ||\n prototype.webkitMatchesSelector ||\n prototype.mozMatchesSelector ||\n prototype.msMatchesSelector ||\n match;\n\n return matches.call(element, selector);\n}\n\n// Find all elements\nexport function getElements(selector) {\n return this.elements.container.querySelectorAll(selector);\n}\n\n// Find a single element\nexport function getElement(selector) {\n return this.elements.container.querySelector(selector);\n}\n\n// Get the focused element\nexport function getFocusElement() {\n let focused = document.activeElement;\n\n if (!focused || focused === document.body) {\n focused = null;\n } else {\n focused = document.querySelector(':focus');\n }\n\n return focused;\n}\n\n// Trap focus inside container\nexport function trapFocus(element = null, toggle = false) {\n if (!is.element(element)) {\n return;\n }\n\n const focusable = getElements.call(this, 'button:not(:disabled), input:not(:disabled), [tabindex]');\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n\n const trap = event => {\n // Bail if not tab key or not fullscreen\n if (event.key !== 'Tab' || event.keyCode !== 9) {\n return;\n }\n\n // Get the current focused element\n const focused = getFocusElement();\n\n if (focused === last && !event.shiftKey) {\n // Move focus to first element that can be tabbed if Shift isn't used\n first.focus();\n event.preventDefault();\n } else if (focused === first && event.shiftKey) {\n // Move focus to last element that can be tabbed if Shift is used\n last.focus();\n event.preventDefault();\n }\n };\n\n toggleListener.call(this, this.elements.container, 'keydown', trap, toggle, false);\n}\n","// ==========================================================================\n// Animation utils\n// ==========================================================================\n\nimport { toggleHidden } from './elements';\nimport is from './is';\n\nexport const transitionEndEvent = (() => {\n const element = document.createElement('span');\n\n const events = {\n WebkitTransition: 'webkitTransitionEnd',\n MozTransition: 'transitionend',\n OTransition: 'oTransitionEnd otransitionend',\n transition: 'transitionend',\n };\n\n const type = Object.keys(events).find(event => element.style[event] !== undefined);\n\n return is.string(type) ? events[type] : false;\n})();\n\n// Force repaint of element\nexport function repaint(element) {\n setTimeout(() => {\n toggleHidden(element, true);\n element.offsetHeight; // eslint-disable-line\n toggleHidden(element, false);\n }, 0);\n}\n","// ==========================================================================\n// Browser sniffing\n// Unfortunately, due to mixed support, UA sniffing is required\n// ==========================================================================\n\nconst browser = {\n isIE: /* @cc_on!@ */ false || !!document.documentMode,\n isWebkit: 'WebkitAppearance' in document.documentElement.style && !/Edge/.test(navigator.userAgent),\n isIPhone: /(iPhone|iPod)/gi.test(navigator.platform),\n isIos: /(iPad|iPhone|iPod)/gi.test(navigator.platform),\n};\n\nexport default browser;\n","// ==========================================================================\n// Plyr support checks\n// ==========================================================================\n\nimport { transitionEndEvent } from './utils/animation';\nimport browser from './utils/browser';\nimport { createElement } from './utils/elements';\nimport is from './utils/is';\n\n// Default codecs for checking mimetype support\nconst defaultCodecs = {\n 'audio/ogg': 'vorbis',\n 'audio/wav': '1',\n 'video/webm': 'vp8, vorbis',\n 'video/mp4': 'avc1.42E01E, mp4a.40.2',\n 'video/ogg': 'theora',\n};\n\n// Check for feature support\nconst support = {\n // Basic support\n audio: 'canPlayType' in document.createElement('audio'),\n video: 'canPlayType' in document.createElement('video'),\n\n // Check for support\n // Basic functionality vs full UI\n check(type, provider, playsinline) {\n const canPlayInline = browser.isIPhone && playsinline && support.playsinline;\n const api = support[type] || provider !== 'html5';\n const ui = api && support.rangeInput && (type !== 'video' || !browser.isIPhone || canPlayInline);\n\n return {\n api,\n ui,\n };\n },\n\n // Picture-in-picture support\n // Safari only currently\n pip: (() => !browser.isIPhone && is.function(createElement('video').webkitSetPresentationMode))(),\n\n // Airplay support\n // Safari only currently\n airplay: is.function(window.WebKitPlaybackTargetAvailabilityEvent),\n\n // Inline playback support\n // https://webkit.org/blog/6784/new-video-policies-for-ios/\n playsinline: 'playsInline' in document.createElement('video'),\n\n // Check for mime type support against a player instance\n // Credits: http://diveintohtml5.info/everything.html\n // Related: http://www.leanbackplayer.com/test/h5mt.html\n mime(inputType) {\n const [mediaType] = inputType.split('/');\n if (!this.isHTML5 || mediaType !== this.type) {\n return false;\n }\n\n let type;\n if (inputType && inputType.includes('codecs=')) {\n // Use input directly\n type = inputType;\n } else if (inputType === 'audio/mpeg') {\n // Skip codec\n type = 'audio/mpeg;';\n } else if (inputType in defaultCodecs) {\n // Use codec\n type = `${inputType}; codecs=\"${defaultCodecs[inputType]}\"`;\n }\n\n try {\n return Boolean(type && this.media.canPlayType(type).replace(/no/, ''));\n } catch (err) {\n return false;\n }\n },\n\n // Check for textTracks support\n textTracks: 'textTracks' in document.createElement('video'),\n\n // <input type=\"range\"> Sliders\n rangeInput: (() => {\n const range = document.createElement('input');\n range.type = 'range';\n return range.type === 'range';\n })(),\n\n // Touch\n // NOTE: Remember a device can be mouse + touch enabled so we check on first touch event\n touch: 'ontouchstart' in document.documentElement,\n\n // Detect transitions support\n transitions: transitionEndEvent !== false,\n\n // Reduced motion iOS & MacOS setting\n // https://webkit.org/blog/7551/responsive-design-for-motion/\n reducedMotion: 'matchMedia' in window && window.matchMedia('(prefers-reduced-motion)').matches,\n};\n\nexport default support;\n","// ==========================================================================\n// Plyr HTML5 helpers\n// ==========================================================================\n\nimport support from './support';\nimport { removeElement } from './utils/elements';\nimport { triggerEvent } from './utils/events';\n\nconst html5 = {\n getSources() {\n if (!this.isHTML5) {\n return [];\n }\n\n const sources = Array.from(this.media.querySelectorAll('source'));\n\n // Filter out unsupported sources\n return sources.filter(source => support.mime.call(this, source.getAttribute('type')));\n },\n\n // Get quality levels\n getQualityOptions() {\n // Get sizes from <source> elements\n return html5.getSources\n .call(this)\n .map(source => Number(source.getAttribute('size')))\n .filter(Boolean);\n },\n\n extend() {\n if (!this.isHTML5) {\n return;\n }\n\n const player = this;\n\n // Quality\n Object.defineProperty(player.media, 'quality', {\n get() {\n // Get sources\n const sources = html5.getSources.call(player);\n const [source] = sources.filter(source => source.getAttribute('src') === player.source);\n\n // Return size, if match is found\n return source && Number(source.getAttribute('size'));\n },\n set(input) {\n // Get sources\n const sources = html5.getSources.call(player);\n\n // Get first match for requested size\n const source = sources.find(source => Number(source.getAttribute('size')) === input);\n\n // No matching source found\n if (!source) {\n return;\n }\n\n // Get current state\n const { currentTime, playing } = player;\n\n // Set new source\n player.media.src = source.getAttribute('src');\n\n // Restore time\n const onLoadedMetaData = () => {\n player.currentTime = currentTime;\n };\n player.once('loadedmetadata', onLoadedMetaData);\n\n // Load new source\n player.media.load();\n\n // Resume playing\n if (playing) {\n player.play();\n }\n\n // Trigger change event\n triggerEvent.call(player, player.media, 'qualitychange', false, {\n quality: input,\n });\n },\n });\n },\n\n // Cancel current network requests\n // See https://github.com/sampotts/plyr/issues/174\n cancelRequests() {\n if (!this.isHTML5) {\n return;\n }\n\n // Remove child sources\n removeElement(html5.getSources.call(this));\n\n // Set blank video src attribute\n // This is to prevent a MEDIA_ERR_SRC_NOT_SUPPORTED error\n // Info: http://stackoverflow.com/questions/32231579/how-to-properly-dispose-of-an-html5-video-and-close-socket-or-connection\n this.media.setAttribute('src', this.config.blankVideo);\n\n // Load the new empty source\n // This will cancel existing requests\n // See https://github.com/sampotts/plyr/issues/174\n this.media.load();\n\n // Debugging\n this.debug.log('Cancelled network requests');\n },\n};\n\nexport default html5;\n","// ==========================================================================\n// Object utils\n// ==========================================================================\n\nimport is from './is';\n\n// Clone nested objects\nexport function cloneDeep(object) {\n return JSON.parse(JSON.stringify(object));\n}\n\n// Get a nested value in an object\nexport function getDeep(object, path) {\n return path.split('.').reduce((obj, key) => obj && obj[key], object);\n}\n\n// Deep extend destination object with N more objects\nexport function extend(target = {}, ...sources) {\n if (!sources.length) {\n return target;\n }\n\n const source = sources.shift();\n\n if (!is.object(source)) {\n return target;\n }\n\n Object.keys(source).forEach(key => {\n if (is.object(source[key])) {\n if (!Object.keys(target).includes(key)) {\n Object.assign(target, { [key]: {} });\n }\n\n extend(target[key], source[key]);\n } else {\n Object.assign(target, { [key]: source[key] });\n }\n });\n\n return extend(target, ...sources);\n}\n","// ==========================================================================\n// String utils\n// ==========================================================================\n\nimport is from './is';\n\n// Generate a random ID\nexport function generateId(prefix) {\n return `${prefix}-${Math.floor(Math.random() * 10000)}`;\n}\n\n// Format string\nexport function format(input, ...args) {\n if (is.empty(input)) {\n return input;\n }\n\n return input.toString().replace(/{(\\d+)}/g, (match, i) => args[i].toString());\n}\n\n// Get percentage\nexport function getPercentage(current, max) {\n if (current === 0 || max === 0 || Number.isNaN(current) || Number.isNaN(max)) {\n return 0;\n }\n\n return (current / max * 100).toFixed(2);\n}\n\n// Replace all occurances of a string in a string\nexport function replaceAll(input = '', find = '', replace = '') {\n return input.replace(\n new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\\]/\\\\])/g, '\\\\$1'), 'g'),\n replace.toString(),\n );\n}\n\n// Convert to title case\nexport function toTitleCase(input = '') {\n return input.toString().replace(/\\w\\S*/g, text => text.charAt(0).toUpperCase() + text.substr(1).toLowerCase());\n}\n\n// Convert string to pascalCase\nexport function toPascalCase(input = '') {\n let string = input.toString();\n\n // Convert kebab case\n string = replaceAll(string, '-', ' ');\n\n // Convert snake case\n string = replaceAll(string, '_', ' ');\n\n // Convert to title case\n string = toTitleCase(string);\n\n // Convert to pascal case\n return replaceAll(string, ' ', '');\n}\n\n// Convert string to pascalCase\nexport function toCamelCase(input = '') {\n let string = input.toString();\n\n // Convert to pascal case\n string = toPascalCase(string);\n\n // Convert first character to lowercase\n return string.charAt(0).toLowerCase() + string.slice(1);\n}\n\n// Remove HTML from a string\nexport function stripHTML(source) {\n const fragment = document.createDocumentFragment();\n const element = document.createElement('div');\n fragment.appendChild(element);\n element.innerHTML = source;\n return fragment.firstChild.innerText;\n}\n\n// Like outerHTML, but also works for DocumentFragment\nexport function getHTML(element) {\n const wrapper = document.createElement('div');\n wrapper.appendChild(element);\n return wrapper.innerHTML;\n}\n","// ==========================================================================\n// Plyr internationalization\n// ==========================================================================\n\nimport is from './utils/is';\nimport { getDeep } from './utils/objects';\nimport { replaceAll } from './utils/strings';\n\nconst i18n = {\n get(key = '', config = {}) {\n if (is.empty(key) || is.empty(config)) {\n return '';\n }\n\n let string = getDeep(config.i18n, key);\n\n if (is.empty(string)) {\n return '';\n }\n\n const replace = {\n '{seektime}': config.seekTime,\n '{title}': config.title,\n };\n\n Object.entries(replace).forEach(([key, value]) => {\n string = replaceAll(string, key, value);\n });\n\n return string;\n },\n};\n\nexport default i18n;\n","// ==========================================================================\n// Array utils\n// ==========================================================================\n\nimport is from './is';\n\n// Remove duplicates in an array\nexport function dedupe(array) {\n if (!is.array(array)) {\n return array;\n }\n\n return array.filter((item, index) => array.indexOf(item) === index);\n}\n\n// Get the closest value in an array\nexport function closest(array, value) {\n if (!is.array(array) || !array.length) {\n return null;\n }\n\n return array.reduce((prev, curr) => (Math.abs(curr - value) < Math.abs(prev - value) ? curr : prev));\n}\n","// ==========================================================================\n// Plyr storage\n// ==========================================================================\n\nimport is from './utils/is';\nimport { extend } from './utils/objects';\n\nclass Storage {\n constructor(player) {\n this.enabled = player.config.storage.enabled;\n this.key = player.config.storage.key;\n }\n\n // Check for actual support (see if we can use it)\n static get supported() {\n try {\n if (!('localStorage' in window)) {\n return false;\n }\n\n const test = '___test';\n\n // Try to use it (it might be disabled, e.g. user is in private mode)\n // see: https://github.com/sampotts/plyr/issues/131\n window.localStorage.setItem(test, test);\n window.localStorage.removeItem(test);\n\n return true;\n } catch (e) {\n return false;\n }\n }\n\n get(key) {\n if (!Storage.supported || !this.enabled) {\n return null;\n }\n\n const store = window.localStorage.getItem(this.key);\n\n if (is.empty(store)) {\n return null;\n }\n\n const json = JSON.parse(store);\n\n return is.string(key) && key.length ? json[key] : json;\n }\n\n set(object) {\n // Bail if we don't have localStorage support or it's disabled\n if (!Storage.supported || !this.enabled) {\n return;\n }\n\n // Can only store objectst\n if (!is.object(object)) {\n return;\n }\n\n // Get current storage\n let storage = this.get();\n\n // Default to empty object\n if (is.empty(storage)) {\n storage = {};\n }\n\n // Update the working copy of the values\n extend(storage, object);\n\n // Update storage\n window.localStorage.setItem(this.key, JSON.stringify(storage));\n }\n}\n\nexport default Storage;\n","// ==========================================================================\n// Sprite loader\n// ==========================================================================\n\nimport Storage from './../storage';\nimport is from './is';\n\n// Load an external SVG sprite\nexport default function loadSprite(url, id) {\n if (!is.string(url)) {\n return;\n }\n\n const prefix = 'cache';\n const hasId = is.string(id);\n let isCached = false;\n\n const exists = () => document.getElementById(id) !== null;\n\n const update = (container, data) => {\n container.innerHTML = data;\n\n // Check again incase of race condition\n if (hasId && exists()) {\n return;\n }\n\n // Inject the SVG to the body\n document.body.insertAdjacentElement('afterbegin', container);\n };\n\n // Only load once if ID set\n if (!hasId || !exists()) {\n const useStorage = Storage.supported;\n\n // Create container\n const container = document.createElement('div');\n container.setAttribute('hidden', '');\n\n if (hasId) {\n container.setAttribute('id', id);\n }\n\n // Check in cache\n if (useStorage) {\n const cached = window.localStorage.getItem(`${prefix}-${id}`);\n isCached = cached !== null;\n\n if (isCached) {\n const data = JSON.parse(cached);\n update(container, data.content);\n }\n }\n\n // Get the sprite\n fetch(url)\n .then(result => {\n if (is.empty(result)) {\n return;\n }\n\n if (useStorage) {\n window.localStorage.setItem(\n `${prefix}-${id}`,\n JSON.stringify({\n content: result,\n }),\n );\n }\n\n update(container, result);\n })\n .catch(() => {});\n }\n}\n","// ==========================================================================\n// Time utils\n// ==========================================================================\n\nimport is from './is';\n\n// Time helpers\nexport const getHours = value => parseInt((value / 60 / 60) % 60, 10);\nexport const getMinutes = value => parseInt((value / 60) % 60, 10);\nexport const getSeconds = value => parseInt(value % 60, 10);\n\n// Format time to UI friendly string\nexport function formatTime(time = 0, displayHours = false, inverted = false) {\n // Bail if the value isn't a number\n if (!is.number(time)) {\n return formatTime(null, displayHours, inverted);\n }\n\n // Format time component to add leading zero\n const format = value => `0${value}`.slice(-2);\n\n // Breakdown to hours, mins, secs\n let hours = getHours(time);\n const mins = getMinutes(time);\n const secs = getSeconds(time);\n\n // Do we need to display hours?\n if (displayHours || hours > 0) {\n hours = `${hours}:`;\n } else {\n hours = '';\n }\n\n // Render\n return `${inverted && time > 0 ? '-' : ''}${hours}${format(mins)}:${format(secs)}`;\n}\n","// ==========================================================================\n// Plyr controls\n// ==========================================================================\n\nimport captions from './captions';\nimport html5 from './html5';\nimport i18n from './i18n';\nimport support from './support';\nimport { repaint, transitionEndEvent } from './utils/animation';\nimport { dedupe } from './utils/arrays';\nimport browser from './utils/browser';\nimport {\n createElement,\n emptyElement,\n getAttributesFromSelector,\n getElement,\n getElements,\n hasClass,\n removeElement,\n setAttributes,\n toggleClass,\n toggleHidden,\n matches,\n} from './utils/elements';\nimport { off, on } from './utils/events';\nimport is from './utils/is';\nimport loadSprite from './utils/loadSprite';\nimport { extend } from './utils/objects';\nimport { getPercentage, replaceAll, toCamelCase, toTitleCase } from './utils/strings';\nimport { formatTime, getHours } from './utils/time';\n\n// TODO: Don't export a massive object - break down and create class\nconst controls = {\n // Get icon URL\n getIconUrl() {\n const url = new URL(this.config.iconUrl, window.location);\n const cors = url.host !== window.location.host || (browser.isIE && !window.svg4everybody);\n\n return {\n url: this.config.iconUrl,\n cors,\n };\n },\n\n // Find the UI controls\n findElements() {\n try {\n this.elements.controls = getElement.call(this, this.config.selectors.controls.wrapper);\n\n // Buttons\n this.elements.buttons = {\n play: getElements.call(this, this.config.selectors.buttons.play),\n pause: getElement.call(this, this.config.selectors.buttons.pause),\n restart: getElement.call(this, this.config.selectors.buttons.restart),\n rewind: getElement.call(this, this.config.selectors.buttons.rewind),\n fastForward: getElement.call(this, this.config.selectors.buttons.fastForward),\n mute: getElement.call(this, this.config.selectors.buttons.mute),\n pip: getElement.call(this, this.config.selectors.buttons.pip),\n airplay: getElement.call(this, this.config.selectors.buttons.airplay),\n settings: getElement.call(this, this.config.selectors.buttons.settings),\n captions: getElement.call(this, this.config.selectors.buttons.captions),\n fullscreen: getElement.call(this, this.config.selectors.buttons.fullscreen),\n };\n\n // Progress\n this.elements.progress = getElement.call(this, this.config.selectors.progress);\n\n // Inputs\n this.elements.inputs = {\n seek: getElement.call(this, this.config.selectors.inputs.seek),\n volume: getElement.call(this, this.config.selectors.inputs.volume),\n };\n\n // Display\n this.elements.display = {\n buffer: getElement.call(this, this.config.selectors.display.buffer),\n currentTime: getElement.call(this, this.config.selectors.display.currentTime),\n duration: getElement.call(this, this.config.selectors.display.duration),\n };\n\n // Seek tooltip\n if (is.element(this.elements.progress)) {\n this.elements.display.seekTooltip = this.elements.progress.querySelector(\n `.${this.config.classNames.tooltip}`,\n );\n }\n\n return true;\n } catch (error) {\n // Log it\n this.debug.warn('It looks like there is a problem with your custom controls HTML', error);\n\n // Restore native video controls\n this.toggleNativeControls(true);\n\n return false;\n }\n },\n\n // Create <svg> icon\n createIcon(type, attributes) {\n const namespace = 'http://www.w3.org/2000/svg';\n const iconUrl = controls.getIconUrl.call(this);\n const iconPath = `${!iconUrl.cors ? iconUrl.url : ''}#${this.config.iconPrefix}`;\n\n // Create <svg>\n const icon = document.createElementNS(namespace, 'svg');\n setAttributes(\n icon,\n extend(attributes, {\n role: 'presentation',\n focusable: 'false',\n }),\n );\n\n // Create the <use> to reference sprite\n const use = document.createElementNS(namespace, 'use');\n const path = `${iconPath}-${type}`;\n\n // Set `href` attributes\n // https://github.com/sampotts/plyr/issues/460\n // https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/xlink:href\n if ('href' in use) {\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'href', path);\n } else {\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path);\n }\n\n // Add <use> to <svg>\n icon.appendChild(use);\n\n return icon;\n },\n\n // Create hidden text label\n createLabel(type, attr = {}) {\n // Skip i18n for abbreviations and brand names\n const universals = {\n pip: 'PIP',\n airplay: 'AirPlay',\n };\n const text = universals[type] || i18n.get(type, this.config);\n\n const attributes = Object.assign({}, attr, {\n class: [attr.class, this.config.classNames.hidden].filter(Boolean).join(' '),\n });\n return createElement('span', attributes, text);\n },\n\n // Create a badge\n createBadge(text) {\n if (is.empty(text)) {\n return null;\n }\n\n const badge = createElement('span', {\n class: this.config.classNames.menu.value,\n });\n\n badge.appendChild(\n createElement(\n 'span',\n {\n class: this.config.classNames.menu.badge,\n },\n text,\n ),\n );\n\n return badge;\n },\n\n // Create a <button>\n createButton(buttonType, attr) {\n const button = createElement('button');\n const attributes = Object.assign({}, attr);\n let type = toCamelCase(buttonType);\n\n let toggle = false;\n let label;\n let icon;\n let labelPressed;\n let iconPressed;\n\n if (!('type' in attributes)) {\n attributes.type = 'button';\n }\n\n if ('class' in attributes) {\n if (attributes.class.includes(this.config.classNames.control)) {\n attributes.class += ` ${this.config.classNames.control}`;\n }\n } else {\n attributes.class = this.config.classNames.control;\n }\n\n // Large play button\n switch (buttonType) {\n case 'play':\n toggle = true;\n label = 'play';\n labelPressed = 'pause';\n icon = 'play';\n iconPressed = 'pause';\n break;\n\n case 'mute':\n toggle = true;\n label = 'mute';\n labelPressed = 'unmute';\n icon = 'volume';\n iconPressed = 'muted';\n break;\n\n case 'captions':\n toggle = true;\n label = 'enableCaptions';\n labelPressed = 'disableCaptions';\n icon = 'captions-off';\n iconPressed = 'captions-on';\n break;\n\n case 'fullscreen':\n toggle = true;\n label = 'enterFullscreen';\n labelPressed = 'exitFullscreen';\n icon = 'enter-fullscreen';\n iconPressed = 'exit-fullscreen';\n break;\n\n case 'play-large':\n attributes.class += ` ${this.config.classNames.control}--overlaid`;\n type = 'play';\n label = 'play';\n icon = 'play';\n break;\n\n default:\n label = type;\n icon = buttonType;\n }\n\n // Setup toggle icon and labels\n if (toggle) {\n // Icon\n button.appendChild(controls.createIcon.call(this, iconPressed, { class: 'icon--pressed' }));\n button.appendChild(controls.createIcon.call(this, icon, { class: 'icon--not-pressed' }));\n\n // Label/Tooltip\n button.appendChild(controls.createLabel.call(this, labelPressed, { class: 'label--pressed' }));\n button.appendChild(controls.createLabel.call(this, label, { class: 'label--not-pressed' }));\n } else {\n button.appendChild(controls.createIcon.call(this, icon));\n button.appendChild(controls.createLabel.call(this, label));\n }\n\n // Merge attributes\n extend(attributes, getAttributesFromSelector(this.config.selectors.buttons[type], attributes));\n\n setAttributes(button, attributes);\n\n // We have multiple play buttons\n if (type === 'play') {\n if (!is.array(this.elements.buttons[type])) {\n this.elements.buttons[type] = [];\n }\n\n this.elements.buttons[type].push(button);\n } else {\n this.elements.buttons[type] = button;\n }\n\n // Toggle classname when pressed property is set\n const className = this.config.classNames.controlPressed;\n Object.defineProperty(button, 'pressed', {\n enumerable: true,\n get() {\n return hasClass(button, className);\n },\n set(pressed = false) {\n toggleClass(button, className, pressed);\n },\n });\n\n return button;\n },\n\n // Create an <input type='range'>\n createRange(type, attributes) {\n // Seek input\n const input = createElement(\n 'input',\n extend(\n getAttributesFromSelector(this.config.selectors.inputs[type]),\n {\n type: 'range',\n min: 0,\n max: 100,\n step: 0.01,\n value: 0,\n autocomplete: 'off',\n // A11y fixes for https://github.com/sampotts/plyr/issues/905\n role: 'slider',\n 'aria-label': i18n.get(type, this.config),\n 'aria-valuemin': 0,\n 'aria-valuemax': 100,\n 'aria-valuenow': 0,\n },\n attributes,\n ),\n );\n\n this.elements.inputs[type] = input;\n\n // Set the fill for webkit now\n controls.updateRangeFill.call(this, input);\n\n return input;\n },\n\n // Create a <progress>\n createProgress(type, attributes) {\n const progress = createElement(\n 'progress',\n extend(\n getAttributesFromSelector(this.config.selectors.display[type]),\n {\n min: 0,\n max: 100,\n value: 0,\n role: 'presentation',\n 'aria-hidden': true,\n },\n attributes,\n ),\n );\n\n // Create the label inside\n if (type !== 'volume') {\n progress.appendChild(createElement('span', null, '0'));\n\n const suffixKey = {\n played: 'played',\n buffer: 'buffered',\n }[type];\n const suffix = suffixKey ? i18n.get(suffixKey, this.config) : '';\n\n progress.innerText = `% ${suffix.toLowerCase()}`;\n }\n\n this.elements.display[type] = progress;\n\n return progress;\n },\n\n // Create time display\n createTime(type) {\n const attributes = getAttributesFromSelector(this.config.selectors.display[type]);\n\n const container = createElement(\n 'div',\n extend(attributes, {\n class: `plyr__time ${attributes.class}`,\n 'aria-label': i18n.get(type, this.config),\n }),\n '00:00',\n );\n\n // Reference for updates\n this.elements.display[type] = container;\n\n return container;\n },\n\n // Create a settings menu item\n createMenuItem({ value, list, type, title, badge = null, checked = false }) {\n const item = createElement('li');\n\n const label = createElement('label', {\n class: this.config.classNames.control,\n });\n\n const radio = createElement(\n 'input',\n extend(getAttributesFromSelector(this.config.selectors.inputs[type]), {\n type: 'radio',\n name: `plyr-${type}`,\n value,\n checked,\n class: 'plyr__sr-only',\n }),\n );\n\n const faux = createElement('span', { hidden: '' });\n\n label.appendChild(radio);\n label.appendChild(faux);\n label.insertAdjacentHTML('beforeend', title);\n\n if (is.element(badge)) {\n label.appendChild(badge);\n }\n\n item.appendChild(label);\n list.appendChild(item);\n },\n\n // Format a time for display\n formatTime(time = 0, inverted = false) {\n // Bail if the value isn't a number\n if (!is.number(time)) {\n return time;\n }\n\n // Always display hours if duration is over an hour\n const forceHours = getHours(this.duration) > 0;\n\n return formatTime(time, forceHours, inverted);\n },\n\n // Update the displayed time\n updateTimeDisplay(target = null, time = 0, inverted = false) {\n // Bail if there's no element to display or the value isn't a number\n if (!is.element(target) || !is.number(time)) {\n return;\n }\n\n // eslint-disable-next-line no-param-reassign\n target.innerText = controls.formatTime(time, inverted);\n },\n\n // Update volume UI and storage\n updateVolume() {\n if (!this.supported.ui) {\n return;\n }\n\n // Update range\n if (is.element(this.elements.inputs.volume)) {\n controls.setRange.call(this, this.elements.inputs.volume, this.muted ? 0 : this.volume);\n }\n\n // Update mute state\n if (is.element(this.elements.buttons.mute)) {\n this.elements.buttons.mute.pressed = this.muted || this.volume === 0;\n }\n },\n\n // Update seek value and lower fill\n setRange(target, value = 0) {\n if (!is.element(target)) {\n return;\n }\n\n // eslint-disable-next-line\n target.value = value;\n\n // Webkit range fill\n controls.updateRangeFill.call(this, target);\n },\n\n // Update <progress> elements\n updateProgress(event) {\n if (!this.supported.ui || !is.event(event)) {\n return;\n }\n\n let value = 0;\n\n const setProgress = (target, input) => {\n const value = is.number(input) ? input : 0;\n const progress = is.element(target) ? target : this.elements.display.buffer;\n\n // Update value and label\n if (is.element(progress)) {\n progress.value = value;\n\n // Update text label inside\n const label = progress.getElementsByTagName('span')[0];\n if (is.element(label)) {\n label.childNodes[0].nodeValue = value;\n }\n }\n };\n\n if (event) {\n switch (event.type) {\n // Video playing\n case 'timeupdate':\n case 'seeking':\n case 'seeked':\n value = getPercentage(this.currentTime, this.duration);\n\n // Set seek range value only if it's a 'natural' time event\n if (event.type === 'timeupdate') {\n controls.setRange.call(this, this.elements.inputs.seek, value);\n }\n\n break;\n\n // Check buffer status\n case 'playing':\n case 'progress':\n setProgress(this.elements.display.buffer, this.buffered * 100);\n\n break;\n\n default:\n break;\n }\n }\n },\n\n // Webkit polyfill for lower fill range\n updateRangeFill(target) {\n // Get range from event if event passed\n const range = is.event(target) ? target.target : target;\n\n // Needs to be a valid <input type='range'>\n if (!is.element(range) || range.getAttribute('type') !== 'range') {\n return;\n }\n\n // Set aria values for https://github.com/sampotts/plyr/issues/905\n if (matches(range, this.config.selectors.inputs.seek)) {\n range.setAttribute('aria-valuenow', this.currentTime);\n const currentTime = controls.formatTime(this.currentTime);\n const duration = controls.formatTime(this.duration);\n const format = i18n.get('seekLabel', this.config);\n range.setAttribute(\n 'aria-valuetext',\n format.replace('{currentTime}', currentTime).replace('{duration}', duration),\n );\n } else if (matches(range, this.config.selectors.inputs.volume)) {\n const percent = range.value * 100;\n range.setAttribute('aria-valuenow', percent);\n range.setAttribute('aria-valuetext', `${percent}%`);\n } else {\n range.setAttribute('aria-valuenow', range.value);\n }\n\n // WebKit only\n if (!browser.isWebkit) {\n return;\n }\n\n // Set CSS custom property\n range.style.setProperty('--value', `${range.value / range.max * 100}%`);\n },\n\n // Update hover tooltip for seeking\n updateSeekTooltip(event) {\n // Bail if setting not true\n if (\n !this.config.tooltips.seek ||\n !is.element(this.elements.inputs.seek) ||\n !is.element(this.elements.display.seekTooltip) ||\n this.duration === 0\n ) {\n return;\n }\n\n // Calculate percentage\n let percent = 0;\n const clientRect = this.elements.progress.getBoundingClientRect();\n const visible = `${this.config.classNames.tooltip}--visible`;\n\n const toggle = toggle => {\n toggleClass(this.elements.display.seekTooltip, visible, toggle);\n };\n\n // Hide on touch\n if (this.touch) {\n toggle(false);\n return;\n }\n\n // Determine percentage, if already visible\n if (is.event(event)) {\n percent = 100 / clientRect.width * (event.pageX - clientRect.left);\n } else if (hasClass(this.elements.display.seekTooltip, visible)) {\n percent = parseFloat(this.elements.display.seekTooltip.style.left, 10);\n } else {\n return;\n }\n\n // Set bounds\n if (percent < 0) {\n percent = 0;\n } else if (percent > 100) {\n percent = 100;\n }\n\n // Display the time a click would seek to\n controls.updateTimeDisplay.call(this, this.elements.display.seekTooltip, this.duration / 100 * percent);\n\n // Set position\n this.elements.display.seekTooltip.style.left = `${percent}%`;\n\n // Show/hide the tooltip\n // If the event is a moues in/out and percentage is inside bounds\n if (is.event(event) && ['mouseenter', 'mouseleave'].includes(event.type)) {\n toggle(event.type === 'mouseenter');\n }\n },\n\n // Handle time change event\n timeUpdate(event) {\n // Only invert if only one time element is displayed and used for both duration and currentTime\n const invert = !is.element(this.elements.display.duration) && this.config.invertTime;\n\n // Duration\n controls.updateTimeDisplay.call(\n this,\n this.elements.display.currentTime,\n invert ? this.duration - this.currentTime : this.currentTime,\n invert,\n );\n\n // Ignore updates while seeking\n if (event && event.type === 'timeupdate' && this.media.seeking) {\n return;\n }\n\n // Playing progress\n controls.updateProgress.call(this, event);\n },\n\n // Show the duration on metadataloaded or durationchange events\n durationUpdate() {\n // Bail if no UI or durationchange event triggered after playing/seek when invertTime is false\n if (!this.supported.ui || (!this.config.invertTime && this.currentTime)) {\n return;\n }\n\n // Update ARIA values\n if (is.element(this.elements.inputs.seek)) {\n this.elements.inputs.seek.setAttribute('aria-valuemax', this.duration);\n }\n\n // If there's a spot to display duration\n const hasDuration = is.element(this.elements.display.duration);\n\n // If there's only one time display, display duration there\n if (!hasDuration && this.config.displayDuration && this.paused) {\n controls.updateTimeDisplay.call(this, this.elements.display.currentTime, this.duration);\n }\n\n // If there's a duration element, update content\n if (hasDuration) {\n controls.updateTimeDisplay.call(this, this.elements.display.duration, this.duration);\n }\n\n // Update the tooltip (if visible)\n controls.updateSeekTooltip.call(this);\n },\n\n // Hide/show a tab\n toggleTab(setting, toggle) {\n toggleHidden(this.elements.settings.tabs[setting], !toggle);\n },\n\n // Set the quality menu\n setQualityMenu(options) {\n // Menu required\n if (!is.element(this.elements.settings.panes.quality)) {\n return;\n }\n\n const type = 'quality';\n const list = this.elements.settings.panes.quality.querySelector('ul');\n\n // Set options if passed and filter based on uniqueness and config\n if (is.array(options)) {\n this.options.quality = dedupe(options).filter(quality => this.config.quality.options.includes(quality));\n }\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.options.quality) && this.options.quality.length > 1;\n controls.toggleTab.call(this, type, toggle);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If we're hiding, nothing more to do\n if (!toggle) {\n return;\n }\n\n // Empty the menu\n emptyElement(list);\n\n // Get the badge HTML for HD, 4K etc\n const getBadge = quality => {\n const label = i18n.get(`qualityBadge.${quality}`, this.config);\n\n if (!label.length) {\n return null;\n }\n\n return controls.createBadge.call(this, label);\n };\n\n // Sort options by the config and then render options\n this.options.quality\n .sort((a, b) => {\n const sorting = this.config.quality.options;\n return sorting.indexOf(a) > sorting.indexOf(b) ? 1 : -1;\n })\n .forEach(quality => {\n controls.createMenuItem.call(this, {\n value: quality,\n list,\n type,\n title: controls.getLabel.call(this, 'quality', quality),\n badge: getBadge(quality),\n });\n });\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Translate a value into a nice label\n getLabel(setting, value) {\n switch (setting) {\n case 'speed':\n return value === 1 ? i18n.get('normal', this.config) : `${value}&times;`;\n\n case 'quality':\n if (is.number(value)) {\n const label = i18n.get(`qualityLabel.${value}`, this.config);\n\n if (!label.length) {\n return `${value}p`;\n }\n\n return label;\n }\n\n return toTitleCase(value);\n\n case 'captions':\n return captions.getLabel.call(this);\n\n default:\n return null;\n }\n },\n\n // Update the selected setting\n updateSetting(setting, container, input) {\n const pane = this.elements.settings.panes[setting];\n let value = null;\n let list = container;\n\n if (setting === 'captions') {\n value = this.currentTrack;\n } else {\n value = !is.empty(input) ? input : this[setting];\n\n // Get default\n if (is.empty(value)) {\n value = this.config[setting].default;\n }\n\n // Unsupported value\n if (!is.empty(this.options[setting]) && !this.options[setting].includes(value)) {\n this.debug.warn(`Unsupported value of '${value}' for ${setting}`);\n return;\n }\n\n // Disabled value\n if (!this.config[setting].options.includes(value)) {\n this.debug.warn(`Disabled value of '${value}' for ${setting}`);\n return;\n }\n }\n\n // Get the list if we need to\n if (!is.element(list)) {\n list = pane && pane.querySelector('ul');\n }\n\n // If there's no list it means it's not been rendered...\n if (!is.element(list)) {\n return;\n }\n\n // Update the label\n const label = this.elements.settings.tabs[setting].querySelector(`.${this.config.classNames.menu.value}`);\n label.innerHTML = controls.getLabel.call(this, setting, value);\n\n // Find the radio option and check it\n const target = list && list.querySelector(`input[value=\"${value}\"]`);\n\n if (is.element(target)) {\n target.checked = true;\n }\n },\n\n // Set the looping options\n /* setLoopMenu() {\n // Menu required\n if (!is.element(this.elements.settings.panes.loop)) {\n return;\n }\n\n const options = ['start', 'end', 'all', 'reset'];\n const list = this.elements.settings.panes.loop.querySelector('ul');\n\n // Show the pane and tab\n toggleHidden(this.elements.settings.tabs.loop, false);\n toggleHidden(this.elements.settings.panes.loop, false);\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.loop.options);\n controls.toggleTab.call(this, 'loop', toggle);\n\n // Empty the menu\n emptyElement(list);\n\n options.forEach(option => {\n const item = createElement('li');\n\n const button = createElement(\n 'button',\n extend(getAttributesFromSelector(this.config.selectors.buttons.loop), {\n type: 'button',\n class: this.config.classNames.control,\n 'data-plyr-loop-action': option,\n }),\n i18n.get(option, this.config)\n );\n\n if (['start', 'end'].includes(option)) {\n const badge = controls.createBadge.call(this, '00:00');\n button.appendChild(badge);\n }\n\n item.appendChild(button);\n list.appendChild(item);\n });\n }, */\n\n // Get current selected caption language\n // TODO: rework this to user the getter in the API?\n\n // Set a list of available captions languages\n setCaptionsMenu() {\n // TODO: Captions or language? Currently it's mixed\n const type = 'captions';\n const list = this.elements.settings.panes.captions.querySelector('ul');\n const tracks = captions.getTracks.call(this);\n\n // Toggle the pane and tab\n controls.toggleTab.call(this, type, tracks.length);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If there's no captions, bail\n if (!tracks.length) {\n return;\n }\n\n // Generate options data\n const options = tracks.map((track, value) => ({\n value,\n checked: this.captions.toggled && this.currentTrack === value,\n title: captions.getLabel.call(this, track),\n badge: track.language && controls.createBadge.call(this, track.language.toUpperCase()),\n list,\n type: 'language',\n }));\n\n // Add the \"Disabled\" option to turn off captions\n options.unshift({\n value: -1,\n checked: !this.captions.toggled,\n title: i18n.get('disabled', this.config),\n list,\n type: 'language',\n });\n\n // Generate options\n options.forEach(controls.createMenuItem.bind(this));\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Set a list of available captions languages\n setSpeedMenu(options) {\n // Do nothing if not selected\n if (!this.config.controls.includes('settings') || !this.config.settings.includes('speed')) {\n return;\n }\n\n // Menu required\n if (!is.element(this.elements.settings.panes.speed)) {\n return;\n }\n\n const type = 'speed';\n\n // Set the speed options\n if (is.array(options)) {\n this.options.speed = options;\n } else if (this.isHTML5 || this.isVimeo) {\n this.options.speed = [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2];\n }\n\n // Set options if passed and filter based on config\n this.options.speed = this.options.speed.filter(speed => this.config.speed.options.includes(speed));\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.options.speed) && this.options.speed.length > 1;\n controls.toggleTab.call(this, type, toggle);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If we're hiding, nothing more to do\n if (!toggle) {\n return;\n }\n\n // Get the list to populate\n const list = this.elements.settings.panes.speed.querySelector('ul');\n\n // Empty the menu\n emptyElement(list);\n\n // Create items\n this.options.speed.forEach(speed => {\n controls.createMenuItem.call(this, {\n value: speed,\n list,\n type,\n title: controls.getLabel.call(this, 'speed', speed),\n });\n });\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Check if we need to hide/show the settings menu\n checkMenu() {\n const { tabs } = this.elements.settings;\n const visible = !is.empty(tabs) && Object.values(tabs).some(tab => !tab.hidden);\n\n toggleHidden(this.elements.settings.menu, !visible);\n },\n\n // Show/hide menu\n toggleMenu(event) {\n const { form } = this.elements.settings;\n const button = this.elements.buttons.settings;\n\n // Menu and button are required\n if (!is.element(form) || !is.element(button)) {\n return;\n }\n\n const show = is.boolean(event) ? event : is.element(form) && form.hasAttribute('hidden');\n\n if (is.event(event)) {\n const isMenuItem = is.element(form) && form.contains(event.target);\n const isButton = event.target === this.elements.buttons.settings;\n\n // If the click was inside the form or if the click\n // wasn't the button or menu item and we're trying to\n // show the menu (a doc click shouldn't show the menu)\n if (isMenuItem || (!isMenuItem && !isButton && show)) {\n return;\n }\n\n // Prevent the toggle being caught by the doc listener\n if (isButton) {\n event.stopPropagation();\n }\n }\n\n // Set form and button attributes\n if (is.element(button)) {\n button.setAttribute('aria-expanded', show);\n }\n\n if (is.element(form)) {\n toggleHidden(form, !show);\n toggleClass(this.elements.container, this.config.classNames.menu.open, show);\n\n if (show) {\n form.removeAttribute('tabindex');\n } else {\n form.setAttribute('tabindex', -1);\n }\n }\n },\n\n // Get the natural size of a tab\n getTabSize(tab) {\n const clone = tab.cloneNode(true);\n clone.style.position = 'absolute';\n clone.style.opacity = 0;\n clone.removeAttribute('hidden');\n\n // Prevent input's being unchecked due to the name being identical\n Array.from(clone.querySelectorAll('input[name]')).forEach(input => {\n const name = input.getAttribute('name');\n input.setAttribute('name', `${name}-clone`);\n });\n\n // Append to parent so we get the \"real\" size\n tab.parentNode.appendChild(clone);\n\n // Get the sizes before we remove\n const width = clone.scrollWidth;\n const height = clone.scrollHeight;\n\n // Remove from the DOM\n removeElement(clone);\n\n return {\n width,\n height,\n };\n },\n\n // Toggle Menu\n showTab(target = '') {\n const { menu } = this.elements.settings;\n const pane = document.getElementById(target);\n\n // Nothing to show, bail\n if (!is.element(pane)) {\n return;\n }\n\n // Are we targeting a tab? If not, bail\n const isTab = pane.getAttribute('role') === 'tabpanel';\n if (!isTab) {\n return;\n }\n\n // Hide all other tabs\n // Get other tabs\n const current = menu.querySelector('[role=\"tabpanel\"]:not([hidden])');\n const container = current.parentNode;\n\n // Set other toggles to be expanded false\n Array.from(menu.querySelectorAll(`[aria-controls=\"${current.getAttribute('id')}\"]`)).forEach(toggle => {\n toggle.setAttribute('aria-expanded', false);\n });\n\n // If we can do fancy animations, we'll animate the height/width\n if (support.transitions && !support.reducedMotion) {\n // Set the current width as a base\n container.style.width = `${current.scrollWidth}px`;\n container.style.height = `${current.scrollHeight}px`;\n\n // Get potential sizes\n const size = controls.getTabSize.call(this, pane);\n\n // Restore auto height/width\n const restore = e => {\n // We're only bothered about height and width on the container\n if (e.target !== container || !['width', 'height'].includes(e.propertyName)) {\n return;\n }\n\n // Revert back to auto\n container.style.width = '';\n container.style.height = '';\n\n // Only listen once\n off.call(this, container, transitionEndEvent, restore);\n };\n\n // Listen for the transition finishing and restore auto height/width\n on.call(this, container, transitionEndEvent, restore);\n\n // Set dimensions to target\n container.style.width = `${size.width}px`;\n container.style.height = `${size.height}px`;\n }\n\n // Set attributes on current tab\n toggleHidden(current, true);\n current.setAttribute('tabindex', -1);\n\n // Set attributes on target\n toggleHidden(pane, false);\n\n const tabs = getElements.call(this, `[aria-controls=\"${target}\"]`);\n Array.from(tabs).forEach(tab => {\n tab.setAttribute('aria-expanded', true);\n });\n pane.removeAttribute('tabindex');\n\n // Focus the first item\n pane.querySelectorAll('button:not(:disabled), input:not(:disabled), [tabindex]')[0].focus();\n },\n\n // Build the default HTML\n // TODO: Set order based on order in the config.controls array?\n create(data) {\n // Do nothing if we want no controls\n if (is.empty(this.config.controls)) {\n return null;\n }\n\n // Create the container\n const container = createElement('div', getAttributesFromSelector(this.config.selectors.controls.wrapper));\n\n // Restart button\n if (this.config.controls.includes('restart')) {\n container.appendChild(controls.createButton.call(this, 'restart'));\n }\n\n // Rewind button\n if (this.config.controls.includes('rewind')) {\n container.appendChild(controls.createButton.call(this, 'rewind'));\n }\n\n // Play/Pause button\n if (this.config.controls.includes('play')) {\n container.appendChild(controls.createButton.call(this, 'play'));\n }\n\n // Fast forward button\n if (this.config.controls.includes('fast-forward')) {\n container.appendChild(controls.createButton.call(this, 'fast-forward'));\n }\n\n // Progress\n if (this.config.controls.includes('progress')) {\n const progress = createElement('div', getAttributesFromSelector(this.config.selectors.progress));\n\n // Seek range slider\n progress.appendChild(\n controls.createRange.call(this, 'seek', {\n id: `plyr-seek-${data.id}`,\n }),\n );\n\n // Buffer progress\n progress.appendChild(controls.createProgress.call(this, 'buffer'));\n\n // TODO: Add loop display indicator\n\n // Seek tooltip\n if (this.config.tooltips.seek) {\n const tooltip = createElement(\n 'span',\n {\n class: this.config.classNames.tooltip,\n },\n '00:00',\n );\n\n progress.appendChild(tooltip);\n this.elements.display.seekTooltip = tooltip;\n }\n\n this.elements.progress = progress;\n container.appendChild(this.elements.progress);\n }\n\n // Media current time display\n if (this.config.controls.includes('current-time')) {\n container.appendChild(controls.createTime.call(this, 'currentTime'));\n }\n\n // Media duration display\n if (this.config.controls.includes('duration')) {\n container.appendChild(controls.createTime.call(this, 'duration'));\n }\n\n // Toggle mute button\n if (this.config.controls.includes('mute')) {\n container.appendChild(controls.createButton.call(this, 'mute'));\n }\n\n // Volume range control\n if (this.config.controls.includes('volume')) {\n const volume = createElement('div', {\n class: 'plyr__volume',\n });\n\n // Set the attributes\n const attributes = {\n max: 1,\n step: 0.05,\n value: this.config.volume,\n };\n\n // Create the volume range slider\n volume.appendChild(\n controls.createRange.call(\n this,\n 'volume',\n extend(attributes, {\n id: `plyr-volume-${data.id}`,\n }),\n ),\n );\n\n this.elements.volume = volume;\n\n container.appendChild(volume);\n }\n\n // Toggle captions button\n if (this.config.controls.includes('captions')) {\n container.appendChild(controls.createButton.call(this, 'captions'));\n }\n\n // Settings button / menu\n if (this.config.controls.includes('settings') && !is.empty(this.config.settings)) {\n const menu = createElement('div', {\n class: 'plyr__menu',\n hidden: '',\n });\n\n menu.appendChild(\n controls.createButton.call(this, 'settings', {\n id: `plyr-settings-toggle-${data.id}`,\n 'aria-haspopup': true,\n 'aria-controls': `plyr-settings-${data.id}`,\n 'aria-expanded': false,\n }),\n );\n\n const form = createElement('form', {\n class: 'plyr__menu__container',\n id: `plyr-settings-${data.id}`,\n hidden: '',\n 'aria-labelled-by': `plyr-settings-toggle-${data.id}`,\n role: 'tablist',\n tabindex: -1,\n });\n\n const inner = createElement('div');\n\n const home = createElement('div', {\n id: `plyr-settings-${data.id}-home`,\n 'aria-labelled-by': `plyr-settings-toggle-${data.id}`,\n role: 'tabpanel',\n });\n\n // Create the tab list\n const tabs = createElement('ul', {\n role: 'tablist',\n });\n\n // Build the tabs\n this.config.settings.forEach(type => {\n const tab = createElement('li', {\n role: 'tab',\n hidden: '',\n });\n\n const button = createElement(\n 'button',\n extend(getAttributesFromSelector(this.config.selectors.buttons.settings), {\n type: 'button',\n class: `${this.config.classNames.control} ${this.config.classNames.control}--forward`,\n id: `plyr-settings-${data.id}-${type}-tab`,\n 'aria-haspopup': true,\n 'aria-controls': `plyr-settings-${data.id}-${type}`,\n 'aria-expanded': false,\n }),\n i18n.get(type, this.config),\n );\n\n const value = createElement('span', {\n class: this.config.classNames.menu.value,\n });\n\n // Speed contains HTML entities\n value.innerHTML = data[type];\n\n button.appendChild(value);\n tab.appendChild(button);\n tabs.appendChild(tab);\n\n this.elements.settings.tabs[type] = tab;\n });\n\n home.appendChild(tabs);\n inner.appendChild(home);\n\n // Build the panes\n this.config.settings.forEach(type => {\n const pane = createElement('div', {\n id: `plyr-settings-${data.id}-${type}`,\n hidden: '',\n 'aria-labelled-by': `plyr-settings-${data.id}-${type}-tab`,\n role: 'tabpanel',\n tabindex: -1,\n });\n\n const back = createElement(\n 'button',\n {\n type: 'button',\n class: `${this.config.classNames.control} ${this.config.classNames.control}--back`,\n 'aria-haspopup': true,\n 'aria-controls': `plyr-settings-${data.id}-home`,\n 'aria-expanded': false,\n },\n i18n.get(type, this.config),\n );\n\n pane.appendChild(back);\n\n const options = createElement('ul');\n\n pane.appendChild(options);\n inner.appendChild(pane);\n\n this.elements.settings.panes[type] = pane;\n });\n\n form.appendChild(inner);\n menu.appendChild(form);\n container.appendChild(menu);\n\n this.elements.settings.form = form;\n this.elements.settings.menu = menu;\n }\n\n // Picture in picture button\n if (this.config.controls.includes('pip') && support.pip) {\n container.appendChild(controls.createButton.call(this, 'pip'));\n }\n\n // Airplay button\n if (this.config.controls.includes('airplay') && support.airplay) {\n container.appendChild(controls.createButton.call(this, 'airplay'));\n }\n\n // Toggle fullscreen button\n if (this.config.controls.includes('fullscreen')) {\n container.appendChild(controls.createButton.call(this, 'fullscreen'));\n }\n\n // Larger overlaid play button\n if (this.config.controls.includes('play-large')) {\n this.elements.container.appendChild(controls.createButton.call(this, 'play-large'));\n }\n\n this.elements.controls = container;\n\n if (this.isHTML5) {\n controls.setQualityMenu.call(this, html5.getQualityOptions.call(this));\n }\n\n controls.setSpeedMenu.call(this);\n\n return container;\n },\n\n // Insert controls\n inject() {\n // Sprite\n if (this.config.loadSprite) {\n const icon = controls.getIconUrl.call(this);\n\n // Only load external sprite using AJAX\n if (icon.cors) {\n loadSprite(icon.url, 'sprite-plyr');\n }\n }\n\n // Create a unique ID\n this.id = Math.floor(Math.random() * 10000);\n\n // Null by default\n let container = null;\n this.elements.controls = null;\n\n // Set template properties\n const props = {\n id: this.id,\n seektime: this.config.seekTime,\n title: this.config.title,\n };\n let update = true;\n\n if (is.string(this.config.controls) || is.element(this.config.controls)) {\n // String or HTMLElement passed as the option\n container = this.config.controls;\n } else if (is.function(this.config.controls)) {\n // A custom function to build controls\n // The function can return a HTMLElement or String\n container = this.config.controls.call(this, props);\n } else {\n // Create controls\n container = controls.create.call(this, {\n id: this.id,\n seektime: this.config.seekTime,\n speed: this.speed,\n quality: this.quality,\n captions: captions.getLabel.call(this),\n // TODO: Looping\n // loop: 'None',\n });\n update = false;\n }\n\n // Replace props with their value\n const replace = input => {\n let result = input;\n\n Object.entries(props).forEach(([key, value]) => {\n result = replaceAll(result, `{${key}}`, value);\n });\n\n return result;\n };\n\n // Update markup\n if (update) {\n if (is.string(this.config.controls)) {\n container = replace(container);\n } else if (is.element(container)) {\n container.innerHTML = replace(container.innerHTML);\n }\n }\n\n // Controls container\n let target;\n\n // Inject to custom location\n if (is.string(this.config.selectors.controls.container)) {\n target = document.querySelector(this.config.selectors.controls.container);\n }\n\n // Inject into the container by default\n if (!is.element(target)) {\n target = this.elements.container;\n }\n\n // Inject controls HTML\n if (is.element(container)) {\n target.appendChild(container);\n } else if (container) {\n target.insertAdjacentHTML('beforeend', container);\n }\n\n // Find the elements if need be\n if (!is.element(this.elements.controls)) {\n controls.findElements.call(this);\n }\n\n // Edge sometimes doesn't finish the paint so force a redraw\n if (window.navigator.userAgent.includes('Edge')) {\n repaint(target);\n }\n\n // Setup tooltips\n if (this.config.tooltips.controls) {\n const { classNames, selectors } = this.config;\n const selector = `${selectors.controls.wrapper} ${selectors.labels} .${classNames.hidden}`;\n const labels = getElements.call(this, selector);\n\n Array.from(labels).forEach(label => {\n toggleClass(label, this.config.classNames.hidden, false);\n toggleClass(label, this.config.classNames.tooltip, true);\n });\n }\n },\n};\n\nexport default controls;\n","// ==========================================================================\n// Fetch wrapper\n// Using XHR to avoid issues with older browsers\n// ==========================================================================\n\nexport default function fetch(url, responseType = 'text') {\n return new Promise((resolve, reject) => {\n try {\n const request = new XMLHttpRequest();\n\n // Check for CORS support\n if (!('withCredentials' in request)) {\n return;\n }\n\n request.addEventListener('load', () => {\n if (responseType === 'text') {\n try {\n resolve(JSON.parse(request.responseText));\n } catch (e) {\n resolve(request.responseText);\n }\n } else {\n resolve(request.response);\n }\n });\n\n request.addEventListener('error', () => {\n throw new Error(request.statusText);\n });\n\n request.open('GET', url, true);\n\n // Set the required response type\n request.responseType = responseType;\n\n request.send();\n } catch (e) {\n reject(e);\n }\n });\n}\n","// ==========================================================================\n// URL utils\n// ==========================================================================\n\nimport is from './is';\n\n/**\n * Parse a string to a URL object\n * @param {string} input - the URL to be parsed\n * @param {boolean} safe - failsafe parsing\n */\nexport function parseUrl(input, safe = true) {\n let url = input;\n\n if (safe) {\n const parser = document.createElement('a');\n parser.href = url;\n url = parser.href;\n }\n\n try {\n return new URL(url);\n } catch (e) {\n return null;\n }\n}\n\n// Convert object to URLSearchParams\nexport function buildUrlParams(input) {\n const params = new URLSearchParams();\n\n if (is.object(input)) {\n Object.entries(input).forEach(([key, value]) => {\n params.set(key, value);\n });\n }\n\n return params;\n}\n","// ==========================================================================\n// Plyr Captions\n// TODO: Create as class\n// ==========================================================================\n\nimport controls from './controls';\nimport i18n from './i18n';\nimport support from './support';\nimport { dedupe } from './utils/arrays';\nimport browser from './utils/browser';\nimport {\n createElement,\n emptyElement,\n getAttributesFromSelector,\n insertAfter,\n removeElement,\n toggleClass,\n} from './utils/elements';\nimport { on, triggerEvent } from './utils/events';\nimport fetch from './utils/fetch';\nimport is from './utils/is';\nimport { getHTML } from './utils/strings';\nimport { parseUrl } from './utils/urls';\n\nconst captions = {\n // Setup captions\n setup() {\n // Requires UI support\n if (!this.supported.ui) {\n return;\n }\n\n // Only Vimeo and HTML5 video supported at this point\n if (!this.isVideo || this.isYouTube || (this.isHTML5 && !support.textTracks)) {\n // Clear menu and hide\n if (\n is.array(this.config.controls) &&\n this.config.controls.includes('settings') &&\n this.config.settings.includes('captions')\n ) {\n controls.setCaptionsMenu.call(this);\n }\n\n return;\n }\n\n // Inject the container\n if (!is.element(this.elements.captions)) {\n this.elements.captions = createElement('div', getAttributesFromSelector(this.config.selectors.captions));\n\n insertAfter(this.elements.captions, this.elements.wrapper);\n }\n\n // Fix IE captions if CORS is used\n // Fetch captions and inject as blobs instead (data URIs not supported!)\n if (browser.isIE && window.URL) {\n const elements = this.media.querySelectorAll('track');\n\n Array.from(elements).forEach(track => {\n const src = track.getAttribute('src');\n const url = parseUrl(src);\n\n if (\n url !== null &&\n url.hostname !== window.location.href.hostname &&\n ['http:', 'https:'].includes(url.protocol)\n ) {\n fetch(src, 'blob')\n .then(blob => {\n track.setAttribute('src', window.URL.createObjectURL(blob));\n })\n .catch(() => {\n removeElement(track);\n });\n }\n });\n }\n\n // Get and set initial data\n // The \"preferred\" options are not realized unless / until the wanted language has a match\n // * languages: Array of user's browser languages.\n // * language: The language preferred by user settings or config\n // * active: The state preferred by user settings or config\n // * toggled: The real captions state\n\n const languages = dedupe(\n Array.from(navigator.languages || navigator.userLanguage).map(language => language.split('-')[0]),\n );\n\n let language = (this.storage.get('language') || this.config.captions.language || 'auto').toLowerCase();\n\n // Use first browser language when language is 'auto'\n if (language === 'auto') {\n [language] = languages;\n }\n\n let active = this.storage.get('captions');\n if (!is.boolean(active)) {\n ({ active } = this.config.captions);\n }\n\n Object.assign(this.captions, {\n toggled: false,\n active,\n language,\n languages,\n });\n\n // Watch changes to textTracks and update captions menu\n if (this.isHTML5) {\n const trackEvents = this.config.captions.update ? 'addtrack removetrack' : 'removetrack';\n on.call(this, this.media.textTracks, trackEvents, captions.update.bind(this));\n }\n\n // Update available languages in list next tick (the event must not be triggered before the listeners)\n setTimeout(captions.update.bind(this), 0);\n },\n\n // Update available language options in settings based on tracks\n update() {\n const tracks = captions.getTracks.call(this, true);\n // Get the wanted language\n const { active, language, meta, currentTrackNode } = this.captions;\n const languageExists = Boolean(tracks.find(track => track.language === language));\n\n // Handle tracks (add event listener and \"pseudo\"-default)\n if (this.isHTML5 && this.isVideo) {\n tracks.filter(track => !meta.get(track)).forEach(track => {\n this.debug.log('Track added', track);\n // Attempt to store if the original dom element was \"default\"\n meta.set(track, {\n default: track.mode === 'showing',\n });\n\n // Turn off native caption rendering to avoid double captions\n track.mode = 'hidden';\n\n // Add event listener for cue changes\n on.call(this, track, 'cuechange', () => captions.updateCues.call(this));\n });\n }\n\n // Update language first time it matches, or if the previous matching track was removed\n if ((languageExists && this.language !== language) || !tracks.includes(currentTrackNode)) {\n captions.setLanguage.call(this, language);\n captions.toggle.call(this, active && languageExists);\n }\n\n // Enable or disable captions based on track length\n toggleClass(this.elements.container, this.config.classNames.captions.enabled, !is.empty(tracks));\n\n // Update available languages in list\n if ((this.config.controls || []).includes('settings') && this.config.settings.includes('captions')) {\n controls.setCaptionsMenu.call(this);\n }\n },\n\n // Toggle captions display\n // Used internally for the toggleCaptions method, with the passive option forced to false\n toggle(input, passive = true) {\n // If there's no full support\n if (!this.supported.ui) {\n return;\n }\n\n const { toggled } = this.captions; // Current state\n const activeClass = this.config.classNames.captions.active;\n\n // Get the next state\n // If the method is called without parameter, toggle based on current value\n const active = is.nullOrUndefined(input) ? !toggled : input;\n\n // Update state and trigger event\n if (active !== toggled) {\n // When passive, don't override user preferences\n if (!passive) {\n this.captions.active = active;\n this.storage.set({ captions: active });\n }\n\n // Force language if the call isn't passive and there is no matching language to toggle to\n if (!this.language && active && !passive) {\n const tracks = captions.getTracks.call(this);\n const track = captions.findTrack.call(this, [this.captions.language, ...this.captions.languages], true);\n\n // Override user preferences to avoid switching languages if a matching track is added\n this.captions.language = track.language;\n\n // Set caption, but don't store in localStorage as user preference\n captions.set.call(this, tracks.indexOf(track));\n return;\n }\n\n // Toggle state\n this.elements.buttons.captions.pressed = active;\n\n // Add class hook\n toggleClass(this.elements.container, activeClass, active);\n\n this.captions.toggled = active;\n\n // Update settings menu\n controls.updateSetting.call(this, 'captions');\n\n // Trigger event (not used internally)\n triggerEvent.call(this, this.media, active ? 'captionsenabled' : 'captionsdisabled');\n }\n },\n\n // Set captions by track index\n // Used internally for the currentTrack setter with the passive option forced to false\n set(index, passive = true) {\n const tracks = captions.getTracks.call(this);\n\n // Disable captions if setting to -1\n if (index === -1) {\n captions.toggle.call(this, false, passive);\n return;\n }\n\n if (!is.number(index)) {\n this.debug.warn('Invalid caption argument', index);\n return;\n }\n\n if (!(index in tracks)) {\n this.debug.warn('Track not found', index);\n return;\n }\n\n if (this.captions.currentTrack !== index) {\n this.captions.currentTrack = index;\n const track = tracks[index];\n const { language } = track || {};\n\n // Store reference to node for invalidation on remove\n this.captions.currentTrackNode = track;\n\n // Update settings menu\n controls.updateSetting.call(this, 'captions');\n\n // When passive, don't override user preferences\n if (!passive) {\n this.captions.language = language;\n this.storage.set({ language });\n }\n\n // Handle Vimeo captions\n if (this.isVimeo) {\n this.embed.enableTextTrack(language);\n }\n\n // Trigger event\n triggerEvent.call(this, this.media, 'languagechange');\n }\n\n // Show captions\n captions.toggle.call(this, true, passive);\n\n if (this.isHTML5 && this.isVideo) {\n // If we change the active track while a cue is already displayed we need to update it\n captions.updateCues.call(this);\n }\n },\n\n // Set captions by language\n // Used internally for the language setter with the passive option forced to false\n setLanguage(input, passive = true) {\n if (!is.string(input)) {\n this.debug.warn('Invalid language argument', input);\n return;\n }\n // Normalize\n const language = input.toLowerCase();\n this.captions.language = language;\n\n // Set currentTrack\n const tracks = captions.getTracks.call(this);\n const track = captions.findTrack.call(this, [language]);\n captions.set.call(this, tracks.indexOf(track), passive);\n },\n\n // Get current valid caption tracks\n // If update is false it will also ignore tracks without metadata\n // This is used to \"freeze\" the language options when captions.update is false\n getTracks(update = false) {\n // Handle media or textTracks missing or null\n const tracks = Array.from((this.media || {}).textTracks || []);\n // For HTML5, use cache instead of current tracks when it exists (if captions.update is false)\n // Filter out removed tracks and tracks that aren't captions/subtitles (for example metadata)\n return tracks\n .filter(track => !this.isHTML5 || update || this.captions.meta.has(track))\n .filter(track => ['captions', 'subtitles'].includes(track.kind));\n },\n\n // Match tracks based on languages and get the first\n findTrack(languages, force = false) {\n const tracks = captions.getTracks.call(this);\n const sortIsDefault = track => Number((this.captions.meta.get(track) || {}).default);\n const sorted = Array.from(tracks).sort((a, b) => sortIsDefault(b) - sortIsDefault(a));\n let track;\n languages.every(language => {\n track = sorted.find(track => track.language === language);\n return !track; // Break iteration if there is a match\n });\n // If no match is found but is required, get first\n return track || (force ? sorted[0] : undefined);\n },\n\n // Get the current track\n getCurrentTrack() {\n return captions.getTracks.call(this)[this.currentTrack];\n },\n\n // Get UI label for track\n getLabel(track) {\n let currentTrack = track;\n\n if (!is.track(currentTrack) && support.textTracks && this.captions.toggled) {\n currentTrack = captions.getCurrentTrack.call(this);\n }\n\n if (is.track(currentTrack)) {\n if (!is.empty(currentTrack.label)) {\n return currentTrack.label;\n }\n\n if (!is.empty(currentTrack.language)) {\n return track.language.toUpperCase();\n }\n\n return i18n.get('enabled', this.config);\n }\n\n return i18n.get('disabled', this.config);\n },\n\n // Update captions using current track's active cues\n // Also optional array argument in case there isn't any track (ex: vimeo)\n updateCues(input) {\n // Requires UI\n if (!this.supported.ui) {\n return;\n }\n\n if (!is.element(this.elements.captions)) {\n this.debug.warn('No captions element to render to');\n return;\n }\n\n // Only accept array or empty input\n if (!is.nullOrUndefined(input) && !Array.isArray(input)) {\n this.debug.warn('updateCues: Invalid input', input);\n return;\n }\n\n let cues = input;\n\n // Get cues from track\n if (!cues) {\n const track = captions.getCurrentTrack.call(this);\n cues = Array.from((track || {}).activeCues || [])\n .map(cue => cue.getCueAsHTML())\n .map(getHTML);\n }\n\n // Set new caption text\n const content = cues.map(cueText => cueText.trim()).join('\\n');\n const changed = content !== this.elements.captions.innerHTML;\n\n if (changed) {\n // Empty the container and create a new child element\n emptyElement(this.elements.captions);\n const caption = createElement('span', getAttributesFromSelector(this.config.selectors.caption));\n caption.innerHTML = content;\n this.elements.captions.appendChild(caption);\n\n // Trigger event\n triggerEvent.call(this, this.media, 'cuechange');\n }\n },\n};\n\nexport default captions;\n","// ==========================================================================\n// Plyr default config\n// ==========================================================================\n\nconst defaults = {\n // Disable\n enabled: true,\n\n // Custom media title\n title: '',\n\n // Logging to console\n debug: false,\n\n // Auto play (if supported)\n autoplay: false,\n\n // Only allow one media playing at once (vimeo only)\n autopause: true,\n\n // Allow inline playback on iOS (this effects YouTube/Vimeo - HTML5 requires the attribute present)\n // TODO: Remove iosNative fullscreen option in favour of this (logic needs work)\n playsinline: true,\n\n // Default time to skip when rewind/fast forward\n seekTime: 10,\n\n // Default volume\n volume: 1,\n muted: false,\n\n // Pass a custom duration\n duration: null,\n\n // Display the media duration on load in the current time position\n // If you have opted to display both duration and currentTime, this is ignored\n displayDuration: true,\n\n // Invert the current time to be a countdown\n invertTime: true,\n\n // Clicking the currentTime inverts it's value to show time left rather than elapsed\n toggleInvert: true,\n\n // Aspect ratio (for embeds)\n ratio: '16:9',\n\n // Click video container to play/pause\n clickToPlay: true,\n\n // Auto hide the controls\n hideControls: true,\n\n // Reset to start when playback ended\n resetOnEnd: false,\n\n // Disable the standard context menu\n disableContextMenu: true,\n\n // Sprite (for icons)\n loadSprite: true,\n iconPrefix: 'plyr',\n iconUrl: 'https://cdn.plyr.io/3.3.12/plyr.svg',\n\n // Blank video (used to prevent errors on source change)\n blankVideo: 'https://cdn.plyr.io/static/blank.mp4',\n\n // Quality default\n quality: {\n default: 576,\n options: [\n 4320,\n 2880,\n 2160,\n 1440,\n 1080,\n 720,\n 576,\n 480,\n 360,\n 240,\n 'default', // YouTube's \"auto\"\n ],\n },\n\n // Set loops\n loop: {\n active: false,\n // start: null,\n // end: null,\n },\n\n // Speed default and options to display\n speed: {\n selected: 1,\n options: [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2],\n },\n\n // Keyboard shortcut settings\n keyboard: {\n focused: true,\n global: false,\n },\n\n // Display tooltips\n tooltips: {\n controls: false,\n seek: true,\n },\n\n // Captions settings\n captions: {\n active: false,\n language: 'auto',\n // Listen to new tracks added after Plyr is initialized.\n // This is needed for streaming captions, but may result in unselectable options\n update: false,\n },\n\n // Fullscreen settings\n fullscreen: {\n enabled: true, // Allow fullscreen?\n fallback: true, // Fallback for vintage browsers\n iosNative: false, // Use the native fullscreen in iOS (disables custom controls)\n },\n\n // Local storage\n storage: {\n enabled: true,\n key: 'plyr',\n },\n\n // Default controls\n controls: [\n 'play-large',\n // 'restart',\n // 'rewind',\n 'play',\n // 'fast-forward',\n 'progress',\n 'current-time',\n 'mute',\n 'volume',\n 'captions',\n 'settings',\n 'pip',\n 'airplay',\n 'fullscreen',\n ],\n settings: ['captions', 'quality', 'speed'],\n\n // Localisation\n i18n: {\n restart: 'Restart',\n rewind: 'Rewind {seektime}s',\n play: 'Play',\n pause: 'Pause',\n fastForward: 'Forward {seektime}s',\n seek: 'Seek',\n seekLabel: '{currentTime} of {duration}',\n played: 'Played',\n buffered: 'Buffered',\n currentTime: 'Current time',\n duration: 'Duration',\n volume: 'Volume',\n mute: 'Mute',\n unmute: 'Unmute',\n enableCaptions: 'Enable captions',\n disableCaptions: 'Disable captions',\n enterFullscreen: 'Enter fullscreen',\n exitFullscreen: 'Exit fullscreen',\n frameTitle: 'Player for {title}',\n captions: 'Captions',\n settings: 'Settings',\n menuBack: 'Go back to previous menu',\n speed: 'Speed',\n normal: 'Normal',\n quality: 'Quality',\n loop: 'Loop',\n start: 'Start',\n end: 'End',\n all: 'All',\n reset: 'Reset',\n disabled: 'Disabled',\n enabled: 'Enabled',\n advertisement: 'Ad',\n qualityBadge: {\n 2160: '4K',\n 1440: 'HD',\n 1080: 'HD',\n 720: 'HD',\n 576: 'SD',\n 480: 'SD',\n },\n },\n\n // URLs\n urls: {\n vimeo: {\n sdk: 'https://player.vimeo.com/api/player.js',\n iframe: 'https://player.vimeo.com/video/{0}?{1}',\n api: 'https://vimeo.com/api/v2/video/{0}.json',\n },\n youtube: {\n sdk: 'https://www.youtube.com/iframe_api',\n api:\n 'https://www.googleapis.com/youtube/v3/videos?id={0}&key={1}&fields=items(snippet(title))&part=snippet',\n },\n googleIMA: {\n sdk: 'https://imasdk.googleapis.com/js/sdkloader/ima3.js',\n },\n },\n\n // Custom control listeners\n listeners: {\n seek: null,\n play: null,\n pause: null,\n restart: null,\n rewind: null,\n fastForward: null,\n mute: null,\n volume: null,\n captions: null,\n fullscreen: null,\n pip: null,\n airplay: null,\n speed: null,\n quality: null,\n loop: null,\n language: null,\n },\n\n // Events to watch and bubble\n events: [\n // Events to watch on HTML5 media elements and bubble\n // https://developer.mozilla.org/en/docs/Web/Guide/Events/Media_events\n 'ended',\n 'progress',\n 'stalled',\n 'playing',\n 'waiting',\n 'canplay',\n 'canplaythrough',\n 'loadstart',\n 'loadeddata',\n 'loadedmetadata',\n 'timeupdate',\n 'volumechange',\n 'play',\n 'pause',\n 'error',\n 'seeking',\n 'seeked',\n 'emptied',\n 'ratechange',\n 'cuechange',\n\n // Custom events\n 'enterfullscreen',\n 'exitfullscreen',\n 'captionsenabled',\n 'captionsdisabled',\n 'languagechange',\n 'controlshidden',\n 'controlsshown',\n 'ready',\n\n // YouTube\n 'statechange',\n 'qualitychange',\n 'qualityrequested',\n\n // Ads\n 'adsloaded',\n 'adscontentpause',\n 'adscontentresume',\n 'adstarted',\n 'adsmidpoint',\n 'adscomplete',\n 'adsallcomplete',\n 'adsimpression',\n 'adsclick',\n ],\n\n // Selectors\n // Change these to match your template if using custom HTML\n selectors: {\n editable: 'input, textarea, select, [contenteditable]',\n container: '.plyr',\n controls: {\n container: null,\n wrapper: '.plyr__controls',\n },\n labels: '[data-plyr]',\n buttons: {\n play: '[data-plyr=\"play\"]',\n pause: '[data-plyr=\"pause\"]',\n restart: '[data-plyr=\"restart\"]',\n rewind: '[data-plyr=\"rewind\"]',\n fastForward: '[data-plyr=\"fast-forward\"]',\n mute: '[data-plyr=\"mute\"]',\n captions: '[data-plyr=\"captions\"]',\n fullscreen: '[data-plyr=\"fullscreen\"]',\n pip: '[data-plyr=\"pip\"]',\n airplay: '[data-plyr=\"airplay\"]',\n settings: '[data-plyr=\"settings\"]',\n loop: '[data-plyr=\"loop\"]',\n },\n inputs: {\n seek: '[data-plyr=\"seek\"]',\n volume: '[data-plyr=\"volume\"]',\n speed: '[data-plyr=\"speed\"]',\n language: '[data-plyr=\"language\"]',\n quality: '[data-plyr=\"quality\"]',\n },\n display: {\n currentTime: '.plyr__time--current',\n duration: '.plyr__time--duration',\n buffer: '.plyr__progress__buffer',\n loop: '.plyr__progress__loop', // Used later\n volume: '.plyr__volume--display',\n },\n progress: '.plyr__progress',\n captions: '.plyr__captions',\n caption: '.plyr__caption',\n menu: {\n quality: '.js-plyr__menu__list--quality',\n },\n },\n\n // Class hooks added to the player in different states\n classNames: {\n type: 'plyr--{0}',\n provider: 'plyr--{0}',\n video: 'plyr__video-wrapper',\n embed: 'plyr__video-embed',\n embedContainer: 'plyr__video-embed__container',\n poster: 'plyr__poster',\n posterEnabled: 'plyr__poster-enabled',\n ads: 'plyr__ads',\n control: 'plyr__control',\n controlPressed: 'plyr__control--pressed',\n playing: 'plyr--playing',\n paused: 'plyr--paused',\n stopped: 'plyr--stopped',\n loading: 'plyr--loading',\n hover: 'plyr--hover',\n tooltip: 'plyr__tooltip',\n cues: 'plyr__cues',\n hidden: 'plyr__sr-only',\n hideControls: 'plyr--hide-controls',\n isIos: 'plyr--is-ios',\n isTouch: 'plyr--is-touch',\n uiSupported: 'plyr--full-ui',\n noTransition: 'plyr--no-transition',\n menu: {\n value: 'plyr__menu__value',\n badge: 'plyr__badge',\n open: 'plyr--menu-open',\n },\n captions: {\n enabled: 'plyr--captions-enabled',\n active: 'plyr--captions-active',\n },\n fullscreen: {\n enabled: 'plyr--fullscreen-enabled',\n fallback: 'plyr--fullscreen-fallback',\n },\n pip: {\n supported: 'plyr--pip-supported',\n active: 'plyr--pip-active',\n },\n airplay: {\n supported: 'plyr--airplay-supported',\n active: 'plyr--airplay-active',\n },\n tabFocus: 'plyr__tab-focus',\n },\n\n // Embed attributes\n attributes: {\n embed: {\n provider: 'data-plyr-provider',\n id: 'data-plyr-embed-id',\n },\n },\n\n // API keys\n keys: {\n google: null,\n },\n\n // Advertisements plugin\n // Register for an account here: http://vi.ai/publisher-video-monetization/?aid=plyrio\n ads: {\n enabled: false,\n publisherId: '',\n },\n};\n\nexport default defaults;\n","// ==========================================================================\n// Plyr supported types and providers\n// ==========================================================================\n\nexport const providers = {\n html5: 'html5',\n youtube: 'youtube',\n vimeo: 'vimeo',\n};\n\nexport const types = {\n audio: 'audio',\n video: 'video',\n};\n\n/**\n * Get provider by URL\n * @param {string} url\n */\nexport function getProviderByUrl(url) {\n // YouTube\n if (/^(https?:\\/\\/)?(www\\.)?(youtube\\.com|youtu\\.?be)\\/.+$/.test(url)) {\n return providers.youtube;\n }\n\n // Vimeo\n if (/^https?:\\/\\/player.vimeo.com\\/video\\/\\d{0,9}(?=\\b|\\/)/.test(url)) {\n return providers.vimeo;\n }\n\n return null;\n}\n\nexport default { providers, types };\n","// ==========================================================================\n// Console wrapper\n// ==========================================================================\n\nconst noop = () => {};\n\nexport default class Console {\n constructor(enabled = false) {\n this.enabled = window.console && enabled;\n\n if (this.enabled) {\n this.log('Debugging enabled');\n }\n }\n\n get log() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.log, console) : noop;\n }\n get warn() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.warn, console) : noop;\n }\n get error() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.error, console) : noop;\n }\n}\n","// ==========================================================================\n// Fullscreen wrapper\n// https://developer.mozilla.org/en-US/docs/Web/API/Fullscreen_API#prefixing\n// ==========================================================================\n\nimport browser from './utils/browser';\nimport { hasClass, toggleClass, trapFocus } from './utils/elements';\nimport { on, triggerEvent } from './utils/events';\nimport is from './utils/is';\n\nfunction onChange() {\n if (!this.enabled) {\n return;\n }\n\n // Update toggle button\n const button = this.player.elements.buttons.fullscreen;\n if (is.element(button)) {\n button.pressed = this.active;\n }\n\n // Trigger an event\n triggerEvent.call(this.player, this.target, this.active ? 'enterfullscreen' : 'exitfullscreen', true);\n\n // Trap focus in container\n if (!browser.isIos) {\n trapFocus.call(this.player, this.target, this.active);\n }\n}\n\nfunction toggleFallback(toggle = false) {\n // Store or restore scroll position\n if (toggle) {\n this.scrollPosition = {\n x: window.scrollX || 0,\n y: window.scrollY || 0,\n };\n } else {\n window.scrollTo(this.scrollPosition.x, this.scrollPosition.y);\n }\n\n // Toggle scroll\n document.body.style.overflow = toggle ? 'hidden' : '';\n\n // Toggle class hook\n toggleClass(this.target, this.player.config.classNames.fullscreen.fallback, toggle);\n\n // Toggle button and fire events\n onChange.call(this);\n}\n\nclass Fullscreen {\n constructor(player) {\n // Keep reference to parent\n this.player = player;\n\n // Get prefix\n this.prefix = Fullscreen.prefix;\n this.property = Fullscreen.property;\n\n // Scroll position\n this.scrollPosition = { x: 0, y: 0 };\n\n // Register event listeners\n // Handle event (incase user presses escape etc)\n on.call(\n this.player,\n document,\n this.prefix === 'ms' ? 'MSFullscreenChange' : `${this.prefix}fullscreenchange`,\n () => {\n // TODO: Filter for target??\n onChange.call(this);\n },\n );\n\n // Fullscreen toggle on double click\n on.call(this.player, this.player.elements.container, 'dblclick', event => {\n // Ignore double click in controls\n if (is.element(this.player.elements.controls) && this.player.elements.controls.contains(event.target)) {\n return;\n }\n\n this.toggle();\n });\n\n // Update the UI\n this.update();\n }\n\n // Determine if native supported\n static get native() {\n return !!(\n document.fullscreenEnabled ||\n document.webkitFullscreenEnabled ||\n document.mozFullScreenEnabled ||\n document.msFullscreenEnabled\n );\n }\n\n // Get the prefix for handlers\n static get prefix() {\n // No prefix\n if (is.function(document.exitFullscreen)) {\n return '';\n }\n\n // Check for fullscreen support by vendor prefix\n let value = '';\n const prefixes = ['webkit', 'moz', 'ms'];\n\n prefixes.some(pre => {\n if (is.function(document[`${pre}ExitFullscreen`]) || is.function(document[`${pre}CancelFullScreen`])) {\n value = pre;\n return true;\n }\n\n return false;\n });\n\n return value;\n }\n\n static get property() {\n return this.prefix === 'moz' ? 'FullScreen' : 'Fullscreen';\n }\n\n // Determine if fullscreen is enabled\n get enabled() {\n return (\n (Fullscreen.native || this.player.config.fullscreen.fallback) &&\n this.player.config.fullscreen.enabled &&\n this.player.supported.ui &&\n this.player.isVideo\n );\n }\n\n // Get active state\n get active() {\n if (!this.enabled) {\n return false;\n }\n\n // Fallback using classname\n if (!Fullscreen.native) {\n return hasClass(this.target, this.player.config.classNames.fullscreen.fallback);\n }\n\n const element = !this.prefix ? document.fullscreenElement : document[`${this.prefix}${this.property}Element`];\n\n return element === this.target;\n }\n\n // Get target element\n get target() {\n return browser.isIos && this.player.config.fullscreen.iosNative\n ? this.player.media\n : this.player.elements.container;\n }\n\n // Update UI\n update() {\n if (this.enabled) {\n this.player.debug.log(`${Fullscreen.native ? 'Native' : 'Fallback'} fullscreen enabled`);\n } else {\n this.player.debug.log('Fullscreen not supported and fallback disabled');\n }\n\n // Add styling hook to show button\n toggleClass(this.player.elements.container, this.player.config.classNames.fullscreen.enabled, this.enabled);\n }\n\n // Make an element fullscreen\n enter() {\n if (!this.enabled) {\n return;\n }\n\n // iOS native fullscreen doesn't need the request step\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n if (this.player.playing) {\n this.target.webkitEnterFullscreen();\n }\n } else if (!Fullscreen.native) {\n toggleFallback.call(this, true);\n } else if (!this.prefix) {\n this.target.requestFullscreen();\n } else if (!is.empty(this.prefix)) {\n this.target[`${this.prefix}Request${this.property}`]();\n }\n }\n\n // Bail from fullscreen\n exit() {\n if (!this.enabled) {\n return;\n }\n\n // iOS native fullscreen\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n this.target.webkitExitFullscreen();\n this.player.play();\n } else if (!Fullscreen.native) {\n toggleFallback.call(this, false);\n } else if (!this.prefix) {\n (document.cancelFullScreen || document.exitFullscreen).call(document);\n } else if (!is.empty(this.prefix)) {\n const action = this.prefix === 'moz' ? 'Cancel' : 'Exit';\n document[`${this.prefix}${action}${this.property}`]();\n }\n }\n\n // Toggle state\n toggle() {\n if (!this.active) {\n this.enter();\n } else {\n this.exit();\n }\n }\n}\n\nexport default Fullscreen;\n","// ==========================================================================\n// Load image avoiding xhr/fetch CORS issues\n// Server status can't be obtained this way unfortunately, so this uses \"naturalWidth\" to determine if the image has loaded\n// By default it checks if it is at least 1px, but you can add a second argument to change this\n// ==========================================================================\n\nexport default function loadImage(src, minWidth = 1) {\n return new Promise((resolve, reject) => {\n const image = new Image();\n\n const handler = () => {\n delete image.onload;\n delete image.onerror;\n (image.naturalWidth >= minWidth ? resolve : reject)(image);\n };\n\n Object.assign(image, { onload: handler, onerror: handler, src });\n });\n}\n","// ==========================================================================\n// Plyr UI\n// ==========================================================================\n\nimport captions from './captions';\nimport controls from './controls';\nimport i18n from './i18n';\nimport support from './support';\nimport browser from './utils/browser';\nimport { getElement, toggleClass } from './utils/elements';\nimport { ready, triggerEvent } from './utils/events';\nimport is from './utils/is';\nimport loadImage from './utils/loadImage';\n\nconst ui = {\n addStyleHook() {\n toggleClass(this.elements.container, this.config.selectors.container.replace('.', ''), true);\n toggleClass(this.elements.container, this.config.classNames.uiSupported, this.supported.ui);\n },\n\n // Toggle native HTML5 media controls\n toggleNativeControls(toggle = false) {\n if (toggle && this.isHTML5) {\n this.media.setAttribute('controls', '');\n } else {\n this.media.removeAttribute('controls');\n }\n },\n\n // Setup the UI\n build() {\n // Re-attach media element listeners\n // TODO: Use event bubbling?\n this.listeners.media();\n\n // Don't setup interface if no support\n if (!this.supported.ui) {\n this.debug.warn(`Basic support only for ${this.provider} ${this.type}`);\n\n // Restore native controls\n ui.toggleNativeControls.call(this, true);\n\n // Bail\n return;\n }\n\n // Inject custom controls if not present\n if (!is.element(this.elements.controls)) {\n // Inject custom controls\n controls.inject.call(this);\n\n // Re-attach control listeners\n this.listeners.controls();\n }\n\n // Remove native controls\n ui.toggleNativeControls.call(this);\n\n // Setup captions for HTML5\n if (this.isHTML5) {\n captions.setup.call(this);\n }\n\n // Reset volume\n this.volume = null;\n\n // Reset mute state\n this.muted = null;\n\n // Reset speed\n this.speed = null;\n\n // Reset loop state\n this.loop = null;\n\n // Reset quality setting\n this.quality = null;\n\n // Reset volume display\n controls.updateVolume.call(this);\n\n // Reset time display\n controls.timeUpdate.call(this);\n\n // Update the UI\n ui.checkPlaying.call(this);\n\n // Check for picture-in-picture support\n toggleClass(\n this.elements.container,\n this.config.classNames.pip.supported,\n support.pip && this.isHTML5 && this.isVideo,\n );\n\n // Check for airplay support\n toggleClass(this.elements.container, this.config.classNames.airplay.supported, support.airplay && this.isHTML5);\n\n // Add iOS class\n toggleClass(this.elements.container, this.config.classNames.isIos, browser.isIos);\n\n // Add touch class\n toggleClass(this.elements.container, this.config.classNames.isTouch, this.touch);\n\n // Ready for API calls\n this.ready = true;\n\n // Ready event at end of execution stack\n setTimeout(() => {\n triggerEvent.call(this, this.media, 'ready');\n }, 0);\n\n // Set the title\n ui.setTitle.call(this);\n\n // Assure the poster image is set, if the property was added before the element was created\n if (this.poster) {\n ui.setPoster.call(this, this.poster, false).catch(() => {});\n }\n\n // Manually set the duration if user has overridden it.\n // The event listeners for it doesn't get called if preload is disabled (#701)\n if (this.config.duration) {\n controls.durationUpdate.call(this);\n }\n },\n\n // Setup aria attribute for play and iframe title\n setTitle() {\n // Find the current text\n let label = i18n.get('play', this.config);\n\n // If there's a media title set, use that for the label\n if (is.string(this.config.title) && !is.empty(this.config.title)) {\n label += `, ${this.config.title}`;\n }\n\n // If there's a play button, set label\n if (is.nodeList(this.elements.buttons.play)) {\n Array.from(this.elements.buttons.play).forEach(button => {\n button.setAttribute('aria-label', label);\n });\n }\n\n // Set iframe title\n // https://github.com/sampotts/plyr/issues/124\n if (this.isEmbed) {\n const iframe = getElement.call(this, 'iframe');\n\n if (!is.element(iframe)) {\n return;\n }\n\n // Default to media type\n const title = !is.empty(this.config.title) ? this.config.title : 'video';\n const format = i18n.get('frameTitle', this.config);\n\n iframe.setAttribute('title', format.replace('{title}', title));\n }\n },\n\n // Toggle poster\n togglePoster(enable) {\n toggleClass(this.elements.container, this.config.classNames.posterEnabled, enable);\n },\n\n // Set the poster image (async)\n // Used internally for the poster setter, with the passive option forced to false\n setPoster(poster, passive = true) {\n // Don't override if call is passive\n if (passive && this.poster) {\n return Promise.reject(new Error('Poster already set'));\n }\n\n // Set property synchronously to respect the call order\n this.media.setAttribute('poster', poster);\n\n // Wait until ui is ready\n return (\n ready\n .call(this)\n // Load image\n .then(() => loadImage(poster))\n .catch(err => {\n // Hide poster on error unless it's been set by another call\n if (poster === this.poster) {\n ui.togglePoster.call(this, false);\n }\n // Rethrow\n throw err;\n })\n .then(() => {\n // Prevent race conditions\n if (poster !== this.poster) {\n throw new Error('setPoster cancelled by later call to setPoster');\n }\n })\n .then(() => {\n Object.assign(this.elements.poster.style, {\n backgroundImage: `url('${poster}')`,\n // Reset backgroundSize as well (since it can be set to \"cover\" for padded thumbnails for youtube)\n backgroundSize: '',\n });\n ui.togglePoster.call(this, true);\n return poster;\n })\n );\n },\n\n // Check playing state\n checkPlaying(event) {\n // Class hooks\n toggleClass(this.elements.container, this.config.classNames.playing, this.playing);\n toggleClass(this.elements.container, this.config.classNames.paused, this.paused);\n toggleClass(this.elements.container, this.config.classNames.stopped, this.stopped);\n\n // Set state\n Array.from(this.elements.buttons.play).forEach(target => {\n target.pressed = this.playing;\n });\n\n // Only update controls on non timeupdate events\n if (is.event(event) && event.type === 'timeupdate') {\n return;\n }\n\n // Toggle controls\n ui.toggleControls.call(this);\n },\n\n // Check if media is loading\n checkLoading(event) {\n this.loading = ['stalled', 'waiting'].includes(event.type);\n\n // Clear timer\n clearTimeout(this.timers.loading);\n\n // Timer to prevent flicker when seeking\n this.timers.loading = setTimeout(() => {\n // Update progress bar loading class state\n toggleClass(this.elements.container, this.config.classNames.loading, this.loading);\n\n // Update controls visibility\n ui.toggleControls.call(this);\n }, this.loading ? 250 : 0);\n },\n\n // Toggle controls based on state and `force` argument\n toggleControls(force) {\n const { controls } = this.elements;\n\n if (controls && this.config.hideControls) {\n // Show controls if force, loading, paused, or button interaction, otherwise hide\n this.toggleControls(Boolean(force || this.loading || this.paused || controls.pressed || controls.hover));\n }\n },\n};\n\nexport default ui;\n","// ==========================================================================\n// Plyr Event Listeners\n// ==========================================================================\n\nimport controls from './controls';\nimport ui from './ui';\nimport browser from './utils/browser';\nimport { getElement, getElements, getFocusElement, matches, toggleClass, toggleHidden } from './utils/elements';\nimport { on, once, toggleListener, triggerEvent } from './utils/events';\nimport is from './utils/is';\n\nclass Listeners {\n constructor(player) {\n this.player = player;\n this.lastKey = null;\n\n this.handleKey = this.handleKey.bind(this);\n this.toggleMenu = this.toggleMenu.bind(this);\n this.firstTouch = this.firstTouch.bind(this);\n }\n\n // Handle key presses\n handleKey(event) {\n const code = event.keyCode ? event.keyCode : event.which;\n const pressed = event.type === 'keydown';\n const repeat = pressed && code === this.lastKey;\n\n // Bail if a modifier key is set\n if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) {\n return;\n }\n\n // If the event is bubbled from the media element\n // Firefox doesn't get the keycode for whatever reason\n if (!is.number(code)) {\n return;\n }\n\n // Seek by the number keys\n const seekByKey = () => {\n // Divide the max duration into 10th's and times by the number value\n this.player.currentTime = this.player.duration / 10 * (code - 48);\n };\n\n // Handle the key on keydown\n // Reset on keyup\n if (pressed) {\n // Which keycodes should we prevent default\n const preventDefault = [32, 37, 38, 39, 40, 48, 49, 50, 51, 52, 53, 54, 56, 57, 67, 70, 73, 75, 76, 77, 79];\n\n // Check focused element\n // and if the focused element is not editable (e.g. text input)\n // and any that accept key input http://webaim.org/techniques/keyboard/\n const focused = getFocusElement();\n if (\n is.element(focused) &&\n (focused !== this.player.elements.inputs.seek &&\n matches(focused, this.player.config.selectors.editable))\n ) {\n return;\n }\n\n // If the code is found prevent default (e.g. prevent scrolling for arrows)\n if (preventDefault.includes(code)) {\n event.preventDefault();\n event.stopPropagation();\n }\n\n switch (code) {\n case 48:\n case 49:\n case 50:\n case 51:\n case 52:\n case 53:\n case 54:\n case 55:\n case 56:\n case 57:\n // 0-9\n if (!repeat) {\n seekByKey();\n }\n break;\n\n case 32:\n case 75:\n // Space and K key\n if (!repeat) {\n this.player.togglePlay();\n }\n break;\n\n case 38:\n // Arrow up\n this.player.increaseVolume(0.1);\n break;\n\n case 40:\n // Arrow down\n this.player.decreaseVolume(0.1);\n break;\n\n case 77:\n // M key\n if (!repeat) {\n this.player.muted = !this.player.muted;\n }\n break;\n\n case 39:\n // Arrow forward\n this.player.forward();\n break;\n\n case 37:\n // Arrow back\n this.player.rewind();\n break;\n\n case 70:\n // F key\n this.player.fullscreen.toggle();\n break;\n\n case 67:\n // C key\n if (!repeat) {\n this.player.toggleCaptions();\n }\n break;\n\n case 76:\n // L key\n this.player.loop = !this.player.loop;\n break;\n\n /* case 73:\n this.setLoop('start');\n break;\n\n case 76:\n this.setLoop();\n break;\n\n case 79:\n this.setLoop('end');\n break; */\n\n default:\n break;\n }\n\n // Escape is handle natively when in full screen\n // So we only need to worry about non native\n if (!this.player.fullscreen.enabled && this.player.fullscreen.active && code === 27) {\n this.player.fullscreen.toggle();\n }\n\n // Store last code for next cycle\n this.lastKey = code;\n } else {\n this.lastKey = null;\n }\n }\n\n // Toggle menu\n toggleMenu(event) {\n controls.toggleMenu.call(this.player, event);\n }\n\n // Device is touch enabled\n firstTouch() {\n this.player.touch = true;\n\n // Add touch class\n toggleClass(this.player.elements.container, this.player.config.classNames.isTouch, true);\n }\n\n // Global window & document listeners\n global(toggle = true) {\n // Keyboard shortcuts\n if (this.player.config.keyboard.global) {\n toggleListener.call(this.player, window, 'keydown keyup', this.handleKey, toggle, false);\n }\n\n // Click anywhere closes menu\n toggleListener.call(this.player, document.body, 'click', this.toggleMenu, toggle);\n\n // Detect touch by events\n once.call(this.player, document.body, 'touchstart', this.firstTouch);\n }\n\n // Container listeners\n container() {\n // Keyboard shortcuts\n if (!this.player.config.keyboard.global && this.player.config.keyboard.focused) {\n on.call(this.player, this.player.elements.container, 'keydown keyup', this.handleKey, false);\n }\n\n // Detect tab focus\n // Remove class on blur/focusout\n on.call(this.player, this.player.elements.container, 'focusout', event => {\n toggleClass(event.target, this.player.config.classNames.tabFocus, false);\n });\n // Add classname to tabbed elements\n on.call(this.player, this.player.elements.container, 'keydown', event => {\n if (event.keyCode !== 9) {\n return;\n }\n\n // Delay the adding of classname until the focus has changed\n // This event fires before the focusin event\n setTimeout(() => {\n toggleClass(getFocusElement(), this.player.config.classNames.tabFocus, true);\n }, 0);\n });\n\n // Toggle controls on mouse events and entering fullscreen\n on.call(\n this.player,\n this.player.elements.container,\n 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen',\n event => {\n const { controls } = this.player.elements;\n\n // Remove button states for fullscreen\n if (event.type === 'enterfullscreen') {\n controls.pressed = false;\n controls.hover = false;\n }\n\n // Show, then hide after a timeout unless another control event occurs\n const show = ['touchstart', 'touchmove', 'mousemove'].includes(event.type);\n\n let delay = 0;\n\n if (show) {\n ui.toggleControls.call(this.player, true);\n // Use longer timeout for touch devices\n delay = this.player.touch ? 3000 : 2000;\n }\n\n // Clear timer\n clearTimeout(this.player.timers.controls);\n // Timer to prevent flicker when seeking\n this.player.timers.controls = setTimeout(() => ui.toggleControls.call(this.player, false), delay);\n },\n );\n }\n\n // Listen for media events\n media() {\n // Time change on media\n on.call(this.player, this.player.media, 'timeupdate seeking seeked', event =>\n controls.timeUpdate.call(this.player, event),\n );\n\n // Display duration\n on.call(this.player, this.player.media, 'durationchange loadeddata loadedmetadata', event =>\n controls.durationUpdate.call(this.player, event),\n );\n\n // Check for audio tracks on load\n // We can't use `loadedmetadata` as it doesn't seem to have audio tracks at that point\n on.call(this.player, this.player.media, 'canplay', () => {\n toggleHidden(this.player.elements.volume, !this.player.hasAudio);\n toggleHidden(this.player.elements.buttons.mute, !this.player.hasAudio);\n });\n\n // Handle the media finishing\n on.call(this.player, this.player.media, 'ended', () => {\n // Show poster on end\n if (this.player.isHTML5 && this.player.isVideo && this.player.config.resetOnEnd) {\n // Restart\n this.player.restart();\n }\n });\n\n // Check for buffer progress\n on.call(this.player, this.player.media, 'progress playing seeking seeked', event =>\n controls.updateProgress.call(this.player, event),\n );\n\n // Handle volume changes\n on.call(this.player, this.player.media, 'volumechange', event =>\n controls.updateVolume.call(this.player, event),\n );\n\n // Handle play/pause\n on.call(this.player, this.player.media, 'playing play pause ended emptied timeupdate', event =>\n ui.checkPlaying.call(this.player, event),\n );\n\n // Loading state\n on.call(this.player, this.player.media, 'waiting canplay seeked playing', event =>\n ui.checkLoading.call(this.player, event),\n );\n\n // If autoplay, then load advertisement if required\n // TODO: Show some sort of loading state while the ad manager loads else there's a delay before ad shows\n on.call(this.player, this.player.media, 'playing', () => {\n if (!this.player.ads) {\n return;\n }\n\n // If ads are enabled, wait for them first\n if (this.player.ads.enabled && !this.player.ads.initialized) {\n // Wait for manager response\n this.player.ads.managerPromise.then(() => this.player.ads.play()).catch(() => this.player.play());\n }\n });\n\n // Click video\n if (this.player.supported.ui && this.player.config.clickToPlay && !this.player.isAudio) {\n // Re-fetch the wrapper\n const wrapper = getElement.call(this.player, `.${this.player.config.classNames.video}`);\n\n // Bail if there's no wrapper (this should never happen)\n if (!is.element(wrapper)) {\n return;\n }\n\n // On click play, pause ore restart\n on.call(this.player, wrapper, 'click', () => {\n // Touch devices will just show controls (if we're hiding controls)\n if (this.player.config.hideControls && this.player.touch && !this.player.paused) {\n return;\n }\n\n if (this.player.paused) {\n this.player.play();\n } else if (this.player.ended) {\n this.player.restart();\n this.player.play();\n } else {\n this.player.pause();\n }\n });\n }\n\n // Disable right click\n if (this.player.supported.ui && this.player.config.disableContextMenu) {\n on.call(\n this.player,\n this.player.elements.wrapper,\n 'contextmenu',\n event => {\n event.preventDefault();\n },\n false,\n );\n }\n\n // Volume change\n on.call(this.player, this.player.media, 'volumechange', () => {\n // Save to storage\n this.player.storage.set({ volume: this.player.volume, muted: this.player.muted });\n });\n\n // Speed change\n on.call(this.player, this.player.media, 'ratechange', () => {\n // Update UI\n controls.updateSetting.call(this.player, 'speed');\n\n // Save to storage\n this.player.storage.set({ speed: this.player.speed });\n });\n\n // Quality request\n on.call(this.player, this.player.media, 'qualityrequested', event => {\n // Save to storage\n this.player.storage.set({ quality: event.detail.quality });\n });\n\n // Quality change\n on.call(this.player, this.player.media, 'qualitychange', event => {\n // Update UI\n controls.updateSetting.call(this.player, 'quality', null, event.detail.quality);\n });\n\n // Proxy events to container\n // Bubble up key events for Edge\n const proxyEvents = this.player.config.events.concat(['keyup', 'keydown']).join(' ');\n on.call(this.player, this.player.media, proxyEvents, event => {\n let { detail = {} } = event;\n\n // Get error details from media\n if (event.type === 'error') {\n detail = this.player.media.error;\n }\n\n triggerEvent.call(this.player, this.player.elements.container, event.type, true, detail);\n });\n }\n\n // Listen for control events\n controls() {\n // IE doesn't support input event, so we fallback to change\n const inputEvent = browser.isIE ? 'change' : 'input';\n\n // Run default and custom handlers\n const proxy = (event, defaultHandler, customHandlerKey) => {\n const customHandler = this.player.config.listeners[customHandlerKey];\n const hasCustomHandler = is.function(customHandler);\n let returned = true;\n\n // Execute custom handler\n if (hasCustomHandler) {\n returned = customHandler.call(this.player, event);\n }\n\n // Only call default handler if not prevented in custom handler\n if (returned && is.function(defaultHandler)) {\n defaultHandler.call(this.player, event);\n }\n };\n\n // Trigger custom and default handlers\n const bind = (element, type, defaultHandler, customHandlerKey, passive = true) => {\n const customHandler = this.player.config.listeners[customHandlerKey];\n const hasCustomHandler = is.function(customHandler);\n\n on.call(\n this.player,\n element,\n type,\n event => proxy(event, defaultHandler, customHandlerKey),\n passive && !hasCustomHandler,\n );\n };\n\n // Play/pause toggle\n Array.from(this.player.elements.buttons.play).forEach(button => {\n bind(button, 'click', this.player.togglePlay, 'play');\n });\n\n // Pause\n bind(this.player.elements.buttons.restart, 'click', this.player.restart, 'restart');\n\n // Rewind\n bind(this.player.elements.buttons.rewind, 'click', this.player.rewind, 'rewind');\n\n // Rewind\n bind(this.player.elements.buttons.fastForward, 'click', this.player.forward, 'fastForward');\n\n // Mute toggle\n bind(\n this.player.elements.buttons.mute,\n 'click',\n () => {\n this.player.muted = !this.player.muted;\n },\n 'mute',\n );\n\n // Captions toggle\n bind(this.player.elements.buttons.captions, 'click', () => this.player.toggleCaptions());\n\n // Fullscreen toggle\n bind(\n this.player.elements.buttons.fullscreen,\n 'click',\n () => {\n this.player.fullscreen.toggle();\n },\n 'fullscreen',\n );\n\n // Picture-in-Picture\n bind(\n this.player.elements.buttons.pip,\n 'click',\n () => {\n this.player.pip = 'toggle';\n },\n 'pip',\n );\n\n // Airplay\n bind(this.player.elements.buttons.airplay, 'click', this.player.airplay, 'airplay');\n\n // Settings menu\n bind(this.player.elements.buttons.settings, 'click', event => {\n controls.toggleMenu.call(this.player, event);\n });\n\n // Settings menu\n bind(this.player.elements.settings.form, 'click', event => {\n event.stopPropagation();\n\n // Go back to home tab on click\n const showHomeTab = () => {\n const id = `plyr-settings-${this.player.id}-home`;\n controls.showTab.call(this.player, id);\n };\n\n // Settings menu items - use event delegation as items are added/removed\n if (matches(event.target, this.player.config.selectors.inputs.language)) {\n proxy(\n event,\n () => {\n this.player.currentTrack = Number(event.target.value);\n showHomeTab();\n },\n 'language',\n );\n } else if (matches(event.target, this.player.config.selectors.inputs.quality)) {\n proxy(\n event,\n () => {\n this.player.quality = event.target.value;\n showHomeTab();\n },\n 'quality',\n );\n } else if (matches(event.target, this.player.config.selectors.inputs.speed)) {\n proxy(\n event,\n () => {\n this.player.speed = parseFloat(event.target.value);\n showHomeTab();\n },\n 'speed',\n );\n } else {\n const tab = event.target;\n controls.showTab.call(this.player, tab.getAttribute('aria-controls'));\n }\n });\n\n // Set range input alternative \"value\", which matches the tooltip time (#954)\n bind(this.player.elements.inputs.seek, 'mousedown mousemove', event => {\n const clientRect = this.player.elements.progress.getBoundingClientRect();\n const percent = 100 / clientRect.width * (event.pageX - clientRect.left);\n event.currentTarget.setAttribute('seek-value', percent);\n });\n\n // Pause while seeking\n bind(this.player.elements.inputs.seek, 'mousedown mouseup keydown keyup touchstart touchend', event => {\n const seek = event.currentTarget;\n\n const code = event.keyCode ? event.keyCode : event.which;\n const eventType = event.type;\n\n if ((eventType === 'keydown' || eventType === 'keyup') && (code !== 39 && code !== 37)) {\n return;\n }\n // Was playing before?\n const play = seek.hasAttribute('play-on-seeked');\n\n // Done seeking\n const done = ['mouseup', 'touchend', 'keyup'].includes(event.type);\n\n // If we're done seeking and it was playing, resume playback\n if (play && done) {\n seek.removeAttribute('play-on-seeked');\n this.player.play();\n } else if (!done && this.player.playing) {\n seek.setAttribute('play-on-seeked', '');\n this.player.pause();\n }\n });\n\n // Seek\n bind(\n this.player.elements.inputs.seek,\n inputEvent,\n event => {\n const seek = event.currentTarget;\n\n // If it exists, use seek-value instead of \"value\" for consistency with tooltip time (#954)\n let seekTo = seek.getAttribute('seek-value');\n\n if (is.empty(seekTo)) {\n seekTo = seek.value;\n }\n\n seek.removeAttribute('seek-value');\n\n this.player.currentTime = seekTo / seek.max * this.player.duration;\n },\n 'seek',\n );\n\n // Current time invert\n // Only if one time element is used for both currentTime and duration\n if (this.player.config.toggleInvert && !is.element(this.player.elements.display.duration)) {\n bind(this.player.elements.display.currentTime, 'click', () => {\n // Do nothing if we're at the start\n if (this.player.currentTime === 0) {\n return;\n }\n\n this.player.config.invertTime = !this.player.config.invertTime;\n\n controls.timeUpdate.call(this.player);\n });\n }\n\n // Volume\n bind(\n this.player.elements.inputs.volume,\n inputEvent,\n event => {\n this.player.volume = event.target.value;\n },\n 'volume',\n );\n\n // Polyfill for lower fill in <input type=\"range\"> for webkit\n if (browser.isWebkit) {\n Array.from(getElements.call(this.player, 'input[type=\"range\"]')).forEach(element => {\n bind(element, 'input', event => controls.updateRangeFill.call(this.player, event.target));\n });\n }\n\n // Seek tooltip\n bind(this.player.elements.progress, 'mouseenter mouseleave mousemove', event =>\n controls.updateSeekTooltip.call(this.player, event),\n );\n\n // Update controls.hover state (used for ui.toggleControls to avoid hiding when interacting)\n bind(this.player.elements.controls, 'mouseenter mouseleave', event => {\n this.player.elements.controls.hover = !this.player.touch && event.type === 'mouseenter';\n });\n\n // Update controls.pressed state (used for ui.toggleControls to avoid hiding when interacting)\n bind(this.player.elements.controls, 'mousedown mouseup touchstart touchend touchcancel', event => {\n this.player.elements.controls.pressed = ['mousedown', 'touchstart'].includes(event.type);\n });\n\n // Focus in/out on controls\n bind(this.player.elements.controls, 'focusin focusout', event => {\n const { config, elements, timers } = this.player;\n\n // Skip transition to prevent focus from scrolling the parent element\n toggleClass(elements.controls, config.classNames.noTransition, event.type === 'focusin');\n\n // Toggle\n ui.toggleControls.call(this.player, event.type === 'focusin');\n\n // If focusin, hide again after delay\n if (event.type === 'focusin') {\n // Restore transition\n setTimeout(() => {\n toggleClass(elements.controls, config.classNames.noTransition, false);\n }, 0);\n\n // Delay a little more for keyboard users\n const delay = this.touch ? 3000 : 4000;\n\n // Clear timer\n clearTimeout(timers.controls);\n // Hide\n timers.controls = setTimeout(() => ui.toggleControls.call(this.player, false), delay);\n }\n });\n\n // Mouse wheel for volume\n bind(\n this.player.elements.inputs.volume,\n 'wheel',\n event => {\n // Detect \"natural\" scroll - suppored on OS X Safari only\n // Other browsers on OS X will be inverted until support improves\n const inverted = event.webkitDirectionInvertedFromDevice;\n const step = 1 / 50;\n let direction = 0;\n\n // Scroll down (or up on natural) to decrease\n if (event.deltaY < 0 || event.deltaX > 0) {\n if (inverted) {\n this.player.decreaseVolume(step);\n direction = -1;\n } else {\n this.player.increaseVolume(step);\n direction = 1;\n }\n }\n\n // Scroll up (or down on natural) to increase\n if (event.deltaY > 0 || event.deltaX < 0) {\n if (inverted) {\n this.player.increaseVolume(step);\n direction = 1;\n } else {\n this.player.decreaseVolume(step);\n direction = -1;\n }\n }\n\n // Don't break page scrolling at max and min\n if (\n (direction === 1 && this.player.media.volume < 1) ||\n (direction === -1 && this.player.media.volume > 0)\n ) {\n event.preventDefault();\n }\n },\n 'volume',\n false,\n );\n }\n}\n\nexport default Listeners;\n","(function(root, factory) {\n if (typeof define === 'function' && define.amd) {\n define([], factory);\n } else if (typeof exports === 'object') {\n module.exports = factory();\n } else {\n root.loadjs = factory();\n }\n}(this, function() {\n/**\n * Global dependencies.\n * @global {Object} document - DOM\n */\n\nvar devnull = function() {},\n bundleIdCache = {},\n bundleResultCache = {},\n bundleCallbackQueue = {};\n\n\n/**\n * Subscribe to bundle load event.\n * @param {string[]} bundleIds - Bundle ids\n * @param {Function} callbackFn - The callback function\n */\nfunction subscribe(bundleIds, callbackFn) {\n // listify\n bundleIds = bundleIds.push ? bundleIds : [bundleIds];\n\n var depsNotFound = [],\n i = bundleIds.length,\n numWaiting = i,\n fn,\n bundleId,\n r,\n q;\n\n // define callback function\n fn = function (bundleId, pathsNotFound) {\n if (pathsNotFound.length) depsNotFound.push(bundleId);\n\n numWaiting--;\n if (!numWaiting) callbackFn(depsNotFound);\n };\n\n // register callback\n while (i--) {\n bundleId = bundleIds[i];\n\n // execute callback if in result cache\n r = bundleResultCache[bundleId];\n if (r) {\n fn(bundleId, r);\n continue;\n }\n\n // add to callback queue\n q = bundleCallbackQueue[bundleId] = bundleCallbackQueue[bundleId] || [];\n q.push(fn);\n }\n}\n\n\n/**\n * Publish bundle load event.\n * @param {string} bundleId - Bundle id\n * @param {string[]} pathsNotFound - List of files not found\n */\nfunction publish(bundleId, pathsNotFound) {\n // exit if id isn't defined\n if (!bundleId) return;\n\n var q = bundleCallbackQueue[bundleId];\n\n // cache result\n bundleResultCache[bundleId] = pathsNotFound;\n\n // exit if queue is empty\n if (!q) return;\n\n // empty callback queue\n while (q.length) {\n q[0](bundleId, pathsNotFound);\n q.splice(0, 1);\n }\n}\n\n\n/**\n * Execute callbacks.\n * @param {Object or Function} args - The callback args\n * @param {string[]} depsNotFound - List of dependencies not found\n */\nfunction executeCallbacks(args, depsNotFound) {\n // accept function as argument\n if (args.call) args = {success: args};\n\n // success and error callbacks\n if (depsNotFound.length) (args.error || devnull)(depsNotFound);\n else (args.success || devnull)(args);\n}\n\n\n/**\n * Load individual file.\n * @param {string} path - The file path\n * @param {Function} callbackFn - The callback function\n */\nfunction loadFile(path, callbackFn, args, numTries) {\n var doc = document,\n async = args.async,\n maxTries = (args.numRetries || 0) + 1,\n beforeCallbackFn = args.before || devnull,\n pathStripped = path.replace(/^(css|img)!/, ''),\n isCss,\n e;\n\n numTries = numTries || 0;\n\n if (/(^css!|\\.css$)/.test(path)) {\n isCss = true;\n\n // css\n e = doc.createElement('link');\n e.rel = 'stylesheet';\n e.href = pathStripped; //.replace(/^css!/, ''); // remove \"css!\" prefix\n } else if (/(^img!|\\.(png|gif|jpg|svg)$)/.test(path)) {\n // image\n e = doc.createElement('img');\n e.src = pathStripped; \n } else {\n // javascript\n e = doc.createElement('script');\n e.src = path;\n e.async = async === undefined ? true : async;\n }\n\n e.onload = e.onerror = e.onbeforeload = function (ev) {\n var result = ev.type[0];\n\n // Note: The following code isolates IE using `hideFocus` and treats empty\n // stylesheets as failures to get around lack of onerror support\n if (isCss && 'hideFocus' in e) {\n try {\n if (!e.sheet.cssText.length) result = 'e';\n } catch (x) {\n // sheets objects created from load errors don't allow access to\n // `cssText`\n result = 'e';\n }\n }\n\n // handle retries in case of load failure\n if (result == 'e') {\n // increment counter\n numTries += 1;\n\n // exit function and try again\n if (numTries < maxTries) {\n return loadFile(path, callbackFn, args, numTries);\n }\n }\n\n // execute callback\n callbackFn(path, result, ev.defaultPrevented);\n };\n\n // add to document (unless callback returns `false`)\n if (beforeCallbackFn(path, e) !== false) doc.head.appendChild(e);\n}\n\n\n/**\n * Load multiple files.\n * @param {string[]} paths - The file paths\n * @param {Function} callbackFn - The callback function\n */\nfunction loadFiles(paths, callbackFn, args) {\n // listify paths\n paths = paths.push ? paths : [paths];\n\n var numWaiting = paths.length,\n x = numWaiting,\n pathsNotFound = [],\n fn,\n i;\n\n // define callback function\n fn = function(path, result, defaultPrevented) {\n // handle error\n if (result == 'e') pathsNotFound.push(path);\n\n // handle beforeload event. If defaultPrevented then that means the load\n // will be blocked (ex. Ghostery/ABP on Safari)\n if (result == 'b') {\n if (defaultPrevented) pathsNotFound.push(path);\n else return;\n }\n\n numWaiting--;\n if (!numWaiting) callbackFn(pathsNotFound);\n };\n\n // load scripts\n for (i=0; i < x; i++) loadFile(paths[i], fn, args);\n}\n\n\n/**\n * Initiate script load and register bundle.\n * @param {(string|string[])} paths - The file paths\n * @param {(string|Function)} [arg1] - The bundleId or success callback\n * @param {Function} [arg2] - The success or error callback\n * @param {Function} [arg3] - The error callback\n */\nfunction loadjs(paths, arg1, arg2) {\n var bundleId,\n args;\n\n // bundleId (if string)\n if (arg1 && arg1.trim) bundleId = arg1;\n\n // args (default is {})\n args = (bundleId ? arg2 : arg1) || {};\n\n // throw error if bundle is already defined\n if (bundleId) {\n if (bundleId in bundleIdCache) {\n throw \"LoadJS\";\n } else {\n bundleIdCache[bundleId] = true;\n }\n }\n\n // load scripts\n loadFiles(paths, function (pathsNotFound) {\n // execute callbacks\n executeCallbacks(args, pathsNotFound);\n\n // publish bundle load event\n publish(bundleId, pathsNotFound);\n }, args);\n}\n\n\n/**\n * Execute callbacks when dependencies have been satisfied.\n * @param {(string|string[])} deps - List of bundle ids\n * @param {Object} args - success/error arguments\n */\nloadjs.ready = function ready(deps, args) {\n // subscribe to bundle load event\n subscribe(deps, function (depsNotFound) {\n // execute callbacks\n executeCallbacks(args, depsNotFound);\n });\n\n return loadjs;\n};\n\n\n/**\n * Manually satisfy bundle dependencies.\n * @param {string} bundleId - The bundle id\n */\nloadjs.done = function done(bundleId) {\n publish(bundleId, []);\n};\n\n\n/**\n * Reset loadjs dependencies statuses\n */\nloadjs.reset = function reset() {\n bundleIdCache = {};\n bundleResultCache = {};\n bundleCallbackQueue = {};\n};\n\n\n/**\n * Determine if bundle has already been defined\n * @param String} bundleId - The bundle id\n */\nloadjs.isDefined = function isDefined(bundleId) {\n return bundleId in bundleIdCache;\n};\n\n\n// export\nreturn loadjs;\n\n}));\n","// ==========================================================================\n// Load an external script\n// ==========================================================================\n\nimport loadjs from 'loadjs';\n\nexport default function loadScript(url) {\n return new Promise((resolve, reject) => {\n loadjs(url, {\n success: resolve,\n error: reject,\n });\n });\n}\n","// ==========================================================================\n// Vimeo plugin\n// ==========================================================================\n\nimport captions from './../captions';\nimport controls from './../controls';\nimport ui from './../ui';\nimport { createElement, replaceElement, toggleClass } from './../utils/elements';\nimport { triggerEvent } from './../utils/events';\nimport fetch from './../utils/fetch';\nimport is from './../utils/is';\nimport loadScript from './../utils/loadScript';\nimport { format, stripHTML } from './../utils/strings';\nimport { buildUrlParams } from './../utils/urls';\n\n// Parse Vimeo ID from URL\nfunction parseId(url) {\n if (is.empty(url)) {\n return null;\n }\n\n if (is.number(Number(url))) {\n return url;\n }\n\n const regex = /^.*(vimeo.com\\/|video\\/)(\\d+).*/;\n return url.match(regex) ? RegExp.$2 : url;\n}\n\n// Get aspect ratio for dimensions\nfunction getAspectRatio(width, height) {\n const getRatio = (w, h) => (h === 0 ? w : getRatio(h, w % h));\n const ratio = getRatio(width, height);\n return `${width / ratio}:${height / ratio}`;\n}\n\n// Set playback state and trigger change (only on actual change)\nfunction assurePlaybackState(play) {\n if (play && !this.embed.hasPlayed) {\n this.embed.hasPlayed = true;\n }\n if (this.media.paused === play) {\n this.media.paused = !play;\n triggerEvent.call(this, this.media, play ? 'play' : 'pause');\n }\n}\n\nconst vimeo = {\n setup() {\n // Add embed class for responsive\n toggleClass(this.elements.wrapper, this.config.classNames.embed, true);\n\n // Set intial ratio\n vimeo.setAspectRatio.call(this);\n\n // Load the API if not already\n if (!is.object(window.Vimeo)) {\n loadScript(this.config.urls.vimeo.sdk)\n .then(() => {\n vimeo.ready.call(this);\n })\n .catch(error => {\n this.debug.warn('Vimeo API failed to load', error);\n });\n } else {\n vimeo.ready.call(this);\n }\n },\n\n // Set aspect ratio\n // For Vimeo we have an extra 300% height <div> to hide the standard controls and UI\n setAspectRatio(input) {\n const [x, y] = (is.string(input) ? input : this.config.ratio).split(':');\n const padding = 100 / x * y;\n this.elements.wrapper.style.paddingBottom = `${padding}%`;\n\n if (this.supported.ui) {\n const height = 240;\n const offset = (height - padding) / (height / 50);\n\n this.media.style.transform = `translateY(-${offset}%)`;\n }\n },\n\n // API Ready\n ready() {\n const player = this;\n\n // Get Vimeo params for the iframe\n const options = {\n loop: player.config.loop.active,\n autoplay: player.autoplay,\n // muted: player.muted,\n byline: false,\n portrait: false,\n title: false,\n speed: true,\n transparent: 0,\n gesture: 'media',\n playsinline: !this.config.fullscreen.iosNative,\n };\n const params = buildUrlParams(options);\n\n // Get the source URL or ID\n let source = player.media.getAttribute('src');\n\n // Get from <div> if needed\n if (is.empty(source)) {\n source = player.media.getAttribute(player.config.attributes.embed.id);\n }\n\n const id = parseId(source);\n\n // Build an iframe\n const iframe = createElement('iframe');\n const src = format(player.config.urls.vimeo.iframe, id, params);\n iframe.setAttribute('src', src);\n iframe.setAttribute('allowfullscreen', '');\n iframe.setAttribute('allowtransparency', '');\n iframe.setAttribute('allow', 'autoplay');\n\n // Get poster, if already set\n const { poster } = player;\n\n // Inject the package\n const wrapper = createElement('div', { poster, class: player.config.classNames.embedContainer });\n wrapper.appendChild(iframe);\n player.media = replaceElement(wrapper, player.media);\n\n // Get poster image\n fetch(format(player.config.urls.vimeo.api, id), 'json').then(response => {\n if (is.empty(response)) {\n return;\n }\n\n // Get the URL for thumbnail\n const url = new URL(response[0].thumbnail_large);\n\n // Get original image\n url.pathname = `${url.pathname.split('_')[0]}.jpg`;\n\n // Set and show poster\n ui.setPoster.call(player, url.href).catch(() => {});\n });\n\n // Setup instance\n // https://github.com/vimeo/player.js\n player.embed = new window.Vimeo.Player(iframe, {\n autopause: player.config.autopause,\n muted: player.muted,\n });\n\n player.media.paused = true;\n player.media.currentTime = 0;\n\n // Disable native text track rendering\n if (player.supported.ui) {\n player.embed.disableTextTrack();\n }\n\n // Create a faux HTML5 API using the Vimeo API\n player.media.play = () => {\n assurePlaybackState.call(player, true);\n return player.embed.play();\n };\n\n player.media.pause = () => {\n assurePlaybackState.call(player, false);\n return player.embed.pause();\n };\n\n player.media.stop = () => {\n player.pause();\n player.currentTime = 0;\n };\n\n // Seeking\n let { currentTime } = player.media;\n Object.defineProperty(player.media, 'currentTime', {\n get() {\n return currentTime;\n },\n set(time) {\n // Vimeo will automatically play on seek if the video hasn't been played before\n\n // Get current paused state and volume etc\n const { embed, media, paused, volume } = player;\n const restorePause = paused && !embed.hasPlayed;\n\n // Set seeking state and trigger event\n media.seeking = true;\n triggerEvent.call(player, media, 'seeking');\n\n // If paused, mute until seek is complete\n Promise.resolve(restorePause && embed.setVolume(0))\n // Seek\n .then(() => embed.setCurrentTime(time))\n // Restore paused\n .then(() => restorePause && embed.pause())\n // Restore volume\n .then(() => restorePause && embed.setVolume(volume))\n .catch(() => {\n // Do nothing\n });\n },\n });\n\n // Playback speed\n let speed = player.config.speed.selected;\n Object.defineProperty(player.media, 'playbackRate', {\n get() {\n return speed;\n },\n set(input) {\n player.embed\n .setPlaybackRate(input)\n .then(() => {\n speed = input;\n triggerEvent.call(player, player.media, 'ratechange');\n })\n .catch(error => {\n // Hide menu item (and menu if empty)\n if (error.name === 'Error') {\n controls.setSpeedMenu.call(player, []);\n }\n });\n },\n });\n\n // Volume\n let { volume } = player.config;\n Object.defineProperty(player.media, 'volume', {\n get() {\n return volume;\n },\n set(input) {\n player.embed.setVolume(input).then(() => {\n volume = input;\n triggerEvent.call(player, player.media, 'volumechange');\n });\n },\n });\n\n // Muted\n let { muted } = player.config;\n Object.defineProperty(player.media, 'muted', {\n get() {\n return muted;\n },\n set(input) {\n const toggle = is.boolean(input) ? input : false;\n\n player.embed.setVolume(toggle ? 0 : player.config.volume).then(() => {\n muted = toggle;\n triggerEvent.call(player, player.media, 'volumechange');\n });\n },\n });\n\n // Loop\n let { loop } = player.config;\n Object.defineProperty(player.media, 'loop', {\n get() {\n return loop;\n },\n set(input) {\n const toggle = is.boolean(input) ? input : player.config.loop.active;\n\n player.embed.setLoop(toggle).then(() => {\n loop = toggle;\n });\n },\n });\n\n // Source\n let currentSrc;\n player.embed\n .getVideoUrl()\n .then(value => {\n currentSrc = value;\n })\n .catch(error => {\n this.debug.warn(error);\n });\n\n Object.defineProperty(player.media, 'currentSrc', {\n get() {\n return currentSrc;\n },\n });\n\n // Ended\n Object.defineProperty(player.media, 'ended', {\n get() {\n return player.currentTime === player.duration;\n },\n });\n\n // Set aspect ratio based on video size\n Promise.all([player.embed.getVideoWidth(), player.embed.getVideoHeight()]).then(dimensions => {\n const ratio = getAspectRatio(dimensions[0], dimensions[1]);\n vimeo.setAspectRatio.call(this, ratio);\n });\n\n // Set autopause\n player.embed.setAutopause(player.config.autopause).then(state => {\n player.config.autopause = state;\n });\n\n // Get title\n player.embed.getVideoTitle().then(title => {\n player.config.title = title;\n ui.setTitle.call(this);\n });\n\n // Get current time\n player.embed.getCurrentTime().then(value => {\n currentTime = value;\n triggerEvent.call(player, player.media, 'timeupdate');\n });\n\n // Get duration\n player.embed.getDuration().then(value => {\n player.media.duration = value;\n triggerEvent.call(player, player.media, 'durationchange');\n });\n\n // Get captions\n player.embed.getTextTracks().then(tracks => {\n player.media.textTracks = tracks;\n captions.setup.call(player);\n });\n\n player.embed.on('cuechange', ({ cues = [] }) => {\n const strippedCues = cues.map(cue => stripHTML(cue.text));\n captions.updateCues.call(player, strippedCues);\n });\n\n player.embed.on('loaded', () => {\n // Assure state and events are updated on autoplay\n player.embed.getPaused().then(paused => {\n assurePlaybackState.call(player, !paused);\n if (!paused) {\n triggerEvent.call(player, player.media, 'playing');\n }\n });\n\n if (is.element(player.embed.element) && player.supported.ui) {\n const frame = player.embed.element;\n\n // Fix keyboard focus issues\n // https://github.com/sampotts/plyr/issues/317\n frame.setAttribute('tabindex', -1);\n }\n });\n\n player.embed.on('play', () => {\n assurePlaybackState.call(player, true);\n triggerEvent.call(player, player.media, 'playing');\n });\n\n player.embed.on('pause', () => {\n assurePlaybackState.call(player, false);\n });\n\n player.embed.on('timeupdate', data => {\n player.media.seeking = false;\n currentTime = data.seconds;\n triggerEvent.call(player, player.media, 'timeupdate');\n });\n\n player.embed.on('progress', data => {\n player.media.buffered = data.percent;\n triggerEvent.call(player, player.media, 'progress');\n\n // Check all loaded\n if (parseInt(data.percent, 10) === 1) {\n triggerEvent.call(player, player.media, 'canplaythrough');\n }\n\n // Get duration as if we do it before load, it gives an incorrect value\n // https://github.com/sampotts/plyr/issues/891\n player.embed.getDuration().then(value => {\n if (value !== player.media.duration) {\n player.media.duration = value;\n triggerEvent.call(player, player.media, 'durationchange');\n }\n });\n });\n\n player.embed.on('seeked', () => {\n player.media.seeking = false;\n triggerEvent.call(player, player.media, 'seeked');\n });\n\n player.embed.on('ended', () => {\n player.media.paused = true;\n triggerEvent.call(player, player.media, 'ended');\n });\n\n player.embed.on('error', detail => {\n player.media.error = detail;\n triggerEvent.call(player, player.media, 'error');\n });\n\n // Rebuild UI\n setTimeout(() => ui.build.call(player), 0);\n },\n};\n\nexport default vimeo;\n","// ==========================================================================\n// YouTube plugin\n// ==========================================================================\n\nimport controls from './../controls';\nimport ui from './../ui';\nimport { dedupe } from './../utils/arrays';\nimport { createElement, replaceElement, toggleClass } from './../utils/elements';\nimport { triggerEvent } from './../utils/events';\nimport fetch from './../utils/fetch';\nimport is from './../utils/is';\nimport loadImage from './../utils/loadImage';\nimport loadScript from './../utils/loadScript';\nimport { format, generateId } from './../utils/strings';\n\n// Parse YouTube ID from URL\nfunction parseId(url) {\n if (is.empty(url)) {\n return null;\n }\n\n const regex = /^.*(youtu.be\\/|v\\/|u\\/\\w\\/|embed\\/|watch\\?v=|&v=)([^#&?]*).*/;\n return url.match(regex) ? RegExp.$2 : url;\n}\n\n// Standardise YouTube quality unit\nfunction mapQualityUnit(input) {\n const qualities = {\n hd2160: 2160,\n hd1440: 1440,\n hd1080: 1080,\n hd720: 720,\n large: 480,\n medium: 360,\n small: 240,\n tiny: 144,\n };\n\n const entry = Object.entries(qualities).find(entry => entry.includes(input));\n\n if (entry) {\n // Get the match corresponding to the input\n return entry.find(value => value !== input);\n }\n\n return 'default';\n}\n\nfunction mapQualityUnits(levels) {\n if (is.empty(levels)) {\n return levels;\n }\n\n return dedupe(levels.map(level => mapQualityUnit(level)));\n}\n\n// Set playback state and trigger change (only on actual change)\nfunction assurePlaybackState(play) {\n if (play && !this.embed.hasPlayed) {\n this.embed.hasPlayed = true;\n }\n if (this.media.paused === play) {\n this.media.paused = !play;\n triggerEvent.call(this, this.media, play ? 'play' : 'pause');\n }\n}\n\nconst youtube = {\n setup() {\n // Add embed class for responsive\n toggleClass(this.elements.wrapper, this.config.classNames.embed, true);\n\n // Set aspect ratio\n youtube.setAspectRatio.call(this);\n\n // Setup API\n if (is.object(window.YT) && is.function(window.YT.Player)) {\n youtube.ready.call(this);\n } else {\n // Load the API\n loadScript(this.config.urls.youtube.sdk).catch(error => {\n this.debug.warn('YouTube API failed to load', error);\n });\n\n // Setup callback for the API\n // YouTube has it's own system of course...\n window.onYouTubeReadyCallbacks = window.onYouTubeReadyCallbacks || [];\n\n // Add to queue\n window.onYouTubeReadyCallbacks.push(() => {\n youtube.ready.call(this);\n });\n\n // Set callback to process queue\n window.onYouTubeIframeAPIReady = () => {\n window.onYouTubeReadyCallbacks.forEach(callback => {\n callback();\n });\n };\n }\n },\n\n // Get the media title\n getTitle(videoId) {\n // Try via undocumented API method first\n // This method disappears now and then though...\n // https://github.com/sampotts/plyr/issues/709\n if (is.function(this.embed.getVideoData)) {\n const { title } = this.embed.getVideoData();\n\n if (is.empty(title)) {\n this.config.title = title;\n ui.setTitle.call(this);\n return;\n }\n }\n\n // Or via Google API\n const key = this.config.keys.google;\n if (is.string(key) && !is.empty(key)) {\n const url = format(this.config.urls.youtube.api, videoId, key);\n\n fetch(url)\n .then(result => {\n if (is.object(result)) {\n this.config.title = result.items[0].snippet.title;\n ui.setTitle.call(this);\n }\n })\n .catch(() => {});\n }\n },\n\n // Set aspect ratio\n setAspectRatio() {\n const ratio = this.config.ratio.split(':');\n this.elements.wrapper.style.paddingBottom = `${100 / ratio[0] * ratio[1]}%`;\n },\n\n // API ready\n ready() {\n const player = this;\n\n // Ignore already setup (race condition)\n const currentId = player.media.getAttribute('id');\n if (!is.empty(currentId) && currentId.startsWith('youtube-')) {\n return;\n }\n\n // Get the source URL or ID\n let source = player.media.getAttribute('src');\n\n // Get from <div> if needed\n if (is.empty(source)) {\n source = player.media.getAttribute(this.config.attributes.embed.id);\n }\n\n // Replace the <iframe> with a <div> due to YouTube API issues\n const videoId = parseId(source);\n const id = generateId(player.provider);\n\n // Get poster, if already set\n const { poster } = player;\n\n // Replace media element\n const container = createElement('div', { id, poster });\n player.media = replaceElement(container, player.media);\n\n // Id to poster wrapper\n const posterSrc = format => `https://img.youtube.com/vi/${videoId}/${format}default.jpg`;\n\n // Check thumbnail images in order of quality, but reject fallback thumbnails (120px wide)\n loadImage(posterSrc('maxres'), 121) // Higest quality and unpadded\n .catch(() => loadImage(posterSrc('sd'), 121)) // 480p padded 4:3\n .catch(() => loadImage(posterSrc('hq'))) // 360p padded 4:3. Always exists\n .then(image => ui.setPoster.call(player, image.src))\n .then(posterSrc => {\n // If the image is padded, use background-size \"cover\" instead (like youtube does too with their posters)\n if (!posterSrc.includes('maxres')) {\n player.elements.poster.style.backgroundSize = 'cover';\n }\n })\n .catch(() => {});\n\n // Setup instance\n // https://developers.google.com/youtube/iframe_api_reference\n player.embed = new window.YT.Player(id, {\n videoId,\n playerVars: {\n autoplay: player.config.autoplay ? 1 : 0, // Autoplay\n controls: player.supported.ui ? 0 : 1, // Only show controls if not fully supported\n rel: 0, // No related vids\n showinfo: 0, // Hide info\n iv_load_policy: 3, // Hide annotations\n modestbranding: 1, // Hide logos as much as possible (they still show one in the corner when paused)\n disablekb: 1, // Disable keyboard as we handle it\n playsinline: 1, // Allow iOS inline playback\n\n // Tracking for stats\n // origin: window ? `${window.location.protocol}//${window.location.host}` : null,\n widget_referrer: window ? window.location.href : null,\n\n // Captions are flaky on YouTube\n cc_load_policy: player.captions.active ? 1 : 0,\n cc_lang_pref: player.config.captions.language,\n },\n events: {\n onError(event) {\n // YouTube may fire onError twice, so only handle it once\n if (!player.media.error) {\n const code = event.data;\n // Messages copied from https://developers.google.com/youtube/iframe_api_reference#onError\n const message =\n {\n 2: 'The request contains an invalid parameter value. For example, this error occurs if you specify a video ID that does not have 11 characters, or if the video ID contains invalid characters, such as exclamation points or asterisks.',\n 5: 'The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.',\n 100: 'The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.',\n 101: 'The owner of the requested video does not allow it to be played in embedded players.',\n 150: 'The owner of the requested video does not allow it to be played in embedded players.',\n }[code] || 'An unknown error occured';\n\n player.media.error = { code, message };\n\n triggerEvent.call(player, player.media, 'error');\n }\n },\n onPlaybackQualityChange() {\n triggerEvent.call(player, player.media, 'qualitychange', false, {\n quality: player.media.quality,\n });\n },\n onPlaybackRateChange(event) {\n // Get the instance\n const instance = event.target;\n\n // Get current speed\n player.media.playbackRate = instance.getPlaybackRate();\n\n triggerEvent.call(player, player.media, 'ratechange');\n },\n onReady(event) {\n // Get the instance\n const instance = event.target;\n\n // Get the title\n youtube.getTitle.call(player, videoId);\n\n // Create a faux HTML5 API using the YouTube API\n player.media.play = () => {\n assurePlaybackState.call(player, true);\n instance.playVideo();\n };\n\n player.media.pause = () => {\n assurePlaybackState.call(player, false);\n instance.pauseVideo();\n };\n\n player.media.stop = () => {\n instance.stopVideo();\n };\n\n player.media.duration = instance.getDuration();\n player.media.paused = true;\n\n // Seeking\n player.media.currentTime = 0;\n Object.defineProperty(player.media, 'currentTime', {\n get() {\n return Number(instance.getCurrentTime());\n },\n set(time) {\n // If paused, mute audio preventively (YouTube starts playing on seek if the video hasn't been played yet).\n if (player.paused) {\n player.embed.mute();\n }\n\n // Set seeking state and trigger event\n player.media.seeking = true;\n triggerEvent.call(player, player.media, 'seeking');\n\n // Seek after events sent\n instance.seekTo(time);\n },\n });\n\n // Playback speed\n Object.defineProperty(player.media, 'playbackRate', {\n get() {\n return instance.getPlaybackRate();\n },\n set(input) {\n instance.setPlaybackRate(input);\n },\n });\n\n // Quality\n Object.defineProperty(player.media, 'quality', {\n get() {\n return mapQualityUnit(instance.getPlaybackQuality());\n },\n set(input) {\n instance.setPlaybackQuality(mapQualityUnit(input));\n },\n });\n\n // Volume\n let { volume } = player.config;\n Object.defineProperty(player.media, 'volume', {\n get() {\n return volume;\n },\n set(input) {\n volume = input;\n instance.setVolume(volume * 100);\n triggerEvent.call(player, player.media, 'volumechange');\n },\n });\n\n // Muted\n let { muted } = player.config;\n Object.defineProperty(player.media, 'muted', {\n get() {\n return muted;\n },\n set(input) {\n const toggle = is.boolean(input) ? input : muted;\n muted = toggle;\n instance[toggle ? 'mute' : 'unMute']();\n triggerEvent.call(player, player.media, 'volumechange');\n },\n });\n\n // Source\n Object.defineProperty(player.media, 'currentSrc', {\n get() {\n return instance.getVideoUrl();\n },\n });\n\n // Ended\n Object.defineProperty(player.media, 'ended', {\n get() {\n return player.currentTime === player.duration;\n },\n });\n\n // Get available speeds\n player.options.speed = instance.getAvailablePlaybackRates();\n\n // Set the tabindex to avoid focus entering iframe\n if (player.supported.ui) {\n player.media.setAttribute('tabindex', -1);\n }\n\n triggerEvent.call(player, player.media, 'timeupdate');\n triggerEvent.call(player, player.media, 'durationchange');\n\n // Reset timer\n clearInterval(player.timers.buffering);\n\n // Setup buffering\n player.timers.buffering = setInterval(() => {\n // Get loaded % from YouTube\n player.media.buffered = instance.getVideoLoadedFraction();\n\n // Trigger progress only when we actually buffer something\n if (player.media.lastBuffered === null || player.media.lastBuffered < player.media.buffered) {\n triggerEvent.call(player, player.media, 'progress');\n }\n\n // Set last buffer point\n player.media.lastBuffered = player.media.buffered;\n\n // Bail if we're at 100%\n if (player.media.buffered === 1) {\n clearInterval(player.timers.buffering);\n\n // Trigger event\n triggerEvent.call(player, player.media, 'canplaythrough');\n }\n }, 200);\n\n // Rebuild UI\n setTimeout(() => ui.build.call(player), 50);\n },\n onStateChange(event) {\n // Get the instance\n const instance = event.target;\n\n // Reset timer\n clearInterval(player.timers.playing);\n\n const seeked = player.media.seeking && [1, 2].includes(event.data);\n\n if (seeked) {\n // Unset seeking and fire seeked event\n player.media.seeking = false;\n triggerEvent.call(player, player.media, 'seeked');\n }\n\n // Handle events\n // -1 Unstarted\n // 0 Ended\n // 1 Playing\n // 2 Paused\n // 3 Buffering\n // 5 Video cued\n switch (event.data) {\n case -1:\n // Update scrubber\n triggerEvent.call(player, player.media, 'timeupdate');\n\n // Get loaded % from YouTube\n player.media.buffered = instance.getVideoLoadedFraction();\n triggerEvent.call(player, player.media, 'progress');\n\n break;\n\n case 0:\n assurePlaybackState.call(player, false);\n\n // YouTube doesn't support loop for a single video, so mimick it.\n if (player.media.loop) {\n // YouTube needs a call to `stopVideo` before playing again\n instance.stopVideo();\n instance.playVideo();\n } else {\n triggerEvent.call(player, player.media, 'ended');\n }\n\n break;\n\n case 1:\n // Restore paused state (YouTube starts playing on seek if the video hasn't been played yet)\n if (player.media.paused && !player.embed.hasPlayed) {\n player.media.pause();\n } else {\n assurePlaybackState.call(player, true);\n\n triggerEvent.call(player, player.media, 'playing');\n\n // Poll to get playback progress\n player.timers.playing = setInterval(() => {\n triggerEvent.call(player, player.media, 'timeupdate');\n }, 50);\n\n // Check duration again due to YouTube bug\n // https://github.com/sampotts/plyr/issues/374\n // https://code.google.com/p/gdata-issues/issues/detail?id=8690\n if (player.media.duration !== instance.getDuration()) {\n player.media.duration = instance.getDuration();\n triggerEvent.call(player, player.media, 'durationchange');\n }\n\n // Get quality\n controls.setQualityMenu.call(\n player,\n mapQualityUnits(instance.getAvailableQualityLevels()),\n );\n }\n\n break;\n\n case 2:\n // Restore audio (YouTube starts playing on seek if the video hasn't been played yet)\n if (!player.muted) {\n player.embed.unMute();\n }\n assurePlaybackState.call(player, false);\n\n break;\n\n default:\n break;\n }\n\n triggerEvent.call(player, player.elements.container, 'statechange', false, {\n code: event.data,\n });\n },\n },\n });\n },\n};\n\nexport default youtube;\n","// ==========================================================================\n// Plyr Media\n// ==========================================================================\n\nimport html5 from './html5';\nimport vimeo from './plugins/vimeo';\nimport youtube from './plugins/youtube';\nimport { createElement, toggleClass, wrap } from './utils/elements';\n\nconst media = {\n // Setup media\n setup() {\n // If there's no media, bail\n if (!this.media) {\n this.debug.warn('No media element found!');\n return;\n }\n\n // Add type class\n toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', this.type), true);\n\n // Add provider class\n toggleClass(this.elements.container, this.config.classNames.provider.replace('{0}', this.provider), true);\n\n // Add video class for embeds\n // This will require changes if audio embeds are added\n if (this.isEmbed) {\n toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', 'video'), true);\n }\n\n // Inject the player wrapper\n if (this.isVideo) {\n // Create the wrapper div\n this.elements.wrapper = createElement('div', {\n class: this.config.classNames.video,\n });\n\n // Wrap the video in a container\n wrap(this.media, this.elements.wrapper);\n\n // Faux poster container\n this.elements.poster = createElement('div', {\n class: this.config.classNames.poster,\n });\n\n this.elements.wrapper.appendChild(this.elements.poster);\n }\n\n if (this.isHTML5) {\n html5.extend.call(this);\n } else if (this.isYouTube) {\n youtube.setup.call(this);\n } else if (this.isVimeo) {\n vimeo.setup.call(this);\n }\n },\n};\n\nexport default media;\n","// ==========================================================================\n// Advertisement plugin using Google IMA HTML5 SDK\n// Create an account with our ad partner, vi here:\n// https://www.vi.ai/publisher-video-monetization/\n// ==========================================================================\n\n/* global google */\n\nimport i18n from '../i18n';\nimport { createElement } from './../utils/elements';\nimport { triggerEvent } from './../utils/events';\nimport is from './../utils/is';\nimport loadScript from './../utils/loadScript';\nimport { formatTime } from './../utils/time';\nimport { buildUrlParams } from './../utils/urls';\n\nclass Ads {\n /**\n * Ads constructor.\n * @param {object} player\n * @return {Ads}\n */\n constructor(player) {\n this.player = player;\n this.publisherId = player.config.ads.publisherId;\n this.playing = false;\n this.initialized = false;\n this.elements = {\n container: null,\n displayContainer: null,\n };\n this.manager = null;\n this.loader = null;\n this.cuePoints = null;\n this.events = {};\n this.safetyTimer = null;\n this.countdownTimer = null;\n\n // Setup a promise to resolve when the IMA manager is ready\n this.managerPromise = new Promise((resolve, reject) => {\n // The ad is loaded and ready\n this.on('loaded', resolve);\n\n // Ads failed\n this.on('error', reject);\n });\n\n this.load();\n }\n\n get enabled() {\n return this.player.isVideo && this.player.config.ads.enabled && !is.empty(this.publisherId);\n }\n\n /**\n * Load the IMA SDK\n */\n load() {\n if (this.enabled) {\n // Check if the Google IMA3 SDK is loaded or load it ourselves\n if (!is.object(window.google) || !is.object(window.google.ima)) {\n loadScript(this.player.config.urls.googleIMA.sdk)\n .then(() => {\n this.ready();\n })\n .catch(() => {\n // Script failed to load or is blocked\n this.trigger('error', new Error('Google IMA SDK failed to load'));\n });\n } else {\n this.ready();\n }\n }\n }\n\n /**\n * Get the ads instance ready\n */\n ready() {\n // Start ticking our safety timer. If the whole advertisement\n // thing doesn't resolve within our set time; we bail\n this.startSafetyTimer(12000, 'ready()');\n\n // Clear the safety timer\n this.managerPromise.then(() => {\n this.clearSafetyTimer('onAdsManagerLoaded()');\n });\n\n // Set listeners on the Plyr instance\n this.listeners();\n\n // Setup the IMA SDK\n this.setupIMA();\n }\n\n // Build the default tag URL\n get tagUrl() {\n const params = {\n AV_PUBLISHERID: '58c25bb0073ef448b1087ad6',\n AV_CHANNELID: '5a0458dc28a06145e4519d21',\n AV_URL: location.hostname,\n cb: Date.now(),\n AV_WIDTH: 640,\n AV_HEIGHT: 480,\n AV_CDIM2: this.publisherId,\n };\n\n const base = 'https://go.aniview.com/api/adserver6/vast/';\n\n return `${base}?${buildUrlParams(params)}`;\n }\n\n /**\n * In order for the SDK to display ads for our video, we need to tell it where to put them,\n * so here we define our ad container. This div is set up to render on top of the video player.\n * Using the code below, we tell the SDK to render ads within that div. We also provide a\n * handle to the content video player - the SDK will poll the current time of our player to\n * properly place mid-rolls. After we create the ad display container, we initialize it. On\n * mobile devices, this initialization is done as the result of a user action.\n */\n setupIMA() {\n // Create the container for our advertisements\n this.elements.container = createElement('div', {\n class: this.player.config.classNames.ads,\n });\n this.player.elements.container.appendChild(this.elements.container);\n\n // So we can run VPAID2\n google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED);\n\n // Set language\n google.ima.settings.setLocale(this.player.config.ads.language);\n\n // We assume the adContainer is the video container of the plyr element\n // that will house the ads\n this.elements.displayContainer = new google.ima.AdDisplayContainer(this.elements.container);\n\n // Request video ads to be pre-loaded\n this.requestAds();\n }\n\n /**\n * Request advertisements\n */\n requestAds() {\n const { container } = this.player.elements;\n\n try {\n // Create ads loader\n this.loader = new google.ima.AdsLoader(this.elements.displayContainer);\n\n // Listen and respond to ads loaded and error events\n this.loader.addEventListener(\n google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED,\n event => this.onAdsManagerLoaded(event),\n false,\n );\n this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, error => this.onAdError(error), false);\n\n // Request video ads\n const request = new google.ima.AdsRequest();\n request.adTagUrl = this.tagUrl;\n\n // Specify the linear and nonlinear slot sizes. This helps the SDK\n // to select the correct creative if multiple are returned\n request.linearAdSlotWidth = container.offsetWidth;\n request.linearAdSlotHeight = container.offsetHeight;\n request.nonLinearAdSlotWidth = container.offsetWidth;\n request.nonLinearAdSlotHeight = container.offsetHeight;\n\n // We only overlay ads as we only support video.\n request.forceNonLinearFullSlot = false;\n\n // Mute based on current state\n request.setAdWillPlayMuted(!this.player.muted);\n\n this.loader.requestAds(request);\n } catch (e) {\n this.onAdError(e);\n }\n }\n\n /**\n * Update the ad countdown\n * @param {boolean} start\n */\n pollCountdown(start = false) {\n if (!start) {\n clearInterval(this.countdownTimer);\n this.elements.container.removeAttribute('data-badge-text');\n return;\n }\n\n const update = () => {\n const time = formatTime(Math.max(this.manager.getRemainingTime(), 0));\n const label = `${i18n.get('advertisement', this.player.config)} - ${time}`;\n this.elements.container.setAttribute('data-badge-text', label);\n };\n\n this.countdownTimer = setInterval(update, 100);\n }\n\n /**\n * This method is called whenever the ads are ready inside the AdDisplayContainer\n * @param {Event} adsManagerLoadedEvent\n */\n onAdsManagerLoaded(event) {\n // Get the ads manager\n const settings = new google.ima.AdsRenderingSettings();\n\n // Tell the SDK to save and restore content video state on our behalf\n settings.restoreCustomPlaybackStateOnAdBreakComplete = true;\n settings.enablePreloading = true;\n\n // The SDK is polling currentTime on the contentPlayback. And needs a duration\n // so it can determine when to start the mid- and post-roll\n this.manager = event.getAdsManager(this.player, settings);\n\n // Get the cue points for any mid-rolls by filtering out the pre- and post-roll\n this.cuePoints = this.manager.getCuePoints();\n\n // Add advertisement cue's within the time line if available\n if (!is.empty(this.cuePoints)) {\n this.cuePoints.forEach(cuePoint => {\n if (cuePoint !== 0 && cuePoint !== -1 && cuePoint < this.player.duration) {\n const seekElement = this.player.elements.progress;\n\n if (is.element(seekElement)) {\n const cuePercentage = 100 / this.player.duration * cuePoint;\n const cue = createElement('span', {\n class: this.player.config.classNames.cues,\n });\n\n cue.style.left = `${cuePercentage.toString()}%`;\n seekElement.appendChild(cue);\n }\n }\n });\n }\n\n // Get skippable state\n // TODO: Skip button\n // this.player.debug.warn(this.manager.getAdSkippableState());\n\n // Set volume to match player\n this.manager.setVolume(this.player.volume);\n\n // Add listeners to the required events\n // Advertisement error events\n this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, error => this.onAdError(error));\n\n // Advertisement regular events\n Object.keys(google.ima.AdEvent.Type).forEach(type => {\n this.manager.addEventListener(google.ima.AdEvent.Type[type], event => this.onAdEvent(event));\n });\n\n // Resolve our adsManager\n this.trigger('loaded');\n }\n\n /**\n * This is where all the event handling takes place. Retrieve the ad from the event. Some\n * events (e.g. ALL_ADS_COMPLETED) don't have the ad object associated\n * https://developers.google.com/interactive-media-ads/docs/sdks/html5/v3/apis#ima.AdEvent.Type\n * @param {Event} event\n */\n onAdEvent(event) {\n const { container } = this.player.elements;\n\n // Retrieve the ad from the event. Some events (e.g. ALL_ADS_COMPLETED)\n // don't have ad object associated\n const ad = event.getAd();\n\n // Proxy event\n const dispatchEvent = type => {\n const event = `ads${type.replace(/_/g, '').toLowerCase()}`;\n triggerEvent.call(this.player, this.player.media, event);\n };\n\n switch (event.type) {\n case google.ima.AdEvent.Type.LOADED:\n // This is the first event sent for an ad - it is possible to determine whether the\n // ad is a video ad or an overlay\n this.trigger('loaded');\n\n // Bubble event\n dispatchEvent(event.type);\n\n // Start countdown\n this.pollCountdown(true);\n\n if (!ad.isLinear()) {\n // Position AdDisplayContainer correctly for overlay\n ad.width = container.offsetWidth;\n ad.height = container.offsetHeight;\n }\n\n // console.info('Ad type: ' + event.getAd().getAdPodInfo().getPodIndex());\n // console.info('Ad time: ' + event.getAd().getAdPodInfo().getTimeOffset());\n break;\n\n case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:\n // All ads for the current videos are done. We can now request new advertisements\n // in case the video is re-played\n\n // Fire event\n dispatchEvent(event.type);\n\n // TODO: Example for what happens when a next video in a playlist would be loaded.\n // So here we load a new video when all ads are done.\n // Then we load new ads within a new adsManager. When the video\n // Is started - after - the ads are loaded, then we get ads.\n // You can also easily test cancelling and reloading by running\n // player.ads.cancel() and player.ads.play from the console I guess.\n // this.player.source = {\n // type: 'video',\n // title: 'View From A Blue Moon',\n // sources: [{\n // src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.mp4', type:\n // 'video/mp4', }], poster:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg', tracks:\n // [ { kind: 'captions', label: 'English', srclang: 'en', src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt',\n // default: true, }, { kind: 'captions', label: 'French', srclang: 'fr', src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt', }, ],\n // };\n\n // TODO: So there is still this thing where a video should only be allowed to start\n // playing when the IMA SDK is ready or has failed\n\n this.loadAds();\n break;\n\n case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:\n // This event indicates the ad has started - the video player can adjust the UI,\n // for example display a pause button and remaining time. Fired when content should\n // be paused. This usually happens right before an ad is about to cover the content\n\n dispatchEvent(event.type);\n\n this.pauseContent();\n\n break;\n\n case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:\n // This event indicates the ad has finished - the video player can perform\n // appropriate UI actions, such as removing the timer for remaining time detection.\n // Fired when content should be resumed. This usually happens when an ad finishes\n // or collapses\n\n dispatchEvent(event.type);\n\n this.pollCountdown();\n\n this.resumeContent();\n\n break;\n\n case google.ima.AdEvent.Type.STARTED:\n case google.ima.AdEvent.Type.MIDPOINT:\n case google.ima.AdEvent.Type.COMPLETE:\n case google.ima.AdEvent.Type.IMPRESSION:\n case google.ima.AdEvent.Type.CLICK:\n dispatchEvent(event.type);\n break;\n\n default:\n break;\n }\n }\n\n /**\n * Any ad error handling comes through here\n * @param {Event} event\n */\n onAdError(event) {\n this.cancel();\n this.player.debug.warn('Ads error', event);\n }\n\n /**\n * Setup hooks for Plyr and window events. This ensures\n * the mid- and post-roll launch at the correct time. And\n * resize the advertisement when the player resizes\n */\n listeners() {\n const { container } = this.player.elements;\n let time;\n\n // Add listeners to the required events\n this.player.on('ended', () => {\n this.loader.contentComplete();\n });\n\n this.player.on('seeking', () => {\n time = this.player.currentTime;\n return time;\n });\n\n this.player.on('seeked', () => {\n const seekedTime = this.player.currentTime;\n\n if (is.empty(this.cuePoints)) {\n return;\n }\n\n this.cuePoints.forEach((cuePoint, index) => {\n if (time < cuePoint && cuePoint < seekedTime) {\n this.manager.discardAdBreak();\n this.cuePoints.splice(index, 1);\n }\n });\n });\n\n // Listen to the resizing of the window. And resize ad accordingly\n // TODO: eventually implement ResizeObserver\n window.addEventListener('resize', () => {\n if (this.manager) {\n this.manager.resize(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);\n }\n });\n }\n\n /**\n * Initialize the adsManager and start playing advertisements\n */\n play() {\n const { container } = this.player.elements;\n\n if (!this.managerPromise) {\n this.resumeContent();\n }\n\n // Play the requested advertisement whenever the adsManager is ready\n this.managerPromise\n .then(() => {\n // Initialize the container. Must be done via a user action on mobile devices\n this.elements.displayContainer.initialize();\n\n try {\n if (!this.initialized) {\n // Initialize the ads manager. Ad rules playlist will start at this time\n this.manager.init(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);\n\n // Call play to start showing the ad. Single video and overlay ads will\n // start at this time; the call will be ignored for ad rules\n this.manager.start();\n }\n\n this.initialized = true;\n } catch (adError) {\n // An error may be thrown if there was a problem with the\n // VAST response\n this.onAdError(adError);\n }\n })\n .catch(() => {});\n }\n\n /**\n * Resume our video\n */\n resumeContent() {\n // Hide the advertisement container\n this.elements.container.style.zIndex = '';\n\n // Ad is stopped\n this.playing = false;\n\n // Play our video\n if (this.player.currentTime < this.player.duration) {\n this.player.play();\n }\n }\n\n /**\n * Pause our video\n */\n pauseContent() {\n // Show the advertisement container\n this.elements.container.style.zIndex = 3;\n\n // Ad is playing.\n this.playing = true;\n\n // Pause our video.\n this.player.pause();\n }\n\n /**\n * Destroy the adsManager so we can grab new ads after this. If we don't then we're not\n * allowed to call new ads based on google policies, as they interpret this as an accidental\n * video requests. https://developers.google.com/interactive-\n * media-ads/docs/sdks/android/faq#8\n */\n cancel() {\n // Pause our video\n if (this.initialized) {\n this.resumeContent();\n }\n\n // Tell our instance that we're done for now\n this.trigger('error');\n\n // Re-create our adsManager\n this.loadAds();\n }\n\n /**\n * Re-create our adsManager\n */\n loadAds() {\n // Tell our adsManager to go bye bye\n this.managerPromise\n .then(() => {\n // Destroy our adsManager\n if (this.manager) {\n this.manager.destroy();\n }\n\n // Re-set our adsManager promises\n this.managerPromise = new Promise(resolve => {\n this.on('loaded', resolve);\n this.player.debug.log(this.manager);\n });\n\n // Now request some new advertisements\n this.requestAds();\n })\n .catch(() => {});\n }\n\n /**\n * Handles callbacks after an ad event was invoked\n * @param {string} event - Event type\n */\n trigger(event, ...args) {\n const handlers = this.events[event];\n\n if (is.array(handlers)) {\n handlers.forEach(handler => {\n if (is.function(handler)) {\n handler.apply(this, args);\n }\n });\n }\n }\n\n /**\n * Add event listeners\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n * @return {Ads}\n */\n on(event, callback) {\n if (!is.array(this.events[event])) {\n this.events[event] = [];\n }\n\n this.events[event].push(callback);\n\n return this;\n }\n\n /**\n * Setup a safety timer for when the ad network doesn't respond for whatever reason.\n * The advertisement has 12 seconds to get its things together. We stop this timer when the\n * advertisement is playing, or when a user action is required to start, then we clear the\n * timer on ad ready\n * @param {number} time\n * @param {string} from\n */\n startSafetyTimer(time, from) {\n this.player.debug.log(`Safety timer invoked from: ${from}`);\n\n this.safetyTimer = setTimeout(() => {\n this.cancel();\n this.clearSafetyTimer('startSafetyTimer()');\n }, time);\n }\n\n /**\n * Clear our safety timer(s)\n * @param {string} from\n */\n clearSafetyTimer(from) {\n if (!is.nullOrUndefined(this.safetyTimer)) {\n this.player.debug.log(`Safety timer cleared from: ${from}`);\n\n clearTimeout(this.safetyTimer);\n this.safetyTimer = null;\n }\n }\n}\n\nexport default Ads;\n","// ==========================================================================\n// Plyr source update\n// ==========================================================================\n\nimport { providers } from './config/types';\nimport html5 from './html5';\nimport media from './media';\nimport support from './support';\nimport ui from './ui';\nimport { createElement, insertElement, removeElement } from './utils/elements';\nimport is from './utils/is';\nimport { getDeep } from './utils/objects';\n\nconst source = {\n // Add elements to HTML5 media (source, tracks, etc)\n insertElements(type, attributes) {\n if (is.string(attributes)) {\n insertElement(type, this.media, {\n src: attributes,\n });\n } else if (is.array(attributes)) {\n attributes.forEach(attribute => {\n insertElement(type, this.media, attribute);\n });\n }\n },\n\n // Update source\n // Sources are not checked for support so be careful\n change(input) {\n if (!getDeep(input, 'sources.length')) {\n this.debug.warn('Invalid source format');\n return;\n }\n\n // Cancel current network requests\n html5.cancelRequests.call(this);\n\n // Destroy instance and re-setup\n this.destroy.call(\n this,\n () => {\n // Reset quality options\n this.options.quality = [];\n\n // Remove elements\n removeElement(this.media);\n this.media = null;\n\n // Reset class name\n if (is.element(this.elements.container)) {\n this.elements.container.removeAttribute('class');\n }\n\n // Set the type and provider\n const { sources, type } = input;\n const [{ provider = providers.html5, src }] = sources;\n const tagName = provider === 'html5' ? type : 'div';\n const attributes = provider === 'html5' ? {} : { src };\n\n Object.assign(this, {\n provider,\n type,\n // Check for support\n supported: support.check(type, provider, this.config.playsinline),\n // Create new element\n media: createElement(tagName, attributes),\n });\n\n // Inject the new element\n this.elements.container.appendChild(this.media);\n\n // Autoplay the new source?\n if (is.boolean(input.autoplay)) {\n this.config.autoplay = input.autoplay;\n }\n\n // Set attributes for audio and video\n if (this.isHTML5) {\n if (this.config.crossorigin) {\n this.media.setAttribute('crossorigin', '');\n }\n if (this.config.autoplay) {\n this.media.setAttribute('autoplay', '');\n }\n if (!is.empty(input.poster)) {\n this.poster = input.poster;\n }\n if (this.config.loop.active) {\n this.media.setAttribute('loop', '');\n }\n if (this.config.muted) {\n this.media.setAttribute('muted', '');\n }\n if (this.config.playsinline) {\n this.media.setAttribute('playsinline', '');\n }\n }\n\n // Restore class hook\n ui.addStyleHook.call(this);\n\n // Set new sources for html5\n if (this.isHTML5) {\n source.insertElements.call(this, 'source', sources);\n }\n\n // Set video title\n this.config.title = input.title;\n\n // Set up from scratch\n media.setup.call(this);\n\n // HTML5 stuff\n if (this.isHTML5) {\n // Setup captions\n if ('tracks' in input) {\n source.insertElements.call(this, 'track', input.tracks);\n }\n\n // Load HTML5 sources\n this.media.load();\n }\n\n // If HTML5 or embed but not fully supported, setupInterface and call ready now\n if (this.isHTML5 || (this.isEmbed && !this.supported.ui)) {\n // Setup interface\n ui.build.call(this);\n }\n\n // Update the fullscreen support\n this.fullscreen.update();\n },\n true,\n );\n },\n};\n\nexport default source;\n","// ==========================================================================\n// Plyr\n// plyr.js v3.3.12\n// https://github.com/sampotts/plyr\n// License: The MIT License (MIT)\n// ==========================================================================\n\nimport captions from './captions';\nimport defaults from './config/defaults';\nimport { getProviderByUrl, providers, types } from './config/types';\nimport Console from './console';\nimport controls from './controls';\nimport Fullscreen from './fullscreen';\nimport Listeners from './listeners';\nimport media from './media';\nimport Ads from './plugins/ads';\nimport source from './source';\nimport Storage from './storage';\nimport support from './support';\nimport ui from './ui';\nimport { closest } from './utils/arrays';\nimport { createElement, hasClass, removeElement, replaceElement, toggleClass, wrap } from './utils/elements';\nimport { off, on, once, triggerEvent, unbindListeners } from './utils/events';\nimport is from './utils/is';\nimport loadSprite from './utils/loadSprite';\nimport { cloneDeep, extend } from './utils/objects';\nimport { parseUrl } from './utils/urls';\n\n// Private properties\n// TODO: Use a WeakMap for private globals\n// const globals = new WeakMap();\n\n// Plyr instance\nclass Plyr {\n constructor(target, options) {\n this.timers = {};\n\n // State\n this.ready = false;\n this.loading = false;\n this.failed = false;\n\n // Touch device\n this.touch = support.touch;\n\n // Set the media element\n this.media = target;\n\n // String selector passed\n if (is.string(this.media)) {\n this.media = document.querySelectorAll(this.media);\n }\n\n // jQuery, NodeList or Array passed, use first element\n if ((window.jQuery && this.media instanceof jQuery) || is.nodeList(this.media) || is.array(this.media)) {\n // eslint-disable-next-line\n this.media = this.media[0];\n }\n\n // Set config\n this.config = extend(\n {},\n defaults,\n Plyr.defaults,\n options || {},\n (() => {\n try {\n return JSON.parse(this.media.getAttribute('data-plyr-config'));\n } catch (e) {\n return {};\n }\n })(),\n );\n\n // Elements cache\n this.elements = {\n container: null,\n buttons: {},\n display: {},\n progress: {},\n inputs: {},\n settings: {\n menu: null,\n panes: {},\n tabs: {},\n },\n captions: null,\n };\n\n // Captions\n this.captions = {\n active: null,\n currentTrack: -1,\n meta: new WeakMap(),\n };\n\n // Fullscreen\n this.fullscreen = {\n active: false,\n };\n\n // Options\n this.options = {\n speed: [],\n quality: [],\n };\n\n // Debugging\n // TODO: move to globals\n this.debug = new Console(this.config.debug);\n\n // Log config options and support\n this.debug.log('Config', this.config);\n this.debug.log('Support', support);\n\n // We need an element to setup\n if (is.nullOrUndefined(this.media) || !is.element(this.media)) {\n this.debug.error('Setup failed: no suitable element passed');\n return;\n }\n\n // Bail if the element is initialized\n if (this.media.plyr) {\n this.debug.warn('Target already setup');\n return;\n }\n\n // Bail if not enabled\n if (!this.config.enabled) {\n this.debug.error('Setup failed: disabled by config');\n return;\n }\n\n // Bail if disabled or no basic support\n // You may want to disable certain UAs etc\n if (!support.check().api) {\n this.debug.error('Setup failed: no support');\n return;\n }\n\n // Cache original element state for .destroy()\n const clone = this.media.cloneNode(true);\n clone.autoplay = false;\n this.elements.original = clone;\n\n // Set media type based on tag or data attribute\n // Supported: video, audio, vimeo, youtube\n const type = this.media.tagName.toLowerCase();\n\n // Embed properties\n let iframe = null;\n let url = null;\n\n // Different setup based on type\n switch (type) {\n case 'div':\n // Find the frame\n iframe = this.media.querySelector('iframe');\n\n // <iframe> type\n if (is.element(iframe)) {\n // Detect provider\n url = parseUrl(iframe.getAttribute('src'));\n this.provider = getProviderByUrl(url.toString());\n\n // Rework elements\n this.elements.container = this.media;\n this.media = iframe;\n\n // Reset classname\n this.elements.container.className = '';\n\n // Get attributes from URL and set config\n if (url.searchParams.length) {\n const truthy = ['1', 'true'];\n\n if (truthy.includes(url.searchParams.get('autoplay'))) {\n this.config.autoplay = true;\n }\n if (truthy.includes(url.searchParams.get('loop'))) {\n this.config.loop.active = true;\n }\n\n // TODO: replace fullscreen.iosNative with this playsinline config option\n // YouTube requires the playsinline in the URL\n if (this.isYouTube) {\n this.config.playsinline = truthy.includes(url.searchParams.get('playsinline'));\n } else {\n this.config.playsinline = true;\n }\n }\n } else {\n // <div> with attributes\n this.provider = this.media.getAttribute(this.config.attributes.embed.provider);\n\n // Remove attribute\n this.media.removeAttribute(this.config.attributes.embed.provider);\n }\n\n // Unsupported or missing provider\n if (is.empty(this.provider) || !Object.keys(providers).includes(this.provider)) {\n this.debug.error('Setup failed: Invalid provider');\n return;\n }\n\n // Audio will come later for external providers\n this.type = types.video;\n\n break;\n\n case 'video':\n case 'audio':\n this.type = type;\n this.provider = providers.html5;\n\n // Get config from attributes\n if (this.media.hasAttribute('crossorigin')) {\n this.config.crossorigin = true;\n }\n if (this.media.hasAttribute('autoplay')) {\n this.config.autoplay = true;\n }\n if (this.media.hasAttribute('playsinline')) {\n this.config.playsinline = true;\n }\n if (this.media.hasAttribute('muted')) {\n this.config.muted = true;\n }\n if (this.media.hasAttribute('loop')) {\n this.config.loop.active = true;\n }\n\n break;\n\n default:\n this.debug.error('Setup failed: unsupported type');\n return;\n }\n\n // Check for support again but with type\n this.supported = support.check(this.type, this.provider, this.config.playsinline);\n\n // If no support for even API, bail\n if (!this.supported.api) {\n this.debug.error('Setup failed: no support');\n return;\n }\n\n this.eventListeners = [];\n\n // Create listeners\n this.listeners = new Listeners(this);\n\n // Setup local storage for user settings\n this.storage = new Storage(this);\n\n // Store reference\n this.media.plyr = this;\n\n // Wrap media\n if (!is.element(this.elements.container)) {\n this.elements.container = createElement('div');\n wrap(this.media, this.elements.container);\n }\n\n // Add style hook\n ui.addStyleHook.call(this);\n\n // Setup media\n media.setup.call(this);\n\n // Listen for events if debugging\n if (this.config.debug) {\n on.call(this, this.elements.container, this.config.events.join(' '), event => {\n this.debug.log(`event: ${event.type}`);\n });\n }\n\n // Setup interface\n // If embed but not fully supported, build interface now to avoid flash of controls\n if (this.isHTML5 || (this.isEmbed && !this.supported.ui)) {\n ui.build.call(this);\n }\n\n // Container listeners\n this.listeners.container();\n\n // Global listeners\n this.listeners.global();\n\n // Setup fullscreen\n this.fullscreen = new Fullscreen(this);\n\n // Setup ads if provided\n this.ads = new Ads(this);\n\n // Autoplay if required\n if (this.config.autoplay) {\n this.play();\n }\n }\n\n // ---------------------------------------\n // API\n // ---------------------------------------\n\n /**\n * Types and provider helpers\n */\n get isHTML5() {\n return Boolean(this.provider === providers.html5);\n }\n get isEmbed() {\n return Boolean(this.isYouTube || this.isVimeo);\n }\n get isYouTube() {\n return Boolean(this.provider === providers.youtube);\n }\n get isVimeo() {\n return Boolean(this.provider === providers.vimeo);\n }\n get isVideo() {\n return Boolean(this.type === types.video);\n }\n get isAudio() {\n return Boolean(this.type === types.audio);\n }\n\n /**\n * Play the media, or play the advertisement (if they are not blocked)\n */\n play() {\n if (!is.function(this.media.play)) {\n return null;\n }\n\n // Return the promise (for HTML5)\n return this.media.play();\n }\n\n /**\n * Pause the media\n */\n pause() {\n if (!this.playing || !is.function(this.media.pause)) {\n return;\n }\n\n this.media.pause();\n }\n\n /**\n * Get playing state\n */\n get playing() {\n return Boolean(this.ready && !this.paused && !this.ended);\n }\n\n /**\n * Get paused state\n */\n get paused() {\n return Boolean(this.media.paused);\n }\n\n /**\n * Get stopped state\n */\n get stopped() {\n return Boolean(this.paused && this.currentTime === 0);\n }\n\n /**\n * Get ended state\n */\n get ended() {\n return Boolean(this.media.ended);\n }\n\n /**\n * Toggle playback based on current status\n * @param {boolean} input\n */\n togglePlay(input) {\n // Toggle based on current state if nothing passed\n const toggle = is.boolean(input) ? input : !this.playing;\n\n if (toggle) {\n this.play();\n } else {\n this.pause();\n }\n }\n\n /**\n * Stop playback\n */\n stop() {\n if (this.isHTML5) {\n this.pause();\n this.restart();\n } else if (is.function(this.media.stop)) {\n this.media.stop();\n }\n }\n\n /**\n * Restart playback\n */\n restart() {\n this.currentTime = 0;\n }\n\n /**\n * Rewind\n * @param {number} seekTime - how far to rewind in seconds. Defaults to the config.seekTime\n */\n rewind(seekTime) {\n this.currentTime = this.currentTime - (is.number(seekTime) ? seekTime : this.config.seekTime);\n }\n\n /**\n * Fast forward\n * @param {number} seekTime - how far to fast forward in seconds. Defaults to the config.seekTime\n */\n forward(seekTime) {\n this.currentTime = this.currentTime + (is.number(seekTime) ? seekTime : this.config.seekTime);\n }\n\n /**\n * Seek to a time\n * @param {number} input - where to seek to in seconds. Defaults to 0 (the start)\n */\n set currentTime(input) {\n // Bail if media duration isn't available yet\n if (!this.duration) {\n return;\n }\n\n // Validate input\n const inputIsValid = is.number(input) && input > 0;\n\n // Set\n this.media.currentTime = inputIsValid ? Math.min(input, this.duration) : 0;\n\n // Logging\n this.debug.log(`Seeking to ${this.currentTime} seconds`);\n }\n\n /**\n * Get current time\n */\n get currentTime() {\n return Number(this.media.currentTime);\n }\n\n /**\n * Get buffered\n */\n get buffered() {\n const { buffered } = this.media;\n\n // YouTube / Vimeo return a float between 0-1\n if (is.number(buffered)) {\n return buffered;\n }\n\n // HTML5\n // TODO: Handle buffered chunks of the media\n // (i.e. seek to another section buffers only that section)\n if (buffered && buffered.length && this.duration > 0) {\n return buffered.end(0) / this.duration;\n }\n\n return 0;\n }\n\n /**\n * Get seeking status\n */\n get seeking() {\n return Boolean(this.media.seeking);\n }\n\n /**\n * Get the duration of the current media\n */\n get duration() {\n // Faux duration set via config\n const fauxDuration = parseFloat(this.config.duration);\n\n // Media duration can be NaN before the media has loaded\n const duration = (this.media || {}).duration || 0;\n\n // If config duration is funky, use regular duration\n return fauxDuration || duration;\n }\n\n /**\n * Set the player volume\n * @param {number} value - must be between 0 and 1. Defaults to the value from local storage and config.volume if not set in storage\n */\n set volume(value) {\n let volume = value;\n const max = 1;\n const min = 0;\n\n if (is.string(volume)) {\n volume = Number(volume);\n }\n\n // Load volume from storage if no value specified\n if (!is.number(volume)) {\n volume = this.storage.get('volume');\n }\n\n // Use config if all else fails\n if (!is.number(volume)) {\n ({ volume } = this.config);\n }\n\n // Maximum is volumeMax\n if (volume > max) {\n volume = max;\n }\n // Minimum is volumeMin\n if (volume < min) {\n volume = min;\n }\n\n // Update config\n this.config.volume = volume;\n\n // Set the player volume\n this.media.volume = volume;\n\n // If muted, and we're increasing volume manually, reset muted state\n if (!is.empty(value) && this.muted && volume > 0) {\n this.muted = false;\n }\n }\n\n /**\n * Get the current player volume\n */\n get volume() {\n return Number(this.media.volume);\n }\n\n /**\n * Increase volume\n * @param {boolean} step - How much to decrease by (between 0 and 1)\n */\n increaseVolume(step) {\n const volume = this.media.muted ? 0 : this.volume;\n this.volume = volume + (is.number(step) ? step : 1);\n }\n\n /**\n * Decrease volume\n * @param {boolean} step - How much to decrease by (between 0 and 1)\n */\n decreaseVolume(step) {\n const volume = this.media.muted ? 0 : this.volume;\n this.volume = volume - (is.number(step) ? step : 1);\n }\n\n /**\n * Set muted state\n * @param {boolean} mute\n */\n set muted(mute) {\n let toggle = mute;\n\n // Load muted state from storage\n if (!is.boolean(toggle)) {\n toggle = this.storage.get('muted');\n }\n\n // Use config if all else fails\n if (!is.boolean(toggle)) {\n toggle = this.config.muted;\n }\n\n // Update config\n this.config.muted = toggle;\n\n // Set mute on the player\n this.media.muted = toggle;\n }\n\n /**\n * Get current muted state\n */\n get muted() {\n return Boolean(this.media.muted);\n }\n\n /**\n * Check if the media has audio\n */\n get hasAudio() {\n // Assume yes for all non HTML5 (as we can't tell...)\n if (!this.isHTML5) {\n return true;\n }\n\n if (this.isAudio) {\n return true;\n }\n\n // Get audio tracks\n return (\n Boolean(this.media.mozHasAudio) ||\n Boolean(this.media.webkitAudioDecodedByteCount) ||\n Boolean(this.media.audioTracks && this.media.audioTracks.length)\n );\n }\n\n /**\n * Set playback speed\n * @param {number} speed - the speed of playback (0.5-2.0)\n */\n set speed(input) {\n let speed = null;\n\n if (is.number(input)) {\n speed = input;\n }\n\n if (!is.number(speed)) {\n speed = this.storage.get('speed');\n }\n\n if (!is.number(speed)) {\n speed = this.config.speed.selected;\n }\n\n // Set min/max\n if (speed < 0.1) {\n speed = 0.1;\n }\n if (speed > 2.0) {\n speed = 2.0;\n }\n\n if (!this.config.speed.options.includes(speed)) {\n this.debug.warn(`Unsupported speed (${speed})`);\n return;\n }\n\n // Update config\n this.config.speed.selected = speed;\n\n // Set media speed\n this.media.playbackRate = speed;\n }\n\n /**\n * Get current playback speed\n */\n get speed() {\n return Number(this.media.playbackRate);\n }\n\n /**\n * Set playback quality\n * Currently HTML5 & YouTube only\n * @param {number} input - Quality level\n */\n set quality(input) {\n const config = this.config.quality;\n const options = this.options.quality;\n\n if (!options.length) {\n return;\n }\n\n let quality = [\n !is.empty(input) && Number(input),\n this.storage.get('quality'),\n config.selected,\n config.default,\n ].find(is.number);\n\n if (!options.includes(quality)) {\n const value = closest(options, quality);\n this.debug.warn(`Unsupported quality option: ${quality}, using ${value} instead`);\n quality = value;\n }\n\n // Trigger request event\n triggerEvent.call(this, this.media, 'qualityrequested', false, { quality });\n\n // Update config\n config.selected = quality;\n\n // Set quality\n this.media.quality = quality;\n }\n\n /**\n * Get current quality level\n */\n get quality() {\n return this.media.quality;\n }\n\n /**\n * Toggle loop\n * TODO: Finish fancy new logic. Set the indicator on load as user may pass loop as config\n * @param {boolean} input - Whether to loop or not\n */\n set loop(input) {\n const toggle = is.boolean(input) ? input : this.config.loop.active;\n this.config.loop.active = toggle;\n this.media.loop = toggle;\n\n // Set default to be a true toggle\n /* const type = ['start', 'end', 'all', 'none', 'toggle'].includes(input) ? input : 'toggle';\n\n switch (type) {\n case 'start':\n if (this.config.loop.end && this.config.loop.end <= this.currentTime) {\n this.config.loop.end = null;\n }\n this.config.loop.start = this.currentTime;\n // this.config.loop.indicator.start = this.elements.display.played.value;\n break;\n\n case 'end':\n if (this.config.loop.start >= this.currentTime) {\n return this;\n }\n this.config.loop.end = this.currentTime;\n // this.config.loop.indicator.end = this.elements.display.played.value;\n break;\n\n case 'all':\n this.config.loop.start = 0;\n this.config.loop.end = this.duration - 2;\n this.config.loop.indicator.start = 0;\n this.config.loop.indicator.end = 100;\n break;\n\n case 'toggle':\n if (this.config.loop.active) {\n this.config.loop.start = 0;\n this.config.loop.end = null;\n } else {\n this.config.loop.start = 0;\n this.config.loop.end = this.duration - 2;\n }\n break;\n\n default:\n this.config.loop.start = 0;\n this.config.loop.end = null;\n break;\n } */\n }\n\n /**\n * Get current loop state\n */\n get loop() {\n return Boolean(this.media.loop);\n }\n\n /**\n * Set new media source\n * @param {object} input - The new source object (see docs)\n */\n set source(input) {\n source.change.call(this, input);\n }\n\n /**\n * Get current source\n */\n get source() {\n return this.media.currentSrc;\n }\n\n /**\n * Set the poster image for a video\n * @param {input} - the URL for the new poster image\n */\n set poster(input) {\n if (!this.isVideo) {\n this.debug.warn('Poster can only be set for video');\n return;\n }\n\n ui.setPoster.call(this, input, false).catch(() => {});\n }\n\n /**\n * Get the current poster image\n */\n get poster() {\n if (!this.isVideo) {\n return null;\n }\n\n return this.media.getAttribute('poster');\n }\n\n /**\n * Set the autoplay state\n * @param {boolean} input - Whether to autoplay or not\n */\n set autoplay(input) {\n const toggle = is.boolean(input) ? input : this.config.autoplay;\n this.config.autoplay = toggle;\n }\n\n /**\n * Get the current autoplay state\n */\n get autoplay() {\n return Boolean(this.config.autoplay);\n }\n\n /**\n * Toggle captions\n * @param {boolean} input - Whether to enable captions\n */\n toggleCaptions(input) {\n captions.toggle.call(this, input, false);\n }\n\n /**\n * Set the caption track by index\n * @param {number} - Caption index\n */\n set currentTrack(input) {\n captions.set.call(this, input, false);\n }\n\n /**\n * Get the current caption track index (-1 if disabled)\n */\n get currentTrack() {\n const { toggled, currentTrack } = this.captions;\n return toggled ? currentTrack : -1;\n }\n\n /**\n * Set the wanted language for captions\n * Since tracks can be added later it won't update the actual caption track until there is a matching track\n * @param {string} - Two character ISO language code (e.g. EN, FR, PT, etc)\n */\n set language(input) {\n captions.setLanguage.call(this, input, false);\n }\n\n /**\n * Get the current track's language\n */\n get language() {\n return (captions.getCurrentTrack.call(this) || {}).language;\n }\n\n /**\n * Toggle picture-in-picture playback on WebKit/MacOS\n * TODO: update player with state, support, enabled\n * TODO: detect outside changes\n */\n set pip(input) {\n const states = {\n pip: 'picture-in-picture',\n inline: 'inline',\n };\n\n // Bail if no support\n if (!support.pip) {\n return;\n }\n\n // Toggle based on current state if not passed\n const toggle = is.boolean(input) ? input : this.pip === states.inline;\n\n // Toggle based on current state\n this.media.webkitSetPresentationMode(toggle ? states.pip : states.inline);\n }\n\n /**\n * Get the current picture-in-picture state\n */\n get pip() {\n if (!support.pip) {\n return null;\n }\n\n return this.media.webkitPresentationMode;\n }\n\n /**\n * Trigger the airplay dialog\n * TODO: update player with state, support, enabled\n */\n airplay() {\n // Show dialog if supported\n if (support.airplay) {\n this.media.webkitShowPlaybackTargetPicker();\n }\n }\n\n /**\n * Toggle the player controls\n * @param {boolean} [toggle] - Whether to show the controls\n */\n toggleControls(toggle) {\n // Don't toggle if missing UI support or if it's audio\n if (this.supported.ui && !this.isAudio) {\n // Get state before change\n const isHidden = hasClass(this.elements.container, this.config.classNames.hideControls);\n\n // Negate the argument if not undefined since adding the class to hides the controls\n const force = typeof toggle === 'undefined' ? undefined : !toggle;\n\n // Apply and get updated state\n const hiding = toggleClass(this.elements.container, this.config.classNames.hideControls, force);\n\n // Close menu\n if (hiding && this.config.controls.includes('settings') && !is.empty(this.config.settings)) {\n controls.toggleMenu.call(this, false);\n }\n // Trigger event on change\n if (hiding !== isHidden) {\n const eventName = hiding ? 'controlshidden' : 'controlsshown';\n triggerEvent.call(this, this.media, eventName);\n }\n return !hiding;\n }\n return false;\n }\n\n /**\n * Add event listeners\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n */\n on(event, callback) {\n on.call(this, this.elements.container, event, callback);\n }\n /**\n * Add event listeners once\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n */\n once(event, callback) {\n once.call(this, this.elements.container, event, callback);\n }\n /**\n * Remove event listeners\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n */\n off(event, callback) {\n off(this.elements.container, event, callback);\n }\n\n /**\n * Destroy an instance\n * Event listeners are removed when elements are removed\n * http://stackoverflow.com/questions/12528049/if-a-dom-element-is-removed-are-its-listeners-also-removed-from-memory\n * @param {function} callback - Callback for when destroy is complete\n * @param {boolean} soft - Whether it's a soft destroy (for source changes etc)\n */\n destroy(callback, soft = false) {\n if (!this.ready) {\n return;\n }\n\n const done = () => {\n // Reset overflow (incase destroyed while in fullscreen)\n document.body.style.overflow = '';\n\n // GC for embed\n this.embed = null;\n\n // If it's a soft destroy, make minimal changes\n if (soft) {\n if (Object.keys(this.elements).length) {\n // Remove elements\n removeElement(this.elements.buttons.play);\n removeElement(this.elements.captions);\n removeElement(this.elements.controls);\n removeElement(this.elements.wrapper);\n\n // Clear for GC\n this.elements.buttons.play = null;\n this.elements.captions = null;\n this.elements.controls = null;\n this.elements.wrapper = null;\n }\n\n // Callback\n if (is.function(callback)) {\n callback();\n }\n } else {\n // Unbind listeners\n unbindListeners.call(this);\n\n // Replace the container with the original element provided\n replaceElement(this.elements.original, this.elements.container);\n\n // Event\n triggerEvent.call(this, this.elements.original, 'destroyed', true);\n\n // Callback\n if (is.function(callback)) {\n callback.call(this.elements.original);\n }\n\n // Reset state\n this.ready = false;\n\n // Clear for garbage collection\n setTimeout(() => {\n this.elements = null;\n this.media = null;\n }, 200);\n }\n };\n\n // Stop playback\n this.stop();\n\n // Provider specific stuff\n if (this.isHTML5) {\n // Clear timeout\n clearTimeout(this.timers.loading);\n\n // Restore native video controls\n ui.toggleNativeControls.call(this, true);\n\n // Clean up\n done();\n } else if (this.isYouTube) {\n // Clear timers\n clearInterval(this.timers.buffering);\n clearInterval(this.timers.playing);\n\n // Destroy YouTube API\n if (this.embed !== null && is.function(this.embed.destroy)) {\n this.embed.destroy();\n }\n\n // Clean up\n done();\n } else if (this.isVimeo) {\n // Destroy Vimeo API\n // then clean up (wait, to prevent postmessage errors)\n if (this.embed !== null) {\n this.embed.unload().then(done);\n }\n\n // Vimeo does not always return\n setTimeout(done, 200);\n }\n }\n\n /**\n * Check for support for a mime type (HTML5 only)\n * @param {string} type - Mime type\n */\n supports(type) {\n return support.mime.call(this, type);\n }\n\n /**\n * Check for support\n * @param {string} type - Player type (audio/video)\n * @param {string} provider - Provider (html5/youtube/vimeo)\n * @param {bool} inline - Where player has `playsinline` sttribute\n */\n static supported(type, provider, inline) {\n return support.check(type, provider, inline);\n }\n\n /**\n * Load an SVG sprite into the page\n * @param {string} url - URL for the SVG sprite\n * @param {string} [id] - Unique ID\n */\n static loadSprite(url, id) {\n return loadSprite(url, id);\n }\n\n /**\n * Setup multiple instances\n * @param {*} selector\n * @param {object} options\n */\n static setup(selector, options = {}) {\n let targets = null;\n\n if (is.string(selector)) {\n targets = Array.from(document.querySelectorAll(selector));\n } else if (is.nodeList(selector)) {\n targets = Array.from(selector);\n } else if (is.array(selector)) {\n targets = selector.filter(is.element);\n }\n\n if (is.empty(targets)) {\n return null;\n }\n\n return targets.map(t => new Plyr(t, options));\n }\n}\n\nPlyr.defaults = cloneDeep(defaults);\n\nexport default Plyr;\n","// ==========================================================================\n// Plyr Polyfilled Build\n// plyr.js v3.3.12\n// https://github.com/sampotts/plyr\n// License: The MIT License (MIT)\n// ==========================================================================\n\nimport 'babel-polyfill';\nimport 'custom-event-polyfill';\nimport 'url-polyfill';\nimport Plyr from './plyr';\n\nexport default Plyr;\n"]} \ No newline at end of file
diff --git a/dist/plyr.polyfilled.min.js b/dist/plyr.polyfilled.min.js
index 21d30e2e..7cbb42f7 100644
--- a/dist/plyr.polyfilled.min.js
+++ b/dist/plyr.polyfilled.min.js
@@ -1,2 +1,2 @@
-"object"==typeof navigator&&function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define("Plyr",t):e.Plyr=t()}(this,function(){"use strict";var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function t(e,t){return e(t={exports:{}},t.exports),t.exports}var n=t(function(e){var t=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=t)}),i=t(function(e){var t=e.exports={version:"2.5.3"};"number"==typeof __e&&(__e=t)}),r=(i.version,function(e){return"object"==typeof e?null!==e:"function"==typeof e}),o=function(e){if(!r(e))throw TypeError(e+" is not an object!");return e},a=function(e){try{return!!e()}catch(e){return!0}},s=!a(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a}),l=n.document,c=r(l)&&r(l.createElement),u=function(e){return c?l.createElement(e):{}},f=!s&&!a(function(){return 7!=Object.defineProperty(u("div"),"a",{get:function(){return 7}}).a}),d=function(e,t){if(!r(e))return e;var n,i;if(t&&"function"==typeof(n=e.toString)&&!r(i=n.call(e)))return i;if("function"==typeof(n=e.valueOf)&&!r(i=n.call(e)))return i;if(!t&&"function"==typeof(n=e.toString)&&!r(i=n.call(e)))return i;throw TypeError("Can't convert object to primitive value")},h=Object.defineProperty,p={f:s?Object.defineProperty:function(e,t,n){if(o(e),t=d(t,!0),o(n),f)try{return h(e,t,n)}catch(e){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(e[t]=n.value),e}},g=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}},m=s?function(e,t,n){return p.f(e,t,g(1,n))}:function(e,t,n){return e[t]=n,e},y={}.hasOwnProperty,v=function(e,t){return y.call(e,t)},b=0,w=Math.random(),k=function(e){return"Symbol(".concat(void 0===e?"":e,")_",(++b+w).toString(36))},E=t(function(e){var t=k("src"),r=Function.toString,o=(""+r).split("toString");i.inspectSource=function(e){return r.call(e)},(e.exports=function(e,i,r,a){var s="function"==typeof r;s&&(v(r,"name")||m(r,"name",i)),e[i]!==r&&(s&&(v(r,t)||m(r,t,e[i]?""+e[i]:o.join(String(i)))),e===n?e[i]=r:a?e[i]?e[i]=r:m(e,i,r):(delete e[i],m(e,i,r)))})(Function.prototype,"toString",function(){return"function"==typeof this&&this[t]||r.call(this)})}),T=function(e){if("function"!=typeof e)throw TypeError(e+" is not a function!");return e},S=function(e,t,n){if(T(e),void 0===t)return e;switch(n){case 1:return function(n){return e.call(t,n)};case 2:return function(n,i){return e.call(t,n,i)};case 3:return function(n,i,r){return e.call(t,n,i,r)}}return function(){return e.apply(t,arguments)}},A=function(e,t,r){var o,a,s,l,c=e&A.F,u=e&A.G,f=e&A.S,d=e&A.P,h=e&A.B,p=u?n:f?n[t]||(n[t]={}):(n[t]||{}).prototype,g=u?i:i[t]||(i[t]={}),y=g.prototype||(g.prototype={});for(o in u&&(r=t),r)s=((a=!c&&p&&void 0!==p[o])?p:r)[o],l=h&&a?S(s,n):d&&"function"==typeof s?S(Function.call,s):s,p&&E(p,o,s,e&A.U),g[o]!=s&&m(g,o,l),d&&y[o]!=s&&(y[o]=s)};n.core=i,A.F=1,A.G=2,A.S=4,A.P=8,A.B=16,A.W=32,A.U=64,A.R=128;for(var _,C=A,P=k("typed_array"),M=k("view"),x=!(!n.ArrayBuffer||!n.DataView),L=x,O=0,N="Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array".split(",");O<9;)(_=n[N[O++]])?(m(_.prototype,P,!0),m(_.prototype,M,!0)):L=!1;var j={ABV:x,CONSTR:L,TYPED:P,VIEW:M},I=function(e,t,n){for(var i in t)E(e,i,t[i],n);return e},F=function(e,t,n,i){if(!(e instanceof t)||void 0!==i&&i in e)throw TypeError(n+": incorrect invocation!");return e},R=Math.ceil,q=Math.floor,B=function(e){return isNaN(e=+e)?0:(e>0?q:R)(e)},U=Math.min,V=function(e){return e>0?U(B(e),9007199254740991):0},D=function(e){if(void 0===e)return 0;var t=B(e),n=V(t);if(t!==n)throw RangeError("Wrong length!");return n},H={}.toString,W=function(e){return H.call(e).slice(8,-1)},z=Object("z").propertyIsEnumerable(0)?Object:function(e){return"String"==W(e)?e.split(""):Object(e)},G=function(e){if(null==e)throw TypeError("Can't call method on "+e);return e},Y=function(e){return z(G(e))},K=Math.max,Q=Math.min,J=function(e,t){return(e=B(e))<0?K(e+t,0):Q(e,t)},$=function(e){return function(t,n,i){var r,o=Y(t),a=V(o.length),s=J(i,a);if(e&&n!=n){for(;a>s;)if((r=o[s++])!=r)return!0}else for(;a>s;s++)if((e||s in o)&&o[s]===n)return e||s||0;return!e&&-1}},X=n["__core-js_shared__"]||(n["__core-js_shared__"]={}),Z=function(e){return X[e]||(X[e]={})},ee=Z("keys"),te=function(e){return ee[e]||(ee[e]=k(e))},ne=$(!1),ie=te("IE_PROTO"),re=function(e,t){var n,i=Y(e),r=0,o=[];for(n in i)n!=ie&&v(i,n)&&o.push(n);for(;t.length>r;)v(i,n=t[r++])&&(~ne(o,n)||o.push(n));return o},oe="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(","),ae=oe.concat("length","prototype"),se={f:Object.getOwnPropertyNames||function(e){return re(e,ae)}},le=function(e){return Object(G(e))},ce=function(e){for(var t=le(this),n=V(t.length),i=arguments.length,r=J(i>1?arguments[1]:void 0,n),o=i>2?arguments[2]:void 0,a=void 0===o?n:J(o,n);a>r;)t[r++]=e;return t},ue=t(function(e){var t=Z("wks"),i=n.Symbol,r="function"==typeof i;(e.exports=function(e){return t[e]||(t[e]=r&&i[e]||(r?i:k)("Symbol."+e))}).store=t}),fe=p.f,de=ue("toStringTag"),he=function(e,t,n){e&&!v(e=n?e:e.prototype,de)&&fe(e,de,{configurable:!0,value:t})},pe=t(function(e,t){var i=se.f,r=p.f,o="prototype",l="Wrong index!",c=n.ArrayBuffer,u=n.DataView,f=n.Math,d=n.RangeError,h=n.Infinity,g=c,y=f.abs,v=f.pow,b=f.floor,w=f.log,k=f.LN2,E=s?"_b":"buffer",T=s?"_l":"byteLength",S=s?"_o":"byteOffset";function A(e,t,n){var i,r,o,a=new Array(n),s=8*n-t-1,l=(1<<s)-1,c=l>>1,u=23===t?v(2,-24)-v(2,-77):0,f=0,d=e<0||0===e&&1/e<0?1:0;for((e=y(e))!=e||e===h?(r=e!=e?1:0,i=l):(i=b(w(e)/k),e*(o=v(2,-i))<1&&(i--,o*=2),(e+=i+c>=1?u/o:u*v(2,1-c))*o>=2&&(i++,o/=2),i+c>=l?(r=0,i=l):i+c>=1?(r=(e*o-1)*v(2,t),i+=c):(r=e*v(2,c-1)*v(2,t),i=0));t>=8;a[f++]=255&r,r/=256,t-=8);for(i=i<<t|r,s+=t;s>0;a[f++]=255&i,i/=256,s-=8);return a[--f]|=128*d,a}function _(e,t,n){var i,r=8*n-t-1,o=(1<<r)-1,a=o>>1,s=r-7,l=n-1,c=e[l--],u=127&c;for(c>>=7;s>0;u=256*u+e[l],l--,s-=8);for(i=u&(1<<-s)-1,u>>=-s,s+=t;s>0;i=256*i+e[l],l--,s-=8);if(0===u)u=1-a;else{if(u===o)return i?NaN:c?-h:h;i+=v(2,t),u-=a}return(c?-1:1)*i*v(2,u-t)}function C(e){return e[3]<<24|e[2]<<16|e[1]<<8|e[0]}function P(e){return[255&e]}function M(e){return[255&e,e>>8&255]}function x(e){return[255&e,e>>8&255,e>>16&255,e>>24&255]}function L(e){return A(e,52,8)}function O(e){return A(e,23,4)}function N(e,t,n){r(e[o],t,{get:function(){return this[n]}})}function R(e,t,n,i){var r=D(+n);if(r+t>e[T])throw d(l);var o=e[E]._b,a=r+e[S],s=o.slice(a,a+t);return i?s:s.reverse()}function q(e,t,n,i,r,o){var a=D(+n);if(a+t>e[T])throw d(l);for(var s=e[E]._b,c=a+e[S],u=i(+r),f=0;f<t;f++)s[c+f]=u[o?f:t-f-1]}if(j.ABV){if(!a(function(){c(1)})||!a(function(){new c(-1)})||a(function(){return new c,new c(1.5),new c(NaN),"ArrayBuffer"!=c.name})){for(var U,H=(c=function(e){return F(this,c),new g(D(e))})[o]=g[o],W=i(g),z=0;W.length>z;)(U=W[z++])in c||m(c,U,g[U]);H.constructor=c}var G=new u(new c(2)),Y=u[o].setInt8;G.setInt8(0,2147483648),G.setInt8(1,2147483649),!G.getInt8(0)&&G.getInt8(1)||I(u[o],{setInt8:function(e,t){Y.call(this,e,t<<24>>24)},setUint8:function(e,t){Y.call(this,e,t<<24>>24)}},!0)}else c=function(e){F(this,c,"ArrayBuffer");var t=D(e);this._b=ce.call(new Array(t),0),this[T]=t},u=function(e,t,n){F(this,u,"DataView"),F(e,c,"DataView");var i=e[T],r=B(t);if(r<0||r>i)throw d("Wrong offset!");if(r+(n=void 0===n?i-r:V(n))>i)throw d("Wrong length!");this[E]=e,this[S]=r,this[T]=n},s&&(N(c,"byteLength","_l"),N(u,"buffer","_b"),N(u,"byteLength","_l"),N(u,"byteOffset","_o")),I(u[o],{getInt8:function(e){return R(this,1,e)[0]<<24>>24},getUint8:function(e){return R(this,1,e)[0]},getInt16:function(e){var t=R(this,2,e,arguments[1]);return(t[1]<<8|t[0])<<16>>16},getUint16:function(e){var t=R(this,2,e,arguments[1]);return t[1]<<8|t[0]},getInt32:function(e){return C(R(this,4,e,arguments[1]))},getUint32:function(e){return C(R(this,4,e,arguments[1]))>>>0},getFloat32:function(e){return _(R(this,4,e,arguments[1]),23,4)},getFloat64:function(e){return _(R(this,8,e,arguments[1]),52,8)},setInt8:function(e,t){q(this,1,e,P,t)},setUint8:function(e,t){q(this,1,e,P,t)},setInt16:function(e,t){q(this,2,e,M,t,arguments[2])},setUint16:function(e,t){q(this,2,e,M,t,arguments[2])},setInt32:function(e,t){q(this,4,e,x,t,arguments[2])},setUint32:function(e,t){q(this,4,e,x,t,arguments[2])},setFloat32:function(e,t){q(this,4,e,O,t,arguments[2])},setFloat64:function(e,t){q(this,8,e,L,t,arguments[2])}});he(c,"ArrayBuffer"),he(u,"DataView"),m(u[o],j.VIEW,!0),t.ArrayBuffer=c,t.DataView=u}),ge=ue("species"),me=function(e,t){var n,i=o(e).constructor;return void 0===i||null==(n=o(i)[ge])?t:T(n)},ye=ue("species"),ve=function(e){var t=n[e];s&&t&&!t[ye]&&p.f(t,ye,{configurable:!0,get:function(){return this}})},be=n.ArrayBuffer,we=pe.ArrayBuffer,ke=pe.DataView,Ee=j.ABV&&be.isView,Te=we.prototype.slice,Se=j.VIEW;C(C.G+C.W+C.F*(be!==we),{ArrayBuffer:we}),C(C.S+C.F*!j.CONSTR,"ArrayBuffer",{isView:function(e){return Ee&&Ee(e)||r(e)&&Se in e}}),C(C.P+C.U+C.F*a(function(){return!new we(2).slice(1,void 0).byteLength}),"ArrayBuffer",{slice:function(e,t){if(void 0!==Te&&void 0===t)return Te.call(o(this),e);for(var n=o(this).byteLength,i=J(e,n),r=J(void 0===t?n:t,n),a=new(me(this,we))(V(r-i)),s=new ke(this),l=new ke(a),c=0;i<r;)l.setUint8(c++,s.getUint8(i++));return a}}),ve("ArrayBuffer");var Ae=ue("toStringTag"),_e="Arguments"==W(function(){return arguments}()),Ce=function(e){var t,n,i;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(n=function(e,t){try{return e[t]}catch(e){}}(t=Object(e),Ae))?n:_e?W(t):"Object"==(i=W(t))&&"function"==typeof t.callee?"Arguments":i},Pe={},Me=ue("iterator"),xe=Array.prototype,Le=function(e){return void 0!==e&&(Pe.Array===e||xe[Me]===e)},Oe=Object.keys||function(e){return re(e,oe)},Ne=s?Object.defineProperties:function(e,t){o(e);for(var n,i=Oe(t),r=i.length,a=0;r>a;)p.f(e,n=i[a++],t[n]);return e},je=n.document,Ie=je&&je.documentElement,Fe=te("IE_PROTO"),Re=function(){},qe=function(){var e,t=u("iframe"),n=oe.length;for(t.style.display="none",Ie.appendChild(t),t.src="javascript:",(e=t.contentWindow.document).open(),e.write("<script>document.F=Object<\/script>"),e.close(),qe=e.F;n--;)delete qe.prototype[oe[n]];return qe()},Be=Object.create||function(e,t){var n;return null!==e?(Re.prototype=o(e),n=new Re,Re.prototype=null,n[Fe]=e):n=qe(),void 0===t?n:Ne(n,t)},Ue=te("IE_PROTO"),Ve=Object.prototype,De=Object.getPrototypeOf||function(e){return e=le(e),v(e,Ue)?e[Ue]:"function"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?Ve:null},He=ue("iterator"),We=i.getIteratorMethod=function(e){if(null!=e)return e[He]||e["@@iterator"]||Pe[Ce(e)]},ze=Array.isArray||function(e){return"Array"==W(e)},Ge=ue("species"),Ye=function(e,t){return new(function(e){var t;return ze(e)&&("function"!=typeof(t=e.constructor)||t!==Array&&!ze(t.prototype)||(t=void 0),r(t)&&null===(t=t[Ge])&&(t=void 0)),void 0===t?Array:t}(e))(t)},Ke=function(e,t){var n=1==e,i=2==e,r=3==e,o=4==e,a=6==e,s=5==e||a,l=t||Ye;return function(t,c,u){for(var f,d,h=le(t),p=z(h),g=S(c,u,3),m=V(p.length),y=0,v=n?l(t,m):i?l(t,0):void 0;m>y;y++)if((s||y in p)&&(d=g(f=p[y],y,h),e))if(n)v[y]=d;else if(d)switch(e){case 3:return!0;case 5:return f;case 6:return y;case 2:v.push(f)}else if(o)return!1;return a?-1:r||o?o:v}},Qe=ue("unscopables"),Je=Array.prototype;null==Je[Qe]&&m(Je,Qe,{});var $e=function(e){Je[Qe][e]=!0},Xe=function(e,t){return{value:t,done:!!e}},Ze={};m(Ze,ue("iterator"),function(){return this});var et=function(e,t,n){e.prototype=Be(Ze,{next:g(1,n)}),he(e,t+" Iterator")},tt=ue("iterator"),nt=!([].keys&&"next"in[].keys()),it=function(){return this},rt=function(e,t,n,i,r,o,a){et(n,t,i);var s,l,c,u=function(e){if(!nt&&e in p)return p[e];switch(e){case"keys":case"values":return function(){return new n(this,e)}}return function(){return new n(this,e)}},f=t+" Iterator",d="values"==r,h=!1,p=e.prototype,g=p[tt]||p["@@iterator"]||r&&p[r],y=!nt&&g||u(r),b=r?d?u("entries"):y:void 0,w="Array"==t&&p.entries||g;if(w&&(c=De(w.call(new e)))!==Object.prototype&&c.next&&(he(c,f,!0),v(c,tt)||m(c,tt,it)),d&&g&&"values"!==g.name&&(h=!0,y=function(){return g.call(this)}),(nt||h||!p[tt])&&m(p,tt,y),Pe[t]=y,Pe[f]=it,r)if(s={values:d?y:u("values"),keys:o?y:u("keys"),entries:b},a)for(l in s)l in p||E(p,l,s[l]);else C(C.P+C.F*(nt||h),t,s);return s},ot=rt(Array,"Array",function(e,t){this._t=Y(e),this._i=0,this._k=t},function(){var e=this._t,t=this._k,n=this._i++;return!e||n>=e.length?(this._t=void 0,Xe(1)):Xe(0,"keys"==t?n:"values"==t?e[n]:[n,e[n]])},"values");Pe.Arguments=Pe.Array,$e("keys"),$e("values"),$e("entries");var at=ue("iterator"),st=!1;try{[7][at]().return=function(){st=!0}}catch(e){}var lt=function(e,t){if(!t&&!st)return!1;var n=!1;try{var i=[7],r=i[at]();r.next=function(){return{done:n=!0}},i[at]=function(){return r},e(i)}catch(e){}return n},ct=[].copyWithin||function(e,t){var n=le(this),i=V(n.length),r=J(e,i),o=J(t,i),a=arguments.length>2?arguments[2]:void 0,s=Math.min((void 0===a?i:J(a,i))-o,i-r),l=1;for(o<r&&r<o+s&&(l=-1,o+=s-1,r+=s-1);s-- >0;)o in n?n[r]=n[o]:delete n[r],r+=l,o+=l;return n},ut={f:{}.propertyIsEnumerable},ft=Object.getOwnPropertyDescriptor,dt={f:s?ft:function(e,t){if(e=Y(e),t=d(t,!0),f)try{return ft(e,t)}catch(e){}if(v(e,t))return g(!ut.f.call(e,t),e[t])}},ht=t(function(e){if(s){var t=n,i=a,o=C,l=j,c=pe,u=S,f=F,h=g,y=m,b=I,w=B,E=V,T=D,A=J,_=d,P=v,M=Ce,x=r,L=le,O=Le,N=Be,R=De,q=se.f,U=We,H=k,W=ue,z=Ke,G=$,Y=me,K=ot,Q=Pe,X=lt,Z=ve,ee=ce,te=ct,ne=p,ie=dt,re=ne.f,oe=ie.f,ae=t.RangeError,fe=t.TypeError,de=t.Uint8Array,he=Array.prototype,ge=c.ArrayBuffer,ye=c.DataView,be=z(0),we=z(2),ke=z(3),Ee=z(4),Te=z(5),Se=z(6),Ae=G(!0),_e=G(!1),Me=K.values,xe=K.keys,Oe=K.entries,Ne=he.lastIndexOf,je=he.reduce,Ie=he.reduceRight,Fe=he.join,Re=he.sort,qe=he.slice,Ue=he.toString,Ve=he.toLocaleString,He=W("iterator"),ze=W("toStringTag"),Ge=H("typed_constructor"),Ye=H("def_constructor"),Qe=l.CONSTR,Je=l.TYPED,$e=l.VIEW,Xe=z(1,function(e,t){return it(Y(e,e[Ye]),t)}),Ze=i(function(){return 1===new de(new Uint16Array([1]).buffer)[0]}),et=!!de&&!!de.prototype.set&&i(function(){new de(1).set({})}),tt=function(e,t){var n=w(e);if(n<0||n%t)throw ae("Wrong offset!");return n},nt=function(e){if(x(e)&&Je in e)return e;throw fe(e+" is not a typed array!")},it=function(e,t){if(!(x(e)&&Ge in e))throw fe("It is not a typed array constructor!");return new e(t)},rt=function(e,t){return at(Y(e,e[Ye]),t)},at=function(e,t){for(var n=0,i=t.length,r=it(e,i);i>n;)r[n]=t[n++];return r},st=function(e,t,n){re(e,t,{get:function(){return this._d[n]}})},ut=function(e){var t,n,i,r,o,a,s=L(e),l=arguments.length,c=l>1?arguments[1]:void 0,f=void 0!==c,d=U(s);if(null!=d&&!O(d)){for(a=d.call(s),i=[],t=0;!(o=a.next()).done;t++)i.push(o.value);s=i}for(f&&l>2&&(c=u(c,arguments[2],2)),t=0,n=E(s.length),r=it(this,n);n>t;t++)r[t]=f?c(s[t],t):s[t];return r},ft=function(){for(var e=0,t=arguments.length,n=it(this,t);t>e;)n[e]=arguments[e++];return n},ht=!!de&&i(function(){Ve.call(new de(1))}),pt=function(){return Ve.apply(ht?qe.call(nt(this)):nt(this),arguments)},gt={copyWithin:function(e,t){return te.call(nt(this),e,t,arguments.length>2?arguments[2]:void 0)},every:function(e){return Ee(nt(this),e,arguments.length>1?arguments[1]:void 0)},fill:function(e){return ee.apply(nt(this),arguments)},filter:function(e){return rt(this,we(nt(this),e,arguments.length>1?arguments[1]:void 0))},find:function(e){return Te(nt(this),e,arguments.length>1?arguments[1]:void 0)},findIndex:function(e){return Se(nt(this),e,arguments.length>1?arguments[1]:void 0)},forEach:function(e){be(nt(this),e,arguments.length>1?arguments[1]:void 0)},indexOf:function(e){return _e(nt(this),e,arguments.length>1?arguments[1]:void 0)},includes:function(e){return Ae(nt(this),e,arguments.length>1?arguments[1]:void 0)},join:function(e){return Fe.apply(nt(this),arguments)},lastIndexOf:function(e){return Ne.apply(nt(this),arguments)},map:function(e){return Xe(nt(this),e,arguments.length>1?arguments[1]:void 0)},reduce:function(e){return je.apply(nt(this),arguments)},reduceRight:function(e){return Ie.apply(nt(this),arguments)},reverse:function(){for(var e,t=nt(this).length,n=Math.floor(t/2),i=0;i<n;)e=this[i],this[i++]=this[--t],this[t]=e;return this},some:function(e){return ke(nt(this),e,arguments.length>1?arguments[1]:void 0)},sort:function(e){return Re.call(nt(this),e)},subarray:function(e,t){var n=nt(this),i=n.length,r=A(e,i);return new(Y(n,n[Ye]))(n.buffer,n.byteOffset+r*n.BYTES_PER_ELEMENT,E((void 0===t?i:A(t,i))-r))}},mt=function(e,t){return rt(this,qe.call(nt(this),e,t))},yt=function(e){nt(this);var t=tt(arguments[1],1),n=this.length,i=L(e),r=E(i.length),o=0;if(r+t>n)throw ae("Wrong length!");for(;o<r;)this[t+o]=i[o++]},vt={entries:function(){return Oe.call(nt(this))},keys:function(){return xe.call(nt(this))},values:function(){return Me.call(nt(this))}},bt=function(e,t){return x(e)&&e[Je]&&"symbol"!=typeof t&&t in e&&String(+t)==String(t)},wt=function(e,t){return bt(e,t=_(t,!0))?h(2,e[t]):oe(e,t)},kt=function(e,t,n){return!(bt(e,t=_(t,!0))&&x(n)&&P(n,"value"))||P(n,"get")||P(n,"set")||n.configurable||P(n,"writable")&&!n.writable||P(n,"enumerable")&&!n.enumerable?re(e,t,n):(e[t]=n.value,e)};Qe||(ie.f=wt,ne.f=kt),o(o.S+o.F*!Qe,"Object",{getOwnPropertyDescriptor:wt,defineProperty:kt}),i(function(){Ue.call({})})&&(Ue=Ve=function(){return Fe.call(this)});var Et=b({},gt);b(Et,vt),y(Et,He,vt.values),b(Et,{slice:mt,set:yt,constructor:function(){},toString:Ue,toLocaleString:pt}),st(Et,"buffer","b"),st(Et,"byteOffset","o"),st(Et,"byteLength","l"),st(Et,"length","e"),re(Et,ze,{get:function(){return this[Je]}}),e.exports=function(e,n,r,a){var s=e+((a=!!a)?"Clamped":"")+"Array",c="get"+e,u="set"+e,d=t[s],h=d||{},p=d&&R(d),g=!d||!l.ABV,m={},v=d&&d.prototype,b=function(e,t){re(e,t,{get:function(){return function(e,t){var i=e._d;return i.v[c](t*n+i.o,Ze)}(this,t)},set:function(e){return function(e,t,i){var r=e._d;a&&(i=(i=Math.round(i))<0?0:i>255?255:255&i),r.v[u](t*n+r.o,i,Ze)}(this,t,e)},enumerable:!0})};g?(d=r(function(e,t,i,r){f(e,d,s,"_d");var o,a,l,c,u=0,h=0;if(x(t)){if(!(t instanceof ge||"ArrayBuffer"==(c=M(t))||"SharedArrayBuffer"==c))return Je in t?at(d,t):ut.call(d,t);o=t,h=tt(i,n);var p=t.byteLength;if(void 0===r){if(p%n)throw ae("Wrong length!");if((a=p-h)<0)throw ae("Wrong length!")}else if((a=E(r)*n)+h>p)throw ae("Wrong length!");l=a/n}else l=T(t),o=new ge(a=l*n);for(y(e,"_d",{b:o,o:h,l:a,e:l,v:new ye(o)});u<l;)b(e,u++)}),v=d.prototype=N(Et),y(v,"constructor",d)):i(function(){d(1)})&&i(function(){new d(-1)})&&X(function(e){new d,new d(null),new d(1.5),new d(e)},!0)||(d=r(function(e,t,i,r){var o;return f(e,d,s),x(t)?t instanceof ge||"ArrayBuffer"==(o=M(t))||"SharedArrayBuffer"==o?void 0!==r?new h(t,tt(i,n),r):void 0!==i?new h(t,tt(i,n)):new h(t):Je in t?at(d,t):ut.call(d,t):new h(T(t))}),be(p!==Function.prototype?q(h).concat(q(p)):q(h),function(e){e in d||y(d,e,h[e])}),d.prototype=v,v.constructor=d);var w=v[He],k=!!w&&("values"==w.name||null==w.name),S=vt.values;y(d,Ge,!0),y(v,Je,s),y(v,$e,!0),y(v,Ye,d),(a?new d(1)[ze]==s:ze in v)||re(v,ze,{get:function(){return s}}),m[s]=d,o(o.G+o.W+o.F*(d!=h),m),o(o.S,s,{BYTES_PER_ELEMENT:n}),o(o.S+o.F*i(function(){h.of.call(d,1)}),s,{from:ut,of:ft}),"BYTES_PER_ELEMENT"in v||y(v,"BYTES_PER_ELEMENT",n),o(o.P,s,gt),Z(s),o(o.P+o.F*et,s,{set:yt}),o(o.P+o.F*!k,s,vt),v.toString!=Ue&&(v.toString=Ue),o(o.P+o.F*i(function(){new d(1).slice()}),s,{slice:mt}),o(o.P+o.F*(i(function(){return[1,2].toLocaleString()!=new d([1,2]).toLocaleString()})||!i(function(){v.toLocaleString.call([1,2])})),s,{toLocaleString:pt}),Q[s]=k?w:S,k||y(v,He,S)}}else e.exports=function(){}});ht("Int8",1,function(e){return function(t,n,i){return e(this,t,n,i)}}),ht("Uint8",1,function(e){return function(t,n,i){return e(this,t,n,i)}}),ht("Uint8",1,function(e){return function(t,n,i){return e(this,t,n,i)}},!0),ht("Int16",2,function(e){return function(t,n,i){return e(this,t,n,i)}}),ht("Uint16",2,function(e){return function(t,n,i){return e(this,t,n,i)}}),ht("Int32",4,function(e){return function(t,n,i){return e(this,t,n,i)}}),ht("Uint32",4,function(e){return function(t,n,i){return e(this,t,n,i)}}),ht("Float32",4,function(e){return function(t,n,i){return e(this,t,n,i)}}),ht("Float64",8,function(e){return function(t,n,i){return e(this,t,n,i)}});var pt=function(e,t,n,i){try{return i?t(o(n)[0],n[1]):t(n)}catch(t){var r=e.return;throw void 0!==r&&o(r.call(e)),t}},gt=t(function(e){var t={},n={},i=e.exports=function(e,i,r,a,s){var l,c,u,f,d=s?function(){return e}:We(e),h=S(r,a,i?2:1),p=0;if("function"!=typeof d)throw TypeError(e+" is not iterable!");if(Le(d)){for(l=V(e.length);l>p;p++)if((f=i?h(o(c=e[p])[0],c[1]):h(e[p]))===t||f===n)return f}else for(u=d.call(e);!(c=u.next()).done;)if((f=pt(u,h,c.value,i))===t||f===n)return f};i.BREAK=t,i.RETURN=n}),mt=t(function(e){var t=k("meta"),n=p.f,i=0,o=Object.isExtensible||function(){return!0},s=!a(function(){return o(Object.preventExtensions({}))}),l=function(e){n(e,t,{value:{i:"O"+ ++i,w:{}}})},c=e.exports={KEY:t,NEED:!1,fastKey:function(e,n){if(!r(e))return"symbol"==typeof e?e:("string"==typeof e?"S":"P")+e;if(!v(e,t)){if(!o(e))return"F";if(!n)return"E";l(e)}return e[t].i},getWeak:function(e,n){if(!v(e,t)){if(!o(e))return!0;if(!n)return!1;l(e)}return e[t].w},onFreeze:function(e){return s&&c.NEED&&o(e)&&!v(e,t)&&l(e),e}}}),yt=(mt.KEY,mt.NEED,mt.fastKey,mt.getWeak,mt.onFreeze,function(e,t){if(!r(e)||e._t!==t)throw TypeError("Incompatible receiver, "+t+" required!");return e}),vt=p.f,bt=mt.fastKey,wt=s?"_s":"size",kt=function(e,t){var n,i=bt(t);if("F"!==i)return e._i[i];for(n=e._f;n;n=n.n)if(n.k==t)return n},Et={getConstructor:function(e,t,n,i){var r=e(function(e,o){F(e,r,t,"_i"),e._t=t,e._i=Be(null),e._f=void 0,e._l=void 0,e[wt]=0,null!=o&&gt(o,n,e[i],e)});return I(r.prototype,{clear:function(){for(var e=yt(this,t),n=e._i,i=e._f;i;i=i.n)i.r=!0,i.p&&(i.p=i.p.n=void 0),delete n[i.i];e._f=e._l=void 0,e[wt]=0},delete:function(e){var n=yt(this,t),i=kt(n,e);if(i){var r=i.n,o=i.p;delete n._i[i.i],i.r=!0,o&&(o.n=r),r&&(r.p=o),n._f==i&&(n._f=r),n._l==i&&(n._l=o),n[wt]--}return!!i},forEach:function(e){yt(this,t);for(var n,i=S(e,arguments.length>1?arguments[1]:void 0,3);n=n?n.n:this._f;)for(i(n.v,n.k,this);n&&n.r;)n=n.p},has:function(e){return!!kt(yt(this,t),e)}}),s&&vt(r.prototype,"size",{get:function(){return yt(this,t)[wt]}}),r},def:function(e,t,n){var i,r,o=kt(e,t);return o?o.v=n:(e._l=o={i:r=bt(t,!0),k:t,v:n,p:i=e._l,n:void 0,r:!1},e._f||(e._f=o),i&&(i.n=o),e[wt]++,"F"!==r&&(e._i[r]=o)),e},getEntry:kt,setStrong:function(e,t,n){rt(e,t,function(e,n){this._t=yt(e,t),this._k=n,this._l=void 0},function(){for(var e=this._k,t=this._l;t&&t.r;)t=t.p;return this._t&&(this._l=t=t?t.n:this._t._f)?Xe(0,"keys"==e?t.k:"values"==e?t.v:[t.k,t.v]):(this._t=void 0,Xe(1))},n?"entries":"values",!n,!0),ve(t)}},Tt=function(e,t){if(o(e),!r(t)&&null!==t)throw TypeError(t+": can't set as prototype!")},St={set:Object.setPrototypeOf||("__proto__"in{}?function(e,t,n){try{(n=S(Function.call,dt.f(Object.prototype,"__proto__").set,2))(e,[]),t=!(e instanceof Array)}catch(e){t=!0}return function(e,i){return Tt(e,i),t?e.__proto__=i:n(e,i),e}}({},!1):void 0),check:Tt},At=St.set,_t=function(e,t,i,o,s,l){var c=n[e],u=c,f=s?"set":"add",d=u&&u.prototype,h={},p=function(e){var t=d[e];E(d,e,"delete"==e?function(e){return!(l&&!r(e))&&t.call(this,0===e?0:e)}:"has"==e?function(e){return!(l&&!r(e))&&t.call(this,0===e?0:e)}:"get"==e?function(e){return l&&!r(e)?void 0:t.call(this,0===e?0:e)}:"add"==e?function(e){return t.call(this,0===e?0:e),this}:function(e,n){return t.call(this,0===e?0:e,n),this})};if("function"==typeof u&&(l||d.forEach&&!a(function(){(new u).entries().next()}))){var g=new u,m=g[f](l?{}:-0,1)!=g,y=a(function(){g.has(1)}),v=lt(function(e){new u(e)}),b=!l&&a(function(){for(var e=new u,t=5;t--;)e[f](t,t);return!e.has(-0)});v||((u=t(function(t,n){F(t,u,e);var i=function(e,t,n){var i,o=t.constructor;return o!==n&&"function"==typeof o&&(i=o.prototype)!==n.prototype&&r(i)&&At&&At(e,i),e}(new c,t,u);return null!=n&&gt(n,s,i[f],i),i})).prototype=d,d.constructor=u),(y||b)&&(p("delete"),p("has"),s&&p("get")),(b||m)&&p(f),l&&d.clear&&delete d.clear}else u=o.getConstructor(t,e,s,f),I(u.prototype,i),mt.NEED=!0;return he(u,e),h[e]=u,C(C.G+C.W+C.F*(u!=c),h),l||o.setStrong(u,e,s),u},Ct=(_t("Map",function(e){return function(){return e(this,arguments.length>0?arguments[0]:void 0)}},{get:function(e){var t=Et.getEntry(yt(this,"Map"),e);return t&&t.v},set:function(e,t){return Et.def(yt(this,"Map"),0===e?0:e,t)}},Et,!0),_t("Set",function(e){return function(){return e(this,arguments.length>0?arguments[0]:void 0)}},{add:function(e){return Et.def(yt(this,"Set"),e=0===e?0:e,e)}},Et),{f:Object.getOwnPropertySymbols}),Pt=Object.assign,Mt=!Pt||a(function(){var e={},t={},n=Symbol(),i="abcdefghijklmnopqrst";return e[n]=7,i.split("").forEach(function(e){t[e]=e}),7!=Pt({},e)[n]||Object.keys(Pt({},t)).join("")!=i})?function(e,t){for(var n=le(e),i=arguments.length,r=1,o=Ct.f,a=ut.f;i>r;)for(var s,l=z(arguments[r++]),c=o?Oe(l).concat(o(l)):Oe(l),u=c.length,f=0;u>f;)a.call(l,s=c[f++])&&(n[s]=l[s]);return n}:Pt,xt=mt.getWeak,Lt=Ke(5),Ot=Ke(6),Nt=0,jt=function(e){return e._l||(e._l=new It)},It=function(){this.a=[]},Ft=function(e,t){return Lt(e.a,function(e){return e[0]===t})};It.prototype={get:function(e){var t=Ft(this,e);if(t)return t[1]},has:function(e){return!!Ft(this,e)},set:function(e,t){var n=Ft(this,e);n?n[1]=t:this.a.push([e,t])},delete:function(e){var t=Ot(this.a,function(t){return t[0]===e});return~t&&this.a.splice(t,1),!!~t}};var Rt={getConstructor:function(e,t,n,i){var o=e(function(e,r){F(e,o,t,"_i"),e._t=t,e._i=Nt++,e._l=void 0,null!=r&&gt(r,n,e[i],e)});return I(o.prototype,{delete:function(e){if(!r(e))return!1;var n=xt(e);return!0===n?jt(yt(this,t)).delete(e):n&&v(n,this._i)&&delete n[this._i]},has:function(e){if(!r(e))return!1;var n=xt(e);return!0===n?jt(yt(this,t)).has(e):n&&v(n,this._i)}}),o},def:function(e,t,n){var i=xt(o(t),!0);return!0===i?jt(e).set(t,n):i[e._i]=n,e},ufstore:jt};t(function(e){var t,n=Ke(0),i=mt.getWeak,o=Object.isExtensible,s=Rt.ufstore,l={},c=function(e){return function(){return e(this,arguments.length>0?arguments[0]:void 0)}},u={get:function(e){if(r(e)){var t=i(e);return!0===t?s(yt(this,"WeakMap")).get(e):t?t[this._i]:void 0}},set:function(e,t){return Rt.def(yt(this,"WeakMap"),e,t)}},f=e.exports=_t("WeakMap",c,u,Rt,!0,!0);a(function(){return 7!=(new f).set((Object.freeze||Object)(l),7).get(l)})&&(t=Rt.getConstructor(c,"WeakMap"),Mt(t.prototype,u),mt.NEED=!0,n(["delete","has","get","set"],function(e){var n=f.prototype,i=n[e];E(n,e,function(n,a){if(r(n)&&!o(n)){this._f||(this._f=new t);var s=this._f[e](n,a);return"set"==e?this:s}return i.call(this,n,a)})}))});_t("WeakSet",function(e){return function(){return e(this,arguments.length>0?arguments[0]:void 0)}},{add:function(e){return Rt.def(yt(this,"WeakSet"),e,!0)}},Rt,!1,!0);var qt=(n.Reflect||{}).apply,Bt=Function.apply;C(C.S+C.F*!a(function(){qt(function(){})}),"Reflect",{apply:function(e,t,n){var i=T(e),r=o(n);return qt?qt(i,t,r):Bt.call(i,t,r)}});var Ut=function(e,t,n){var i=void 0===n;switch(t.length){case 0:return i?e():e.call(n);case 1:return i?e(t[0]):e.call(n,t[0]);case 2:return i?e(t[0],t[1]):e.call(n,t[0],t[1]);case 3:return i?e(t[0],t[1],t[2]):e.call(n,t[0],t[1],t[2]);case 4:return i?e(t[0],t[1],t[2],t[3]):e.call(n,t[0],t[1],t[2],t[3])}return e.apply(n,t)},Vt=[].slice,Dt={},Ht=Function.bind||function(e){var t=T(this),n=Vt.call(arguments,1),i=function(){var r=n.concat(Vt.call(arguments));return this instanceof i?function(e,t,n){if(!(t in Dt)){for(var i=[],r=0;r<t;r++)i[r]="a["+r+"]";Dt[t]=Function("F,a","return new F("+i.join(",")+")")}return Dt[t](e,n)}(t,r.length,r):Ut(t,r,e)};return r(t.prototype)&&(i.prototype=t.prototype),i},Wt=(n.Reflect||{}).construct,zt=a(function(){function e(){}return!(Wt(function(){},[],e)instanceof e)}),Gt=!a(function(){Wt(function(){})});C(C.S+C.F*(zt||Gt),"Reflect",{construct:function(e,t){T(e),o(t);var n=arguments.length<3?e:T(arguments[2]);if(Gt&&!zt)return Wt(e,t,n);if(e==n){switch(t.length){case 0:return new e;case 1:return new e(t[0]);case 2:return new e(t[0],t[1]);case 3:return new e(t[0],t[1],t[2]);case 4:return new e(t[0],t[1],t[2],t[3])}var i=[null];return i.push.apply(i,t),new(Ht.apply(e,i))}var a=n.prototype,s=Be(r(a)?a:Object.prototype),l=Function.apply.call(e,s,t);return r(l)?l:s}}),C(C.S+C.F*a(function(){Reflect.defineProperty(p.f({},1,{value:1}),1,{value:2})}),"Reflect",{defineProperty:function(e,t,n){o(e),t=d(t,!0),o(n);try{return p.f(e,t,n),!0}catch(e){return!1}}});var Yt=dt.f;C(C.S,"Reflect",{deleteProperty:function(e,t){var n=Yt(o(e),t);return!(n&&!n.configurable)&&delete e[t]}}),C(C.S,"Reflect",{get:function e(t,n){var i,a,s=arguments.length<3?t:arguments[2];return o(t)===s?t[n]:(i=dt.f(t,n))?v(i,"value")?i.value:void 0!==i.get?i.get.call(s):void 0:r(a=De(t))?e(a,n,s):void 0}}),C(C.S,"Reflect",{getOwnPropertyDescriptor:function(e,t){return dt.f(o(e),t)}}),C(C.S,"Reflect",{getPrototypeOf:function(e){return De(o(e))}}),C(C.S,"Reflect",{has:function(e,t){return t in e}});var Kt=Object.isExtensible;C(C.S,"Reflect",{isExtensible:function(e){return o(e),!Kt||Kt(e)}});var Qt=n.Reflect,Jt=Qt&&Qt.ownKeys||function(e){var t=se.f(o(e)),n=Ct.f;return n?t.concat(n(e)):t};C(C.S,"Reflect",{ownKeys:Jt});var $t=Object.preventExtensions;C(C.S,"Reflect",{preventExtensions:function(e){o(e);try{return $t&&$t(e),!0}catch(e){return!1}}}),C(C.S,"Reflect",{set:function e(t,n,i){var a,s,l=arguments.length<4?t:arguments[3],c=dt.f(o(t),n);if(!c){if(r(s=De(t)))return e(s,n,i,l);c=g(0)}return v(c,"value")?!(!1===c.writable||!r(l)||((a=dt.f(l,n)||g(0)).value=i,p.f(l,n,a),0)):void 0!==c.set&&(c.set.call(l,i),!0)}}),St&&C(C.S,"Reflect",{setPrototypeOf:function(e,t){St.check(e,t);try{return St.set(e,t),!0}catch(e){return!1}}});var Xt,Zt,en,tn=n.process,nn=n.setImmediate,rn=n.clearImmediate,on=n.MessageChannel,an=n.Dispatch,sn=0,ln={},cn=function(){var e=+this;if(ln.hasOwnProperty(e)){var t=ln[e];delete ln[e],t()}},un=function(e){cn.call(e.data)};nn&&rn||(nn=function(e){for(var t=[],n=1;arguments.length>n;)t.push(arguments[n++]);return ln[++sn]=function(){Ut("function"==typeof e?e:Function(e),t)},Xt(sn),sn},rn=function(e){delete ln[e]},"process"==W(tn)?Xt=function(e){tn.nextTick(S(cn,e,1))}:an&&an.now?Xt=function(e){an.now(S(cn,e,1))}:on?(en=(Zt=new on).port2,Zt.port1.onmessage=un,Xt=S(en.postMessage,en,1)):n.addEventListener&&"function"==typeof postMessage&&!n.importScripts?(Xt=function(e){n.postMessage(e+"","*")},n.addEventListener("message",un,!1)):Xt="onreadystatechange"in u("script")?function(e){Ie.appendChild(u("script")).onreadystatechange=function(){Ie.removeChild(this),cn.call(e)}}:function(e){setTimeout(S(cn,e,1),0)});var fn={set:nn,clear:rn},dn=fn.set,hn=n.MutationObserver||n.WebKitMutationObserver,pn=n.process,gn=n.Promise,mn="process"==W(pn);function yn(e){var t,n;this.promise=new e(function(e,i){if(void 0!==t||void 0!==n)throw TypeError("Bad Promise constructor");t=e,n=i}),this.resolve=T(t),this.reject=T(n)}var vn,bn,wn,kn,En={f:function(e){return new yn(e)}},Tn=function(e){try{return{e:!1,v:e()}}catch(e){return{e:!0,v:e}}},Sn=fn.set,An=function(){var e,t,i,r=function(){var n,r;for(mn&&(n=pn.domain)&&n.exit();e;){r=e.fn,e=e.next;try{r()}catch(n){throw e?i():t=void 0,n}}t=void 0,n&&n.enter()};if(mn)i=function(){pn.nextTick(r)};else if(!hn||n.navigator&&n.navigator.standalone)if(gn&&gn.resolve){var o=gn.resolve();i=function(){o.then(r)}}else i=function(){dn.call(n,r)};else{var a=!0,s=document.createTextNode("");new hn(r).observe(s,{characterData:!0}),i=function(){s.data=a=!a}}return function(n){var r={fn:n,next:void 0};t&&(t.next=r),e||(e=r,i()),t=r}}(),_n=n.TypeError,Cn=n.process,Pn=n.Promise,Mn="process"==Ce(Cn),xn=function(){},Ln=bn=En.f,On=!!function(){try{var e=Pn.resolve(1),t=(e.constructor={})[ue("species")]=function(e){e(xn,xn)};return(Mn||"function"==typeof PromiseRejectionEvent)&&e.then(xn)instanceof t}catch(e){}}(),Nn=function(e){var t;return!(!r(e)||"function"!=typeof(t=e.then))&&t},jn=function(e,t){if(!e._n){e._n=!0;var n=e._c;An(function(){for(var i=e._v,r=1==e._s,o=0,a=function(t){var n,o,a=r?t.ok:t.fail,s=t.resolve,l=t.reject,c=t.domain;try{a?(r||(2==e._h&&Rn(e),e._h=1),!0===a?n=i:(c&&c.enter(),n=a(i),c&&c.exit()),n===t.promise?l(_n("Promise-chain cycle")):(o=Nn(n))?o.call(n,s,l):s(n)):l(i)}catch(e){l(e)}};n.length>o;)a(n[o++]);e._c=[],e._n=!1,t&&!e._h&&In(e)})}},In=function(e){Sn.call(n,function(){var t,i,r,o=e._v,a=Fn(e);if(a&&(t=Tn(function(){Mn?Cn.emit("unhandledRejection",o,e):(i=n.onunhandledrejection)?i({promise:e,reason:o}):(r=n.console)&&r.error&&r.error("Unhandled promise rejection",o)}),e._h=Mn||Fn(e)?2:1),e._a=void 0,a&&t.e)throw t.v})},Fn=function(e){return 1!==e._h&&0===(e._a||e._c).length},Rn=function(e){Sn.call(n,function(){var t;Mn?Cn.emit("rejectionHandled",e):(t=n.onrejectionhandled)&&t({promise:e,reason:e._v})})},qn=function(e){var t=this;t._d||(t._d=!0,(t=t._w||t)._v=e,t._s=2,t._a||(t._a=t._c.slice()),jn(t,!0))},Bn=function(e){var t,n=this;if(!n._d){n._d=!0,n=n._w||n;try{if(n===e)throw _n("Promise can't be resolved itself");(t=Nn(e))?An(function(){var i={_w:n,_d:!1};try{t.call(e,S(Bn,i,1),S(qn,i,1))}catch(e){qn.call(i,e)}}):(n._v=e,n._s=1,jn(n,!1))}catch(e){qn.call({_w:n,_d:!1},e)}}};On||(Pn=function(e){F(this,Pn,"Promise","_h"),T(e),vn.call(this);try{e(S(Bn,this,1),S(qn,this,1))}catch(e){qn.call(this,e)}},(vn=function(e){this._c=[],this._a=void 0,this._s=0,this._d=!1,this._v=void 0,this._h=0,this._n=!1}).prototype=I(Pn.prototype,{then:function(e,t){var n=Ln(me(this,Pn));return n.ok="function"!=typeof e||e,n.fail="function"==typeof t&&t,n.domain=Mn?Cn.domain:void 0,this._c.push(n),this._a&&this._a.push(n),this._s&&jn(this,!1),n.promise},catch:function(e){return this.then(void 0,e)}}),wn=function(){var e=new vn;this.promise=e,this.resolve=S(Bn,e,1),this.reject=S(qn,e,1)},En.f=Ln=function(e){return e===Pn||e===kn?new wn(e):bn(e)}),C(C.G+C.W+C.F*!On,{Promise:Pn}),he(Pn,"Promise"),ve("Promise"),kn=i.Promise,C(C.S+C.F*!On,"Promise",{reject:function(e){var t=Ln(this);return(0,t.reject)(e),t.promise}}),C(C.S+C.F*!On,"Promise",{resolve:function(e){return function(e,t){if(o(e),r(t)&&t.constructor===e)return t;var n=En.f(e);return(0,n.resolve)(t),n.promise}(this,e)}}),C(C.S+C.F*!(On&&lt(function(e){Pn.all(e).catch(xn)})),"Promise",{all:function(e){var t=this,n=Ln(t),i=n.resolve,r=n.reject,o=Tn(function(){var n=[],o=0,a=1;gt(e,!1,function(e){var s=o++,l=!1;n.push(void 0),a++,t.resolve(e).then(function(e){l||(l=!0,n[s]=e,--a||i(n))},r)}),--a||i(n)});return o.e&&r(o.v),n.promise},race:function(e){var t=this,n=Ln(t),i=n.reject,r=Tn(function(){gt(e,!1,function(e){t.resolve(e).then(n.resolve,i)})});return r.e&&i(r.v),n.promise}});var Un={f:ue},Vn=p.f,Dn=function(e){var t=i.Symbol||(i.Symbol=n.Symbol||{});"_"==e.charAt(0)||e in t||Vn(t,e,{value:Un.f(e)})},Hn=se.f,Wn={}.toString,zn="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],Gn={f:function(e){return zn&&"[object Window]"==Wn.call(e)?function(e){try{return Hn(e)}catch(e){return zn.slice()}}(e):Hn(Y(e))}},Yn=mt.KEY,Kn=dt.f,Qn=p.f,Jn=Gn.f,$n=n.Symbol,Xn=n.JSON,Zn=Xn&&Xn.stringify,ei=ue("_hidden"),ti=ue("toPrimitive"),ni={}.propertyIsEnumerable,ii=Z("symbol-registry"),ri=Z("symbols"),oi=Z("op-symbols"),ai=Object.prototype,si="function"==typeof $n,li=n.QObject,ci=!li||!li.prototype||!li.prototype.findChild,ui=s&&a(function(){return 7!=Be(Qn({},"a",{get:function(){return Qn(this,"a",{value:7}).a}})).a})?function(e,t,n){var i=Kn(ai,t);i&&delete ai[t],Qn(e,t,n),i&&e!==ai&&Qn(ai,t,i)}:Qn,fi=function(e){var t=ri[e]=Be($n.prototype);return t._k=e,t},di=si&&"symbol"==typeof $n.iterator?function(e){return"symbol"==typeof e}:function(e){return e instanceof $n},hi=function(e,t,n){return e===ai&&hi(oi,t,n),o(e),t=d(t,!0),o(n),v(ri,t)?(n.enumerable?(v(e,ei)&&e[ei][t]&&(e[ei][t]=!1),n=Be(n,{enumerable:g(0,!1)})):(v(e,ei)||Qn(e,ei,g(1,{})),e[ei][t]=!0),ui(e,t,n)):Qn(e,t,n)},pi=function(e,t){o(e);for(var n,i=function(e){var t=Oe(e),n=Ct.f;if(n)for(var i,r=n(e),o=ut.f,a=0;r.length>a;)o.call(e,i=r[a++])&&t.push(i);return t}(t=Y(t)),r=0,a=i.length;a>r;)hi(e,n=i[r++],t[n]);return e},gi=function(e){var t=ni.call(this,e=d(e,!0));return!(this===ai&&v(ri,e)&&!v(oi,e))&&(!(t||!v(this,e)||!v(ri,e)||v(this,ei)&&this[ei][e])||t)},mi=function(e,t){if(e=Y(e),t=d(t,!0),e!==ai||!v(ri,t)||v(oi,t)){var n=Kn(e,t);return!n||!v(ri,t)||v(e,ei)&&e[ei][t]||(n.enumerable=!0),n}},yi=function(e){for(var t,n=Jn(Y(e)),i=[],r=0;n.length>r;)v(ri,t=n[r++])||t==ei||t==Yn||i.push(t);return i},vi=function(e){for(var t,n=e===ai,i=Jn(n?oi:Y(e)),r=[],o=0;i.length>o;)!v(ri,t=i[o++])||n&&!v(ai,t)||r.push(ri[t]);return r};si||(E(($n=function(){if(this instanceof $n)throw TypeError("Symbol is not a constructor!");var e=k(arguments.length>0?arguments[0]:void 0),t=function(n){this===ai&&t.call(oi,n),v(this,ei)&&v(this[ei],e)&&(this[ei][e]=!1),ui(this,e,g(1,n))};return s&&ci&&ui(ai,e,{configurable:!0,set:t}),fi(e)}).prototype,"toString",function(){return this._k}),dt.f=mi,p.f=hi,se.f=Gn.f=yi,ut.f=gi,Ct.f=vi,s&&E(ai,"propertyIsEnumerable",gi,!0),Un.f=function(e){return fi(ue(e))}),C(C.G+C.W+C.F*!si,{Symbol:$n});for(var bi="hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables".split(","),wi=0;bi.length>wi;)ue(bi[wi++]);for(var ki=Oe(ue.store),Ei=0;ki.length>Ei;)Dn(ki[Ei++]);C(C.S+C.F*!si,"Symbol",{for:function(e){return v(ii,e+="")?ii[e]:ii[e]=$n(e)},keyFor:function(e){if(!di(e))throw TypeError(e+" is not a symbol!");for(var t in ii)if(ii[t]===e)return t},useSetter:function(){ci=!0},useSimple:function(){ci=!1}}),C(C.S+C.F*!si,"Object",{create:function(e,t){return void 0===t?Be(e):pi(Be(e),t)},defineProperty:hi,defineProperties:pi,getOwnPropertyDescriptor:mi,getOwnPropertyNames:yi,getOwnPropertySymbols:vi}),Xn&&C(C.S+C.F*(!si||a(function(){var e=$n();return"[null]"!=Zn([e])||"{}"!=Zn({a:e})||"{}"!=Zn(Object(e))})),"JSON",{stringify:function(e){for(var t,n,i=[e],o=1;arguments.length>o;)i.push(arguments[o++]);if(n=t=i[1],(r(t)||void 0!==e)&&!di(e))return ze(t)||(t=function(e,t){if("function"==typeof n&&(t=n.call(this,e,t)),!di(t))return t}),i[1]=t,Zn.apply(Xn,i)}}),$n.prototype[ti]||m($n.prototype,ti,$n.prototype.valueOf),he($n,"Symbol"),he(Math,"Math",!0),he(n.JSON,"JSON",!0);var Ti=function(e,t){var n=(i.Object||{})[e]||Object[e],r={};r[e]=t(n),C(C.S+C.F*a(function(){n(1)}),"Object",r)},Si=mt.onFreeze;Ti("freeze",function(e){return function(t){return e&&r(t)?e(Si(t)):t}});var Ai=mt.onFreeze;Ti("seal",function(e){return function(t){return e&&r(t)?e(Ai(t)):t}});var _i=mt.onFreeze;Ti("preventExtensions",function(e){return function(t){return e&&r(t)?e(_i(t)):t}}),Ti("isFrozen",function(e){return function(t){return!r(t)||!!e&&e(t)}}),Ti("isSealed",function(e){return function(t){return!r(t)||!!e&&e(t)}}),Ti("isExtensible",function(e){return function(t){return!!r(t)&&(!e||e(t))}});var Ci=dt.f;Ti("getOwnPropertyDescriptor",function(){return function(e,t){return Ci(Y(e),t)}}),Ti("getPrototypeOf",function(){return function(e){return De(le(e))}}),Ti("keys",function(){return function(e){return Oe(le(e))}}),Ti("getOwnPropertyNames",function(){return Gn.f}),C(C.S+C.F,"Object",{assign:Mt});var Pi=Object.is||function(e,t){return e===t?0!==e||1/e==1/t:e!=e&&t!=t};C(C.S,"Object",{is:Pi});var Mi=p.f,xi=Function.prototype,Li=/^\s*function ([^ (]*)/;"name"in xi||s&&Mi(xi,"name",{configurable:!0,get:function(){try{return(""+this).match(Li)[1]}catch(e){return""}}}),C(C.S,"String",{raw:function(e){for(var t=Y(e.raw),n=V(t.length),i=arguments.length,r=[],o=0;n>o;)r.push(String(t[o++])),o<i&&r.push(String(arguments[o]));return r.join("")}});var Oi=String.fromCharCode,Ni=String.fromCodePoint;C(C.S+C.F*(!!Ni&&1!=Ni.length),"String",{fromCodePoint:function(e){for(var t,n=[],i=arguments.length,r=0;i>r;){if(t=+arguments[r++],J(t,1114111)!==t)throw RangeError(t+" is not a valid code point");n.push(t<65536?Oi(t):Oi(55296+((t-=65536)>>10),t%1024+56320))}return n.join("")}});var ji,Ii=(ji=!1,function(e,t){var n,i,r=String(G(e)),o=B(t),a=r.length;return o<0||o>=a?ji?"":void 0:(n=r.charCodeAt(o))<55296||n>56319||o+1===a||(i=r.charCodeAt(o+1))<56320||i>57343?ji?r.charAt(o):n:ji?r.slice(o,o+2):i-56320+(n-55296<<10)+65536});C(C.P,"String",{codePointAt:function(e){return Ii(this,e)}});var Fi=function(e){var t=String(G(this)),n="",i=B(e);if(i<0||i==1/0)throw RangeError("Count can't be negative");for(;i>0;(i>>>=1)&&(t+=t))1&i&&(n+=t);return n};C(C.P,"String",{repeat:Fi});var Ri=ue("match"),qi=function(e){var t;return r(e)&&(void 0!==(t=e[Ri])?!!t:"RegExp"==W(e))},Bi=function(e,t,n){if(qi(t))throw TypeError("String#"+n+" doesn't accept regex!");return String(G(e))},Ui=ue("match"),Vi=function(e){var t=/./;try{"/./"[e](t)}catch(n){try{return t[Ui]=!1,!"/./"[e](t)}catch(e){}}return!0},Di="".startsWith;C(C.P+C.F*Vi("startsWith"),"String",{startsWith:function(e){var t=Bi(this,e,"startsWith"),n=V(Math.min(arguments.length>1?arguments[1]:void 0,t.length)),i=String(e);return Di?Di.call(t,i,n):t.slice(n,n+i.length)===i}});var Hi="".endsWith;C(C.P+C.F*Vi("endsWith"),"String",{endsWith:function(e){var t=Bi(this,e,"endsWith"),n=arguments.length>1?arguments[1]:void 0,i=V(t.length),r=void 0===n?i:Math.min(V(n),i),o=String(e);return Hi?Hi.call(t,o,r):t.slice(r-o.length,r)===o}});C(C.P+C.F*Vi("includes"),"String",{includes:function(e){return!!~Bi(this,e,"includes").indexOf(e,arguments.length>1?arguments[1]:void 0)}});s&&"g"!=/./g.flags&&p.f(RegExp.prototype,"flags",{configurable:!0,get:function(){var e=o(this),t="";return e.global&&(t+="g"),e.ignoreCase&&(t+="i"),e.multiline&&(t+="m"),e.unicode&&(t+="u"),e.sticky&&(t+="y"),t}});var Wi=function(e,t,n){var i=ue(e),r=n(G,i,""[e]),o=r[0],s=r[1];a(function(){var t={};return t[i]=function(){return 7},7!=""[e](t)})&&(E(String.prototype,e,o),m(RegExp.prototype,i,2==t?function(e,t){return s.call(e,this,t)}:function(e){return s.call(e,this)}))};Wi("match",1,function(e,t,n){return[function(n){var i=e(this),r=null==n?void 0:n[t];return void 0!==r?r.call(n,i):new RegExp(n)[t](String(i))},n]}),Wi("replace",2,function(e,t,n){return[function(i,r){var o=e(this),a=null==i?void 0:i[t];return void 0!==a?a.call(i,o,r):n.call(String(o),i,r)},n]}),Wi("split",2,function(e,t,n){var i=qi,r=n,o=[].push;if("c"=="abbc".split(/(b)*/)[1]||4!="test".split(/(?:)/,-1).length||2!="ab".split(/(?:ab)*/).length||4!=".".split(/(.?)(.?)/).length||".".split(/()()/).length>1||"".split(/.?/).length){var a=void 0===/()??/.exec("")[1];n=function(e,t){var n=String(this);if(void 0===e&&0===t)return[];if(!i(e))return r.call(n,e,t);var s,l,c,u,f,d=[],h=(e.ignoreCase?"i":"")+(e.multiline?"m":"")+(e.unicode?"u":"")+(e.sticky?"y":""),p=0,g=void 0===t?4294967295:t>>>0,m=new RegExp(e.source,h+"g");for(a||(s=new RegExp("^"+m.source+"$(?!\\s)",h));(l=m.exec(n))&&!((c=l.index+l[0].length)>p&&(d.push(n.slice(p,l.index)),!a&&l.length>1&&l[0].replace(s,function(){for(f=1;f<arguments.length-2;f++)void 0===arguments[f]&&(l[f]=void 0)}),l.length>1&&l.index<n.length&&o.apply(d,l.slice(1)),u=l[0].length,p=c,d.length>=g));)m.lastIndex===l.index&&m.lastIndex++;return p===n.length?!u&&m.test("")||d.push(""):d.push(n.slice(p)),d.length>g?d.slice(0,g):d}}else"0".split(void 0,0).length&&(n=function(e,t){return void 0===e&&0===t?[]:r.call(this,e,t)});return[function(i,r){var o=e(this),a=null==i?void 0:i[t];return void 0!==a?a.call(i,o,r):n.call(String(o),i,r)},n]}),Wi("search",1,function(e,t,n){return[function(n){var i=e(this),r=null==n?void 0:n[t];return void 0!==r?r.call(n,i):new RegExp(n)[t](String(i))},n]});var zi=function(e,t,n){t in e?p.f(e,t,g(0,n)):e[t]=n};C(C.S+C.F*!lt(function(e){}),"Array",{from:function(e){var t,n,i,r,o=le(e),a="function"==typeof this?this:Array,s=arguments.length,l=s>1?arguments[1]:void 0,c=void 0!==l,u=0,f=We(o);if(c&&(l=S(l,s>2?arguments[2]:void 0,2)),null==f||a==Array&&Le(f))for(n=new a(t=V(o.length));t>u;u++)zi(n,u,c?l(o[u],u):o[u]);else for(r=f.call(o),n=new a;!(i=r.next()).done;u++)zi(n,u,c?pt(r,l,[i.value,u],!0):i.value);return n.length=u,n}}),C(C.S+C.F*a(function(){function e(){}return!(Array.of.call(e)instanceof e)}),"Array",{of:function(){for(var e=0,t=arguments.length,n=new("function"==typeof this?this:Array)(t);t>e;)zi(n,e,arguments[e++]);return n.length=t,n}}),C(C.P,"Array",{copyWithin:ct}),$e("copyWithin");var Gi=Ke(5),Yi=!0;"find"in[]&&Array(1).find(function(){Yi=!1}),C(C.P+C.F*Yi,"Array",{find:function(e){return Gi(this,e,arguments.length>1?arguments[1]:void 0)}}),$e("find");var Ki=Ke(6),Qi=!0;"findIndex"in[]&&Array(1).findIndex(function(){Qi=!1}),C(C.P+C.F*Qi,"Array",{findIndex:function(e){return Ki(this,e,arguments.length>1?arguments[1]:void 0)}}),$e("findIndex"),C(C.P,"Array",{fill:ce}),$e("fill");var Ji=n.isFinite;C(C.S,"Number",{isFinite:function(e){return"number"==typeof e&&Ji(e)}});var $i=Math.floor,Xi=function(e){return!r(e)&&isFinite(e)&&$i(e)===e};C(C.S,"Number",{isInteger:Xi});var Zi=Math.abs;C(C.S,"Number",{isSafeInteger:function(e){return Xi(e)&&Zi(e)<=9007199254740991}}),C(C.S,"Number",{isNaN:function(e){return e!=e}}),C(C.S,"Number",{EPSILON:Math.pow(2,-52)}),C(C.S,"Number",{MIN_SAFE_INTEGER:-9007199254740991}),C(C.S,"Number",{MAX_SAFE_INTEGER:9007199254740991});var er=Math.log1p||function(e){return(e=+e)>-1e-8&&e<1e-8?e-e*e/2:Math.log(1+e)},tr=Math.sqrt,nr=Math.acosh;C(C.S+C.F*!(nr&&710==Math.floor(nr(Number.MAX_VALUE))&&nr(1/0)==1/0),"Math",{acosh:function(e){return(e=+e)<1?NaN:e>94906265.62425156?Math.log(e)+Math.LN2:er(e-1+tr(e-1)*tr(e+1))}});var ir=Math.asinh;C(C.S+C.F*!(ir&&1/ir(0)>0),"Math",{asinh:function e(t){return isFinite(t=+t)&&0!=t?t<0?-e(-t):Math.log(t+Math.sqrt(t*t+1)):t}});var rr=Math.atanh;C(C.S+C.F*!(rr&&1/rr(-0)<0),"Math",{atanh:function(e){return 0==(e=+e)?e:Math.log((1+e)/(1-e))/2}});var or=Math.sign||function(e){return 0==(e=+e)||e!=e?e:e<0?-1:1};C(C.S,"Math",{cbrt:function(e){return or(e=+e)*Math.pow(Math.abs(e),1/3)}}),C(C.S,"Math",{clz32:function(e){return(e>>>=0)?31-Math.floor(Math.log(e+.5)*Math.LOG2E):32}});var ar=Math.exp;C(C.S,"Math",{cosh:function(e){return(ar(e=+e)+ar(-e))/2}});var sr=Math.expm1,lr=!sr||sr(10)>22025.465794806718||sr(10)<22025.465794806718||-2e-17!=sr(-2e-17)?function(e){return 0==(e=+e)?e:e>-1e-6&&e<1e-6?e+e*e/2:Math.exp(e)-1}:sr;C(C.S+C.F*(lr!=Math.expm1),"Math",{expm1:lr});var cr=Math.pow,ur=cr(2,-52),fr=cr(2,-23),dr=cr(2,127)*(2-fr),hr=cr(2,-126),pr=Math.fround||function(e){var t,n,i=Math.abs(e),r=or(e);return i<hr?r*(i/hr/fr+1/ur-1/ur)*hr*fr:(n=(t=(1+fr/ur)*i)-(t-i))>dr||n!=n?r*(1/0):r*n};C(C.S,"Math",{fround:pr});var gr=Math.abs;C(C.S,"Math",{hypot:function(e,t){for(var n,i,r=0,o=0,a=arguments.length,s=0;o<a;)s<(n=gr(arguments[o++]))?(r=r*(i=s/n)*i+1,s=n):r+=n>0?(i=n/s)*i:n;return s===1/0?1/0:s*Math.sqrt(r)}});var mr=Math.imul;C(C.S+C.F*a(function(){return-5!=mr(4294967295,5)||2!=mr.length}),"Math",{imul:function(e,t){var n=+e,i=+t,r=65535&n,o=65535&i;return 0|r*o+((65535&n>>>16)*o+r*(65535&i>>>16)<<16>>>0)}}),C(C.S,"Math",{log1p:er}),C(C.S,"Math",{log10:function(e){return Math.log(e)*Math.LOG10E}}),C(C.S,"Math",{log2:function(e){return Math.log(e)/Math.LN2}}),C(C.S,"Math",{sign:or});var yr=Math.exp;C(C.S+C.F*a(function(){return-2e-17!=!Math.sinh(-2e-17)}),"Math",{sinh:function(e){return Math.abs(e=+e)<1?(lr(e)-lr(-e))/2:(yr(e-1)-yr(-e-1))*(Math.E/2)}});var vr=Math.exp;C(C.S,"Math",{tanh:function(e){var t=lr(e=+e),n=lr(-e);return t==1/0?1:n==1/0?-1:(t-n)/(vr(e)+vr(-e))}}),C(C.S,"Math",{trunc:function(e){return(e>0?Math.floor:Math.ceil)(e)}});var br=$(!0);C(C.P,"Array",{includes:function(e){return br(this,e,arguments.length>1?arguments[1]:void 0)}}),$e("includes");var wr=ut.f,kr=function(e){return function(t){for(var n,i=Y(t),r=Oe(i),o=r.length,a=0,s=[];o>a;)wr.call(i,n=r[a++])&&s.push(e?[n,i[n]]:i[n]);return s}},Er=kr(!1);C(C.S,"Object",{values:function(e){return Er(e)}});var Tr=kr(!0);C(C.S,"Object",{entries:function(e){return Tr(e)}}),C(C.S,"Object",{getOwnPropertyDescriptors:function(e){for(var t,n,i=Y(e),r=dt.f,o=Jt(i),a={},s=0;o.length>s;)void 0!==(n=r(i,t=o[s++]))&&zi(a,t,n);return a}});var Sr=function(e,t,n,i){var r=String(G(e)),o=r.length,a=void 0===n?" ":String(n),s=V(t);if(s<=o||""==a)return r;var l=s-o,c=Fi.call(a,Math.ceil(l/a.length));return c.length>l&&(c=c.slice(0,l)),i?c+r:r+c},Ar=n.navigator,_r=Ar&&Ar.userAgent||"";C(C.P+C.F*/Version\/10\.\d+(\.\d+)? Safari\//.test(_r),"String",{padStart:function(e){return Sr(this,e,arguments.length>1?arguments[1]:void 0,!0)}}),C(C.P+C.F*/Version\/10\.\d+(\.\d+)? Safari\//.test(_r),"String",{padEnd:function(e){return Sr(this,e,arguments.length>1?arguments[1]:void 0,!1)}});var Cr=[].slice,Pr=/MSIE .\./.test(_r),Mr=function(e){return function(t,n){var i=arguments.length>2,r=!!i&&Cr.call(arguments,2);return e(i?function(){("function"==typeof t?t:Function(t)).apply(this,r)}:t,n)}};C(C.G+C.B+C.F*Pr,{setTimeout:Mr(n.setTimeout),setInterval:Mr(n.setInterval)}),C(C.G+C.B,{setImmediate:fn.set,clearImmediate:fn.clear});for(var xr=ue("iterator"),Lr=ue("toStringTag"),Or=Pe.Array,Nr={CSSRuleList:!0,CSSStyleDeclaration:!1,CSSValueList:!1,ClientRectList:!1,DOMRectList:!1,DOMStringList:!1,DOMTokenList:!0,DataTransferItemList:!1,FileList:!1,HTMLAllCollection:!1,HTMLCollection:!1,HTMLFormElement:!1,HTMLSelectElement:!1,MediaList:!0,MimeTypeArray:!1,NamedNodeMap:!1,NodeList:!0,PaintRequestList:!1,Plugin:!1,PluginArray:!1,SVGLengthList:!1,SVGNumberList:!1,SVGPathSegList:!1,SVGPointList:!1,SVGStringList:!1,SVGTransformList:!1,SourceBufferList:!1,StyleSheetList:!0,TextTrackCueList:!1,TextTrackList:!1,TouchList:!1},jr=Oe(Nr),Ir=0;Ir<jr.length;Ir++){var Fr,Rr=jr[Ir],qr=Nr[Rr],Br=n[Rr],Ur=Br&&Br.prototype;if(Ur&&(Ur[xr]||m(Ur,xr,Or),Ur[Lr]||m(Ur,Lr,Rr),Pe[Rr]=Or,qr))for(Fr in ot)Ur[Fr]||E(Ur,Fr,ot[Fr],!0)}t(function(t){!function(e){var n,i=Object.prototype,r=i.hasOwnProperty,o="function"==typeof Symbol?Symbol:{},a=o.iterator||"@@iterator",s=o.asyncIterator||"@@asyncIterator",l=o.toStringTag||"@@toStringTag",c=e.regeneratorRuntime;if(c)t.exports=c;else{(c=e.regeneratorRuntime=t.exports).wrap=b;var u="suspendedStart",f="suspendedYield",d="executing",h="completed",p={},g={};g[a]=function(){return this};var m=Object.getPrototypeOf,y=m&&m(m(x([])));y&&y!==i&&r.call(y,a)&&(g=y);var v=T.prototype=k.prototype=Object.create(g);E.prototype=v.constructor=T,T.constructor=E,T[l]=E.displayName="GeneratorFunction",c.isGeneratorFunction=function(e){var t="function"==typeof e&&e.constructor;return!!t&&(t===E||"GeneratorFunction"===(t.displayName||t.name))},c.mark=function(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,T):(e.__proto__=T,l in e||(e[l]="GeneratorFunction")),e.prototype=Object.create(v),e},c.awrap=function(e){return{__await:e}},S(A.prototype),A.prototype[s]=function(){return this},c.AsyncIterator=A,c.async=function(e,t,n,i){var r=new A(b(e,t,n,i));return c.isGeneratorFunction(t)?r:r.next().then(function(e){return e.done?e.value:r.next()})},S(v),v[l]="Generator",v[a]=function(){return this},v.toString=function(){return"[object Generator]"},c.keys=function(e){var t=[];for(var n in e)t.push(n);return t.reverse(),function n(){for(;t.length;){var i=t.pop();if(i in e)return n.value=i,n.done=!1,n}return n.done=!0,n}},c.values=x,M.prototype={constructor:M,reset:function(e){if(this.prev=0,this.next=0,this.sent=this._sent=n,this.done=!1,this.delegate=null,this.method="next",this.arg=n,this.tryEntries.forEach(P),!e)for(var t in this)"t"===t.charAt(0)&&r.call(this,t)&&!isNaN(+t.slice(1))&&(this[t]=n)},stop:function(){this.done=!0;var e=this.tryEntries[0].completion;if("throw"===e.type)throw e.arg;return this.rval},dispatchException:function(e){if(this.done)throw e;var t=this;function i(i,r){return s.type="throw",s.arg=e,t.next=i,r&&(t.method="next",t.arg=n),!!r}for(var o=this.tryEntries.length-1;o>=0;--o){var a=this.tryEntries[o],s=a.completion;if("root"===a.tryLoc)return i("end");if(a.tryLoc<=this.prev){var l=r.call(a,"catchLoc"),c=r.call(a,"finallyLoc");if(l&&c){if(this.prev<a.catchLoc)return i(a.catchLoc,!0);if(this.prev<a.finallyLoc)return i(a.finallyLoc)}else if(l){if(this.prev<a.catchLoc)return i(a.catchLoc,!0)}else{if(!c)throw new Error("try statement without catch or finally");if(this.prev<a.finallyLoc)return i(a.finallyLoc)}}}},abrupt:function(e,t){for(var n=this.tryEntries.length-1;n>=0;--n){var i=this.tryEntries[n];if(i.tryLoc<=this.prev&&r.call(i,"finallyLoc")&&this.prev<i.finallyLoc){var o=i;break}}o&&("break"===e||"continue"===e)&&o.tryLoc<=t&&t<=o.finallyLoc&&(o=null);var a=o?o.completion:{};return a.type=e,a.arg=t,o?(this.method="next",this.next=o.finallyLoc,p):this.complete(a)},complete:function(e,t){if("throw"===e.type)throw e.arg;return"break"===e.type||"continue"===e.type?this.next=e.arg:"return"===e.type?(this.rval=this.arg=e.arg,this.method="return",this.next="end"):"normal"===e.type&&t&&(this.next=t),p},finish:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.finallyLoc===e)return this.complete(n.completion,n.afterLoc),P(n),p}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.tryLoc===e){var i=n.completion;if("throw"===i.type){var r=i.arg;P(n)}return r}}throw new Error("illegal catch attempt")},delegateYield:function(e,t,i){return this.delegate={iterator:x(e),resultName:t,nextLoc:i},"next"===this.method&&(this.arg=n),p}}}function b(e,t,n,i){var r=t&&t.prototype instanceof k?t:k,o=Object.create(r.prototype),a=new M(i||[]);return o._invoke=function(e,t,n){var i=u;return function(r,o){if(i===d)throw new Error("Generator is already running");if(i===h){if("throw"===r)throw o;return L()}for(n.method=r,n.arg=o;;){var a=n.delegate;if(a){var s=_(a,n);if(s){if(s===p)continue;return s}}if("next"===n.method)n.sent=n._sent=n.arg;else if("throw"===n.method){if(i===u)throw i=h,n.arg;n.dispatchException(n.arg)}else"return"===n.method&&n.abrupt("return",n.arg);i=d;var l=w(e,t,n);if("normal"===l.type){if(i=n.done?h:f,l.arg===p)continue;return{value:l.arg,done:n.done}}"throw"===l.type&&(i=h,n.method="throw",n.arg=l.arg)}}}(e,n,a),o}function w(e,t,n){try{return{type:"normal",arg:e.call(t,n)}}catch(e){return{type:"throw",arg:e}}}function k(){}function E(){}function T(){}function S(e){["next","throw","return"].forEach(function(t){e[t]=function(e){return this._invoke(t,e)}})}function A(t){function n(e,i,o,a){var s=w(t[e],t,i);if("throw"!==s.type){var l=s.arg,c=l.value;return c&&"object"==typeof c&&r.call(c,"__await")?Promise.resolve(c.__await).then(function(e){n("next",e,o,a)},function(e){n("throw",e,o,a)}):Promise.resolve(c).then(function(e){l.value=e,o(l)},a)}a(s.arg)}var i;"object"==typeof e.process&&e.process.domain&&(n=e.process.domain.bind(n)),this._invoke=function(e,t){function r(){return new Promise(function(i,r){n(e,t,i,r)})}return i=i?i.then(r,r):r()}}function _(e,t){var i=e.iterator[t.method];if(i===n){if(t.delegate=null,"throw"===t.method){if(e.iterator.return&&(t.method="return",t.arg=n,_(e,t),"throw"===t.method))return p;t.method="throw",t.arg=new TypeError("The iterator does not provide a 'throw' method")}return p}var r=w(i,e.iterator,t.arg);if("throw"===r.type)return t.method="throw",t.arg=r.arg,t.delegate=null,p;var o=r.arg;return o?o.done?(t[e.resultName]=o.value,t.next=e.nextLoc,"return"!==t.method&&(t.method="next",t.arg=n),t.delegate=null,p):o:(t.method="throw",t.arg=new TypeError("iterator result is not an object"),t.delegate=null,p)}function C(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function P(e){var t=e.completion||{};t.type="normal",delete t.arg,e.completion=t}function M(e){this.tryEntries=[{tryLoc:"root"}],e.forEach(C,this),this.reset(!0)}function x(e){if(e){var t=e[a];if(t)return t.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length)){var i=-1,o=function t(){for(;++i<e.length;)if(r.call(e,i))return t.value=e[i],t.done=!1,t;return t.value=n,t.done=!0,t};return o.next=o}}return{next:L}}function L(){return{value:n,done:!0}}}("object"==typeof e?e:"object"==typeof window?window:"object"==typeof self?self:e)});try{var Vr=new window.CustomEvent("test");if(Vr.preventDefault(),!0!==Vr.defaultPrevented)throw new Error("Could not prevent default")}catch(e){var Dr=function(e,t){var n,i;return t=t||{bubbles:!1,cancelable:!1,detail:void 0},(n=document.createEvent("CustomEvent")).initCustomEvent(e,t.bubbles,t.cancelable,t.detail),i=n.preventDefault,n.preventDefault=function(){i.call(this);try{Object.defineProperty(this,"defaultPrevented",{get:function(){return!0}})}catch(e){this.defaultPrevented=!0}},n};Dr.prototype=window.Event.prototype,window.CustomEvent=Dr}!function(e){var t=function(){try{return!!Symbol.iterator}catch(e){return!1}}(),n=function(e){var n={next:function(){var t=e.shift();return{done:void 0===t,value:t}}};return t&&(n[Symbol.iterator]=function(){return n}),n},i=function(e){return encodeURIComponent(e).replace(/%20/g,"+")},r=function(e){return decodeURIComponent(e).replace(/\+/g," ")};"URLSearchParams"in e&&"a=1"===new URLSearchParams("?a=1").toString()||function(){var o=function(e){if(Object.defineProperty(this,"_entries",{value:{}}),"string"==typeof e){if(""!==e)for(var t,n=(e=e.replace(/^\?/,"")).split("&"),i=0;i<n.length;i++)t=n[i].split("="),this.append(r(t[0]),t.length>1?r(t[1]):"")}else if(e instanceof o){var a=this;e.forEach(function(e,t){a.append(e,t)})}},a=o.prototype;a.append=function(e,t){e in this._entries?this._entries[e].push(t.toString()):this._entries[e]=[t.toString()]},a.delete=function(e){delete this._entries[e]},a.get=function(e){return e in this._entries?this._entries[e][0]:null},a.getAll=function(e){return e in this._entries?this._entries[e].slice(0):[]},a.has=function(e){return e in this._entries},a.set=function(e,t){this._entries[e]=[t.toString()]},a.forEach=function(e,t){var n;for(var i in this._entries)if(this._entries.hasOwnProperty(i)){n=this._entries[i];for(var r=0;r<n.length;r++)e.call(t,n[r],i,this)}},a.keys=function(){var e=[];return this.forEach(function(t,n){e.push(n)}),n(e)},a.values=function(){var e=[];return this.forEach(function(t){e.push(t)}),n(e)},a.entries=function(){var e=[];return this.forEach(function(t,n){e.push([n,t])}),n(e)},t&&(a[Symbol.iterator]=a.entries),a.toString=function(){var e="";return this.forEach(function(t,n){e.length>0&&(e+="&"),e+=i(n)+"="+i(t)}),e},e.URLSearchParams=o}()}(void 0!==e?e:"undefined"!=typeof window?window:"undefined"!=typeof self?self:e),function(e){if(function(){try{var e=new URL("b","http://a");return e.pathname="c%20d","http://a/c%20d"===e.href&&e.searchParams}catch(e){return!1}}()||function(){var t=e.URL,n=function(e,t){"string"!=typeof e&&(e=String(e));var n=document.implementation.createHTMLDocument("");if(window.doc=n,t){var i=n.createElement("base");i.href=t,n.head.appendChild(i)}var r=n.createElement("a");if(r.href=e,n.body.appendChild(r),r.href=r.href,":"===r.protocol||!/:/.test(r.href))throw new TypeError("Invalid URL");Object.defineProperty(this,"_anchorElement",{value:r})},i=n.prototype;["hash","host","hostname","port","protocol","search"].forEach(function(e){!function(e){Object.defineProperty(i,e,{get:function(){return this._anchorElement[e]},set:function(t){this._anchorElement[e]=t},enumerable:!0})}(e)}),Object.defineProperties(i,{toString:{get:function(){var e=this;return function(){return e.href}}},href:{get:function(){return this._anchorElement.href.replace(/\?$/,"")},set:function(e){this._anchorElement.href=e},enumerable:!0},pathname:{get:function(){return this._anchorElement.pathname.replace(/(^\/?)/,"/")},set:function(e){this._anchorElement.pathname=e},enumerable:!0},origin:{get:function(){var e={"http:":80,"https:":443,"ftp:":21}[this._anchorElement.protocol],t=this._anchorElement.port!=e&&""!==this._anchorElement.port;return this._anchorElement.protocol+"//"+this._anchorElement.hostname+(t?":"+this._anchorElement.port:"")},enumerable:!0},password:{get:function(){return""},set:function(e){},enumerable:!0},username:{get:function(){return""},set:function(e){},enumerable:!0},searchParams:{get:function(){var e=new URLSearchParams(this.search),t=this;return["append","delete","set"].forEach(function(n){var i=e[n];e[n]=function(){i.apply(e,arguments),t.search=e.toString()}}),e},enumerable:!0}}),n.createObjectURL=function(e){return t.createObjectURL.apply(t,arguments)},n.revokeObjectURL=function(e){return t.revokeObjectURL.apply(t,arguments)},e.URL=n}(),void 0!==e.location&&!("origin"in e.location)){var t=function(){return e.location.protocol+"//"+e.location.hostname+(e.location.port?":"+e.location.port:"")};try{Object.defineProperty(e.location,"origin",{get:t,enumerable:!0})}catch(n){setInterval(function(){e.location.origin=t()},100)}}}(void 0!==e?e:"undefined"!=typeof window?window:"undefined"!=typeof self?self:e);var Hr,Wr=t(function(e,t){var n;n=function(){var e=function(){},t={},n={},i={};function r(e,t){if(e){var r=i[e];if(n[e]=t,r)for(;r.length;)r[0](e,t),r.splice(0,1)}}function o(t,n){t.call&&(t={success:t}),n.length?(t.error||e)(n):(t.success||e)(t)}function a(t,n,i,r){var o,s,l=document,c=i.async,u=(i.numRetries||0)+1,f=i.before||e,d=t.replace(/^(css|img)!/,"");r=r||0,/(^css!|\.css$)/.test(t)?(o=!0,(s=l.createElement("link")).rel="stylesheet",s.href=d):/(^img!|\.(png|gif|jpg|svg)$)/.test(t)?(s=l.createElement("img")).src=d:((s=l.createElement("script")).src=t,s.async=void 0===c||c),s.onload=s.onerror=s.onbeforeload=function(e){var l=e.type[0];if(o&&"hideFocus"in s)try{s.sheet.cssText.length||(l="e")}catch(e){l="e"}if("e"==l&&(r+=1)<u)return a(t,n,i,r);n(t,l,e.defaultPrevented)},!1!==f(t,s)&&l.head.appendChild(s)}function s(e,n,i){var s,l;if(n&&n.trim&&(s=n),l=(s?i:n)||{},s){if(s in t)throw"LoadJS";t[s]=!0}!function(e,t,n){var i,r,o=(e=e.push?e:[e]).length,s=o,l=[];for(i=function(e,n,i){if("e"==n&&l.push(e),"b"==n){if(!i)return;l.push(e)}--o||t(l)},r=0;r<s;r++)a(e[r],i,n)}(e,function(e){o(l,e),r(s,e)},l)}return s.ready=function(e,t){return function(e,t){e=e.push?e:[e];var r,o,a,s=[],l=e.length,c=l;for(r=function(e,n){n.length&&s.push(e),--c||t(s)};l--;)o=e[l],(a=n[o])?r(o,a):(i[o]=i[o]||[]).push(r)}(e,function(e){o(t,e)}),s},s.done=function(e){r(e,[])},s.reset=function(){t={},n={},i={}},s.isDefined=function(e){return e in t},s},e.exports=n()}),zr=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},Gr=function(){function e(e,t){for(var n=0;n<t.length;n++){var i=t[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i)}}return function(t,n,i){return n&&e(t.prototype,n),i&&e(t,i),t}}(),Yr=function(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e},Kr=function(){return function(e,t){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return function(e,t){var n=[],i=!0,r=!1,o=void 0;try{for(var a,s=e[Symbol.iterator]();!(i=(a=s.next()).done)&&(n.push(a.value),!t||n.length!==t);i=!0);}catch(e){r=!0,o=e}finally{try{!i&&s.return&&s.return()}finally{if(r)throw o}}return n}(e,t);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),Qr=function(){function e(t){zr(this,e),this.enabled=t.config.storage.enabled,this.key=t.config.storage.key}return Gr(e,[{key:"get",value:function(t){if(!e.supported||!this.enabled)return null;var n=window.localStorage.getItem(this.key);if(Xr.is.empty(n))return null;var i=JSON.parse(n);return Xr.is.string(t)&&t.length?i[t]:i}},{key:"set",value:function(t){if(e.supported&&this.enabled&&Xr.is.object(t)){var n=this.get();Xr.is.empty(n)&&(n={}),Xr.extend(n,t),window.localStorage.setItem(this.key,JSON.stringify(n))}}}],[{key:"supported",get:function(){try{if(!("localStorage"in window))return!1;return window.localStorage.setItem("___test","___test"),window.localStorage.removeItem("___test"),!0}catch(e){return!1}}}]),e}(),Jr={html5:"html5",youtube:"youtube",vimeo:"vimeo"},$r={audio:"audio",video:"video"},Xr={is:{object:function(e){return Xr.getConstructor(e)===Object},number:function(e){return Xr.getConstructor(e)===Number&&!Number.isNaN(e)},string:function(e){return Xr.getConstructor(e)===String},boolean:function(e){return Xr.getConstructor(e)===Boolean},function:function(e){return Xr.getConstructor(e)===Function},array:function(e){return!Xr.is.nullOrUndefined(e)&&Array.isArray(e)},weakMap:function(e){return Xr.is.instanceof(e,WeakMap)},nodeList:function(e){return Xr.is.instanceof(e,NodeList)},element:function(e){return Xr.is.instanceof(e,Element)},textNode:function(e){return Xr.getConstructor(e)===Text},event:function(e){return Xr.is.instanceof(e,Event)},cue:function(e){return Xr.is.instanceof(e,window.TextTrackCue)||Xr.is.instanceof(e,window.VTTCue)},track:function(e){return Xr.is.instanceof(e,TextTrack)||!Xr.is.nullOrUndefined(e)&&Xr.is.string(e.kind)},url:function(e){return!Xr.is.nullOrUndefined(e)&&/(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-/]))?/.test(e)},nullOrUndefined:function(e){return null==e},empty:function(e){return Xr.is.nullOrUndefined(e)||(Xr.is.string(e)||Xr.is.array(e)||Xr.is.nodeList(e))&&!e.length||Xr.is.object(e)&&!Object.keys(e).length},instanceof:function(e,t){return Boolean(e&&t&&e instanceof t)}},getConstructor:function(e){return Xr.is.nullOrUndefined(e)?null:e.constructor},getBrowser:function(){return{isIE:!!document.documentMode,isWebkit:"WebkitAppearance"in document.documentElement.style&&!/Edge/.test(navigator.userAgent),isIPhone:/(iPhone|iPod)/gi.test(navigator.platform),isIos:/(iPad|iPhone|iPod)/gi.test(navigator.platform)}},fetch:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"text";return new Promise(function(n,i){try{var r=new XMLHttpRequest;if(!("withCredentials"in r))return;r.addEventListener("load",function(){if("text"===t)try{n(JSON.parse(r.responseText))}catch(e){n(r.responseText)}else n(r.response)}),r.addEventListener("error",function(){throw new Error(r.statusText)}),r.open("GET",e,!0),r.responseType=t,r.send()}catch(e){i(e)}})},loadImage:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;return new Promise(function(n,i){var r=new Image,o=function(){delete r.onload,delete r.onerror,(r.naturalWidth>=t?n:i)(r)};Object.assign(r,{onload:o,onerror:o,src:e})})},loadScript:function(e){return new Promise(function(t,n){Wr(e,{success:t,error:n})})},loadSprite:function(e,t){if(Xr.is.string(e)){var n=Xr.is.string(t),i=function(){return null!==document.getElementById(t)},r=function(e,t){e.innerHTML=t,n&&i()||document.body.insertAdjacentElement("afterbegin",e)};if(!n||!i()){var o=Qr.supported,a=document.createElement("div");if(Xr.toggleHidden(a,!0),n&&a.setAttribute("id",t),o){var s=window.localStorage.getItem("cache-"+t);if(null!==s){var l=JSON.parse(s);r(a,l.content)}}Xr.fetch(e).then(function(e){Xr.is.empty(e)||(o&&window.localStorage.setItem("cache-"+t,JSON.stringify({content:e})),r(a,e))}).catch(function(){})}}},generateId:function(e){return e+"-"+Math.floor(1e4*Math.random())},wrap:function(e,t){var n=e.length?e:[e];Array.from(n).reverse().forEach(function(e,n){var i=n>0?t.cloneNode(!0):t,r=e.parentNode,o=e.nextSibling;i.appendChild(e),o?r.insertBefore(i,o):r.appendChild(i)})},createElement:function(e,t,n){var i=document.createElement(e);return Xr.is.object(t)&&Xr.setAttributes(i,t),Xr.is.string(n)&&(i.innerText=n),i},insertAfter:function(e,t){t.parentNode.insertBefore(e,t.nextSibling)},insertElement:function(e,t,n,i){t.appendChild(Xr.createElement(e,n,i))},removeElement:function(e){Xr.is.nodeList(e)||Xr.is.array(e)?Array.from(e).forEach(Xr.removeElement):Xr.is.element(e)&&Xr.is.element(e.parentNode)&&e.parentNode.removeChild(e)},emptyElement:function(e){for(var t=e.childNodes.length;t>0;)e.removeChild(e.lastChild),t-=1},replaceElement:function(e,t){return Xr.is.element(t)&&Xr.is.element(t.parentNode)&&Xr.is.element(e)?(t.parentNode.replaceChild(e,t),e):null},setAttributes:function(e,t){Xr.is.element(e)&&!Xr.is.empty(t)&&Object.entries(t).forEach(function(t){var n=Kr(t,2),i=n[0],r=n[1];e.setAttribute(i,r)})},getAttributesFromSelector:function(e,t){if(!Xr.is.string(e)||Xr.is.empty(e))return{};var n={},i=t;return e.split(",").forEach(function(e){var t=e.trim(),r=t.replace(".",""),o=t.replace(/[[\]]/g,"").split("="),a=o[0],s=o.length>1?o[1].replace(/["']/g,""):"";switch(t.charAt(0)){case".":Xr.is.object(i)&&Xr.is.string(i.class)&&(i.class+=" "+r),n.class=r;break;case"#":n.id=t.replace("#","");break;case"[":n[a]=s}}),n},toggleHidden:function(e,t){if(Xr.is.element(e)){var n=t;Xr.is.boolean(n)||(n=!e.hasAttribute("hidden")),n?e.setAttribute("hidden",""):e.removeAttribute("hidden")}},toggleClass:function(e,t,n){if(Xr.is.element(e)){var i="toggle";return void 0!==n&&(i=n?"add":"remove"),e.classList[i](t),e.classList.contains(t)}return null},hasClass:function(e,t){return Xr.is.element(e)&&e.classList.contains(t)},matches:function(e,t){var n={Element:Element};var i=n.matches||n.webkitMatchesSelector||n.mozMatchesSelector||n.msMatchesSelector||function(){return Array.from(document.querySelectorAll(t)).includes(this)};return i.call(e,t)},getElements:function(e){return this.elements.container.querySelectorAll(e)},getElement:function(e){return this.elements.container.querySelector(e)},getFocusElement:function(){var e=document.activeElement;return e=e&&e!==document.body?document.querySelector(":focus"):null},trapFocus:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(Xr.is.element(e)){var n=Xr.getElements.call(this,"button:not(:disabled), input:not(:disabled), [tabindex]"),i=n[0],r=n[n.length-1],o=function(e){if("Tab"===e.key&&9===e.keyCode){var t=Xr.getFocusElement();t!==r||e.shiftKey?t===i&&e.shiftKey&&(r.focus(),e.preventDefault()):(i.focus(),e.preventDefault())}};t?Xr.on(this.elements.container,"keydown",o,!1):Xr.off(this.elements.container,"keydown",o,!1)}},toggleListener:function(e,t,n){var i=arguments.length>3&&void 0!==arguments[3]&&arguments[3],r=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],o=arguments.length>5&&void 0!==arguments[5]&&arguments[5];if(!Xr.is.empty(e)&&!Xr.is.empty(t)&&Xr.is.function(n))if(Xr.is.nodeList(e)||Xr.is.array(e))Array.from(e).forEach(function(e){e instanceof Node&&Xr.toggleListener.call(null,e,t,n,i,r,o)});else{var a=t.split(" "),s=o;Zr.passiveListeners&&(s={passive:r,capture:o}),a.forEach(function(t){e[i?"addEventListener":"removeEventListener"](t,n,s)})}},on:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments[2],i=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],r=arguments.length>4&&void 0!==arguments[4]&&arguments[4];Xr.toggleListener(e,t,n,!0,i,r)},off:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments[2],i=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],r=arguments.length>4&&void 0!==arguments[4]&&arguments[4];Xr.toggleListener(e,t,n,!1,i,r)},dispatchEvent:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};if(Xr.is.element(e)&&!Xr.is.empty(t)){var r=new CustomEvent(t,{bubbles:n,detail:Object.assign({},i,{plyr:this})});e.dispatchEvent(r)}},format:function(e){for(var t=arguments.length,n=Array(t>1?t-1:0),i=1;i<t;i++)n[i-1]=arguments[i];return Xr.is.empty(e)?e:e.toString().replace(/{(\d+)}/g,function(e,t){return Xr.is.string(n[t])?n[t]:""})},getPercentage:function(e,t){return 0===e||0===t||Number.isNaN(e)||Number.isNaN(t)?0:(e/t*100).toFixed(2)},getHours:function(e){return parseInt(e/60/60%60,10)},getMinutes:function(e){return parseInt(e/60%60,10)},getSeconds:function(e){return parseInt(e%60,10)},formatTime:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if(!Xr.is.number(e))return Xr.formatTime(null,t,n);var i=function(e){return("0"+e).slice(-2)},r=Xr.getHours(e),o=Xr.getMinutes(e),a=Xr.getSeconds(e);return t||r>0?r+=":":r="",(n?"-":"")+r+i(o)+":"+i(a)},replaceAll:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"";return e.replace(new RegExp(t.toString().replace(/([.*+?^=!:${}()|[\]/\\])/g,"\\$1"),"g"),n.toString())},toTitleCase:function(){return(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"").toString().replace(/\w\S*/g,function(e){return e.charAt(0).toUpperCase()+e.substr(1).toLowerCase()})},toPascalCase:function(){var e=(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"").toString();return e=Xr.replaceAll(e,"-"," "),e=Xr.replaceAll(e,"_"," "),e=Xr.toTitleCase(e),Xr.replaceAll(e," ","")},toCamelCase:function(){var e=(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"").toString();return(e=Xr.toPascalCase(e)).charAt(0).toLowerCase()+e.slice(1)},extend:function(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length,n=Array(t>1?t-1:0),i=1;i<t;i++)n[i-1]=arguments[i];if(!n.length)return e;var r=n.shift();return Xr.is.object(r)?(Object.keys(r).forEach(function(t){Xr.is.object(r[t])?(Object.keys(e).includes(t)||Object.assign(e,Yr({},t,{})),Xr.extend(e[t],r[t])):Object.assign(e,Yr({},t,r[t]))}),Xr.extend.apply(Xr,[e].concat(function(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t<e.length;t++)n[t]=e[t];return n}return Array.from(e)}(n)))):e},dedupe:function(e){return Xr.is.array(e)?e.filter(function(t,n){return e.indexOf(t)===n}):e},cloneDeep:function(e){return JSON.parse(JSON.stringify(e))},getDeep:function(e,t){return t.split(".").reduce(function(e,t){return e&&e[t]},e)},closest:function(e,t){return Xr.is.array(e)&&e.length?e.reduce(function(e,n){return Math.abs(n-t)<Math.abs(e-t)?n:e}):null},getProviderByUrl:function(e){return/^(https?:\/\/)?(www\.)?(youtube\.com|youtu\.?be)\/.+$/.test(e)?Jr.youtube:/^https?:\/\/player.vimeo.com\/video\/\d{0,9}(?=\b|\/)/.test(e)?Jr.vimeo:null},parseYouTubeId:function(e){if(Xr.is.empty(e))return null;return e.match(/^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|&v=)([^#&?]*).*/)?RegExp.$2:e},parseVimeoId:function(e){if(Xr.is.empty(e))return null;if(Xr.is.number(Number(e)))return e;return e.match(/^.*(vimeo.com\/|video\/)(\d+).*/)?RegExp.$2:e},parseUrl:function(e){var t=document.createElement("a");return t.href=e,t},getUrlParams:function(e){var t=e;(e.startsWith("http://")||e.startsWith("https://"))&&(t=Xr.parseUrl(e).search);return Xr.is.empty(t)?null:t.slice(t.indexOf("?")+1).split("&").reduce(function(e,t){var n=t.split("="),i=Kr(n,2),r=i[0],o=i[1];return Object.assign(e,Yr({},r,decodeURIComponent(o)))},{})},buildUrlParams:function(e){return Xr.is.object(e)?Object.keys(e).map(function(t){return encodeURIComponent(t)+"="+encodeURIComponent(e[t])}).join("&"):""},stripHTML:function(e){var t=document.createDocumentFragment(),n=document.createElement("div");return t.appendChild(n),n.innerHTML=e,t.firstChild.innerText},getHTML:function(e){var t=document.createElement("div");return t.appendChild(e),t.innerHTML},getAspectRatio:function(e,t){var n=function e(t,n){return 0===n?t:e(n,t%n)}(e,t);return e/n+":"+t/n},get transitionEndEvent(){var e=document.createElement("span"),t={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},n=Object.keys(t).find(function(t){return void 0!==e.style[t]});return!!Xr.is.string(n)&&t[n]},repaint:function(e){setTimeout(function(){Xr.toggleHidden(e,!0),e.offsetHeight,Xr.toggleHidden(e,!1)},0)}},Zr={audio:"canPlayType"in document.createElement("audio"),video:"canPlayType"in document.createElement("video"),check:function(e,t,n){var i=!1,r=!1,o=Xr.getBrowser(),a=o.isIPhone&&n&&Zr.playsinline;switch(t+":"+e){case"html5:video":r=(i=Zr.video)&&Zr.rangeInput&&(!o.isIPhone||a);break;case"html5:audio":r=(i=Zr.audio)&&Zr.rangeInput;break;case"youtube:video":case"vimeo:video":i=!0,r=Zr.rangeInput&&(!o.isIPhone||a);break;default:r=(i=Zr.audio&&Zr.video)&&Zr.rangeInput}return{api:i,ui:r}},pip:!Xr.getBrowser().isIPhone&&Xr.is.function(Xr.createElement("video").webkitSetPresentationMode),airplay:Xr.is.function(window.WebKitPlaybackTargetAvailabilityEvent),playsinline:"playsInline"in document.createElement("video"),mime:function(e){var t=this.media;try{if(!this.isHTML5||!Xr.is.function(t.canPlayType))return!1;if(e.includes("codecs="))return t.canPlayType(e).replace(/no/,"");if(this.isVideo)switch(e){case"video/webm":return t.canPlayType('video/webm; codecs="vp8, vorbis"').replace(/no/,"");case"video/mp4":return t.canPlayType('video/mp4; codecs="avc1.42E01E, mp4a.40.2"').replace(/no/,"");case"video/ogg":return t.canPlayType('video/ogg; codecs="theora"').replace(/no/,"");default:return!1}else if(this.isAudio)switch(e){case"audio/mpeg":return t.canPlayType("audio/mpeg;").replace(/no/,"");case"audio/ogg":return t.canPlayType('audio/ogg; codecs="vorbis"').replace(/no/,"");case"audio/wav":return t.canPlayType('audio/wav; codecs="1"').replace(/no/,"");default:return!1}}catch(e){return!1}return!1},textTracks:"textTracks"in document.createElement("video"),passiveListeners:function(){var e=!1;try{var t=Object.defineProperty({},"passive",{get:function(){return e=!0,null}});window.addEventListener("test",null,t),window.removeEventListener("test",null,t)}catch(e){}return e}(),rangeInput:(Hr=document.createElement("input"),Hr.type="range","range"===Hr.type),touch:"ontouchstart"in document.documentElement,transitions:!1!==Xr.transitionEndEvent,reducedMotion:"matchMedia"in window&&window.matchMedia("(prefers-reduced-motion)").matches},eo={getSources:function(){return this.isHTML5?this.media.querySelectorAll("source"):null},getQualityOptions:function(){if(!this.isHTML5)return null;var e=eo.getSources.call(this);if(Xr.is.empty(e))return null;var t=Array.from(e).filter(function(e){return!Xr.is.empty(e.getAttribute("size"))});return Xr.is.empty(t)?null:Xr.dedupe(t.map(function(e){return Number(e.getAttribute("size"))}))},extend:function(){if(this.isHTML5){var e=this;Object.defineProperty(e.media,"quality",{get:function(){var t=eo.getSources.call(e);if(Xr.is.empty(t))return null;var n=Array.from(t).filter(function(t){return t.getAttribute("src")===e.source});return Xr.is.empty(n)?null:Number(n[0].getAttribute("size"))},set:function(t){var n=eo.getSources.call(e);if(!Xr.is.empty(n)){var i=Array.from(n).filter(function(e){return Number(e.getAttribute("size"))===t});if(!Xr.is.empty(i)){var r=i.filter(function(t){return Zr.mime.call(e,t.getAttribute("type"))});if(!Xr.is.empty(r)){Xr.dispatchEvent.call(e,e.media,"qualityrequested",!1,{quality:t});var o=e.currentTime,a=e.playing;e.media.src=r[0].getAttribute("src");e.on("loadedmetadata",function t(){e.currentTime=o,e.off("loadedmetadata",t)}),e.media.load(),a&&e.play(),Xr.dispatchEvent.call(e,e.media,"qualitychange",!1,{quality:t})}}}}})}},cancelRequests:function(){this.isHTML5&&(Xr.removeElement(eo.getSources()),this.media.setAttribute("src",this.config.blankVideo),this.media.load(),this.debug.log("Cancelled network requests"))}},to=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(Xr.is.empty(e)||Xr.is.empty(t))return"";var n=Xr.getDeep(t.i18n,e);if(Xr.is.empty(n))return"";var i={"{seektime}":t.seekTime,"{title}":t.title};return Object.entries(i).forEach(function(e){var t=Kr(e,2),i=t[0],r=t[1];n=Xr.replaceAll(n,i,r)}),n},no=Xr.getBrowser(),io={getIconUrl:function(){var e=new URL(this.config.iconUrl,window.location).host!==window.location.host||no.isIE&&!window.svg4everybody;return{url:this.config.iconUrl,cors:e}},findElements:function(){try{return this.elements.controls=Xr.getElement.call(this,this.config.selectors.controls.wrapper),this.elements.buttons={play:Xr.getElements.call(this,this.config.selectors.buttons.play),pause:Xr.getElement.call(this,this.config.selectors.buttons.pause),restart:Xr.getElement.call(this,this.config.selectors.buttons.restart),rewind:Xr.getElement.call(this,this.config.selectors.buttons.rewind),fastForward:Xr.getElement.call(this,this.config.selectors.buttons.fastForward),mute:Xr.getElement.call(this,this.config.selectors.buttons.mute),pip:Xr.getElement.call(this,this.config.selectors.buttons.pip),airplay:Xr.getElement.call(this,this.config.selectors.buttons.airplay),settings:Xr.getElement.call(this,this.config.selectors.buttons.settings),captions:Xr.getElement.call(this,this.config.selectors.buttons.captions),fullscreen:Xr.getElement.call(this,this.config.selectors.buttons.fullscreen)},this.elements.progress=Xr.getElement.call(this,this.config.selectors.progress),this.elements.inputs={seek:Xr.getElement.call(this,this.config.selectors.inputs.seek),volume:Xr.getElement.call(this,this.config.selectors.inputs.volume)},this.elements.display={buffer:Xr.getElement.call(this,this.config.selectors.display.buffer),currentTime:Xr.getElement.call(this,this.config.selectors.display.currentTime),duration:Xr.getElement.call(this,this.config.selectors.display.duration)},Xr.is.element(this.elements.progress)&&(this.elements.display.seekTooltip=this.elements.progress.querySelector("."+this.config.classNames.tooltip)),!0}catch(e){return this.debug.warn("It looks like there is a problem with your custom controls HTML",e),this.toggleNativeControls(!0),!1}},createIcon:function(e,t){var n=io.getIconUrl.call(this),i=(n.cors?"":n.url)+"#"+this.config.iconPrefix,r=document.createElementNS("http://www.w3.org/2000/svg","svg");Xr.setAttributes(r,Xr.extend(t,{role:"presentation",focusable:"false"}));var o=document.createElementNS("http://www.w3.org/2000/svg","use"),a=i+"-"+e;return"href"in o?o.setAttributeNS("http://www.w3.org/1999/xlink","href",a):o.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href",a),r.appendChild(o),r},createLabel:function(e,t){var n=to(e,this.config),i=Object.assign({},t);switch(e){case"pip":n="PIP";break;case"airplay":n="AirPlay"}return"class"in i?i.class+=" "+this.config.classNames.hidden:i.class=this.config.classNames.hidden,Xr.createElement("span",i,n)},createBadge:function(e){if(Xr.is.empty(e))return null;var t=Xr.createElement("span",{class:this.config.classNames.menu.value});return t.appendChild(Xr.createElement("span",{class:this.config.classNames.menu.badge},e)),t},createButton:function(e,t){var n=Xr.createElement("button"),i=Object.assign({},t),r=Xr.toCamelCase(e),o=!1,a=void 0,s=void 0,l=void 0,c=void 0;switch("type"in i||(i.type="button"),"class"in i?i.class.includes(this.config.classNames.control)&&(i.class+=" "+this.config.classNames.control):i.class=this.config.classNames.control,e){case"play":o=!0,a="play",l="pause",s="play",c="pause";break;case"mute":o=!0,a="mute",l="unmute",s="volume",c="muted";break;case"captions":o=!0,a="enableCaptions",l="disableCaptions",s="captions-off",c="captions-on";break;case"fullscreen":o=!0,a="enterFullscreen",l="exitFullscreen",s="enter-fullscreen",c="exit-fullscreen";break;case"play-large":i.class+=" "+this.config.classNames.control+"--overlaid",r="play",a="play",s="play";break;default:a=r,s=e}o?(n.appendChild(io.createIcon.call(this,c,{class:"icon--pressed"})),n.appendChild(io.createIcon.call(this,s,{class:"icon--not-pressed"})),n.appendChild(io.createLabel.call(this,l,{class:"label--pressed"})),n.appendChild(io.createLabel.call(this,a,{class:"label--not-pressed"}))):(n.appendChild(io.createIcon.call(this,s)),n.appendChild(io.createLabel.call(this,a))),Xr.extend(i,Xr.getAttributesFromSelector(this.config.selectors.buttons[r],i)),Xr.setAttributes(n,i),"play"===r?(Xr.is.array(this.elements.buttons[r])||(this.elements.buttons[r]=[]),this.elements.buttons[r].push(n)):this.elements.buttons[r]=n;var u=this.config.classNames.controlPressed;return Object.defineProperty(n,"pressed",{enumerable:!0,get:function(){return Xr.hasClass(n,u)},set:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];Xr.toggleClass(n,u,e)}}),n},createRange:function(e,t){var n=Xr.createElement("input",Xr.extend(Xr.getAttributesFromSelector(this.config.selectors.inputs[e]),{type:"range",min:0,max:100,step:.01,value:0,autocomplete:"off",role:"slider","aria-label":to(e,this.config),"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":0},t));return this.elements.inputs[e]=n,io.updateRangeFill.call(this,n),n},createProgress:function(e,t){var n=Xr.createElement("progress",Xr.extend(Xr.getAttributesFromSelector(this.config.selectors.display[e]),{min:0,max:100,value:0,role:"presentation","aria-hidden":!0},t));if("volume"!==e){n.appendChild(Xr.createElement("span",null,"0"));var i="";switch(e){case"played":i=to("played",this.config);break;case"buffer":i=to("buffered",this.config)}n.innerText="% "+i.toLowerCase()}return this.elements.display[e]=n,n},createTime:function(e){var t=Xr.getAttributesFromSelector(this.config.selectors.display[e]),n=Xr.createElement("div",Xr.extend(t,{class:"plyr__time "+t.class,"aria-label":to(e,this.config)}),"00:00");return this.elements.display[e]=n,n},createMenuItem:function(e){var t=e.value,n=e.list,i=e.type,r=e.title,o=e.badge,a=void 0===o?null:o,s=e.checked,l=void 0!==s&&s,c=Xr.createElement("li"),u=Xr.createElement("label",{class:this.config.classNames.control}),f=Xr.createElement("input",Xr.extend(Xr.getAttributesFromSelector(this.config.selectors.inputs[i]),{type:"radio",name:"plyr-"+i,value:t,checked:l,class:"plyr__sr-only"})),d=Xr.createElement("span",{hidden:""});u.appendChild(f),u.appendChild(d),u.insertAdjacentHTML("beforeend",r),Xr.is.element(a)&&u.appendChild(a),c.appendChild(u),n.appendChild(c)},formatTime:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(!Xr.is.number(e))return e;var n=Xr.getHours(this.duration)>0;return Xr.formatTime(e,n,t)},updateTimeDisplay:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];Xr.is.element(e)&&Xr.is.number(t)&&(e.innerText=io.formatTime(t,n))},updateVolume:function(){this.supported.ui&&(Xr.is.element(this.elements.inputs.volume)&&io.setRange.call(this,this.elements.inputs.volume,this.muted?0:this.volume),Xr.is.element(this.elements.buttons.mute)&&(this.elements.buttons.mute.pressed=this.muted||0===this.volume))},setRange:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;Xr.is.element(e)&&(e.value=t,io.updateRangeFill.call(this,e))},updateProgress:function(e){var t=this;if(this.supported.ui&&Xr.is.event(e)){var n=0;if(e)switch(e.type){case"timeupdate":case"seeking":case"seeked":n=Xr.getPercentage(this.currentTime,this.duration),"timeupdate"===e.type&&io.setRange.call(this,this.elements.inputs.seek,n);break;case"playing":case"progress":!function(e,n){var i=Xr.is.number(n)?n:0,r=Xr.is.element(e)?e:t.elements.display.buffer;if(Xr.is.element(r)){r.value=i;var o=r.getElementsByTagName("span")[0];Xr.is.element(o)&&(o.childNodes[0].nodeValue=i)}}(this.elements.display.buffer,100*this.buffered)}}},updateRangeFill:function(e){var t=Xr.is.event(e)?e.target:e;if(Xr.is.element(t)&&"range"===t.getAttribute("type")){if(Xr.matches(t,this.config.selectors.inputs.seek)){t.setAttribute("aria-valuenow",this.currentTime);var n=io.formatTime(this.currentTime),i=io.formatTime(this.duration),r=to("seekLabel",this.config);t.setAttribute("aria-valuetext",r.replace("{currentTime}",n).replace("{duration}",i))}else if(Xr.matches(t,this.config.selectors.inputs.volume)){var o=100*t.value;t.setAttribute("aria-valuenow",o),t.setAttribute("aria-valuetext",o+"%")}else t.setAttribute("aria-valuenow",t.value);no.isWebkit&&t.style.setProperty("--value",t.value/t.max*100+"%")}},updateSeekTooltip:function(e){var t=this;if(this.config.tooltips.seek&&Xr.is.element(this.elements.inputs.seek)&&Xr.is.element(this.elements.display.seekTooltip)&&0!==this.duration){var n=0,i=this.elements.progress.getBoundingClientRect(),r=this.config.classNames.tooltip+"--visible",o=function(e){Xr.toggleClass(t.elements.display.seekTooltip,r,e)};if(this.touch)o(!1);else{if(Xr.is.event(e))n=100/i.width*(e.pageX-i.left);else{if(!Xr.hasClass(this.elements.display.seekTooltip,r))return;n=parseFloat(this.elements.display.seekTooltip.style.left,10)}n<0?n=0:n>100&&(n=100),io.updateTimeDisplay.call(this,this.elements.display.seekTooltip,this.duration/100*n),this.elements.display.seekTooltip.style.left=n+"%",Xr.is.event(e)&&["mouseenter","mouseleave"].includes(e.type)&&o("mouseenter"===e.type)}}},timeUpdate:function(e){var t=!Xr.is.element(this.elements.display.duration)&&this.config.invertTime;io.updateTimeDisplay.call(this,this.elements.display.currentTime,t?this.duration-this.currentTime:this.currentTime,t),e&&"timeupdate"===e.type&&this.media.seeking||io.updateProgress.call(this,e)},durationUpdate:function(){if(this.supported.ui&&(this.config.invertTime||!this.currentTime)){Xr.is.element(this.elements.inputs.seek)&&this.elements.inputs.seek.setAttribute("aria-valuemax",this.duration);var e=Xr.is.element(this.elements.display.duration);!e&&this.config.displayDuration&&this.paused&&io.updateTimeDisplay.call(this,this.elements.display.currentTime,this.duration),e&&io.updateTimeDisplay.call(this,this.elements.display.duration,this.duration),io.updateSeekTooltip.call(this)}},toggleTab:function(e,t){Xr.toggleHidden(this.elements.settings.tabs[e],!t)},setQualityMenu:function(e){var t=this;if(Xr.is.element(this.elements.settings.panes.quality)){var n=this.elements.settings.panes.quality.querySelector("ul");Xr.is.array(e)&&(this.options.quality=e.filter(function(e){return t.config.quality.options.includes(e)}));var i=!Xr.is.empty(this.options.quality)&&this.options.quality.length>1;if(io.toggleTab.call(this,"quality",i),io.checkMenu.call(this),i){Xr.emptyElement(n);this.options.quality.sort(function(e,n){var i=t.config.quality.options;return i.indexOf(e)>i.indexOf(n)?1:-1}).forEach(function(e){io.createMenuItem.call(t,{value:e,list:n,type:"quality",title:io.getLabel.call(t,"quality",e),badge:function(e){var n=to("qualityBadge."+e,t.config);return n.length?io.createBadge.call(t,n):null}(e)})}),io.updateSetting.call(this,"quality",n)}}},getLabel:function(e,t){switch(e){case"speed":return 1===t?to("normal",this.config):t+"&times;";case"quality":if(Xr.is.number(t)){var n=to("qualityLabel."+t,this.config);return n.length?n:t+"p"}return Xr.toTitleCase(t);case"captions":return ro.getLabel.call(this);default:return null}},updateSetting:function(e,t,n){var i=this.elements.settings.panes[e],r=null,o=t;switch(e){case"captions":r=this.currentTrack;break;default:if(r=Xr.is.empty(n)?this[e]:n,Xr.is.empty(r)&&(r=this.config[e].default),!Xr.is.empty(this.options[e])&&!this.options[e].includes(r))return void this.debug.warn("Unsupported value of '"+r+"' for "+e);if(!this.config[e].options.includes(r))return void this.debug.warn("Disabled value of '"+r+"' for "+e)}if(Xr.is.element(o)||(o=i&&i.querySelector("ul")),Xr.is.element(o)){this.elements.settings.tabs[e].querySelector("."+this.config.classNames.menu.value).innerHTML=io.getLabel.call(this,e,r);var a=o&&o.querySelector('input[value="'+r+'"]');Xr.is.element(a)&&(a.checked=!0)}},setCaptionsMenu:function(){var e=this,t=this.elements.settings.panes.captions.querySelector("ul"),n=ro.getTracks.call(this);if(io.toggleTab.call(this,"captions",n.length),Xr.emptyElement(t),io.checkMenu.call(this),n.length){var i=n.map(function(n,i){return{value:i,checked:e.captions.active&&e.currentTrack===i,title:ro.getLabel.call(e,n),badge:n.language&&io.createBadge.call(e,n.language.toUpperCase()),list:t,type:"language"}});i.unshift({value:-1,checked:!this.captions.active,title:to("disabled",this.config),list:t,type:"language"}),i.forEach(io.createMenuItem.bind(this)),io.updateSetting.call(this,"captions",t)}},setSpeedMenu:function(e){var t=this;if(this.config.controls.includes("settings")&&this.config.settings.includes("speed")&&Xr.is.element(this.elements.settings.panes.speed)){Xr.is.array(e)?this.options.speed=e:(this.isHTML5||this.isVimeo)&&(this.options.speed=[.5,.75,1,1.25,1.5,1.75,2]),this.options.speed=this.options.speed.filter(function(e){return t.config.speed.options.includes(e)});var n=!Xr.is.empty(this.options.speed)&&this.options.speed.length>1;if(io.toggleTab.call(this,"speed",n),io.checkMenu.call(this),n){var i=this.elements.settings.panes.speed.querySelector("ul");Xr.emptyElement(i),this.options.speed.forEach(function(e){io.createMenuItem.call(t,{value:e,list:i,type:"speed",title:io.getLabel.call(t,"speed",e)})}),io.updateSetting.call(this,"speed",i)}}},checkMenu:function(){var e=this.elements.settings.tabs,t=!Xr.is.empty(e)&&Object.values(e).some(function(e){return!e.hidden});Xr.toggleHidden(this.elements.settings.menu,!t)},toggleMenu:function(e){var t=this.elements.settings.form,n=this.elements.buttons.settings;if(Xr.is.element(t)&&Xr.is.element(n)){var i=Xr.is.boolean(e)?e:Xr.is.element(t)&&t.hasAttribute("hidden");if(Xr.is.event(e)){var r=Xr.is.element(t)&&t.contains(e.target),o=e.target===this.elements.buttons.settings;if(r||!r&&!o&&i)return;o&&e.stopPropagation()}Xr.is.element(n)&&n.setAttribute("aria-expanded",i),Xr.is.element(t)&&(Xr.toggleHidden(t,!i),Xr.toggleClass(this.elements.container,this.config.classNames.menu.open,i),i?t.removeAttribute("tabindex"):t.setAttribute("tabindex",-1))}},getTabSize:function(e){var t=e.cloneNode(!0);t.style.position="absolute",t.style.opacity=0,t.removeAttribute("hidden"),Array.from(t.querySelectorAll("input[name]")).forEach(function(e){var t=e.getAttribute("name");e.setAttribute("name",t+"-clone")}),e.parentNode.appendChild(t);var n=t.scrollWidth,i=t.scrollHeight;return Xr.removeElement(t),{width:n,height:i}},showTab:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=this.elements.settings.menu,n=document.getElementById(e);if(Xr.is.element(n)&&"tabpanel"===n.getAttribute("role")){var i=t.querySelector('[role="tabpanel"]:not([hidden])'),r=i.parentNode;if(Array.from(t.querySelectorAll('[aria-controls="'+i.getAttribute("id")+'"]')).forEach(function(e){e.setAttribute("aria-expanded",!1)}),Zr.transitions&&!Zr.reducedMotion){r.style.width=i.scrollWidth+"px",r.style.height=i.scrollHeight+"px";var o=io.getTabSize.call(this,n);Xr.on(r,Xr.transitionEndEvent,function e(t){t.target===r&&["width","height"].includes(t.propertyName)&&(r.style.width="",r.style.height="",Xr.off(r,Xr.transitionEndEvent,e))}),r.style.width=o.width+"px",r.style.height=o.height+"px"}Xr.toggleHidden(i,!0),i.setAttribute("tabindex",-1),Xr.toggleHidden(n,!1);var a=Xr.getElements.call(this,'[aria-controls="'+e+'"]');Array.from(a).forEach(function(e){e.setAttribute("aria-expanded",!0)}),n.removeAttribute("tabindex"),n.querySelectorAll("button:not(:disabled), input:not(:disabled), [tabindex]")[0].focus()}},create:function(e){var t=this;if(Xr.is.empty(this.config.controls))return null;var n=Xr.createElement("div",Xr.getAttributesFromSelector(this.config.selectors.controls.wrapper));if(this.config.controls.includes("restart")&&n.appendChild(io.createButton.call(this,"restart")),this.config.controls.includes("rewind")&&n.appendChild(io.createButton.call(this,"rewind")),this.config.controls.includes("play")&&n.appendChild(io.createButton.call(this,"play")),this.config.controls.includes("fast-forward")&&n.appendChild(io.createButton.call(this,"fast-forward")),this.config.controls.includes("progress")){var i=Xr.createElement("div",Xr.getAttributesFromSelector(this.config.selectors.progress));if(i.appendChild(io.createRange.call(this,"seek",{id:"plyr-seek-"+e.id})),i.appendChild(io.createProgress.call(this,"buffer")),this.config.tooltips.seek){var r=Xr.createElement("span",{class:this.config.classNames.tooltip},"00:00");i.appendChild(r),this.elements.display.seekTooltip=r}this.elements.progress=i,n.appendChild(this.elements.progress)}if(this.config.controls.includes("current-time")&&n.appendChild(io.createTime.call(this,"currentTime")),this.config.controls.includes("duration")&&n.appendChild(io.createTime.call(this,"duration")),this.config.controls.includes("mute")&&n.appendChild(io.createButton.call(this,"mute")),this.config.controls.includes("volume")){var o=Xr.createElement("div",{class:"plyr__volume"}),a={max:1,step:.05,value:this.config.volume};o.appendChild(io.createRange.call(this,"volume",Xr.extend(a,{id:"plyr-volume-"+e.id}))),this.elements.volume=o,n.appendChild(o)}if(this.config.controls.includes("captions")&&n.appendChild(io.createButton.call(this,"captions")),this.config.controls.includes("settings")&&!Xr.is.empty(this.config.settings)){var s=Xr.createElement("div",{class:"plyr__menu",hidden:""});s.appendChild(io.createButton.call(this,"settings",{id:"plyr-settings-toggle-"+e.id,"aria-haspopup":!0,"aria-controls":"plyr-settings-"+e.id,"aria-expanded":!1}));var l=Xr.createElement("form",{class:"plyr__menu__container",id:"plyr-settings-"+e.id,hidden:"","aria-labelled-by":"plyr-settings-toggle-"+e.id,role:"tablist",tabindex:-1}),c=Xr.createElement("div"),u=Xr.createElement("div",{id:"plyr-settings-"+e.id+"-home","aria-labelled-by":"plyr-settings-toggle-"+e.id,role:"tabpanel"}),f=Xr.createElement("ul",{role:"tablist"});this.config.settings.forEach(function(n){var i=Xr.createElement("li",{role:"tab",hidden:""}),r=Xr.createElement("button",Xr.extend(Xr.getAttributesFromSelector(t.config.selectors.buttons.settings),{type:"button",class:t.config.classNames.control+" "+t.config.classNames.control+"--forward",id:"plyr-settings-"+e.id+"-"+n+"-tab","aria-haspopup":!0,"aria-controls":"plyr-settings-"+e.id+"-"+n,"aria-expanded":!1}),to(n,t.config)),o=Xr.createElement("span",{class:t.config.classNames.menu.value});o.innerHTML=e[n],r.appendChild(o),i.appendChild(r),f.appendChild(i),t.elements.settings.tabs[n]=i}),u.appendChild(f),c.appendChild(u),this.config.settings.forEach(function(n){var i=Xr.createElement("div",{id:"plyr-settings-"+e.id+"-"+n,hidden:"","aria-labelled-by":"plyr-settings-"+e.id+"-"+n+"-tab",role:"tabpanel",tabindex:-1}),r=Xr.createElement("button",{type:"button",class:t.config.classNames.control+" "+t.config.classNames.control+"--back","aria-haspopup":!0,"aria-controls":"plyr-settings-"+e.id+"-home","aria-expanded":!1},to(n,t.config));i.appendChild(r);var o=Xr.createElement("ul");i.appendChild(o),c.appendChild(i),t.elements.settings.panes[n]=i}),l.appendChild(c),s.appendChild(l),n.appendChild(s),this.elements.settings.form=l,this.elements.settings.menu=s}return this.config.controls.includes("pip")&&Zr.pip&&n.appendChild(io.createButton.call(this,"pip")),this.config.controls.includes("airplay")&&Zr.airplay&&n.appendChild(io.createButton.call(this,"airplay")),this.config.controls.includes("fullscreen")&&n.appendChild(io.createButton.call(this,"fullscreen")),this.config.controls.includes("play-large")&&this.elements.container.appendChild(io.createButton.call(this,"play-large")),this.elements.controls=n,this.isHTML5&&io.setQualityMenu.call(this,eo.getQualityOptions.call(this)),io.setSpeedMenu.call(this),n},inject:function(){var e=this;if(this.config.loadSprite){var t=io.getIconUrl.call(this);t.cors&&Xr.loadSprite(t.url,"sprite-plyr")}this.id=Math.floor(1e4*Math.random());var n=null;this.elements.controls=null;var i={id:this.id,seektime:this.config.seekTime,title:this.config.title},r=!0;Xr.is.string(this.config.controls)||Xr.is.element(this.config.controls)?n=this.config.controls:Xr.is.function(this.config.controls)?n=this.config.controls.call(this,i):(n=io.create.call(this,{id:this.id,seektime:this.config.seekTime,speed:this.speed,quality:this.quality,captions:ro.getLabel.call(this)}),r=!1);var o=function(e){var t=e;return Object.entries(i).forEach(function(e){var n=Kr(e,2),i=n[0],r=n[1];t=Xr.replaceAll(t,"{"+i+"}",r)}),t};r&&(Xr.is.string(this.config.controls)?n=o(n):Xr.is.element(n)&&(n.innerHTML=o(n.innerHTML)));var a=void 0;if(Xr.is.string(this.config.selectors.controls.container)&&(a=document.querySelector(this.config.selectors.controls.container)),Xr.is.element(a)||(a=this.elements.container),Xr.is.element(n)?a.appendChild(n):n&&a.insertAdjacentHTML("beforeend",n),Xr.is.element(this.elements.controls)||io.findElements.call(this),window.navigator.userAgent.includes("Edge")&&Xr.repaint(a),this.config.tooltips.controls){var s=Xr.getElements.call(this,[this.config.selectors.controls.wrapper," ",this.config.selectors.labels," .",this.config.classNames.hidden].join(""));Array.from(s).forEach(function(t){Xr.toggleClass(t,e.config.classNames.hidden,!1),Xr.toggleClass(t,e.config.classNames.tooltip,!0)})}}},ro={setup:function(){if(this.supported.ui)if(!this.isVideo||this.isYouTube||this.isHTML5&&!Zr.textTracks)Xr.is.array(this.config.controls)&&this.config.controls.includes("settings")&&this.config.settings.includes("captions")&&io.setCaptionsMenu.call(this);else{if(Xr.is.element(this.elements.captions)||(this.elements.captions=Xr.createElement("div",Xr.getAttributesFromSelector(this.config.selectors.captions)),Xr.insertAfter(this.elements.captions,this.elements.wrapper)),Xr.getBrowser().isIE&&window.URL){var e=this.media.querySelectorAll("track");Array.from(e).forEach(function(e){var t=e.getAttribute("src"),n=Xr.parseUrl(t);n.hostname!==window.location.href.hostname&&["http:","https:"].includes(n.protocol)&&Xr.fetch(t,"blob").then(function(t){e.setAttribute("src",window.URL.createObjectURL(t))}).catch(function(){Xr.removeElement(e)})})}var t=this.storage.get("captions");Xr.is.boolean(t)||(t=this.config.captions.active);var n=this.storage.get("language")||this.config.captions.language;if("auto"===n){var i=(navigator.language||navigator.userLanguage).split("-");n=Kr(i,1)[0]}if(ro.setLanguage.call(this,n,t),this.isHTML5){var r=this.config.captions.update?"addtrack removetrack":"removetrack";Xr.on(this.media.textTracks,r,ro.update.bind(this))}setTimeout(ro.update.bind(this),0)}},update:function(){var e=this,t=ro.getTracks.call(this,!0),n=this.captions,i=n.language,r=n.meta;this.isHTML5&&this.isVideo&&t.filter(function(e){return!r.get(e)}).forEach(function(t){e.debug.log("Track added",t),r.set(t,{default:"showing"===t.mode}),t.mode="hidden",Xr.on(t,"cuechange",function(){return ro.updateCues.call(e)})});var o=!t.find(function(t){return t===e.captions.currentTrackNode}),a=this.language!==i&&t.find(function(e){return e.language===i});(o||a)&&ro.setLanguage.call(this,i,this.config.captions.active),Xr.toggleClass(this.elements.container,this.config.classNames.captions.enabled,!Xr.is.empty(t)),(this.config.controls||[]).includes("settings")&&this.config.settings.includes("captions")&&io.setCaptionsMenu.call(this)},set:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],i=ro.getTracks.call(this);if(-1!==e)if(Xr.is.number(e))if(e in i){if(this.captions.currentTrack!==e){this.captions.currentTrack=e;var r=ro.getCurrentTrack.call(this),o=(r||{}).language;this.captions.currentTrackNode=r,t&&(this.captions.language=o),this.isVimeo&&this.embed.enableTextTrack(o),Xr.dispatchEvent.call(this,this.media,"languagechange")}this.isHTML5&&this.isVideo&&ro.updateCues.call(this),n&&this.toggleCaptions(!0)}else this.debug.warn("Track not found",e);else this.debug.warn("Invalid caption argument",e);else this.toggleCaptions(!1)},setLanguage:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(Xr.is.string(e)){this.captions.language=e.toLowerCase();var n=ro.getTracks.call(this),i=ro.getCurrentTrack.call(this,!0);ro.set.call(this,n.indexOf(i),!1,t)}else this.debug.warn("Invalid language argument",e)},getTracks:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return Array.from((this.media||{}).textTracks||[]).filter(function(n){return!e.isHTML5||t||e.captions.meta.has(n)}).filter(function(e){return["captions","subtitles"].includes(e.kind)})},getCurrentTrack:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]&&arguments[0],n=ro.getTracks.call(this),i=function(t){return Number((e.captions.meta.get(t)||{}).default)},r=Array.from(n).sort(function(e,t){return i(t)-i(e)});return!t&&n[this.currentTrack]||r.find(function(t){return t.language===e.captions.language})||r[0]},getLabel:function(e){var t=e;return!Xr.is.track(t)&&Zr.textTracks&&this.captions.active&&(t=ro.getCurrentTrack.call(this)),Xr.is.track(t)?Xr.is.empty(t.label)?Xr.is.empty(t.language)?to("enabled",this.config):e.language.toUpperCase():t.label:to("disabled",this.config)},updateCues:function(e){if(this.supported.ui)if(Xr.is.element(this.elements.captions))if(Xr.is.nullOrUndefined(e)||Array.isArray(e)){var t=e;if(!t){var n=ro.getCurrentTrack.call(this);t=Array.from((n||{}).activeCues||[]).map(function(e){return e.getCueAsHTML()}).map(Xr.getHTML)}var i=t.map(function(e){return e.trim()}).join("\n");if(i!==this.elements.captions.innerHTML){Xr.emptyElement(this.elements.captions);var r=Xr.createElement("span",Xr.getAttributesFromSelector(this.config.selectors.caption));r.innerHTML=i,this.elements.captions.appendChild(r),Xr.dispatchEvent.call(this,this.media,"cuechange")}}else this.debug.warn("updateCues: Invalid input",e);else this.debug.warn("No captions element to render to")}},oo=function(){},ao=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];zr(this,e),this.enabled=window.console&&t,this.enabled&&this.log("Debugging enabled")}return Gr(e,[{key:"log",get:function(){return this.enabled?Function.prototype.bind.call(console.log,console):oo}},{key:"warn",get:function(){return this.enabled?Function.prototype.bind.call(console.warn,console):oo}},{key:"error",get:function(){return this.enabled?Function.prototype.bind.call(console.error,console):oo}}]),e}(),so={enabled:!0,title:"",debug:!1,autoplay:!1,autopause:!0,playsinline:!0,seekTime:10,volume:1,muted:!1,duration:null,displayDuration:!0,invertTime:!0,toggleInvert:!0,ratio:"16:9",clickToPlay:!0,hideControls:!0,resetOnEnd:!1,disableContextMenu:!0,loadSprite:!0,iconPrefix:"plyr",iconUrl:"https://cdn.plyr.io/3.3.12/plyr.svg",blankVideo:"https://cdn.plyr.io/static/blank.mp4",quality:{default:576,options:[4320,2880,2160,1440,1080,720,576,480,360,240,"default"]},loop:{active:!1},speed:{selected:1,options:[.5,.75,1,1.25,1.5,1.75,2]},keyboard:{focused:!0,global:!1},tooltips:{controls:!1,seek:!0},captions:{active:!1,language:"auto",update:!1},fullscreen:{enabled:!0,fallback:!0,iosNative:!1},storage:{enabled:!0,key:"plyr"},controls:["play-large","play","progress","current-time","mute","volume","captions","settings","pip","airplay","fullscreen"],settings:["captions","quality","speed"],i18n:{restart:"Restart",rewind:"Rewind {seektime}s",play:"Play",pause:"Pause",fastForward:"Forward {seektime}s",seek:"Seek",seekLabel:"{currentTime} of {duration}",played:"Played",buffered:"Buffered",currentTime:"Current time",duration:"Duration",volume:"Volume",mute:"Mute",unmute:"Unmute",enableCaptions:"Enable captions",disableCaptions:"Disable captions",enterFullscreen:"Enter fullscreen",exitFullscreen:"Exit fullscreen",frameTitle:"Player for {title}",captions:"Captions",settings:"Settings",menuBack:"Go back to previous menu",speed:"Speed",normal:"Normal",quality:"Quality",loop:"Loop",start:"Start",end:"End",all:"All",reset:"Reset",disabled:"Disabled",enabled:"Enabled",advertisement:"Ad",qualityBadge:{2160:"4K",1440:"HD",1080:"HD",720:"HD",576:"SD",480:"SD"}},urls:{vimeo:{sdk:"https://player.vimeo.com/api/player.js",iframe:"https://player.vimeo.com/video/{0}?{1}",api:"https://vimeo.com/api/v2/video/{0}.json"},youtube:{sdk:"https://www.youtube.com/iframe_api",api:"https://www.googleapis.com/youtube/v3/videos?id={0}&key={1}&fields=items(snippet(title))&part=snippet"},googleIMA:{sdk:"https://imasdk.googleapis.com/js/sdkloader/ima3.js"}},listeners:{seek:null,play:null,pause:null,restart:null,rewind:null,fastForward:null,mute:null,volume:null,captions:null,fullscreen:null,pip:null,airplay:null,speed:null,quality:null,loop:null,language:null},events:["ended","progress","stalled","playing","waiting","canplay","canplaythrough","loadstart","loadeddata","loadedmetadata","timeupdate","volumechange","play","pause","error","seeking","seeked","emptied","ratechange","cuechange","enterfullscreen","exitfullscreen","captionsenabled","captionsdisabled","languagechange","controlshidden","controlsshown","ready","statechange","qualitychange","qualityrequested","adsloaded","adscontentpause","adscontentresume","adstarted","adsmidpoint","adscomplete","adsallcomplete","adsimpression","adsclick"],selectors:{editable:"input, textarea, select, [contenteditable]",container:".plyr",controls:{container:null,wrapper:".plyr__controls"},labels:"[data-plyr]",buttons:{play:'[data-plyr="play"]',pause:'[data-plyr="pause"]',restart:'[data-plyr="restart"]',rewind:'[data-plyr="rewind"]',fastForward:'[data-plyr="fast-forward"]',mute:'[data-plyr="mute"]',captions:'[data-plyr="captions"]',fullscreen:'[data-plyr="fullscreen"]',pip:'[data-plyr="pip"]',airplay:'[data-plyr="airplay"]',settings:'[data-plyr="settings"]',loop:'[data-plyr="loop"]'},inputs:{seek:'[data-plyr="seek"]',volume:'[data-plyr="volume"]',speed:'[data-plyr="speed"]',language:'[data-plyr="language"]',quality:'[data-plyr="quality"]'},display:{currentTime:".plyr__time--current",duration:".plyr__time--duration",buffer:".plyr__progress__buffer",loop:".plyr__progress__loop",volume:".plyr__volume--display"},progress:".plyr__progress",captions:".plyr__captions",caption:".plyr__caption",menu:{quality:".js-plyr__menu__list--quality"}},classNames:{type:"plyr--{0}",provider:"plyr--{0}",video:"plyr__video-wrapper",embed:"plyr__video-embed",embedContainer:"plyr__video-embed__container",poster:"plyr__poster",posterEnabled:"plyr__poster-enabled",ads:"plyr__ads",control:"plyr__control",controlPressed:"plyr__control--pressed",playing:"plyr--playing",paused:"plyr--paused",stopped:"plyr--stopped",loading:"plyr--loading",hover:"plyr--hover",tooltip:"plyr__tooltip",cues:"plyr__cues",hidden:"plyr__sr-only",hideControls:"plyr--hide-controls",isIos:"plyr--is-ios",isTouch:"plyr--is-touch",uiSupported:"plyr--full-ui",noTransition:"plyr--no-transition",menu:{value:"plyr__menu__value",badge:"plyr__badge",open:"plyr--menu-open"},captions:{enabled:"plyr--captions-enabled",active:"plyr--captions-active"},fullscreen:{enabled:"plyr--fullscreen-enabled",fallback:"plyr--fullscreen-fallback"},pip:{supported:"plyr--pip-supported",active:"plyr--pip-active"},airplay:{supported:"plyr--airplay-supported",active:"plyr--airplay-active"},tabFocus:"plyr__tab-focus"},attributes:{embed:{provider:"data-plyr-provider",id:"data-plyr-embed-id"}},keys:{google:null},ads:{enabled:!1,publisherId:""}},lo=Xr.getBrowser();function co(){if(this.enabled){var e=this.player.elements.buttons.fullscreen;Xr.is.element(e)&&(e.pressed=this.active),Xr.dispatchEvent.call(this.player,this.target,this.active?"enterfullscreen":"exitfullscreen",!0),lo.isIos||Xr.trapFocus.call(this.player,this.target,this.active)}}function uo(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];e?this.scrollPosition={x:window.scrollX||0,y:window.scrollY||0}:window.scrollTo(this.scrollPosition.x,this.scrollPosition.y),document.body.style.overflow=e?"hidden":"",Xr.toggleClass(this.target,this.player.config.classNames.fullscreen.fallback,e),co.call(this)}var fo=function(){function e(t){var n=this;zr(this,e),this.player=t,this.prefix=e.prefix,this.property=e.property,this.scrollPosition={x:0,y:0},Xr.on(document,"ms"===this.prefix?"MSFullscreenChange":this.prefix+"fullscreenchange",function(){co.call(n)}),Xr.on(this.player.elements.container,"dblclick",function(e){Xr.is.element(n.player.elements.controls)&&n.player.elements.controls.contains(e.target)||n.toggle()}),this.update()}return Gr(e,[{key:"update",value:function(){this.enabled?this.player.debug.log((e.native?"Native":"Fallback")+" fullscreen enabled"):this.player.debug.log("Fullscreen not supported and fallback disabled"),Xr.toggleClass(this.player.elements.container,this.player.config.classNames.fullscreen.enabled,this.enabled)}},{key:"enter",value:function(){this.enabled&&(lo.isIos&&this.player.config.fullscreen.iosNative?this.player.playing&&this.target.webkitEnterFullscreen():e.native?this.prefix?Xr.is.empty(this.prefix)||this.target[this.prefix+"Request"+this.property]():this.target.requestFullscreen():uo.call(this,!0))}},{key:"exit",value:function(){if(this.enabled)if(lo.isIos&&this.player.config.fullscreen.iosNative)this.target.webkitExitFullscreen(),this.player.play();else if(e.native)if(this.prefix){if(!Xr.is.empty(this.prefix)){var t="moz"===this.prefix?"Cancel":"Exit";document[""+this.prefix+t+this.property]()}}else(document.cancelFullScreen||document.exitFullscreen).call(document);else uo.call(this,!1)}},{key:"toggle",value:function(){this.active?this.exit():this.enter()}},{key:"enabled",get:function(){return(e.native||this.player.config.fullscreen.fallback)&&this.player.config.fullscreen.enabled&&this.player.supported.ui&&this.player.isVideo}},{key:"active",get:function(){return!!this.enabled&&(e.native?(this.prefix?document[""+this.prefix+this.property+"Element"]:document.fullscreenElement)===this.target:Xr.hasClass(this.target,this.player.config.classNames.fullscreen.fallback))}},{key:"target",get:function(){return lo.isIos&&this.player.config.fullscreen.iosNative?this.player.media:this.player.elements.container}}],[{key:"native",get:function(){return!!(document.fullscreenEnabled||document.webkitFullscreenEnabled||document.mozFullScreenEnabled||document.msFullscreenEnabled)}},{key:"prefix",get:function(){if(Xr.is.function(document.exitFullscreen))return"";var e="";return["webkit","moz","ms"].some(function(t){return!(!Xr.is.function(document[t+"ExitFullscreen"])&&!Xr.is.function(document[t+"CancelFullScreen"]))&&(e=t,!0)}),e}},{key:"property",get:function(){return"moz"===this.prefix?"FullScreen":"Fullscreen"}}]),e}(),ho=Xr.getBrowser(),po={addStyleHook:function(){Xr.toggleClass(this.elements.container,this.config.selectors.container.replace(".",""),!0),Xr.toggleClass(this.elements.container,this.config.classNames.uiSupported,this.supported.ui)},toggleNativeControls:function(){arguments.length>0&&void 0!==arguments[0]&&arguments[0]&&this.isHTML5?this.media.setAttribute("controls",""):this.media.removeAttribute("controls")},build:function(){var e=this;if(this.listeners.media(),!this.supported.ui)return this.debug.warn("Basic support only for "+this.provider+" "+this.type),void po.toggleNativeControls.call(this,!0);Xr.is.element(this.elements.controls)||(io.inject.call(this),this.listeners.controls()),po.toggleNativeControls.call(this),this.isHTML5&&ro.setup.call(this),this.volume=null,this.muted=null,this.speed=null,this.loop=null,this.quality=null,io.updateVolume.call(this),io.timeUpdate.call(this),po.checkPlaying.call(this),Xr.toggleClass(this.elements.container,this.config.classNames.pip.supported,Zr.pip&&this.isHTML5&&this.isVideo),Xr.toggleClass(this.elements.container,this.config.classNames.airplay.supported,Zr.airplay&&this.isHTML5),Xr.toggleClass(this.elements.container,this.config.classNames.isIos,ho.isIos),Xr.toggleClass(this.elements.container,this.config.classNames.isTouch,this.touch),this.ready=!0,setTimeout(function(){Xr.dispatchEvent.call(e,e.media,"ready")},0),po.setTitle.call(this),this.poster&&this.elements.poster&&!this.elements.poster.style.backgroundImage&&po.setPoster.call(this,this.poster),this.config.duration&&io.durationUpdate.call(this)},setTitle:function(){var e=to("play",this.config);if(Xr.is.string(this.config.title)&&!Xr.is.empty(this.config.title)&&(e+=", "+this.config.title),Xr.is.nodeList(this.elements.buttons.play)&&Array.from(this.elements.buttons.play).forEach(function(t){t.setAttribute("aria-label",e)}),this.isEmbed){var t=Xr.getElement.call(this,"iframe");if(!Xr.is.element(t))return;var n=Xr.is.empty(this.config.title)?"video":this.config.title,i=to("frameTitle",this.config);t.setAttribute("title",i.replace("{title}",n))}},togglePoster:function(e){Xr.toggleClass(this.elements.container,this.config.classNames.posterEnabled,e)},setPoster:function(e){var t=this;if(this.media.setAttribute("poster",e),!Xr.is.element(this.elements.poster))return Promise.reject();var n=Xr.loadImage(e).then(function(){return t.elements.poster.style.backgroundImage="url('"+e+"')",Object.assign(t.elements.poster.style,{backgroundImage:"url('"+e+"')",backgroundSize:""}),po.togglePoster.call(t,!0),e});return n.catch(function(){return po.togglePoster.call(t,!1)}),n},checkPlaying:function(e){var t=this;Xr.toggleClass(this.elements.container,this.config.classNames.playing,this.playing),Xr.toggleClass(this.elements.container,this.config.classNames.paused,this.paused),Xr.toggleClass(this.elements.container,this.config.classNames.stopped,this.stopped),Array.from(this.elements.buttons.play).forEach(function(e){e.pressed=t.playing}),Xr.is.event(e)&&"timeupdate"===e.type||po.toggleControls.call(this)},checkLoading:function(e){var t=this;this.loading=["stalled","waiting"].includes(e.type),clearTimeout(this.timers.loading),this.timers.loading=setTimeout(function(){Xr.toggleClass(t.elements.container,t.config.classNames.loading,t.loading),po.toggleControls.call(t)},this.loading?250:0)},toggleControls:function(e){var t=this.elements.controls;t&&this.config.hideControls&&this.toggleControls(Boolean(e||this.loading||this.paused||t.pressed||t.hover))}},go=Xr.getBrowser(),mo=function(){function e(t){zr(this,e),this.player=t,this.lastKey=null,this.handleKey=this.handleKey.bind(this),this.toggleMenu=this.toggleMenu.bind(this),this.firstTouch=this.firstTouch.bind(this)}return Gr(e,[{key:"handleKey",value:function(e){var t=this,n=e.keyCode?e.keyCode:e.which,i="keydown"===e.type,r=i&&n===this.lastKey;if(!(e.altKey||e.ctrlKey||e.metaKey||e.shiftKey)&&Xr.is.number(n)){if(i){var o=Xr.getFocusElement();if(Xr.is.element(o)&&o!==this.player.elements.inputs.seek&&Xr.matches(o,this.player.config.selectors.editable))return;switch([48,49,50,51,52,53,54,56,57,32,75,38,40,77,39,37,70,67,73,76,79].includes(n)&&(e.preventDefault(),e.stopPropagation()),n){case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:r||(t.player.currentTime=t.player.duration/10*(n-48));break;case 32:case 75:r||this.player.togglePlay();break;case 38:this.player.increaseVolume(.1);break;case 40:this.player.decreaseVolume(.1);break;case 77:r||(this.player.muted=!this.player.muted);break;case 39:this.player.forward();break;case 37:this.player.rewind();break;case 70:this.player.fullscreen.toggle();break;case 67:r||this.player.toggleCaptions();break;case 76:this.player.loop=!this.player.loop}!this.player.fullscreen.enabled&&this.player.fullscreen.active&&27===n&&this.player.fullscreen.toggle(),this.lastKey=n}else this.lastKey=null}}},{key:"toggleMenu",value:function(e){io.toggleMenu.call(this.player,e)}},{key:"firstTouch",value:function(){this.player.touch=!0,Xr.toggleClass(this.player.elements.container,this.player.config.classNames.isTouch,!0),Xr.off(document.body,"touchstart",this.firstTouch)}},{key:"global",value:function(){var e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.player.config.keyboard.global&&Xr.toggleListener(window,"keydown keyup",this.handleKey,e,!1),Xr.toggleListener(document.body,"click",this.toggleMenu,e),Xr.on(document.body,"touchstart",this.firstTouch)}},{key:"container",value:function(){var e=this;!this.player.config.keyboard.global&&this.player.config.keyboard.focused&&Xr.on(this.player.elements.container,"keydown keyup",this.handleKey,!1),Xr.on(this.player.elements.container,"focusout",function(t){Xr.toggleClass(t.target,e.player.config.classNames.tabFocus,!1)}),Xr.on(this.player.elements.container,"keydown",function(t){9===t.keyCode&&setTimeout(function(){Xr.toggleClass(Xr.getFocusElement(),e.player.config.classNames.tabFocus,!0)},0)}),Xr.on(this.player.elements.container,"mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen",function(t){var n=e.player.elements.controls;"enterfullscreen"===t.type&&(n.pressed=!1,n.hover=!1);var i=0;["touchstart","touchmove","mousemove"].includes(t.type)&&(po.toggleControls.call(e.player,!0),i=e.player.touch?3e3:2e3),clearTimeout(e.player.timers.controls),e.player.timers.controls=setTimeout(function(){return po.toggleControls.call(e.player,!1)},i)})}},{key:"media",value:function(){var e=this;if(Xr.on(this.player.media,"timeupdate seeking seeked",function(t){return io.timeUpdate.call(e.player,t)}),Xr.on(this.player.media,"durationchange loadeddata loadedmetadata",function(t){return io.durationUpdate.call(e.player,t)}),Xr.on(this.player.media,"loadeddata",function(){Xr.toggleHidden(e.player.elements.volume,!e.player.hasAudio),Xr.toggleHidden(e.player.elements.buttons.mute,!e.player.hasAudio)}),Xr.on(this.player.media,"ended",function(){e.player.isHTML5&&e.player.isVideo&&e.player.config.resetOnEnd&&e.player.restart()}),Xr.on(this.player.media,"progress playing seeking seeked",function(t){return io.updateProgress.call(e.player,t)}),Xr.on(this.player.media,"volumechange",function(t){return io.updateVolume.call(e.player,t)}),Xr.on(this.player.media,"playing play pause ended emptied timeupdate",function(t){return po.checkPlaying.call(e.player,t)}),Xr.on(this.player.media,"waiting canplay seeked playing",function(t){return po.checkLoading.call(e.player,t)}),Xr.on(this.player.media,"playing",function(){e.player.ads&&e.player.ads.enabled&&!e.player.ads.initialized&&e.player.ads.managerPromise.then(function(){return e.player.ads.play()}).catch(function(){return e.player.play()})}),this.player.supported.ui&&this.player.config.clickToPlay&&!this.player.isAudio){var t=Xr.getElement.call(this.player,"."+this.player.config.classNames.video);if(!Xr.is.element(t))return;Xr.on(t,"click",function(){e.player.config.hideControls&&e.player.touch&&!e.player.paused||(e.player.paused?e.player.play():e.player.ended?(e.player.restart(),e.player.play()):e.player.pause())})}this.player.supported.ui&&this.player.config.disableContextMenu&&Xr.on(this.player.elements.wrapper,"contextmenu",function(e){e.preventDefault()},!1),Xr.on(this.player.media,"volumechange",function(){e.player.storage.set({volume:e.player.volume,muted:e.player.muted})}),Xr.on(this.player.media,"ratechange",function(){io.updateSetting.call(e.player,"speed"),e.player.storage.set({speed:e.player.speed})}),Xr.on(this.player.media,"qualityrequested",function(t){e.player.storage.set({quality:t.detail.quality})}),Xr.on(this.player.media,"qualitychange",function(t){io.updateSetting.call(e.player,"quality",null,t.detail.quality)}),Xr.on(this.player.media,"languagechange",function(){io.updateSetting.call(e.player,"captions"),e.player.storage.set({language:e.player.language})}),Xr.on(this.player.media,"captionsenabled captionsdisabled",function(){io.updateSetting.call(e.player,"captions"),e.player.storage.set({captions:e.player.captions.active})}),Xr.on(this.player.media,this.player.config.events.concat(["keyup","keydown"]).join(" "),function(t){var n=t.detail,i=void 0===n?{}:n;"error"===t.type&&(i=e.player.media.error),Xr.dispatchEvent.call(e.player,e.player.elements.container,t.type,!0,i)})}},{key:"controls",value:function(){var e=this,t=go.isIE?"change":"input",n=function(t,n,i){var r=e.player.config.listeners[i],o=!0;Xr.is.function(r)&&(o=r.call(e.player,t)),o&&Xr.is.function(n)&&n.call(e.player,t)},i=function(t,i,r,o){var a=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],s=e.player.config.listeners[o],l=Xr.is.function(s);Xr.on(t,i,function(e){return n(e,r,o)},a&&!l)};i(this.player.elements.buttons.play,"click",this.player.togglePlay,"play"),i(this.player.elements.buttons.restart,"click",this.player.restart,"restart"),i(this.player.elements.buttons.rewind,"click",this.player.rewind,"rewind"),i(this.player.elements.buttons.fastForward,"click",this.player.forward,"fastForward"),i(this.player.elements.buttons.mute,"click",function(){e.player.muted=!e.player.muted},"mute"),i(this.player.elements.buttons.captions,"click",this.player.toggleCaptions),i(this.player.elements.buttons.fullscreen,"click",function(){e.player.fullscreen.toggle()},"fullscreen"),i(this.player.elements.buttons.pip,"click",function(){e.player.pip="toggle"},"pip"),i(this.player.elements.buttons.airplay,"click",this.player.airplay,"airplay"),i(this.player.elements.buttons.settings,"click",function(t){io.toggleMenu.call(e.player,t)}),i(this.player.elements.settings.form,"click",function(t){t.stopPropagation();var i=function(){var t="plyr-settings-"+e.player.id+"-home";io.showTab.call(e.player,t)};if(Xr.matches(t.target,e.player.config.selectors.inputs.language))n(t,function(){e.player.currentTrack=Number(t.target.value),i()},"language");else if(Xr.matches(t.target,e.player.config.selectors.inputs.quality))n(t,function(){e.player.quality=t.target.value,i()},"quality");else if(Xr.matches(t.target,e.player.config.selectors.inputs.speed))n(t,function(){e.player.speed=parseFloat(t.target.value),i()},"speed");else{var r=t.target;io.showTab.call(e.player,r.getAttribute("aria-controls"))}}),i(this.player.elements.inputs.seek,"mousedown mousemove",function(t){var n=e.player.elements.progress.getBoundingClientRect(),i=100/n.width*(t.pageX-n.left);t.currentTarget.setAttribute("seek-value",i)}),i(this.player.elements.inputs.seek,"mousedown mouseup keydown keyup touchstart touchend",function(t){var n=t.currentTarget,i=t.keyCode?t.keyCode:t.which,r=t.type;if("keydown"!==r&&"keyup"!==r||39===i||37===i){var o=n.hasAttribute("play-on-seeked"),a=["mouseup","touchend","keyup"].includes(t.type);o&&a?(n.removeAttribute("play-on-seeked"),e.player.play()):!a&&e.player.playing&&(n.setAttribute("play-on-seeked",""),e.player.pause())}}),i(this.player.elements.inputs.seek,t,function(t){var n=t.currentTarget,i=n.getAttribute("seek-value");Xr.is.empty(i)&&(i=n.value),n.removeAttribute("seek-value"),e.player.currentTime=i/n.max*e.player.duration},"seek"),this.player.config.toggleInvert&&!Xr.is.element(this.player.elements.display.duration)&&i(this.player.elements.display.currentTime,"click",function(){0!==e.player.currentTime&&(e.player.config.invertTime=!e.player.config.invertTime,io.timeUpdate.call(e.player))}),i(this.player.elements.inputs.volume,t,function(t){e.player.volume=t.target.value},"volume"),go.isWebkit&&i(Xr.getElements.call(this.player,'input[type="range"]'),"input",function(t){io.updateRangeFill.call(e.player,t.target)}),i(this.player.elements.progress,"mouseenter mouseleave mousemove",function(t){return io.updateSeekTooltip.call(e.player,t)}),i(this.player.elements.controls,"mouseenter mouseleave",function(t){e.player.elements.controls.hover=!e.player.touch&&"mouseenter"===t.type}),i(this.player.elements.controls,"mousedown mouseup touchstart touchend touchcancel",function(t){e.player.elements.controls.pressed=["mousedown","touchstart"].includes(t.type)}),i(this.player.elements.controls,"focusin focusout",function(t){var n=e.player,i=n.config,r=n.elements,o=n.timers;if(Xr.toggleClass(r.controls,i.classNames.noTransition,"focusin"===t.type),po.toggleControls.call(e.player,"focusin"===t.type),"focusin"===t.type){setTimeout(function(){Xr.toggleClass(r.controls,i.classNames.noTransition,!1)},0);var a=e.touch?3e3:4e3;clearTimeout(o.controls),o.controls=setTimeout(function(){return po.toggleControls.call(e.player,!1)},a)}}),i(this.player.elements.inputs.volume,"wheel",function(t){var n=t.webkitDirectionInvertedFromDevice,i=0;(t.deltaY<0||t.deltaX>0)&&(n?(e.player.decreaseVolume(.02),i=-1):(e.player.increaseVolume(.02),i=1)),(t.deltaY>0||t.deltaX<0)&&(n?(e.player.increaseVolume(.02),i=1):(e.player.decreaseVolume(.02),i=-1)),(1===i&&e.player.media.volume<1||-1===i&&e.player.media.volume>0)&&t.preventDefault()},"volume",!1)}},{key:"clear",value:function(){this.global(!1)}}]),e}();function yo(e){e&&!this.embed.hasPlayed&&(this.embed.hasPlayed=!0),this.media.paused===e&&(this.media.paused=!e,Xr.dispatchEvent.call(this,this.media,e?"play":"pause"))}var vo={setup:function(){var e=this;Xr.toggleClass(this.elements.wrapper,this.config.classNames.embed,!0),vo.setAspectRatio.call(this),Xr.is.object(window.Vimeo)?vo.ready.call(this):Xr.loadScript(this.config.urls.vimeo.sdk).then(function(){vo.ready.call(e)}).catch(function(t){e.debug.warn("Vimeo API failed to load",t)})},setAspectRatio:function(e){var t=Xr.is.string(e)?e.split(":"):this.config.ratio.split(":"),n=100/t[0]*t[1];if(this.elements.wrapper.style.paddingBottom=n+"%",this.supported.ui){var i=(240-n)/4.8;this.media.style.transform="translateY(-"+i+"%)"}},ready:function(){var e=this,t=this,n={loop:t.config.loop.active,autoplay:t.autoplay,byline:!1,portrait:!1,title:!1,speed:!0,transparent:0,gesture:"media",playsinline:!this.config.fullscreen.iosNative},i=Xr.buildUrlParams(n),r=t.media.getAttribute("src");Xr.is.empty(r)&&(r=t.media.getAttribute(t.config.attributes.embed.id));var o=Xr.parseVimeoId(r),a=Xr.createElement("iframe"),s=Xr.format(t.config.urls.vimeo.iframe,o,i);a.setAttribute("src",s),a.setAttribute("allowfullscreen",""),a.setAttribute("allowtransparency",""),a.setAttribute("allow","autoplay");var l=Xr.createElement("div",{class:t.config.classNames.embedContainer});l.appendChild(a),t.media=Xr.replaceElement(l,t.media),Xr.fetch(Xr.format(t.config.urls.vimeo.api,o),"json").then(function(e){if(!Xr.is.empty(e)){var n=new URL(e[0].thumbnail_large);n.pathname=n.pathname.split("_")[0]+".jpg",po.setPoster.call(t,n.href)}}),t.embed=new window.Vimeo.Player(a,{autopause:t.config.autopause,muted:t.muted}),t.media.paused=!0,t.media.currentTime=0,t.supported.ui&&t.embed.disableTextTrack(),t.media.play=function(){return yo.call(t,!0),t.embed.play()},t.media.pause=function(){return yo.call(t,!1),t.embed.pause()},t.media.stop=function(){t.pause(),t.currentTime=0};var c=t.media.currentTime;Object.defineProperty(t.media,"currentTime",{get:function(){return c},set:function(e){var n=t.embed,i=t.media,r=t.paused,o=t.volume,a=r&&!n.hasPlayed;i.seeking=!0,Xr.dispatchEvent.call(t,i,"seeking"),Promise.resolve(a&&n.setVolume(0)).then(function(){return n.setCurrentTime(e)}).then(function(){return a&&n.pause()}).then(function(){return a&&n.setVolume(o)}).catch(function(){})}});var u=t.config.speed.selected;Object.defineProperty(t.media,"playbackRate",{get:function(){return u},set:function(e){t.embed.setPlaybackRate(e).then(function(){u=e,Xr.dispatchEvent.call(t,t.media,"ratechange")}).catch(function(e){"Error"===e.name&&io.setSpeedMenu.call(t,[])})}});var f=t.config.volume;Object.defineProperty(t.media,"volume",{get:function(){return f},set:function(e){t.embed.setVolume(e).then(function(){f=e,Xr.dispatchEvent.call(t,t.media,"volumechange")})}});var d=t.config.muted;Object.defineProperty(t.media,"muted",{get:function(){return d},set:function(e){var n=!!Xr.is.boolean(e)&&e;t.embed.setVolume(n?0:t.config.volume).then(function(){d=n,Xr.dispatchEvent.call(t,t.media,"volumechange")})}});var h=t.config.loop;Object.defineProperty(t.media,"loop",{get:function(){return h},set:function(e){var n=Xr.is.boolean(e)?e:t.config.loop.active;t.embed.setLoop(n).then(function(){h=n})}});var p=void 0;t.embed.getVideoUrl().then(function(e){p=e}).catch(function(t){e.debug.warn(t)}),Object.defineProperty(t.media,"currentSrc",{get:function(){return p}}),Object.defineProperty(t.media,"ended",{get:function(){return t.currentTime===t.duration}}),Promise.all([t.embed.getVideoWidth(),t.embed.getVideoHeight()]).then(function(t){var n=Xr.getAspectRatio(t[0],t[1]);vo.setAspectRatio.call(e,n)}),t.embed.setAutopause(t.config.autopause).then(function(e){t.config.autopause=e}),t.embed.getVideoTitle().then(function(n){t.config.title=n,po.setTitle.call(e)}),t.embed.getCurrentTime().then(function(e){c=e,Xr.dispatchEvent.call(t,t.media,"timeupdate")}),t.embed.getDuration().then(function(e){t.media.duration=e,Xr.dispatchEvent.call(t,t.media,"durationchange")}),t.embed.getTextTracks().then(function(e){t.media.textTracks=e,ro.setup.call(t)}),t.embed.on("cuechange",function(e){var n=e.cues,i=(void 0===n?[]:n).map(function(e){return Xr.stripHTML(e.text)});ro.updateCues.call(t,i)}),t.embed.on("loaded",function(){(t.embed.getPaused().then(function(e){yo.call(t,!e),e||Xr.dispatchEvent.call(t,t.media,"playing")}),Xr.is.element(t.embed.element)&&t.supported.ui)&&t.embed.element.setAttribute("tabindex",-1)}),t.embed.on("play",function(){yo.call(t,!0),Xr.dispatchEvent.call(t,t.media,"playing")}),t.embed.on("pause",function(){yo.call(t,!1)}),t.embed.on("timeupdate",function(e){t.media.seeking=!1,c=e.seconds,Xr.dispatchEvent.call(t,t.media,"timeupdate")}),t.embed.on("progress",function(e){t.media.buffered=e.percent,Xr.dispatchEvent.call(t,t.media,"progress"),1===parseInt(e.percent,10)&&Xr.dispatchEvent.call(t,t.media,"canplaythrough"),t.embed.getDuration().then(function(e){e!==t.media.duration&&(t.media.duration=e,Xr.dispatchEvent.call(t,t.media,"durationchange"))})}),t.embed.on("seeked",function(){t.media.seeking=!1,Xr.dispatchEvent.call(t,t.media,"seeked")}),t.embed.on("ended",function(){t.media.paused=!0,Xr.dispatchEvent.call(t,t.media,"ended")}),t.embed.on("error",function(e){t.media.error=e,Xr.dispatchEvent.call(t,t.media,"error")}),setTimeout(function(){return po.build.call(t)},0)}};function bo(e){switch(e){case"hd2160":return 2160;case 2160:return"hd2160";case"hd1440":return 1440;case 1440:return"hd1440";case"hd1080":return 1080;case 1080:return"hd1080";case"hd720":return 720;case 720:return"hd720";case"large":return 480;case 480:return"large";case"medium":return 360;case 360:return"medium";case"small":return 240;case 240:return"small";default:return"default"}}function wo(e){e&&!this.embed.hasPlayed&&(this.embed.hasPlayed=!0),this.media.paused===e&&(this.media.paused=!e,Xr.dispatchEvent.call(this,this.media,e?"play":"pause"))}var ko={setup:function(){var e=this;Xr.toggleClass(this.elements.wrapper,this.config.classNames.embed,!0),ko.setAspectRatio.call(this),Xr.is.object(window.YT)&&Xr.is.function(window.YT.Player)?ko.ready.call(this):(Xr.loadScript(this.config.urls.youtube.sdk).catch(function(t){e.debug.warn("YouTube API failed to load",t)}),window.onYouTubeReadyCallbacks=window.onYouTubeReadyCallbacks||[],window.onYouTubeReadyCallbacks.push(function(){ko.ready.call(e)}),window.onYouTubeIframeAPIReady=function(){window.onYouTubeReadyCallbacks.forEach(function(e){e()})})},getTitle:function(e){var t=this;if(Xr.is.function(this.embed.getVideoData)){var n=this.embed.getVideoData().title;if(Xr.is.empty(n))return this.config.title=n,void po.setTitle.call(this)}var i=this.config.keys.google;if(Xr.is.string(i)&&!Xr.is.empty(i)){var r=Xr.format(this.config.urls.youtube.api,e,i);Xr.fetch(r).then(function(e){Xr.is.object(e)&&(t.config.title=e.items[0].snippet.title,po.setTitle.call(t))}).catch(function(){})}},setAspectRatio:function(){var e=this.config.ratio.split(":");this.elements.wrapper.style.paddingBottom=100/e[0]*e[1]+"%"},ready:function(){var e=this,t=e.media.getAttribute("id");if(Xr.is.empty(t)||!t.startsWith("youtube-")){var n=e.media.getAttribute("src");Xr.is.empty(n)&&(n=e.media.getAttribute(this.config.attributes.embed.id));var i=Xr.parseYouTubeId(n),r=Xr.generateId(e.provider),o=Xr.createElement("div",{id:r});e.media=Xr.replaceElement(o,e.media);var a=function(e){return"https://img.youtube.com/vi/"+i+"/"+e+"default.jpg"};Xr.loadImage(a("maxres"),121).catch(function(){return Xr.loadImage(a("sd"),121)}).catch(function(){return Xr.loadImage(a("hq"))}).then(function(t){return po.setPoster.call(e,t.src)}).then(function(t){t.includes("maxres")||(e.elements.poster.style.backgroundSize="cover")}),e.embed=new window.YT.Player(r,{videoId:i,playerVars:{autoplay:e.config.autoplay?1:0,controls:e.supported.ui?0:1,rel:0,showinfo:0,iv_load_policy:3,modestbranding:1,disablekb:1,playsinline:1,widget_referrer:window?window.location.href:null,cc_load_policy:e.captions.active?1:0,cc_lang_pref:e.config.captions.language},events:{onError:function(t){if(!Xr.is.object(e.media.error)){var n={code:t.data};switch(t.data){case 2:n.message="The request contains an invalid parameter value. For example, this error occurs if you specify a video ID that does not have 11 characters, or if the video ID contains invalid characters, such as exclamation points or asterisks.";break;case 5:n.message="The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.";break;case 100:n.message="The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.";break;case 101:case 150:n.message="The owner of the requested video does not allow it to be played in embedded players.";break;default:n.message="An unknown error occured"}e.media.error=n,Xr.dispatchEvent.call(e,e.media,"error")}},onPlaybackQualityChange:function(){Xr.dispatchEvent.call(e,e.media,"qualitychange",!1,{quality:e.media.quality})},onPlaybackRateChange:function(t){var n=t.target;e.media.playbackRate=n.getPlaybackRate(),Xr.dispatchEvent.call(e,e.media,"ratechange")},onReady:function(t){var n=t.target;ko.getTitle.call(e,i),e.media.play=function(){wo.call(e,!0),n.playVideo()},e.media.pause=function(){wo.call(e,!1),n.pauseVideo()},e.media.stop=function(){n.stopVideo()},e.media.duration=n.getDuration(),e.media.paused=!0,e.media.currentTime=0,Object.defineProperty(e.media,"currentTime",{get:function(){return Number(n.getCurrentTime())},set:function(t){e.paused&&e.embed.mute(),e.media.seeking=!0,Xr.dispatchEvent.call(e,e.media,"seeking"),n.seekTo(t)}}),Object.defineProperty(e.media,"playbackRate",{get:function(){return n.getPlaybackRate()},set:function(e){n.setPlaybackRate(e)}}),Object.defineProperty(e.media,"quality",{get:function(){return bo(n.getPlaybackQuality())},set:function(t){var i=t;n.setPlaybackQuality(bo(i)),Xr.dispatchEvent.call(e,e.media,"qualityrequested",!1,{quality:i})}});var r=e.config.volume;Object.defineProperty(e.media,"volume",{get:function(){return r},set:function(t){r=t,n.setVolume(100*r),Xr.dispatchEvent.call(e,e.media,"volumechange")}});var o=e.config.muted;Object.defineProperty(e.media,"muted",{get:function(){return o},set:function(t){var i=Xr.is.boolean(t)?t:o;o=i,n[i?"mute":"unMute"](),Xr.dispatchEvent.call(e,e.media,"volumechange")}}),Object.defineProperty(e.media,"currentSrc",{get:function(){return n.getVideoUrl()}}),Object.defineProperty(e.media,"ended",{get:function(){return e.currentTime===e.duration}}),e.options.speed=n.getAvailablePlaybackRates(),e.supported.ui&&e.media.setAttribute("tabindex",-1),Xr.dispatchEvent.call(e,e.media,"timeupdate"),Xr.dispatchEvent.call(e,e.media,"durationchange"),clearInterval(e.timers.buffering),e.timers.buffering=setInterval(function(){e.media.buffered=n.getVideoLoadedFraction(),(null===e.media.lastBuffered||e.media.lastBuffered<e.media.buffered)&&Xr.dispatchEvent.call(e,e.media,"progress"),e.media.lastBuffered=e.media.buffered,1===e.media.buffered&&(clearInterval(e.timers.buffering),Xr.dispatchEvent.call(e,e.media,"canplaythrough"))},200),setTimeout(function(){return po.build.call(e)},50)},onStateChange:function(t){var n,i=t.target;switch(clearInterval(e.timers.playing),e.media.seeking&&[1,2].includes(t.data)&&(e.media.seeking=!1,Xr.dispatchEvent.call(e,e.media,"seeked")),t.data){case-1:Xr.dispatchEvent.call(e,e.media,"timeupdate"),e.media.buffered=i.getVideoLoadedFraction(),Xr.dispatchEvent.call(e,e.media,"progress");break;case 0:wo.call(e,!1),e.media.loop?(i.stopVideo(),i.playVideo()):Xr.dispatchEvent.call(e,e.media,"ended");break;case 1:e.media.paused&&!e.embed.hasPlayed?e.media.pause():(wo.call(e,!0),Xr.dispatchEvent.call(e,e.media,"playing"),e.timers.playing=setInterval(function(){Xr.dispatchEvent.call(e,e.media,"timeupdate")},50),e.media.duration!==i.getDuration()&&(e.media.duration=i.getDuration(),Xr.dispatchEvent.call(e,e.media,"durationchange")),io.setQualityMenu.call(e,(n=i.getAvailableQualityLevels(),Xr.is.empty(n)?n:Xr.dedupe(n.map(function(e){return bo(e)})))));break;case 2:e.muted||e.embed.unMute(),wo.call(e,!1)}Xr.dispatchEvent.call(e,e.elements.container,"statechange",!1,{code:t.data})}}})}}},Eo={setup:function(){if(this.media)if(Xr.toggleClass(this.elements.container,this.config.classNames.type.replace("{0}",this.type),!0),Xr.toggleClass(this.elements.container,this.config.classNames.provider.replace("{0}",this.provider),!0),this.isEmbed&&Xr.toggleClass(this.elements.container,this.config.classNames.type.replace("{0}","video"),!0),this.isVideo&&(this.elements.wrapper=Xr.createElement("div",{class:this.config.classNames.video}),Xr.wrap(this.media,this.elements.wrapper),this.elements.poster=Xr.createElement("div",{class:this.config.classNames.poster}),this.elements.wrapper.appendChild(this.elements.poster)),this.isEmbed)switch(this.provider){case"youtube":ko.setup.call(this);break;case"vimeo":vo.setup.call(this)}else this.isHTML5&&eo.extend.call(this);else this.debug.warn("No media element found!")}},To=function(){function e(t){var n=this;zr(this,e),this.player=t,this.publisherId=t.config.ads.publisherId,this.playing=!1,this.initialized=!1,this.elements={container:null,displayContainer:null},this.manager=null,this.loader=null,this.cuePoints=null,this.events={},this.safetyTimer=null,this.countdownTimer=null,this.managerPromise=new Promise(function(e,t){n.on("loaded",e),n.on("error",t)}),this.load()}return Gr(e,[{key:"load",value:function(){var e=this;this.enabled&&(Xr.is.object(window.google)&&Xr.is.object(window.google.ima)?this.ready():Xr.loadScript(this.player.config.urls.googleIMA.sdk).then(function(){e.ready()}).catch(function(){e.trigger("error",new Error("Google IMA SDK failed to load"))}))}},{key:"ready",value:function(){var e=this;this.startSafetyTimer(12e3,"ready()"),this.managerPromise.then(function(){e.clearSafetyTimer("onAdsManagerLoaded()")}),this.listeners(),this.setupIMA()}},{key:"setupIMA",value:function(){this.elements.container=Xr.createElement("div",{class:this.player.config.classNames.ads}),this.player.elements.container.appendChild(this.elements.container),google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED),google.ima.settings.setLocale(this.player.config.ads.language),this.elements.displayContainer=new google.ima.AdDisplayContainer(this.elements.container),this.requestAds()}},{key:"requestAds",value:function(){var e=this,t=this.player.elements.container;try{this.loader=new google.ima.AdsLoader(this.elements.displayContainer),this.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED,function(t){return e.onAdsManagerLoaded(t)},!1),this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR,function(t){return e.onAdError(t)},!1);var n=new google.ima.AdsRequest;n.adTagUrl=this.tagUrl,n.linearAdSlotWidth=t.offsetWidth,n.linearAdSlotHeight=t.offsetHeight,n.nonLinearAdSlotWidth=t.offsetWidth,n.nonLinearAdSlotHeight=t.offsetHeight,n.forceNonLinearFullSlot=!1,n.setAdWillPlayMuted(!this.player.muted),this.loader.requestAds(n)}catch(e){this.onAdError(e)}}},{key:"pollCountdown",value:function(){var e=this;if(!(arguments.length>0&&void 0!==arguments[0]&&arguments[0]))return clearInterval(this.countdownTimer),void this.elements.container.removeAttribute("data-badge-text");this.countdownTimer=setInterval(function(){var t=Xr.formatTime(Math.max(e.manager.getRemainingTime(),0)),n=to("advertisement",e.player.config)+" - "+t;e.elements.container.setAttribute("data-badge-text",n)},100)}},{key:"onAdsManagerLoaded",value:function(e){var t=this,n=new google.ima.AdsRenderingSettings;n.restoreCustomPlaybackStateOnAdBreakComplete=!0,n.enablePreloading=!0,this.manager=e.getAdsManager(this.player,n),this.cuePoints=this.manager.getCuePoints(),Xr.is.empty(this.cuePoints)||this.cuePoints.forEach(function(e){if(0!==e&&-1!==e&&e<t.player.duration){var n=t.player.elements.progress;if(Xr.is.element(n)){var i=100/t.player.duration*e,r=Xr.createElement("span",{class:t.player.config.classNames.cues});r.style.left=i.toString()+"%",n.appendChild(r)}}}),this.manager.setVolume(this.player.volume),this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR,function(e){return t.onAdError(e)}),Object.keys(google.ima.AdEvent.Type).forEach(function(e){t.manager.addEventListener(google.ima.AdEvent.Type[e],function(e){return t.onAdEvent(e)})}),this.trigger("loaded")}},{key:"onAdEvent",value:function(e){var t=this,n=this.player.elements.container,i=e.getAd(),r=function(e){var n="ads"+e.replace(/_/g,"").toLowerCase();Xr.dispatchEvent.call(t.player,t.player.media,n)};switch(e.type){case google.ima.AdEvent.Type.LOADED:this.trigger("loaded"),r(e.type),this.pollCountdown(!0),i.isLinear()||(i.width=n.offsetWidth,i.height=n.offsetHeight);break;case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:r(e.type),this.loadAds();break;case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:r(e.type),this.pauseContent();break;case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:r(e.type),this.pollCountdown(),this.resumeContent();break;case google.ima.AdEvent.Type.STARTED:case google.ima.AdEvent.Type.MIDPOINT:case google.ima.AdEvent.Type.COMPLETE:case google.ima.AdEvent.Type.IMPRESSION:case google.ima.AdEvent.Type.CLICK:r(e.type)}}},{key:"onAdError",value:function(e){this.cancel(),this.player.debug.warn("Ads error",e)}},{key:"listeners",value:function(){var e=this,t=this.player.elements.container,n=void 0;this.player.on("ended",function(){e.loader.contentComplete()}),this.player.on("seeking",function(){return n=e.player.currentTime}),this.player.on("seeked",function(){var t=e.player.currentTime;Xr.is.empty(e.cuePoints)||e.cuePoints.forEach(function(i,r){n<i&&i<t&&(e.manager.discardAdBreak(),e.cuePoints.splice(r,1))})}),window.addEventListener("resize",function(){e.manager&&e.manager.resize(t.offsetWidth,t.offsetHeight,google.ima.ViewMode.NORMAL)})}},{key:"play",value:function(){var e=this,t=this.player.elements.container;this.managerPromise||this.resumeContent(),this.managerPromise.then(function(){e.elements.displayContainer.initialize();try{e.initialized||(e.manager.init(t.offsetWidth,t.offsetHeight,google.ima.ViewMode.NORMAL),e.manager.start()),e.initialized=!0}catch(t){e.onAdError(t)}}).catch(function(){})}},{key:"resumeContent",value:function(){this.elements.container.style.zIndex="",this.playing=!1,this.player.currentTime<this.player.duration&&this.player.play()}},{key:"pauseContent",value:function(){this.elements.container.style.zIndex=3,this.playing=!0,this.player.pause()}},{key:"cancel",value:function(){this.initialized&&this.resumeContent(),this.trigger("error"),this.loadAds()}},{key:"loadAds",value:function(){var e=this;this.managerPromise.then(function(){e.manager&&e.manager.destroy(),e.managerPromise=new Promise(function(t){e.on("loaded",t),e.player.debug.log(e.manager)}),e.requestAds()}).catch(function(){})}},{key:"trigger",value:function(e){for(var t=this,n=arguments.length,i=Array(n>1?n-1:0),r=1;r<n;r++)i[r-1]=arguments[r];var o=this.events[e];Xr.is.array(o)&&o.forEach(function(e){Xr.is.function(e)&&e.apply(t,i)})}},{key:"on",value:function(e,t){return Xr.is.array(this.events[e])||(this.events[e]=[]),this.events[e].push(t),this}},{key:"startSafetyTimer",value:function(e,t){var n=this;this.player.debug.log("Safety timer invoked from: "+t),this.safetyTimer=setTimeout(function(){n.cancel(),n.clearSafetyTimer("startSafetyTimer()")},e)}},{key:"clearSafetyTimer",value:function(e){Xr.is.nullOrUndefined(this.safetyTimer)||(this.player.debug.log("Safety timer cleared from: "+e),clearTimeout(this.safetyTimer),this.safetyTimer=null)}},{key:"enabled",get:function(){return this.player.isVideo&&this.player.config.ads.enabled&&!Xr.is.empty(this.publisherId)}},{key:"tagUrl",get:function(){var e={AV_PUBLISHERID:"58c25bb0073ef448b1087ad6",AV_CHANNELID:"5a0458dc28a06145e4519d21",AV_URL:location.hostname,cb:Date.now(),AV_WIDTH:640,AV_HEIGHT:480,AV_CDIM2:this.publisherId};return"https://go.aniview.com/api/adserver6/vast/?"+Xr.buildUrlParams(e)}}]),e}(),So={insertElements:function(e,t){var n=this;Xr.is.string(t)?Xr.insertElement(e,this.media,{src:t}):Xr.is.array(t)&&t.forEach(function(t){Xr.insertElement(e,n.media,t)})},change:function(e){var t=this;Xr.is.object(e)&&"sources"in e&&e.sources.length?(eo.cancelRequests.call(this),this.destroy.call(this,function(){switch(t.options.quality=[],Xr.removeElement(t.media),t.media=null,Xr.is.element(t.elements.container)&&t.elements.container.removeAttribute("class"),t.type=e.type,t.provider=Xr.is.empty(e.sources[0].provider)?Jr.html5:e.sources[0].provider,t.supported=Zr.check(t.type,t.provider,t.config.playsinline),t.provider+":"+t.type){case"html5:video":t.media=Xr.createElement("video");break;case"html5:audio":t.media=Xr.createElement("audio");break;case"youtube:video":case"vimeo:video":t.media=Xr.createElement("div",{src:e.sources[0].src})}t.elements.container.appendChild(t.media),Xr.is.boolean(e.autoplay)&&(t.config.autoplay=e.autoplay),t.isHTML5&&(t.config.crossorigin&&t.media.setAttribute("crossorigin",""),t.config.autoplay&&t.media.setAttribute("autoplay",""),Xr.is.empty(e.poster)||(t.poster=e.poster),t.config.loop.active&&t.media.setAttribute("loop",""),t.config.muted&&t.media.setAttribute("muted",""),t.config.playsinline&&t.media.setAttribute("playsinline","")),po.addStyleHook.call(t),t.isHTML5&&So.insertElements.call(t,"source",e.sources),t.config.title=e.title,Eo.setup.call(t),t.isHTML5&&("tracks"in e&&So.insertElements.call(t,"track",e.tracks),t.media.load()),(t.isHTML5||t.isEmbed&&!t.supported.ui)&&po.build.call(t),t.fullscreen.update()},!0)):this.debug.warn("Invalid source format")}},Ao=function(){function e(t,n){var i=this;if(zr(this,e),this.timers={},this.ready=!1,this.loading=!1,this.failed=!1,this.touch=Zr.touch,this.media=t,Xr.is.string(this.media)&&(this.media=document.querySelectorAll(this.media)),(window.jQuery&&this.media instanceof jQuery||Xr.is.nodeList(this.media)||Xr.is.array(this.media))&&(this.media=this.media[0]),this.config=Xr.extend({},so,e.defaults,n||{},function(){try{return JSON.parse(i.media.getAttribute("data-plyr-config"))}catch(e){return{}}}()),this.elements={container:null,buttons:{},display:{},progress:{},inputs:{},settings:{menu:null,panes:{},tabs:{}},captions:null},this.captions={active:null,currentTrack:-1,meta:new WeakMap},this.fullscreen={active:!1},this.options={speed:[],quality:[]},this.debug=new ao(this.config.debug),this.debug.log("Config",this.config),this.debug.log("Support",Zr),!Xr.is.nullOrUndefined(this.media)&&Xr.is.element(this.media))if(this.media.plyr)this.debug.warn("Target already setup");else if(this.config.enabled)if(Zr.check().api){var r=this.media.cloneNode(!0);r.autoplay=!1,this.elements.original=r;var o=this.media.tagName.toLowerCase(),a=null,s=null,l=null;switch(o){case"div":if(a=this.media.querySelector("iframe"),Xr.is.element(a)){if(s=a.getAttribute("src"),this.provider=Xr.getProviderByUrl(s),this.elements.container=this.media,this.media=a,this.elements.container.className="",l=Xr.getUrlParams(s),!Xr.is.empty(l)){var c=["1","true"];c.includes(l.autoplay)&&(this.config.autoplay=!0),c.includes(l.loop)&&(this.config.loop.active=!0),this.isYouTube?this.config.playsinline=c.includes(l.playsinline):this.config.playsinline=!0}}else this.provider=this.media.getAttribute(this.config.attributes.embed.provider),this.media.removeAttribute(this.config.attributes.embed.provider);if(Xr.is.empty(this.provider)||!Object.keys(Jr).includes(this.provider))return void this.debug.error("Setup failed: Invalid provider");this.type=$r.video;break;case"video":case"audio":this.type=o,this.provider=Jr.html5,this.media.hasAttribute("crossorigin")&&(this.config.crossorigin=!0),this.media.hasAttribute("autoplay")&&(this.config.autoplay=!0),this.media.hasAttribute("playsinline")&&(this.config.playsinline=!0),this.media.hasAttribute("muted")&&(this.config.muted=!0),this.media.hasAttribute("loop")&&(this.config.loop.active=!0);break;default:return void this.debug.error("Setup failed: unsupported type")}this.supported=Zr.check(this.type,this.provider,this.config.playsinline),this.supported.api?(this.listeners=new mo(this),this.storage=new Qr(this),this.media.plyr=this,Xr.is.element(this.elements.container)||(this.elements.container=Xr.createElement("div"),Xr.wrap(this.media,this.elements.container)),po.addStyleHook.call(this),Eo.setup.call(this),this.config.debug&&Xr.on(this.elements.container,this.config.events.join(" "),function(e){i.debug.log("event: "+e.type)}),(this.isHTML5||this.isEmbed&&!this.supported.ui)&&po.build.call(this),this.listeners.container(),this.listeners.global(),this.fullscreen=new fo(this),this.ads=new To(this),this.config.autoplay&&this.play()):this.debug.error("Setup failed: no support")}else this.debug.error("Setup failed: no support");else this.debug.error("Setup failed: disabled by config");else this.debug.error("Setup failed: no suitable element passed")}return Gr(e,[{key:"play",value:function(){return Xr.is.function(this.media.play)?this.media.play():null}},{key:"pause",value:function(){this.playing&&Xr.is.function(this.media.pause)&&this.media.pause()}},{key:"togglePlay",value:function(e){(Xr.is.boolean(e)?e:!this.playing)?this.play():this.pause()}},{key:"stop",value:function(){this.isHTML5?(this.pause(),this.restart()):Xr.is.function(this.media.stop)&&this.media.stop()}},{key:"restart",value:function(){this.currentTime=0}},{key:"rewind",value:function(e){this.currentTime=this.currentTime-(Xr.is.number(e)?e:this.config.seekTime)}},{key:"forward",value:function(e){this.currentTime=this.currentTime+(Xr.is.number(e)?e:this.config.seekTime)}},{key:"increaseVolume",value:function(e){var t=this.media.muted?0:this.volume;this.volume=t+(Xr.is.number(e)?e:1)}},{key:"decreaseVolume",value:function(e){var t=this.media.muted?0:this.volume;this.volume=t-(Xr.is.number(e)?e:1)}},{key:"toggleCaptions",value:function(e){if(this.supported.ui){var t=Xr.is.boolean(e)?e:!this.elements.container.classList.contains(this.config.classNames.captions.active);this.elements.buttons.captions.pressed=t,Xr.toggleClass(this.elements.container,this.config.classNames.captions.active,t),t!==this.captions.active&&(this.captions.active=t,Xr.dispatchEvent.call(this,this.media,this.captions.active?"captionsenabled":"captionsdisabled"))}}},{key:"airplay",value:function(){Zr.airplay&&this.media.webkitShowPlaybackTargetPicker()}},{key:"toggleControls",value:function(e){if(this.supported.ui&&!this.isAudio){var t=Xr.hasClass(this.elements.container,this.config.classNames.hideControls),n=void 0===e?void 0:!e,i=Xr.toggleClass(this.elements.container,this.config.classNames.hideControls,n);if(i&&this.config.controls.includes("settings")&&!Xr.is.empty(this.config.settings)&&io.toggleMenu.call(this,!1),i!==t){var r=i?"controlshidden":"controlsshown";Xr.dispatchEvent.call(this,this.media,r)}return!i}return!1}},{key:"on",value:function(e,t){Xr.on(this.elements.container,e,t)}},{key:"off",value:function(e,t){Xr.off(this.elements.container,e,t)}},{key:"destroy",value:function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(this.ready){var i=function(){document.body.style.overflow="",t.embed=null,n?(Object.keys(t.elements).length&&(Xr.removeElement(t.elements.buttons.play),Xr.removeElement(t.elements.captions),Xr.removeElement(t.elements.controls),Xr.removeElement(t.elements.wrapper),t.elements.buttons.play=null,t.elements.captions=null,t.elements.controls=null,t.elements.wrapper=null),Xr.is.function(e)&&e()):(t.listeners.clear(),Xr.replaceElement(t.elements.original,t.elements.container),Xr.dispatchEvent.call(t,t.elements.original,"destroyed",!0),Xr.is.function(e)&&e.call(t.elements.original),t.ready=!1,setTimeout(function(){t.elements=null,t.media=null},200))};switch(this.stop(),this.provider+":"+this.type){case"html5:video":case"html5:audio":clearTimeout(this.timers.loading),po.toggleNativeControls.call(this,!0),i();break;case"youtube:video":clearInterval(this.timers.buffering),clearInterval(this.timers.playing),null!==this.embed&&Xr.is.function(this.embed.destroy)&&this.embed.destroy(),i();break;case"vimeo:video":null!==this.embed&&this.embed.unload().then(i),setTimeout(i,200)}}}},{key:"supports",value:function(e){return Zr.mime.call(this,e)}},{key:"isHTML5",get:function(){return Boolean(this.provider===Jr.html5)}},{key:"isEmbed",get:function(){return Boolean(this.isYouTube||this.isVimeo)}},{key:"isYouTube",get:function(){return Boolean(this.provider===Jr.youtube)}},{key:"isVimeo",get:function(){return Boolean(this.provider===Jr.vimeo)}},{key:"isVideo",get:function(){return Boolean(this.type===$r.video)}},{key:"isAudio",get:function(){return Boolean(this.type===$r.audio)}},{key:"playing",get:function(){return Boolean(this.ready&&!this.paused&&!this.ended)}},{key:"paused",get:function(){return Boolean(this.media.paused)}},{key:"stopped",get:function(){return Boolean(this.paused&&0===this.currentTime)}},{key:"ended",get:function(){return Boolean(this.media.ended)}},{key:"currentTime",set:function(e){if(this.duration){var t=Xr.is.number(e)&&e>0;this.media.currentTime=t?Math.min(e,this.duration):0,this.debug.log("Seeking to "+this.currentTime+" seconds")}},get:function(){return Number(this.media.currentTime)}},{key:"buffered",get:function(){var e=this.media.buffered;return Xr.is.number(e)?e:e&&e.length&&this.duration>0?e.end(0)/this.duration:0}},{key:"seeking",get:function(){return Boolean(this.media.seeking)}},{key:"duration",get:function(){var e=parseFloat(this.config.duration),t=(this.media||{}).duration||0;return e||t}},{key:"volume",set:function(e){var t=e;Xr.is.string(t)&&(t=Number(t)),Xr.is.number(t)||(t=this.storage.get("volume")),Xr.is.number(t)||(t=this.config.volume),t>1&&(t=1),t<0&&(t=0),this.config.volume=t,this.media.volume=t,!Xr.is.empty(e)&&this.muted&&t>0&&(this.muted=!1)},get:function(){return Number(this.media.volume)}},{key:"muted",set:function(e){var t=e;Xr.is.boolean(t)||(t=this.storage.get("muted")),Xr.is.boolean(t)||(t=this.config.muted),this.config.muted=t,this.media.muted=t},get:function(){return Boolean(this.media.muted)}},{key:"hasAudio",get:function(){return!this.isHTML5||(!!this.isAudio||(Boolean(this.media.mozHasAudio)||Boolean(this.media.webkitAudioDecodedByteCount)||Boolean(this.media.audioTracks&&this.media.audioTracks.length)))}},{key:"speed",set:function(e){var t=null;Xr.is.number(e)&&(t=e),Xr.is.number(t)||(t=this.storage.get("speed")),Xr.is.number(t)||(t=this.config.speed.selected),t<.1&&(t=.1),t>2&&(t=2),this.config.speed.options.includes(t)?(this.config.speed.selected=t,this.media.playbackRate=t):this.debug.warn("Unsupported speed ("+t+")")},get:function(){return Number(this.media.playbackRate)}},{key:"quality",set:function(e){var t=null;if(Xr.is.empty(e)||(t=Number(e)),Xr.is.number(t)||(t=this.storage.get("quality")),Xr.is.number(t)||(t=this.config.quality.selected),Xr.is.number(t)||(t=this.config.quality.default),this.options.quality.length){if(!this.options.quality.includes(t)){var n=Xr.closest(this.options.quality,t);this.debug.warn("Unsupported quality option: "+t+", using "+n+" instead"),t=n}this.config.quality.selected=t,this.media.quality=t}},get:function(){return this.media.quality}},{key:"loop",set:function(e){var t=Xr.is.boolean(e)?e:this.config.loop.active;this.config.loop.active=t,this.media.loop=t},get:function(){return Boolean(this.media.loop)}},{key:"source",set:function(e){So.change.call(this,e)},get:function(){return this.media.currentSrc}},{key:"poster",set:function(e){this.isVideo?po.setPoster.call(this,e):this.debug.warn("Poster can only be set for video")},get:function(){return this.isVideo?this.media.getAttribute("poster"):null}},{key:"autoplay",set:function(e){var t=Xr.is.boolean(e)?e:this.config.autoplay;this.config.autoplay=t},get:function(){return Boolean(this.config.autoplay)}},{key:"currentTrack",set:function(e){ro.set.call(this,e)},get:function(){var e=this.captions,t=e.active,n=e.currentTrack;return t?n:-1}},{key:"language",set:function(e){ro.setLanguage.call(this,e)},get:function(){return(ro.getCurrentTrack.call(this)||{}).language}},{key:"pip",set:function(e){var t="picture-in-picture",n="inline";if(Zr.pip){var i=Xr.is.boolean(e)?e:this.pip===n;this.media.webkitSetPresentationMode(i?t:n)}},get:function(){return Zr.pip?this.media.webkitPresentationMode:null}}],[{key:"supported",value:function(e,t,n){return Zr.check(e,t,n)}},{key:"loadSprite",value:function(e,t){return Xr.loadSprite(e,t)}},{key:"setup",value:function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=null;return Xr.is.string(t)?i=Array.from(document.querySelectorAll(t)):Xr.is.nodeList(t)?i=Array.from(t):Xr.is.array(t)&&(i=t.filter(Xr.is.element)),Xr.is.empty(i)?null:i.map(function(t){return new e(t,n)})}}]),e}();return Ao.defaults=Xr.cloneDeep(so),Ao});
+"object"==typeof navigator&&function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define("Plyr",t):e.Plyr=t()}(this,function(){"use strict";var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function t(e,t){return e(t={exports:{}},t.exports),t.exports}var n=t(function(e){var t=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=t)}),i=t(function(e){var t=e.exports={version:"2.5.3"};"number"==typeof __e&&(__e=t)}),r=(i.version,function(e){return"object"==typeof e?null!==e:"function"==typeof e}),o=function(e){if(!r(e))throw TypeError(e+" is not an object!");return e},a=function(e){try{return!!e()}catch(e){return!0}},s=!a(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a}),l=n.document,c=r(l)&&r(l.createElement),u=function(e){return c?l.createElement(e):{}},f=!s&&!a(function(){return 7!=Object.defineProperty(u("div"),"a",{get:function(){return 7}}).a}),h=function(e,t){if(!r(e))return e;var n,i;if(t&&"function"==typeof(n=e.toString)&&!r(i=n.call(e)))return i;if("function"==typeof(n=e.valueOf)&&!r(i=n.call(e)))return i;if(!t&&"function"==typeof(n=e.toString)&&!r(i=n.call(e)))return i;throw TypeError("Can't convert object to primitive value")},d=Object.defineProperty,p={f:s?Object.defineProperty:function(e,t,n){if(o(e),t=h(t,!0),o(n),f)try{return d(e,t,n)}catch(e){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(e[t]=n.value),e}},g=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}},m=s?function(e,t,n){return p.f(e,t,g(1,n))}:function(e,t,n){return e[t]=n,e},y={}.hasOwnProperty,v=function(e,t){return y.call(e,t)},b=0,w=Math.random(),k=function(e){return"Symbol(".concat(void 0===e?"":e,")_",(++b+w).toString(36))},T=t(function(e){var t=k("src"),r=Function.toString,o=(""+r).split("toString");i.inspectSource=function(e){return r.call(e)},(e.exports=function(e,i,r,a){var s="function"==typeof r;s&&(v(r,"name")||m(r,"name",i)),e[i]!==r&&(s&&(v(r,t)||m(r,t,e[i]?""+e[i]:o.join(String(i)))),e===n?e[i]=r:a?e[i]?e[i]=r:m(e,i,r):(delete e[i],m(e,i,r)))})(Function.prototype,"toString",function(){return"function"==typeof this&&this[t]||r.call(this)})}),S=function(e){if("function"!=typeof e)throw TypeError(e+" is not a function!");return e},E=function(e,t,n){if(S(e),void 0===t)return e;switch(n){case 1:return function(n){return e.call(t,n)};case 2:return function(n,i){return e.call(t,n,i)};case 3:return function(n,i,r){return e.call(t,n,i,r)}}return function(){return e.apply(t,arguments)}},_=function(e,t,r){var o,a,s,l,c=e&_.F,u=e&_.G,f=e&_.S,h=e&_.P,d=e&_.B,p=u?n:f?n[t]||(n[t]={}):(n[t]||{}).prototype,g=u?i:i[t]||(i[t]={}),y=g.prototype||(g.prototype={});for(o in u&&(r=t),r)s=((a=!c&&p&&void 0!==p[o])?p:r)[o],l=d&&a?E(s,n):h&&"function"==typeof s?E(Function.call,s):s,p&&T(p,o,s,e&_.U),g[o]!=s&&m(g,o,l),h&&y[o]!=s&&(y[o]=s)};n.core=i,_.F=1,_.G=2,_.S=4,_.P=8,_.B=16,_.W=32,_.U=64,_.R=128;for(var A,P=_,M=k("typed_array"),L=k("view"),x=!(!n.ArrayBuffer||!n.DataView),C=x,O=0,N="Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array".split(",");O<9;)(A=n[N[O++]])?(m(A.prototype,M,!0),m(A.prototype,L,!0)):C=!1;var j={ABV:x,CONSTR:C,TYPED:M,VIEW:L},I=function(e,t,n){for(var i in t)T(e,i,t[i],n);return e},F=function(e,t,n,i){if(!(e instanceof t)||void 0!==i&&i in e)throw TypeError(n+": incorrect invocation!");return e},R=Math.ceil,q=Math.floor,V=function(e){return isNaN(e=+e)?0:(e>0?q:R)(e)},B=Math.min,D=function(e){return e>0?B(V(e),9007199254740991):0},U=function(e){if(void 0===e)return 0;var t=V(e),n=D(t);if(t!==n)throw RangeError("Wrong length!");return n},H={}.toString,W=function(e){return H.call(e).slice(8,-1)},z=Object("z").propertyIsEnumerable(0)?Object:function(e){return"String"==W(e)?e.split(""):Object(e)},G=function(e){if(null==e)throw TypeError("Can't call method on "+e);return e},Y=function(e){return z(G(e))},K=Math.max,Q=Math.min,J=function(e,t){return(e=V(e))<0?K(e+t,0):Q(e,t)},$=function(e){return function(t,n,i){var r,o=Y(t),a=D(o.length),s=J(i,a);if(e&&n!=n){for(;a>s;)if((r=o[s++])!=r)return!0}else for(;a>s;s++)if((e||s in o)&&o[s]===n)return e||s||0;return!e&&-1}},X=n["__core-js_shared__"]||(n["__core-js_shared__"]={}),Z=function(e){return X[e]||(X[e]={})},ee=Z("keys"),te=function(e){return ee[e]||(ee[e]=k(e))},ne=$(!1),ie=te("IE_PROTO"),re=function(e,t){var n,i=Y(e),r=0,o=[];for(n in i)n!=ie&&v(i,n)&&o.push(n);for(;t.length>r;)v(i,n=t[r++])&&(~ne(o,n)||o.push(n));return o},oe="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(","),ae=oe.concat("length","prototype"),se={f:Object.getOwnPropertyNames||function(e){return re(e,ae)}},le=function(e){return Object(G(e))},ce=function(e){for(var t=le(this),n=D(t.length),i=arguments.length,r=J(i>1?arguments[1]:void 0,n),o=i>2?arguments[2]:void 0,a=void 0===o?n:J(o,n);a>r;)t[r++]=e;return t},ue=t(function(e){var t=Z("wks"),i=n.Symbol,r="function"==typeof i;(e.exports=function(e){return t[e]||(t[e]=r&&i[e]||(r?i:k)("Symbol."+e))}).store=t}),fe=p.f,he=ue("toStringTag"),de=function(e,t,n){e&&!v(e=n?e:e.prototype,he)&&fe(e,he,{configurable:!0,value:t})},pe=t(function(e,t){var i=se.f,r=p.f,o="prototype",l="Wrong index!",c=n.ArrayBuffer,u=n.DataView,f=n.Math,h=n.RangeError,d=n.Infinity,g=c,y=f.abs,v=f.pow,b=f.floor,w=f.log,k=f.LN2,T=s?"_b":"buffer",S=s?"_l":"byteLength",E=s?"_o":"byteOffset";function _(e,t,n){var i,r,o,a=new Array(n),s=8*n-t-1,l=(1<<s)-1,c=l>>1,u=23===t?v(2,-24)-v(2,-77):0,f=0,h=e<0||0===e&&1/e<0?1:0;for((e=y(e))!=e||e===d?(r=e!=e?1:0,i=l):(i=b(w(e)/k),e*(o=v(2,-i))<1&&(i--,o*=2),(e+=i+c>=1?u/o:u*v(2,1-c))*o>=2&&(i++,o/=2),i+c>=l?(r=0,i=l):i+c>=1?(r=(e*o-1)*v(2,t),i+=c):(r=e*v(2,c-1)*v(2,t),i=0));t>=8;a[f++]=255&r,r/=256,t-=8);for(i=i<<t|r,s+=t;s>0;a[f++]=255&i,i/=256,s-=8);return a[--f]|=128*h,a}function A(e,t,n){var i,r=8*n-t-1,o=(1<<r)-1,a=o>>1,s=r-7,l=n-1,c=e[l--],u=127&c;for(c>>=7;s>0;u=256*u+e[l],l--,s-=8);for(i=u&(1<<-s)-1,u>>=-s,s+=t;s>0;i=256*i+e[l],l--,s-=8);if(0===u)u=1-a;else{if(u===o)return i?NaN:c?-d:d;i+=v(2,t),u-=a}return(c?-1:1)*i*v(2,u-t)}function P(e){return e[3]<<24|e[2]<<16|e[1]<<8|e[0]}function M(e){return[255&e]}function L(e){return[255&e,e>>8&255]}function x(e){return[255&e,e>>8&255,e>>16&255,e>>24&255]}function C(e){return _(e,52,8)}function O(e){return _(e,23,4)}function N(e,t,n){r(e[o],t,{get:function(){return this[n]}})}function R(e,t,n,i){var r=U(+n);if(r+t>e[S])throw h(l);var o=e[T]._b,a=r+e[E],s=o.slice(a,a+t);return i?s:s.reverse()}function q(e,t,n,i,r,o){var a=U(+n);if(a+t>e[S])throw h(l);for(var s=e[T]._b,c=a+e[E],u=i(+r),f=0;f<t;f++)s[c+f]=u[o?f:t-f-1]}if(j.ABV){if(!a(function(){c(1)})||!a(function(){new c(-1)})||a(function(){return new c,new c(1.5),new c(NaN),"ArrayBuffer"!=c.name})){for(var B,H=(c=function(e){return F(this,c),new g(U(e))})[o]=g[o],W=i(g),z=0;W.length>z;)(B=W[z++])in c||m(c,B,g[B]);H.constructor=c}var G=new u(new c(2)),Y=u[o].setInt8;G.setInt8(0,2147483648),G.setInt8(1,2147483649),!G.getInt8(0)&&G.getInt8(1)||I(u[o],{setInt8:function(e,t){Y.call(this,e,t<<24>>24)},setUint8:function(e,t){Y.call(this,e,t<<24>>24)}},!0)}else c=function(e){F(this,c,"ArrayBuffer");var t=U(e);this._b=ce.call(new Array(t),0),this[S]=t},u=function(e,t,n){F(this,u,"DataView"),F(e,c,"DataView");var i=e[S],r=V(t);if(r<0||r>i)throw h("Wrong offset!");if(r+(n=void 0===n?i-r:D(n))>i)throw h("Wrong length!");this[T]=e,this[E]=r,this[S]=n},s&&(N(c,"byteLength","_l"),N(u,"buffer","_b"),N(u,"byteLength","_l"),N(u,"byteOffset","_o")),I(u[o],{getInt8:function(e){return R(this,1,e)[0]<<24>>24},getUint8:function(e){return R(this,1,e)[0]},getInt16:function(e){var t=R(this,2,e,arguments[1]);return(t[1]<<8|t[0])<<16>>16},getUint16:function(e){var t=R(this,2,e,arguments[1]);return t[1]<<8|t[0]},getInt32:function(e){return P(R(this,4,e,arguments[1]))},getUint32:function(e){return P(R(this,4,e,arguments[1]))>>>0},getFloat32:function(e){return A(R(this,4,e,arguments[1]),23,4)},getFloat64:function(e){return A(R(this,8,e,arguments[1]),52,8)},setInt8:function(e,t){q(this,1,e,M,t)},setUint8:function(e,t){q(this,1,e,M,t)},setInt16:function(e,t){q(this,2,e,L,t,arguments[2])},setUint16:function(e,t){q(this,2,e,L,t,arguments[2])},setInt32:function(e,t){q(this,4,e,x,t,arguments[2])},setUint32:function(e,t){q(this,4,e,x,t,arguments[2])},setFloat32:function(e,t){q(this,4,e,O,t,arguments[2])},setFloat64:function(e,t){q(this,8,e,C,t,arguments[2])}});de(c,"ArrayBuffer"),de(u,"DataView"),m(u[o],j.VIEW,!0),t.ArrayBuffer=c,t.DataView=u}),ge=ue("species"),me=function(e,t){var n,i=o(e).constructor;return void 0===i||null==(n=o(i)[ge])?t:S(n)},ye=ue("species"),ve=function(e){var t=n[e];s&&t&&!t[ye]&&p.f(t,ye,{configurable:!0,get:function(){return this}})},be=n.ArrayBuffer,we=pe.ArrayBuffer,ke=pe.DataView,Te=j.ABV&&be.isView,Se=we.prototype.slice,Ee=j.VIEW;P(P.G+P.W+P.F*(be!==we),{ArrayBuffer:we}),P(P.S+P.F*!j.CONSTR,"ArrayBuffer",{isView:function(e){return Te&&Te(e)||r(e)&&Ee in e}}),P(P.P+P.U+P.F*a(function(){return!new we(2).slice(1,void 0).byteLength}),"ArrayBuffer",{slice:function(e,t){if(void 0!==Se&&void 0===t)return Se.call(o(this),e);for(var n=o(this).byteLength,i=J(e,n),r=J(void 0===t?n:t,n),a=new(me(this,we))(D(r-i)),s=new ke(this),l=new ke(a),c=0;i<r;)l.setUint8(c++,s.getUint8(i++));return a}}),ve("ArrayBuffer");var _e=ue("toStringTag"),Ae="Arguments"==W(function(){return arguments}()),Pe=function(e){var t,n,i;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(n=function(e,t){try{return e[t]}catch(e){}}(t=Object(e),_e))?n:Ae?W(t):"Object"==(i=W(t))&&"function"==typeof t.callee?"Arguments":i},Me={},Le=ue("iterator"),xe=Array.prototype,Ce=function(e){return void 0!==e&&(Me.Array===e||xe[Le]===e)},Oe=Object.keys||function(e){return re(e,oe)},Ne=s?Object.defineProperties:function(e,t){o(e);for(var n,i=Oe(t),r=i.length,a=0;r>a;)p.f(e,n=i[a++],t[n]);return e},je=n.document,Ie=je&&je.documentElement,Fe=te("IE_PROTO"),Re=function(){},qe=function(){var e,t=u("iframe"),n=oe.length;for(t.style.display="none",Ie.appendChild(t),t.src="javascript:",(e=t.contentWindow.document).open(),e.write("<script>document.F=Object<\/script>"),e.close(),qe=e.F;n--;)delete qe.prototype[oe[n]];return qe()},Ve=Object.create||function(e,t){var n;return null!==e?(Re.prototype=o(e),n=new Re,Re.prototype=null,n[Fe]=e):n=qe(),void 0===t?n:Ne(n,t)},Be=te("IE_PROTO"),De=Object.prototype,Ue=Object.getPrototypeOf||function(e){return e=le(e),v(e,Be)?e[Be]:"function"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?De:null},He=ue("iterator"),We=i.getIteratorMethod=function(e){if(null!=e)return e[He]||e["@@iterator"]||Me[Pe(e)]},ze=Array.isArray||function(e){return"Array"==W(e)},Ge=ue("species"),Ye=function(e,t){return new(function(e){var t;return ze(e)&&("function"!=typeof(t=e.constructor)||t!==Array&&!ze(t.prototype)||(t=void 0),r(t)&&null===(t=t[Ge])&&(t=void 0)),void 0===t?Array:t}(e))(t)},Ke=function(e,t){var n=1==e,i=2==e,r=3==e,o=4==e,a=6==e,s=5==e||a,l=t||Ye;return function(t,c,u){for(var f,h,d=le(t),p=z(d),g=E(c,u,3),m=D(p.length),y=0,v=n?l(t,m):i?l(t,0):void 0;m>y;y++)if((s||y in p)&&(h=g(f=p[y],y,d),e))if(n)v[y]=h;else if(h)switch(e){case 3:return!0;case 5:return f;case 6:return y;case 2:v.push(f)}else if(o)return!1;return a?-1:r||o?o:v}},Qe=ue("unscopables"),Je=Array.prototype;null==Je[Qe]&&m(Je,Qe,{});var $e=function(e){Je[Qe][e]=!0},Xe=function(e,t){return{value:t,done:!!e}},Ze={};m(Ze,ue("iterator"),function(){return this});var et=function(e,t,n){e.prototype=Ve(Ze,{next:g(1,n)}),de(e,t+" Iterator")},tt=ue("iterator"),nt=!([].keys&&"next"in[].keys()),it=function(){return this},rt=function(e,t,n,i,r,o,a){et(n,t,i);var s,l,c,u=function(e){if(!nt&&e in p)return p[e];switch(e){case"keys":case"values":return function(){return new n(this,e)}}return function(){return new n(this,e)}},f=t+" Iterator",h="values"==r,d=!1,p=e.prototype,g=p[tt]||p["@@iterator"]||r&&p[r],y=!nt&&g||u(r),b=r?h?u("entries"):y:void 0,w="Array"==t&&p.entries||g;if(w&&(c=Ue(w.call(new e)))!==Object.prototype&&c.next&&(de(c,f,!0),v(c,tt)||m(c,tt,it)),h&&g&&"values"!==g.name&&(d=!0,y=function(){return g.call(this)}),(nt||d||!p[tt])&&m(p,tt,y),Me[t]=y,Me[f]=it,r)if(s={values:h?y:u("values"),keys:o?y:u("keys"),entries:b},a)for(l in s)l in p||T(p,l,s[l]);else P(P.P+P.F*(nt||d),t,s);return s},ot=rt(Array,"Array",function(e,t){this._t=Y(e),this._i=0,this._k=t},function(){var e=this._t,t=this._k,n=this._i++;return!e||n>=e.length?(this._t=void 0,Xe(1)):Xe(0,"keys"==t?n:"values"==t?e[n]:[n,e[n]])},"values");Me.Arguments=Me.Array,$e("keys"),$e("values"),$e("entries");var at=ue("iterator"),st=!1;try{[7][at]().return=function(){st=!0}}catch(e){}var lt=function(e,t){if(!t&&!st)return!1;var n=!1;try{var i=[7],r=i[at]();r.next=function(){return{done:n=!0}},i[at]=function(){return r},e(i)}catch(e){}return n},ct=[].copyWithin||function(e,t){var n=le(this),i=D(n.length),r=J(e,i),o=J(t,i),a=arguments.length>2?arguments[2]:void 0,s=Math.min((void 0===a?i:J(a,i))-o,i-r),l=1;for(o<r&&r<o+s&&(l=-1,o+=s-1,r+=s-1);s-- >0;)o in n?n[r]=n[o]:delete n[r],r+=l,o+=l;return n},ut={f:{}.propertyIsEnumerable},ft=Object.getOwnPropertyDescriptor,ht={f:s?ft:function(e,t){if(e=Y(e),t=h(t,!0),f)try{return ft(e,t)}catch(e){}if(v(e,t))return g(!ut.f.call(e,t),e[t])}},dt=t(function(e){if(s){var t=n,i=a,o=P,l=j,c=pe,u=E,f=F,d=g,y=m,b=I,w=V,T=D,S=U,_=J,A=h,M=v,L=Pe,x=r,C=le,O=Ce,N=Ve,R=Ue,q=se.f,B=We,H=k,W=ue,z=Ke,G=$,Y=me,K=ot,Q=Me,X=lt,Z=ve,ee=ce,te=ct,ne=p,ie=ht,re=ne.f,oe=ie.f,ae=t.RangeError,fe=t.TypeError,he=t.Uint8Array,de=Array.prototype,ge=c.ArrayBuffer,ye=c.DataView,be=z(0),we=z(2),ke=z(3),Te=z(4),Se=z(5),Ee=z(6),_e=G(!0),Ae=G(!1),Le=K.values,xe=K.keys,Oe=K.entries,Ne=de.lastIndexOf,je=de.reduce,Ie=de.reduceRight,Fe=de.join,Re=de.sort,qe=de.slice,Be=de.toString,De=de.toLocaleString,He=W("iterator"),ze=W("toStringTag"),Ge=H("typed_constructor"),Ye=H("def_constructor"),Qe=l.CONSTR,Je=l.TYPED,$e=l.VIEW,Xe=z(1,function(e,t){return it(Y(e,e[Ye]),t)}),Ze=i(function(){return 1===new he(new Uint16Array([1]).buffer)[0]}),et=!!he&&!!he.prototype.set&&i(function(){new he(1).set({})}),tt=function(e,t){var n=w(e);if(n<0||n%t)throw ae("Wrong offset!");return n},nt=function(e){if(x(e)&&Je in e)return e;throw fe(e+" is not a typed array!")},it=function(e,t){if(!(x(e)&&Ge in e))throw fe("It is not a typed array constructor!");return new e(t)},rt=function(e,t){return at(Y(e,e[Ye]),t)},at=function(e,t){for(var n=0,i=t.length,r=it(e,i);i>n;)r[n]=t[n++];return r},st=function(e,t,n){re(e,t,{get:function(){return this._d[n]}})},ut=function(e){var t,n,i,r,o,a,s=C(e),l=arguments.length,c=l>1?arguments[1]:void 0,f=void 0!==c,h=B(s);if(null!=h&&!O(h)){for(a=h.call(s),i=[],t=0;!(o=a.next()).done;t++)i.push(o.value);s=i}for(f&&l>2&&(c=u(c,arguments[2],2)),t=0,n=T(s.length),r=it(this,n);n>t;t++)r[t]=f?c(s[t],t):s[t];return r},ft=function(){for(var e=0,t=arguments.length,n=it(this,t);t>e;)n[e]=arguments[e++];return n},dt=!!he&&i(function(){De.call(new he(1))}),pt=function(){return De.apply(dt?qe.call(nt(this)):nt(this),arguments)},gt={copyWithin:function(e,t){return te.call(nt(this),e,t,arguments.length>2?arguments[2]:void 0)},every:function(e){return Te(nt(this),e,arguments.length>1?arguments[1]:void 0)},fill:function(e){return ee.apply(nt(this),arguments)},filter:function(e){return rt(this,we(nt(this),e,arguments.length>1?arguments[1]:void 0))},find:function(e){return Se(nt(this),e,arguments.length>1?arguments[1]:void 0)},findIndex:function(e){return Ee(nt(this),e,arguments.length>1?arguments[1]:void 0)},forEach:function(e){be(nt(this),e,arguments.length>1?arguments[1]:void 0)},indexOf:function(e){return Ae(nt(this),e,arguments.length>1?arguments[1]:void 0)},includes:function(e){return _e(nt(this),e,arguments.length>1?arguments[1]:void 0)},join:function(e){return Fe.apply(nt(this),arguments)},lastIndexOf:function(e){return Ne.apply(nt(this),arguments)},map:function(e){return Xe(nt(this),e,arguments.length>1?arguments[1]:void 0)},reduce:function(e){return je.apply(nt(this),arguments)},reduceRight:function(e){return Ie.apply(nt(this),arguments)},reverse:function(){for(var e,t=nt(this).length,n=Math.floor(t/2),i=0;i<n;)e=this[i],this[i++]=this[--t],this[t]=e;return this},some:function(e){return ke(nt(this),e,arguments.length>1?arguments[1]:void 0)},sort:function(e){return Re.call(nt(this),e)},subarray:function(e,t){var n=nt(this),i=n.length,r=_(e,i);return new(Y(n,n[Ye]))(n.buffer,n.byteOffset+r*n.BYTES_PER_ELEMENT,T((void 0===t?i:_(t,i))-r))}},mt=function(e,t){return rt(this,qe.call(nt(this),e,t))},yt=function(e){nt(this);var t=tt(arguments[1],1),n=this.length,i=C(e),r=T(i.length),o=0;if(r+t>n)throw ae("Wrong length!");for(;o<r;)this[t+o]=i[o++]},vt={entries:function(){return Oe.call(nt(this))},keys:function(){return xe.call(nt(this))},values:function(){return Le.call(nt(this))}},bt=function(e,t){return x(e)&&e[Je]&&"symbol"!=typeof t&&t in e&&String(+t)==String(t)},wt=function(e,t){return bt(e,t=A(t,!0))?d(2,e[t]):oe(e,t)},kt=function(e,t,n){return!(bt(e,t=A(t,!0))&&x(n)&&M(n,"value"))||M(n,"get")||M(n,"set")||n.configurable||M(n,"writable")&&!n.writable||M(n,"enumerable")&&!n.enumerable?re(e,t,n):(e[t]=n.value,e)};Qe||(ie.f=wt,ne.f=kt),o(o.S+o.F*!Qe,"Object",{getOwnPropertyDescriptor:wt,defineProperty:kt}),i(function(){Be.call({})})&&(Be=De=function(){return Fe.call(this)});var Tt=b({},gt);b(Tt,vt),y(Tt,He,vt.values),b(Tt,{slice:mt,set:yt,constructor:function(){},toString:Be,toLocaleString:pt}),st(Tt,"buffer","b"),st(Tt,"byteOffset","o"),st(Tt,"byteLength","l"),st(Tt,"length","e"),re(Tt,ze,{get:function(){return this[Je]}}),e.exports=function(e,n,r,a){var s=e+((a=!!a)?"Clamped":"")+"Array",c="get"+e,u="set"+e,h=t[s],d=h||{},p=h&&R(h),g=!h||!l.ABV,m={},v=h&&h.prototype,b=function(e,t){re(e,t,{get:function(){return function(e,t){var i=e._d;return i.v[c](t*n+i.o,Ze)}(this,t)},set:function(e){return function(e,t,i){var r=e._d;a&&(i=(i=Math.round(i))<0?0:i>255?255:255&i),r.v[u](t*n+r.o,i,Ze)}(this,t,e)},enumerable:!0})};g?(h=r(function(e,t,i,r){f(e,h,s,"_d");var o,a,l,c,u=0,d=0;if(x(t)){if(!(t instanceof ge||"ArrayBuffer"==(c=L(t))||"SharedArrayBuffer"==c))return Je in t?at(h,t):ut.call(h,t);o=t,d=tt(i,n);var p=t.byteLength;if(void 0===r){if(p%n)throw ae("Wrong length!");if((a=p-d)<0)throw ae("Wrong length!")}else if((a=T(r)*n)+d>p)throw ae("Wrong length!");l=a/n}else l=S(t),o=new ge(a=l*n);for(y(e,"_d",{b:o,o:d,l:a,e:l,v:new ye(o)});u<l;)b(e,u++)}),v=h.prototype=N(Tt),y(v,"constructor",h)):i(function(){h(1)})&&i(function(){new h(-1)})&&X(function(e){new h,new h(null),new h(1.5),new h(e)},!0)||(h=r(function(e,t,i,r){var o;return f(e,h,s),x(t)?t instanceof ge||"ArrayBuffer"==(o=L(t))||"SharedArrayBuffer"==o?void 0!==r?new d(t,tt(i,n),r):void 0!==i?new d(t,tt(i,n)):new d(t):Je in t?at(h,t):ut.call(h,t):new d(S(t))}),be(p!==Function.prototype?q(d).concat(q(p)):q(d),function(e){e in h||y(h,e,d[e])}),h.prototype=v,v.constructor=h);var w=v[He],k=!!w&&("values"==w.name||null==w.name),E=vt.values;y(h,Ge,!0),y(v,Je,s),y(v,$e,!0),y(v,Ye,h),(a?new h(1)[ze]==s:ze in v)||re(v,ze,{get:function(){return s}}),m[s]=h,o(o.G+o.W+o.F*(h!=d),m),o(o.S,s,{BYTES_PER_ELEMENT:n}),o(o.S+o.F*i(function(){d.of.call(h,1)}),s,{from:ut,of:ft}),"BYTES_PER_ELEMENT"in v||y(v,"BYTES_PER_ELEMENT",n),o(o.P,s,gt),Z(s),o(o.P+o.F*et,s,{set:yt}),o(o.P+o.F*!k,s,vt),v.toString!=Be&&(v.toString=Be),o(o.P+o.F*i(function(){new h(1).slice()}),s,{slice:mt}),o(o.P+o.F*(i(function(){return[1,2].toLocaleString()!=new h([1,2]).toLocaleString()})||!i(function(){v.toLocaleString.call([1,2])})),s,{toLocaleString:pt}),Q[s]=k?w:E,k||y(v,He,E)}}else e.exports=function(){}});dt("Int8",1,function(e){return function(t,n,i){return e(this,t,n,i)}}),dt("Uint8",1,function(e){return function(t,n,i){return e(this,t,n,i)}}),dt("Uint8",1,function(e){return function(t,n,i){return e(this,t,n,i)}},!0),dt("Int16",2,function(e){return function(t,n,i){return e(this,t,n,i)}}),dt("Uint16",2,function(e){return function(t,n,i){return e(this,t,n,i)}}),dt("Int32",4,function(e){return function(t,n,i){return e(this,t,n,i)}}),dt("Uint32",4,function(e){return function(t,n,i){return e(this,t,n,i)}}),dt("Float32",4,function(e){return function(t,n,i){return e(this,t,n,i)}}),dt("Float64",8,function(e){return function(t,n,i){return e(this,t,n,i)}});var pt=function(e,t,n,i){try{return i?t(o(n)[0],n[1]):t(n)}catch(t){var r=e.return;throw void 0!==r&&o(r.call(e)),t}},gt=t(function(e){var t={},n={},i=e.exports=function(e,i,r,a,s){var l,c,u,f,h=s?function(){return e}:We(e),d=E(r,a,i?2:1),p=0;if("function"!=typeof h)throw TypeError(e+" is not iterable!");if(Ce(h)){for(l=D(e.length);l>p;p++)if((f=i?d(o(c=e[p])[0],c[1]):d(e[p]))===t||f===n)return f}else for(u=h.call(e);!(c=u.next()).done;)if((f=pt(u,d,c.value,i))===t||f===n)return f};i.BREAK=t,i.RETURN=n}),mt=t(function(e){var t=k("meta"),n=p.f,i=0,o=Object.isExtensible||function(){return!0},s=!a(function(){return o(Object.preventExtensions({}))}),l=function(e){n(e,t,{value:{i:"O"+ ++i,w:{}}})},c=e.exports={KEY:t,NEED:!1,fastKey:function(e,n){if(!r(e))return"symbol"==typeof e?e:("string"==typeof e?"S":"P")+e;if(!v(e,t)){if(!o(e))return"F";if(!n)return"E";l(e)}return e[t].i},getWeak:function(e,n){if(!v(e,t)){if(!o(e))return!0;if(!n)return!1;l(e)}return e[t].w},onFreeze:function(e){return s&&c.NEED&&o(e)&&!v(e,t)&&l(e),e}}}),yt=(mt.KEY,mt.NEED,mt.fastKey,mt.getWeak,mt.onFreeze,function(e,t){if(!r(e)||e._t!==t)throw TypeError("Incompatible receiver, "+t+" required!");return e}),vt=p.f,bt=mt.fastKey,wt=s?"_s":"size",kt=function(e,t){var n,i=bt(t);if("F"!==i)return e._i[i];for(n=e._f;n;n=n.n)if(n.k==t)return n},Tt={getConstructor:function(e,t,n,i){var r=e(function(e,o){F(e,r,t,"_i"),e._t=t,e._i=Ve(null),e._f=void 0,e._l=void 0,e[wt]=0,null!=o&&gt(o,n,e[i],e)});return I(r.prototype,{clear:function(){for(var e=yt(this,t),n=e._i,i=e._f;i;i=i.n)i.r=!0,i.p&&(i.p=i.p.n=void 0),delete n[i.i];e._f=e._l=void 0,e[wt]=0},delete:function(e){var n=yt(this,t),i=kt(n,e);if(i){var r=i.n,o=i.p;delete n._i[i.i],i.r=!0,o&&(o.n=r),r&&(r.p=o),n._f==i&&(n._f=r),n._l==i&&(n._l=o),n[wt]--}return!!i},forEach:function(e){yt(this,t);for(var n,i=E(e,arguments.length>1?arguments[1]:void 0,3);n=n?n.n:this._f;)for(i(n.v,n.k,this);n&&n.r;)n=n.p},has:function(e){return!!kt(yt(this,t),e)}}),s&&vt(r.prototype,"size",{get:function(){return yt(this,t)[wt]}}),r},def:function(e,t,n){var i,r,o=kt(e,t);return o?o.v=n:(e._l=o={i:r=bt(t,!0),k:t,v:n,p:i=e._l,n:void 0,r:!1},e._f||(e._f=o),i&&(i.n=o),e[wt]++,"F"!==r&&(e._i[r]=o)),e},getEntry:kt,setStrong:function(e,t,n){rt(e,t,function(e,n){this._t=yt(e,t),this._k=n,this._l=void 0},function(){for(var e=this._k,t=this._l;t&&t.r;)t=t.p;return this._t&&(this._l=t=t?t.n:this._t._f)?Xe(0,"keys"==e?t.k:"values"==e?t.v:[t.k,t.v]):(this._t=void 0,Xe(1))},n?"entries":"values",!n,!0),ve(t)}},St=function(e,t){if(o(e),!r(t)&&null!==t)throw TypeError(t+": can't set as prototype!")},Et={set:Object.setPrototypeOf||("__proto__"in{}?function(e,t,n){try{(n=E(Function.call,ht.f(Object.prototype,"__proto__").set,2))(e,[]),t=!(e instanceof Array)}catch(e){t=!0}return function(e,i){return St(e,i),t?e.__proto__=i:n(e,i),e}}({},!1):void 0),check:St},_t=Et.set,At=function(e,t,i,o,s,l){var c=n[e],u=c,f=s?"set":"add",h=u&&u.prototype,d={},p=function(e){var t=h[e];T(h,e,"delete"==e?function(e){return!(l&&!r(e))&&t.call(this,0===e?0:e)}:"has"==e?function(e){return!(l&&!r(e))&&t.call(this,0===e?0:e)}:"get"==e?function(e){return l&&!r(e)?void 0:t.call(this,0===e?0:e)}:"add"==e?function(e){return t.call(this,0===e?0:e),this}:function(e,n){return t.call(this,0===e?0:e,n),this})};if("function"==typeof u&&(l||h.forEach&&!a(function(){(new u).entries().next()}))){var g=new u,m=g[f](l?{}:-0,1)!=g,y=a(function(){g.has(1)}),v=lt(function(e){new u(e)}),b=!l&&a(function(){for(var e=new u,t=5;t--;)e[f](t,t);return!e.has(-0)});v||((u=t(function(t,n){F(t,u,e);var i=function(e,t,n){var i,o=t.constructor;return o!==n&&"function"==typeof o&&(i=o.prototype)!==n.prototype&&r(i)&&_t&&_t(e,i),e}(new c,t,u);return null!=n&&gt(n,s,i[f],i),i})).prototype=h,h.constructor=u),(y||b)&&(p("delete"),p("has"),s&&p("get")),(b||m)&&p(f),l&&h.clear&&delete h.clear}else u=o.getConstructor(t,e,s,f),I(u.prototype,i),mt.NEED=!0;return de(u,e),d[e]=u,P(P.G+P.W+P.F*(u!=c),d),l||o.setStrong(u,e,s),u},Pt=(At("Map",function(e){return function(){return e(this,arguments.length>0?arguments[0]:void 0)}},{get:function(e){var t=Tt.getEntry(yt(this,"Map"),e);return t&&t.v},set:function(e,t){return Tt.def(yt(this,"Map"),0===e?0:e,t)}},Tt,!0),At("Set",function(e){return function(){return e(this,arguments.length>0?arguments[0]:void 0)}},{add:function(e){return Tt.def(yt(this,"Set"),e=0===e?0:e,e)}},Tt),{f:Object.getOwnPropertySymbols}),Mt=Object.assign,Lt=!Mt||a(function(){var e={},t={},n=Symbol(),i="abcdefghijklmnopqrst";return e[n]=7,i.split("").forEach(function(e){t[e]=e}),7!=Mt({},e)[n]||Object.keys(Mt({},t)).join("")!=i})?function(e,t){for(var n=le(e),i=arguments.length,r=1,o=Pt.f,a=ut.f;i>r;)for(var s,l=z(arguments[r++]),c=o?Oe(l).concat(o(l)):Oe(l),u=c.length,f=0;u>f;)a.call(l,s=c[f++])&&(n[s]=l[s]);return n}:Mt,xt=mt.getWeak,Ct=Ke(5),Ot=Ke(6),Nt=0,jt=function(e){return e._l||(e._l=new It)},It=function(){this.a=[]},Ft=function(e,t){return Ct(e.a,function(e){return e[0]===t})};It.prototype={get:function(e){var t=Ft(this,e);if(t)return t[1]},has:function(e){return!!Ft(this,e)},set:function(e,t){var n=Ft(this,e);n?n[1]=t:this.a.push([e,t])},delete:function(e){var t=Ot(this.a,function(t){return t[0]===e});return~t&&this.a.splice(t,1),!!~t}};var Rt={getConstructor:function(e,t,n,i){var o=e(function(e,r){F(e,o,t,"_i"),e._t=t,e._i=Nt++,e._l=void 0,null!=r&&gt(r,n,e[i],e)});return I(o.prototype,{delete:function(e){if(!r(e))return!1;var n=xt(e);return!0===n?jt(yt(this,t)).delete(e):n&&v(n,this._i)&&delete n[this._i]},has:function(e){if(!r(e))return!1;var n=xt(e);return!0===n?jt(yt(this,t)).has(e):n&&v(n,this._i)}}),o},def:function(e,t,n){var i=xt(o(t),!0);return!0===i?jt(e).set(t,n):i[e._i]=n,e},ufstore:jt};t(function(e){var t,n=Ke(0),i=mt.getWeak,o=Object.isExtensible,s=Rt.ufstore,l={},c=function(e){return function(){return e(this,arguments.length>0?arguments[0]:void 0)}},u={get:function(e){if(r(e)){var t=i(e);return!0===t?s(yt(this,"WeakMap")).get(e):t?t[this._i]:void 0}},set:function(e,t){return Rt.def(yt(this,"WeakMap"),e,t)}},f=e.exports=At("WeakMap",c,u,Rt,!0,!0);a(function(){return 7!=(new f).set((Object.freeze||Object)(l),7).get(l)})&&(t=Rt.getConstructor(c,"WeakMap"),Lt(t.prototype,u),mt.NEED=!0,n(["delete","has","get","set"],function(e){var n=f.prototype,i=n[e];T(n,e,function(n,a){if(r(n)&&!o(n)){this._f||(this._f=new t);var s=this._f[e](n,a);return"set"==e?this:s}return i.call(this,n,a)})}))});At("WeakSet",function(e){return function(){return e(this,arguments.length>0?arguments[0]:void 0)}},{add:function(e){return Rt.def(yt(this,"WeakSet"),e,!0)}},Rt,!1,!0);var qt=(n.Reflect||{}).apply,Vt=Function.apply;P(P.S+P.F*!a(function(){qt(function(){})}),"Reflect",{apply:function(e,t,n){var i=S(e),r=o(n);return qt?qt(i,t,r):Vt.call(i,t,r)}});var Bt=function(e,t,n){var i=void 0===n;switch(t.length){case 0:return i?e():e.call(n);case 1:return i?e(t[0]):e.call(n,t[0]);case 2:return i?e(t[0],t[1]):e.call(n,t[0],t[1]);case 3:return i?e(t[0],t[1],t[2]):e.call(n,t[0],t[1],t[2]);case 4:return i?e(t[0],t[1],t[2],t[3]):e.call(n,t[0],t[1],t[2],t[3])}return e.apply(n,t)},Dt=[].slice,Ut={},Ht=Function.bind||function(e){var t=S(this),n=Dt.call(arguments,1),i=function(){var r=n.concat(Dt.call(arguments));return this instanceof i?function(e,t,n){if(!(t in Ut)){for(var i=[],r=0;r<t;r++)i[r]="a["+r+"]";Ut[t]=Function("F,a","return new F("+i.join(",")+")")}return Ut[t](e,n)}(t,r.length,r):Bt(t,r,e)};return r(t.prototype)&&(i.prototype=t.prototype),i},Wt=(n.Reflect||{}).construct,zt=a(function(){function e(){}return!(Wt(function(){},[],e)instanceof e)}),Gt=!a(function(){Wt(function(){})});P(P.S+P.F*(zt||Gt),"Reflect",{construct:function(e,t){S(e),o(t);var n=arguments.length<3?e:S(arguments[2]);if(Gt&&!zt)return Wt(e,t,n);if(e==n){switch(t.length){case 0:return new e;case 1:return new e(t[0]);case 2:return new e(t[0],t[1]);case 3:return new e(t[0],t[1],t[2]);case 4:return new e(t[0],t[1],t[2],t[3])}var i=[null];return i.push.apply(i,t),new(Ht.apply(e,i))}var a=n.prototype,s=Ve(r(a)?a:Object.prototype),l=Function.apply.call(e,s,t);return r(l)?l:s}}),P(P.S+P.F*a(function(){Reflect.defineProperty(p.f({},1,{value:1}),1,{value:2})}),"Reflect",{defineProperty:function(e,t,n){o(e),t=h(t,!0),o(n);try{return p.f(e,t,n),!0}catch(e){return!1}}});var Yt=ht.f;P(P.S,"Reflect",{deleteProperty:function(e,t){var n=Yt(o(e),t);return!(n&&!n.configurable)&&delete e[t]}}),P(P.S,"Reflect",{get:function e(t,n){var i,a,s=arguments.length<3?t:arguments[2];return o(t)===s?t[n]:(i=ht.f(t,n))?v(i,"value")?i.value:void 0!==i.get?i.get.call(s):void 0:r(a=Ue(t))?e(a,n,s):void 0}}),P(P.S,"Reflect",{getOwnPropertyDescriptor:function(e,t){return ht.f(o(e),t)}}),P(P.S,"Reflect",{getPrototypeOf:function(e){return Ue(o(e))}}),P(P.S,"Reflect",{has:function(e,t){return t in e}});var Kt=Object.isExtensible;P(P.S,"Reflect",{isExtensible:function(e){return o(e),!Kt||Kt(e)}});var Qt=n.Reflect,Jt=Qt&&Qt.ownKeys||function(e){var t=se.f(o(e)),n=Pt.f;return n?t.concat(n(e)):t};P(P.S,"Reflect",{ownKeys:Jt});var $t=Object.preventExtensions;P(P.S,"Reflect",{preventExtensions:function(e){o(e);try{return $t&&$t(e),!0}catch(e){return!1}}}),P(P.S,"Reflect",{set:function e(t,n,i){var a,s,l=arguments.length<4?t:arguments[3],c=ht.f(o(t),n);if(!c){if(r(s=Ue(t)))return e(s,n,i,l);c=g(0)}return v(c,"value")?!(!1===c.writable||!r(l)||((a=ht.f(l,n)||g(0)).value=i,p.f(l,n,a),0)):void 0!==c.set&&(c.set.call(l,i),!0)}}),Et&&P(P.S,"Reflect",{setPrototypeOf:function(e,t){Et.check(e,t);try{return Et.set(e,t),!0}catch(e){return!1}}});var Xt,Zt,en,tn=n.process,nn=n.setImmediate,rn=n.clearImmediate,on=n.MessageChannel,an=n.Dispatch,sn=0,ln={},cn=function(){var e=+this;if(ln.hasOwnProperty(e)){var t=ln[e];delete ln[e],t()}},un=function(e){cn.call(e.data)};nn&&rn||(nn=function(e){for(var t=[],n=1;arguments.length>n;)t.push(arguments[n++]);return ln[++sn]=function(){Bt("function"==typeof e?e:Function(e),t)},Xt(sn),sn},rn=function(e){delete ln[e]},"process"==W(tn)?Xt=function(e){tn.nextTick(E(cn,e,1))}:an&&an.now?Xt=function(e){an.now(E(cn,e,1))}:on?(en=(Zt=new on).port2,Zt.port1.onmessage=un,Xt=E(en.postMessage,en,1)):n.addEventListener&&"function"==typeof postMessage&&!n.importScripts?(Xt=function(e){n.postMessage(e+"","*")},n.addEventListener("message",un,!1)):Xt="onreadystatechange"in u("script")?function(e){Ie.appendChild(u("script")).onreadystatechange=function(){Ie.removeChild(this),cn.call(e)}}:function(e){setTimeout(E(cn,e,1),0)});var fn={set:nn,clear:rn},hn=fn.set,dn=n.MutationObserver||n.WebKitMutationObserver,pn=n.process,gn=n.Promise,mn="process"==W(pn);function yn(e){var t,n;this.promise=new e(function(e,i){if(void 0!==t||void 0!==n)throw TypeError("Bad Promise constructor");t=e,n=i}),this.resolve=S(t),this.reject=S(n)}var vn,bn,wn,kn,Tn={f:function(e){return new yn(e)}},Sn=function(e){try{return{e:!1,v:e()}}catch(e){return{e:!0,v:e}}},En=fn.set,_n=function(){var e,t,i,r=function(){var n,r;for(mn&&(n=pn.domain)&&n.exit();e;){r=e.fn,e=e.next;try{r()}catch(n){throw e?i():t=void 0,n}}t=void 0,n&&n.enter()};if(mn)i=function(){pn.nextTick(r)};else if(!dn||n.navigator&&n.navigator.standalone)if(gn&&gn.resolve){var o=gn.resolve();i=function(){o.then(r)}}else i=function(){hn.call(n,r)};else{var a=!0,s=document.createTextNode("");new dn(r).observe(s,{characterData:!0}),i=function(){s.data=a=!a}}return function(n){var r={fn:n,next:void 0};t&&(t.next=r),e||(e=r,i()),t=r}}(),An=n.TypeError,Pn=n.process,Mn=n.Promise,Ln="process"==Pe(Pn),xn=function(){},Cn=bn=Tn.f,On=!!function(){try{var e=Mn.resolve(1),t=(e.constructor={})[ue("species")]=function(e){e(xn,xn)};return(Ln||"function"==typeof PromiseRejectionEvent)&&e.then(xn)instanceof t}catch(e){}}(),Nn=function(e){var t;return!(!r(e)||"function"!=typeof(t=e.then))&&t},jn=function(e,t){if(!e._n){e._n=!0;var n=e._c;_n(function(){for(var i=e._v,r=1==e._s,o=0,a=function(t){var n,o,a=r?t.ok:t.fail,s=t.resolve,l=t.reject,c=t.domain;try{a?(r||(2==e._h&&Rn(e),e._h=1),!0===a?n=i:(c&&c.enter(),n=a(i),c&&c.exit()),n===t.promise?l(An("Promise-chain cycle")):(o=Nn(n))?o.call(n,s,l):s(n)):l(i)}catch(e){l(e)}};n.length>o;)a(n[o++]);e._c=[],e._n=!1,t&&!e._h&&In(e)})}},In=function(e){En.call(n,function(){var t,i,r,o=e._v,a=Fn(e);if(a&&(t=Sn(function(){Ln?Pn.emit("unhandledRejection",o,e):(i=n.onunhandledrejection)?i({promise:e,reason:o}):(r=n.console)&&r.error&&r.error("Unhandled promise rejection",o)}),e._h=Ln||Fn(e)?2:1),e._a=void 0,a&&t.e)throw t.v})},Fn=function(e){return 1!==e._h&&0===(e._a||e._c).length},Rn=function(e){En.call(n,function(){var t;Ln?Pn.emit("rejectionHandled",e):(t=n.onrejectionhandled)&&t({promise:e,reason:e._v})})},qn=function(e){var t=this;t._d||(t._d=!0,(t=t._w||t)._v=e,t._s=2,t._a||(t._a=t._c.slice()),jn(t,!0))},Vn=function(e){var t,n=this;if(!n._d){n._d=!0,n=n._w||n;try{if(n===e)throw An("Promise can't be resolved itself");(t=Nn(e))?_n(function(){var i={_w:n,_d:!1};try{t.call(e,E(Vn,i,1),E(qn,i,1))}catch(e){qn.call(i,e)}}):(n._v=e,n._s=1,jn(n,!1))}catch(e){qn.call({_w:n,_d:!1},e)}}};On||(Mn=function(e){F(this,Mn,"Promise","_h"),S(e),vn.call(this);try{e(E(Vn,this,1),E(qn,this,1))}catch(e){qn.call(this,e)}},(vn=function(e){this._c=[],this._a=void 0,this._s=0,this._d=!1,this._v=void 0,this._h=0,this._n=!1}).prototype=I(Mn.prototype,{then:function(e,t){var n=Cn(me(this,Mn));return n.ok="function"!=typeof e||e,n.fail="function"==typeof t&&t,n.domain=Ln?Pn.domain:void 0,this._c.push(n),this._a&&this._a.push(n),this._s&&jn(this,!1),n.promise},catch:function(e){return this.then(void 0,e)}}),wn=function(){var e=new vn;this.promise=e,this.resolve=E(Vn,e,1),this.reject=E(qn,e,1)},Tn.f=Cn=function(e){return e===Mn||e===kn?new wn(e):bn(e)}),P(P.G+P.W+P.F*!On,{Promise:Mn}),de(Mn,"Promise"),ve("Promise"),kn=i.Promise,P(P.S+P.F*!On,"Promise",{reject:function(e){var t=Cn(this);return(0,t.reject)(e),t.promise}}),P(P.S+P.F*!On,"Promise",{resolve:function(e){return function(e,t){if(o(e),r(t)&&t.constructor===e)return t;var n=Tn.f(e);return(0,n.resolve)(t),n.promise}(this,e)}}),P(P.S+P.F*!(On&&lt(function(e){Mn.all(e).catch(xn)})),"Promise",{all:function(e){var t=this,n=Cn(t),i=n.resolve,r=n.reject,o=Sn(function(){var n=[],o=0,a=1;gt(e,!1,function(e){var s=o++,l=!1;n.push(void 0),a++,t.resolve(e).then(function(e){l||(l=!0,n[s]=e,--a||i(n))},r)}),--a||i(n)});return o.e&&r(o.v),n.promise},race:function(e){var t=this,n=Cn(t),i=n.reject,r=Sn(function(){gt(e,!1,function(e){t.resolve(e).then(n.resolve,i)})});return r.e&&i(r.v),n.promise}});var Bn={f:ue},Dn=p.f,Un=function(e){var t=i.Symbol||(i.Symbol=n.Symbol||{});"_"==e.charAt(0)||e in t||Dn(t,e,{value:Bn.f(e)})},Hn=se.f,Wn={}.toString,zn="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],Gn={f:function(e){return zn&&"[object Window]"==Wn.call(e)?function(e){try{return Hn(e)}catch(e){return zn.slice()}}(e):Hn(Y(e))}},Yn=mt.KEY,Kn=ht.f,Qn=p.f,Jn=Gn.f,$n=n.Symbol,Xn=n.JSON,Zn=Xn&&Xn.stringify,ei=ue("_hidden"),ti=ue("toPrimitive"),ni={}.propertyIsEnumerable,ii=Z("symbol-registry"),ri=Z("symbols"),oi=Z("op-symbols"),ai=Object.prototype,si="function"==typeof $n,li=n.QObject,ci=!li||!li.prototype||!li.prototype.findChild,ui=s&&a(function(){return 7!=Ve(Qn({},"a",{get:function(){return Qn(this,"a",{value:7}).a}})).a})?function(e,t,n){var i=Kn(ai,t);i&&delete ai[t],Qn(e,t,n),i&&e!==ai&&Qn(ai,t,i)}:Qn,fi=function(e){var t=ri[e]=Ve($n.prototype);return t._k=e,t},hi=si&&"symbol"==typeof $n.iterator?function(e){return"symbol"==typeof e}:function(e){return e instanceof $n},di=function(e,t,n){return e===ai&&di(oi,t,n),o(e),t=h(t,!0),o(n),v(ri,t)?(n.enumerable?(v(e,ei)&&e[ei][t]&&(e[ei][t]=!1),n=Ve(n,{enumerable:g(0,!1)})):(v(e,ei)||Qn(e,ei,g(1,{})),e[ei][t]=!0),ui(e,t,n)):Qn(e,t,n)},pi=function(e,t){o(e);for(var n,i=function(e){var t=Oe(e),n=Pt.f;if(n)for(var i,r=n(e),o=ut.f,a=0;r.length>a;)o.call(e,i=r[a++])&&t.push(i);return t}(t=Y(t)),r=0,a=i.length;a>r;)di(e,n=i[r++],t[n]);return e},gi=function(e){var t=ni.call(this,e=h(e,!0));return!(this===ai&&v(ri,e)&&!v(oi,e))&&(!(t||!v(this,e)||!v(ri,e)||v(this,ei)&&this[ei][e])||t)},mi=function(e,t){if(e=Y(e),t=h(t,!0),e!==ai||!v(ri,t)||v(oi,t)){var n=Kn(e,t);return!n||!v(ri,t)||v(e,ei)&&e[ei][t]||(n.enumerable=!0),n}},yi=function(e){for(var t,n=Jn(Y(e)),i=[],r=0;n.length>r;)v(ri,t=n[r++])||t==ei||t==Yn||i.push(t);return i},vi=function(e){for(var t,n=e===ai,i=Jn(n?oi:Y(e)),r=[],o=0;i.length>o;)!v(ri,t=i[o++])||n&&!v(ai,t)||r.push(ri[t]);return r};si||(T(($n=function(){if(this instanceof $n)throw TypeError("Symbol is not a constructor!");var e=k(arguments.length>0?arguments[0]:void 0),t=function(n){this===ai&&t.call(oi,n),v(this,ei)&&v(this[ei],e)&&(this[ei][e]=!1),ui(this,e,g(1,n))};return s&&ci&&ui(ai,e,{configurable:!0,set:t}),fi(e)}).prototype,"toString",function(){return this._k}),ht.f=mi,p.f=di,se.f=Gn.f=yi,ut.f=gi,Pt.f=vi,s&&T(ai,"propertyIsEnumerable",gi,!0),Bn.f=function(e){return fi(ue(e))}),P(P.G+P.W+P.F*!si,{Symbol:$n});for(var bi="hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables".split(","),wi=0;bi.length>wi;)ue(bi[wi++]);for(var ki=Oe(ue.store),Ti=0;ki.length>Ti;)Un(ki[Ti++]);P(P.S+P.F*!si,"Symbol",{for:function(e){return v(ii,e+="")?ii[e]:ii[e]=$n(e)},keyFor:function(e){if(!hi(e))throw TypeError(e+" is not a symbol!");for(var t in ii)if(ii[t]===e)return t},useSetter:function(){ci=!0},useSimple:function(){ci=!1}}),P(P.S+P.F*!si,"Object",{create:function(e,t){return void 0===t?Ve(e):pi(Ve(e),t)},defineProperty:di,defineProperties:pi,getOwnPropertyDescriptor:mi,getOwnPropertyNames:yi,getOwnPropertySymbols:vi}),Xn&&P(P.S+P.F*(!si||a(function(){var e=$n();return"[null]"!=Zn([e])||"{}"!=Zn({a:e})||"{}"!=Zn(Object(e))})),"JSON",{stringify:function(e){for(var t,n,i=[e],o=1;arguments.length>o;)i.push(arguments[o++]);if(n=t=i[1],(r(t)||void 0!==e)&&!hi(e))return ze(t)||(t=function(e,t){if("function"==typeof n&&(t=n.call(this,e,t)),!hi(t))return t}),i[1]=t,Zn.apply(Xn,i)}}),$n.prototype[ti]||m($n.prototype,ti,$n.prototype.valueOf),de($n,"Symbol"),de(Math,"Math",!0),de(n.JSON,"JSON",!0);var Si=function(e,t){var n=(i.Object||{})[e]||Object[e],r={};r[e]=t(n),P(P.S+P.F*a(function(){n(1)}),"Object",r)},Ei=mt.onFreeze;Si("freeze",function(e){return function(t){return e&&r(t)?e(Ei(t)):t}});var _i=mt.onFreeze;Si("seal",function(e){return function(t){return e&&r(t)?e(_i(t)):t}});var Ai=mt.onFreeze;Si("preventExtensions",function(e){return function(t){return e&&r(t)?e(Ai(t)):t}}),Si("isFrozen",function(e){return function(t){return!r(t)||!!e&&e(t)}}),Si("isSealed",function(e){return function(t){return!r(t)||!!e&&e(t)}}),Si("isExtensible",function(e){return function(t){return!!r(t)&&(!e||e(t))}});var Pi=ht.f;Si("getOwnPropertyDescriptor",function(){return function(e,t){return Pi(Y(e),t)}}),Si("getPrototypeOf",function(){return function(e){return Ue(le(e))}}),Si("keys",function(){return function(e){return Oe(le(e))}}),Si("getOwnPropertyNames",function(){return Gn.f}),P(P.S+P.F,"Object",{assign:Lt});var Mi=Object.is||function(e,t){return e===t?0!==e||1/e==1/t:e!=e&&t!=t};P(P.S,"Object",{is:Mi});var Li=p.f,xi=Function.prototype,Ci=/^\s*function ([^ (]*)/;"name"in xi||s&&Li(xi,"name",{configurable:!0,get:function(){try{return(""+this).match(Ci)[1]}catch(e){return""}}}),P(P.S,"String",{raw:function(e){for(var t=Y(e.raw),n=D(t.length),i=arguments.length,r=[],o=0;n>o;)r.push(String(t[o++])),o<i&&r.push(String(arguments[o]));return r.join("")}});var Oi=String.fromCharCode,Ni=String.fromCodePoint;P(P.S+P.F*(!!Ni&&1!=Ni.length),"String",{fromCodePoint:function(e){for(var t,n=[],i=arguments.length,r=0;i>r;){if(t=+arguments[r++],J(t,1114111)!==t)throw RangeError(t+" is not a valid code point");n.push(t<65536?Oi(t):Oi(55296+((t-=65536)>>10),t%1024+56320))}return n.join("")}});var ji,Ii=(ji=!1,function(e,t){var n,i,r=String(G(e)),o=V(t),a=r.length;return o<0||o>=a?ji?"":void 0:(n=r.charCodeAt(o))<55296||n>56319||o+1===a||(i=r.charCodeAt(o+1))<56320||i>57343?ji?r.charAt(o):n:ji?r.slice(o,o+2):i-56320+(n-55296<<10)+65536});P(P.P,"String",{codePointAt:function(e){return Ii(this,e)}});var Fi=function(e){var t=String(G(this)),n="",i=V(e);if(i<0||i==1/0)throw RangeError("Count can't be negative");for(;i>0;(i>>>=1)&&(t+=t))1&i&&(n+=t);return n};P(P.P,"String",{repeat:Fi});var Ri=ue("match"),qi=function(e){var t;return r(e)&&(void 0!==(t=e[Ri])?!!t:"RegExp"==W(e))},Vi=function(e,t,n){if(qi(t))throw TypeError("String#"+n+" doesn't accept regex!");return String(G(e))},Bi=ue("match"),Di=function(e){var t=/./;try{"/./"[e](t)}catch(n){try{return t[Bi]=!1,!"/./"[e](t)}catch(e){}}return!0},Ui="".startsWith;P(P.P+P.F*Di("startsWith"),"String",{startsWith:function(e){var t=Vi(this,e,"startsWith"),n=D(Math.min(arguments.length>1?arguments[1]:void 0,t.length)),i=String(e);return Ui?Ui.call(t,i,n):t.slice(n,n+i.length)===i}});var Hi="".endsWith;P(P.P+P.F*Di("endsWith"),"String",{endsWith:function(e){var t=Vi(this,e,"endsWith"),n=arguments.length>1?arguments[1]:void 0,i=D(t.length),r=void 0===n?i:Math.min(D(n),i),o=String(e);return Hi?Hi.call(t,o,r):t.slice(r-o.length,r)===o}});P(P.P+P.F*Di("includes"),"String",{includes:function(e){return!!~Vi(this,e,"includes").indexOf(e,arguments.length>1?arguments[1]:void 0)}});s&&"g"!=/./g.flags&&p.f(RegExp.prototype,"flags",{configurable:!0,get:function(){var e=o(this),t="";return e.global&&(t+="g"),e.ignoreCase&&(t+="i"),e.multiline&&(t+="m"),e.unicode&&(t+="u"),e.sticky&&(t+="y"),t}});var Wi=function(e,t,n){var i=ue(e),r=n(G,i,""[e]),o=r[0],s=r[1];a(function(){var t={};return t[i]=function(){return 7},7!=""[e](t)})&&(T(String.prototype,e,o),m(RegExp.prototype,i,2==t?function(e,t){return s.call(e,this,t)}:function(e){return s.call(e,this)}))};Wi("match",1,function(e,t,n){return[function(n){var i=e(this),r=null==n?void 0:n[t];return void 0!==r?r.call(n,i):new RegExp(n)[t](String(i))},n]}),Wi("replace",2,function(e,t,n){return[function(i,r){var o=e(this),a=null==i?void 0:i[t];return void 0!==a?a.call(i,o,r):n.call(String(o),i,r)},n]}),Wi("split",2,function(e,t,n){var i=qi,r=n,o=[].push;if("c"=="abbc".split(/(b)*/)[1]||4!="test".split(/(?:)/,-1).length||2!="ab".split(/(?:ab)*/).length||4!=".".split(/(.?)(.?)/).length||".".split(/()()/).length>1||"".split(/.?/).length){var a=void 0===/()??/.exec("")[1];n=function(e,t){var n=String(this);if(void 0===e&&0===t)return[];if(!i(e))return r.call(n,e,t);var s,l,c,u,f,h=[],d=(e.ignoreCase?"i":"")+(e.multiline?"m":"")+(e.unicode?"u":"")+(e.sticky?"y":""),p=0,g=void 0===t?4294967295:t>>>0,m=new RegExp(e.source,d+"g");for(a||(s=new RegExp("^"+m.source+"$(?!\\s)",d));(l=m.exec(n))&&!((c=l.index+l[0].length)>p&&(h.push(n.slice(p,l.index)),!a&&l.length>1&&l[0].replace(s,function(){for(f=1;f<arguments.length-2;f++)void 0===arguments[f]&&(l[f]=void 0)}),l.length>1&&l.index<n.length&&o.apply(h,l.slice(1)),u=l[0].length,p=c,h.length>=g));)m.lastIndex===l.index&&m.lastIndex++;return p===n.length?!u&&m.test("")||h.push(""):h.push(n.slice(p)),h.length>g?h.slice(0,g):h}}else"0".split(void 0,0).length&&(n=function(e,t){return void 0===e&&0===t?[]:r.call(this,e,t)});return[function(i,r){var o=e(this),a=null==i?void 0:i[t];return void 0!==a?a.call(i,o,r):n.call(String(o),i,r)},n]}),Wi("search",1,function(e,t,n){return[function(n){var i=e(this),r=null==n?void 0:n[t];return void 0!==r?r.call(n,i):new RegExp(n)[t](String(i))},n]});var zi=function(e,t,n){t in e?p.f(e,t,g(0,n)):e[t]=n};P(P.S+P.F*!lt(function(e){}),"Array",{from:function(e){var t,n,i,r,o=le(e),a="function"==typeof this?this:Array,s=arguments.length,l=s>1?arguments[1]:void 0,c=void 0!==l,u=0,f=We(o);if(c&&(l=E(l,s>2?arguments[2]:void 0,2)),null==f||a==Array&&Ce(f))for(n=new a(t=D(o.length));t>u;u++)zi(n,u,c?l(o[u],u):o[u]);else for(r=f.call(o),n=new a;!(i=r.next()).done;u++)zi(n,u,c?pt(r,l,[i.value,u],!0):i.value);return n.length=u,n}}),P(P.S+P.F*a(function(){function e(){}return!(Array.of.call(e)instanceof e)}),"Array",{of:function(){for(var e=0,t=arguments.length,n=new("function"==typeof this?this:Array)(t);t>e;)zi(n,e,arguments[e++]);return n.length=t,n}}),P(P.P,"Array",{copyWithin:ct}),$e("copyWithin");var Gi=Ke(5),Yi=!0;"find"in[]&&Array(1).find(function(){Yi=!1}),P(P.P+P.F*Yi,"Array",{find:function(e){return Gi(this,e,arguments.length>1?arguments[1]:void 0)}}),$e("find");var Ki=Ke(6),Qi=!0;"findIndex"in[]&&Array(1).findIndex(function(){Qi=!1}),P(P.P+P.F*Qi,"Array",{findIndex:function(e){return Ki(this,e,arguments.length>1?arguments[1]:void 0)}}),$e("findIndex"),P(P.P,"Array",{fill:ce}),$e("fill");var Ji=n.isFinite;P(P.S,"Number",{isFinite:function(e){return"number"==typeof e&&Ji(e)}});var $i=Math.floor,Xi=function(e){return!r(e)&&isFinite(e)&&$i(e)===e};P(P.S,"Number",{isInteger:Xi});var Zi=Math.abs;P(P.S,"Number",{isSafeInteger:function(e){return Xi(e)&&Zi(e)<=9007199254740991}}),P(P.S,"Number",{isNaN:function(e){return e!=e}}),P(P.S,"Number",{EPSILON:Math.pow(2,-52)}),P(P.S,"Number",{MIN_SAFE_INTEGER:-9007199254740991}),P(P.S,"Number",{MAX_SAFE_INTEGER:9007199254740991});var er=Math.log1p||function(e){return(e=+e)>-1e-8&&e<1e-8?e-e*e/2:Math.log(1+e)},tr=Math.sqrt,nr=Math.acosh;P(P.S+P.F*!(nr&&710==Math.floor(nr(Number.MAX_VALUE))&&nr(1/0)==1/0),"Math",{acosh:function(e){return(e=+e)<1?NaN:e>94906265.62425156?Math.log(e)+Math.LN2:er(e-1+tr(e-1)*tr(e+1))}});var ir=Math.asinh;P(P.S+P.F*!(ir&&1/ir(0)>0),"Math",{asinh:function e(t){return isFinite(t=+t)&&0!=t?t<0?-e(-t):Math.log(t+Math.sqrt(t*t+1)):t}});var rr=Math.atanh;P(P.S+P.F*!(rr&&1/rr(-0)<0),"Math",{atanh:function(e){return 0==(e=+e)?e:Math.log((1+e)/(1-e))/2}});var or=Math.sign||function(e){return 0==(e=+e)||e!=e?e:e<0?-1:1};P(P.S,"Math",{cbrt:function(e){return or(e=+e)*Math.pow(Math.abs(e),1/3)}}),P(P.S,"Math",{clz32:function(e){return(e>>>=0)?31-Math.floor(Math.log(e+.5)*Math.LOG2E):32}});var ar=Math.exp;P(P.S,"Math",{cosh:function(e){return(ar(e=+e)+ar(-e))/2}});var sr=Math.expm1,lr=!sr||sr(10)>22025.465794806718||sr(10)<22025.465794806718||-2e-17!=sr(-2e-17)?function(e){return 0==(e=+e)?e:e>-1e-6&&e<1e-6?e+e*e/2:Math.exp(e)-1}:sr;P(P.S+P.F*(lr!=Math.expm1),"Math",{expm1:lr});var cr=Math.pow,ur=cr(2,-52),fr=cr(2,-23),hr=cr(2,127)*(2-fr),dr=cr(2,-126),pr=Math.fround||function(e){var t,n,i=Math.abs(e),r=or(e);return i<dr?r*(i/dr/fr+1/ur-1/ur)*dr*fr:(n=(t=(1+fr/ur)*i)-(t-i))>hr||n!=n?r*(1/0):r*n};P(P.S,"Math",{fround:pr});var gr=Math.abs;P(P.S,"Math",{hypot:function(e,t){for(var n,i,r=0,o=0,a=arguments.length,s=0;o<a;)s<(n=gr(arguments[o++]))?(r=r*(i=s/n)*i+1,s=n):r+=n>0?(i=n/s)*i:n;return s===1/0?1/0:s*Math.sqrt(r)}});var mr=Math.imul;P(P.S+P.F*a(function(){return-5!=mr(4294967295,5)||2!=mr.length}),"Math",{imul:function(e,t){var n=+e,i=+t,r=65535&n,o=65535&i;return 0|r*o+((65535&n>>>16)*o+r*(65535&i>>>16)<<16>>>0)}}),P(P.S,"Math",{log1p:er}),P(P.S,"Math",{log10:function(e){return Math.log(e)*Math.LOG10E}}),P(P.S,"Math",{log2:function(e){return Math.log(e)/Math.LN2}}),P(P.S,"Math",{sign:or});var yr=Math.exp;P(P.S+P.F*a(function(){return-2e-17!=!Math.sinh(-2e-17)}),"Math",{sinh:function(e){return Math.abs(e=+e)<1?(lr(e)-lr(-e))/2:(yr(e-1)-yr(-e-1))*(Math.E/2)}});var vr=Math.exp;P(P.S,"Math",{tanh:function(e){var t=lr(e=+e),n=lr(-e);return t==1/0?1:n==1/0?-1:(t-n)/(vr(e)+vr(-e))}}),P(P.S,"Math",{trunc:function(e){return(e>0?Math.floor:Math.ceil)(e)}});var br=$(!0);P(P.P,"Array",{includes:function(e){return br(this,e,arguments.length>1?arguments[1]:void 0)}}),$e("includes");var wr=ut.f,kr=function(e){return function(t){for(var n,i=Y(t),r=Oe(i),o=r.length,a=0,s=[];o>a;)wr.call(i,n=r[a++])&&s.push(e?[n,i[n]]:i[n]);return s}},Tr=kr(!1);P(P.S,"Object",{values:function(e){return Tr(e)}});var Sr=kr(!0);P(P.S,"Object",{entries:function(e){return Sr(e)}}),P(P.S,"Object",{getOwnPropertyDescriptors:function(e){for(var t,n,i=Y(e),r=ht.f,o=Jt(i),a={},s=0;o.length>s;)void 0!==(n=r(i,t=o[s++]))&&zi(a,t,n);return a}});var Er=function(e,t,n,i){var r=String(G(e)),o=r.length,a=void 0===n?" ":String(n),s=D(t);if(s<=o||""==a)return r;var l=s-o,c=Fi.call(a,Math.ceil(l/a.length));return c.length>l&&(c=c.slice(0,l)),i?c+r:r+c},_r=n.navigator,Ar=_r&&_r.userAgent||"";P(P.P+P.F*/Version\/10\.\d+(\.\d+)? Safari\//.test(Ar),"String",{padStart:function(e){return Er(this,e,arguments.length>1?arguments[1]:void 0,!0)}}),P(P.P+P.F*/Version\/10\.\d+(\.\d+)? Safari\//.test(Ar),"String",{padEnd:function(e){return Er(this,e,arguments.length>1?arguments[1]:void 0,!1)}});var Pr=[].slice,Mr=/MSIE .\./.test(Ar),Lr=function(e){return function(t,n){var i=arguments.length>2,r=!!i&&Pr.call(arguments,2);return e(i?function(){("function"==typeof t?t:Function(t)).apply(this,r)}:t,n)}};P(P.G+P.B+P.F*Mr,{setTimeout:Lr(n.setTimeout),setInterval:Lr(n.setInterval)}),P(P.G+P.B,{setImmediate:fn.set,clearImmediate:fn.clear});for(var xr=ue("iterator"),Cr=ue("toStringTag"),Or=Me.Array,Nr={CSSRuleList:!0,CSSStyleDeclaration:!1,CSSValueList:!1,ClientRectList:!1,DOMRectList:!1,DOMStringList:!1,DOMTokenList:!0,DataTransferItemList:!1,FileList:!1,HTMLAllCollection:!1,HTMLCollection:!1,HTMLFormElement:!1,HTMLSelectElement:!1,MediaList:!0,MimeTypeArray:!1,NamedNodeMap:!1,NodeList:!0,PaintRequestList:!1,Plugin:!1,PluginArray:!1,SVGLengthList:!1,SVGNumberList:!1,SVGPathSegList:!1,SVGPointList:!1,SVGStringList:!1,SVGTransformList:!1,SourceBufferList:!1,StyleSheetList:!0,TextTrackCueList:!1,TextTrackList:!1,TouchList:!1},jr=Oe(Nr),Ir=0;Ir<jr.length;Ir++){var Fr,Rr=jr[Ir],qr=Nr[Rr],Vr=n[Rr],Br=Vr&&Vr.prototype;if(Br&&(Br[xr]||m(Br,xr,Or),Br[Cr]||m(Br,Cr,Rr),Me[Rr]=Or,qr))for(Fr in ot)Br[Fr]||T(Br,Fr,ot[Fr],!0)}t(function(t){!function(e){var n,i=Object.prototype,r=i.hasOwnProperty,o="function"==typeof Symbol?Symbol:{},a=o.iterator||"@@iterator",s=o.asyncIterator||"@@asyncIterator",l=o.toStringTag||"@@toStringTag",c=e.regeneratorRuntime;if(c)t.exports=c;else{(c=e.regeneratorRuntime=t.exports).wrap=b;var u="suspendedStart",f="suspendedYield",h="executing",d="completed",p={},g={};g[a]=function(){return this};var m=Object.getPrototypeOf,y=m&&m(m(x([])));y&&y!==i&&r.call(y,a)&&(g=y);var v=S.prototype=k.prototype=Object.create(g);T.prototype=v.constructor=S,S.constructor=T,S[l]=T.displayName="GeneratorFunction",c.isGeneratorFunction=function(e){var t="function"==typeof e&&e.constructor;return!!t&&(t===T||"GeneratorFunction"===(t.displayName||t.name))},c.mark=function(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,S):(e.__proto__=S,l in e||(e[l]="GeneratorFunction")),e.prototype=Object.create(v),e},c.awrap=function(e){return{__await:e}},E(_.prototype),_.prototype[s]=function(){return this},c.AsyncIterator=_,c.async=function(e,t,n,i){var r=new _(b(e,t,n,i));return c.isGeneratorFunction(t)?r:r.next().then(function(e){return e.done?e.value:r.next()})},E(v),v[l]="Generator",v[a]=function(){return this},v.toString=function(){return"[object Generator]"},c.keys=function(e){var t=[];for(var n in e)t.push(n);return t.reverse(),function n(){for(;t.length;){var i=t.pop();if(i in e)return n.value=i,n.done=!1,n}return n.done=!0,n}},c.values=x,L.prototype={constructor:L,reset:function(e){if(this.prev=0,this.next=0,this.sent=this._sent=n,this.done=!1,this.delegate=null,this.method="next",this.arg=n,this.tryEntries.forEach(M),!e)for(var t in this)"t"===t.charAt(0)&&r.call(this,t)&&!isNaN(+t.slice(1))&&(this[t]=n)},stop:function(){this.done=!0;var e=this.tryEntries[0].completion;if("throw"===e.type)throw e.arg;return this.rval},dispatchException:function(e){if(this.done)throw e;var t=this;function i(i,r){return s.type="throw",s.arg=e,t.next=i,r&&(t.method="next",t.arg=n),!!r}for(var o=this.tryEntries.length-1;o>=0;--o){var a=this.tryEntries[o],s=a.completion;if("root"===a.tryLoc)return i("end");if(a.tryLoc<=this.prev){var l=r.call(a,"catchLoc"),c=r.call(a,"finallyLoc");if(l&&c){if(this.prev<a.catchLoc)return i(a.catchLoc,!0);if(this.prev<a.finallyLoc)return i(a.finallyLoc)}else if(l){if(this.prev<a.catchLoc)return i(a.catchLoc,!0)}else{if(!c)throw new Error("try statement without catch or finally");if(this.prev<a.finallyLoc)return i(a.finallyLoc)}}}},abrupt:function(e,t){for(var n=this.tryEntries.length-1;n>=0;--n){var i=this.tryEntries[n];if(i.tryLoc<=this.prev&&r.call(i,"finallyLoc")&&this.prev<i.finallyLoc){var o=i;break}}o&&("break"===e||"continue"===e)&&o.tryLoc<=t&&t<=o.finallyLoc&&(o=null);var a=o?o.completion:{};return a.type=e,a.arg=t,o?(this.method="next",this.next=o.finallyLoc,p):this.complete(a)},complete:function(e,t){if("throw"===e.type)throw e.arg;return"break"===e.type||"continue"===e.type?this.next=e.arg:"return"===e.type?(this.rval=this.arg=e.arg,this.method="return",this.next="end"):"normal"===e.type&&t&&(this.next=t),p},finish:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.finallyLoc===e)return this.complete(n.completion,n.afterLoc),M(n),p}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.tryLoc===e){var i=n.completion;if("throw"===i.type){var r=i.arg;M(n)}return r}}throw new Error("illegal catch attempt")},delegateYield:function(e,t,i){return this.delegate={iterator:x(e),resultName:t,nextLoc:i},"next"===this.method&&(this.arg=n),p}}}function b(e,t,n,i){var r=t&&t.prototype instanceof k?t:k,o=Object.create(r.prototype),a=new L(i||[]);return o._invoke=function(e,t,n){var i=u;return function(r,o){if(i===h)throw new Error("Generator is already running");if(i===d){if("throw"===r)throw o;return C()}for(n.method=r,n.arg=o;;){var a=n.delegate;if(a){var s=A(a,n);if(s){if(s===p)continue;return s}}if("next"===n.method)n.sent=n._sent=n.arg;else if("throw"===n.method){if(i===u)throw i=d,n.arg;n.dispatchException(n.arg)}else"return"===n.method&&n.abrupt("return",n.arg);i=h;var l=w(e,t,n);if("normal"===l.type){if(i=n.done?d:f,l.arg===p)continue;return{value:l.arg,done:n.done}}"throw"===l.type&&(i=d,n.method="throw",n.arg=l.arg)}}}(e,n,a),o}function w(e,t,n){try{return{type:"normal",arg:e.call(t,n)}}catch(e){return{type:"throw",arg:e}}}function k(){}function T(){}function S(){}function E(e){["next","throw","return"].forEach(function(t){e[t]=function(e){return this._invoke(t,e)}})}function _(t){function n(e,i,o,a){var s=w(t[e],t,i);if("throw"!==s.type){var l=s.arg,c=l.value;return c&&"object"==typeof c&&r.call(c,"__await")?Promise.resolve(c.__await).then(function(e){n("next",e,o,a)},function(e){n("throw",e,o,a)}):Promise.resolve(c).then(function(e){l.value=e,o(l)},a)}a(s.arg)}var i;"object"==typeof e.process&&e.process.domain&&(n=e.process.domain.bind(n)),this._invoke=function(e,t){function r(){return new Promise(function(i,r){n(e,t,i,r)})}return i=i?i.then(r,r):r()}}function A(e,t){var i=e.iterator[t.method];if(i===n){if(t.delegate=null,"throw"===t.method){if(e.iterator.return&&(t.method="return",t.arg=n,A(e,t),"throw"===t.method))return p;t.method="throw",t.arg=new TypeError("The iterator does not provide a 'throw' method")}return p}var r=w(i,e.iterator,t.arg);if("throw"===r.type)return t.method="throw",t.arg=r.arg,t.delegate=null,p;var o=r.arg;return o?o.done?(t[e.resultName]=o.value,t.next=e.nextLoc,"return"!==t.method&&(t.method="next",t.arg=n),t.delegate=null,p):o:(t.method="throw",t.arg=new TypeError("iterator result is not an object"),t.delegate=null,p)}function P(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function M(e){var t=e.completion||{};t.type="normal",delete t.arg,e.completion=t}function L(e){this.tryEntries=[{tryLoc:"root"}],e.forEach(P,this),this.reset(!0)}function x(e){if(e){var t=e[a];if(t)return t.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length)){var i=-1,o=function t(){for(;++i<e.length;)if(r.call(e,i))return t.value=e[i],t.done=!1,t;return t.value=n,t.done=!0,t};return o.next=o}}return{next:C}}function C(){return{value:n,done:!0}}}("object"==typeof e?e:"object"==typeof window?window:"object"==typeof self?self:e)});try{var Dr=new window.CustomEvent("test");if(Dr.preventDefault(),!0!==Dr.defaultPrevented)throw new Error("Could not prevent default")}catch(e){var Ur=function(e,t){var n,i;return t=t||{bubbles:!1,cancelable:!1,detail:void 0},(n=document.createEvent("CustomEvent")).initCustomEvent(e,t.bubbles,t.cancelable,t.detail),i=n.preventDefault,n.preventDefault=function(){i.call(this);try{Object.defineProperty(this,"defaultPrevented",{get:function(){return!0}})}catch(e){this.defaultPrevented=!0}},n};Ur.prototype=window.Event.prototype,window.CustomEvent=Ur}!function(e){var t=function(){try{return!!Symbol.iterator}catch(e){return!1}}(),n=function(e){var n={next:function(){var t=e.shift();return{done:void 0===t,value:t}}};return t&&(n[Symbol.iterator]=function(){return n}),n},i=function(e){return encodeURIComponent(e).replace(/%20/g,"+")},r=function(e){return decodeURIComponent(e).replace(/\+/g," ")};"URLSearchParams"in e&&"a=1"===new URLSearchParams("?a=1").toString()||function(){var o=function(e){if(Object.defineProperty(this,"_entries",{value:{}}),"string"==typeof e){if(""!==e)for(var t,n=(e=e.replace(/^\?/,"")).split("&"),i=0;i<n.length;i++)t=n[i].split("="),this.append(r(t[0]),t.length>1?r(t[1]):"")}else if(e instanceof o){var a=this;e.forEach(function(e,t){a.append(e,t)})}},a=o.prototype;a.append=function(e,t){e in this._entries?this._entries[e].push(t.toString()):this._entries[e]=[t.toString()]},a.delete=function(e){delete this._entries[e]},a.get=function(e){return e in this._entries?this._entries[e][0]:null},a.getAll=function(e){return e in this._entries?this._entries[e].slice(0):[]},a.has=function(e){return e in this._entries},a.set=function(e,t){this._entries[e]=[t.toString()]},a.forEach=function(e,t){var n;for(var i in this._entries)if(this._entries.hasOwnProperty(i)){n=this._entries[i];for(var r=0;r<n.length;r++)e.call(t,n[r],i,this)}},a.keys=function(){var e=[];return this.forEach(function(t,n){e.push(n)}),n(e)},a.values=function(){var e=[];return this.forEach(function(t){e.push(t)}),n(e)},a.entries=function(){var e=[];return this.forEach(function(t,n){e.push([n,t])}),n(e)},t&&(a[Symbol.iterator]=a.entries),a.toString=function(){var e="";return this.forEach(function(t,n){e.length>0&&(e+="&"),e+=i(n)+"="+i(t)}),e},e.URLSearchParams=o}()}(void 0!==e?e:"undefined"!=typeof window?window:"undefined"!=typeof self?self:e),function(e){if(function(){try{var e=new URL("b","http://a");return e.pathname="c%20d","http://a/c%20d"===e.href&&e.searchParams}catch(e){return!1}}()||function(){var t=e.URL,n=function(e,t){"string"!=typeof e&&(e=String(e));var n=document.implementation.createHTMLDocument("");if(window.doc=n,t){var i=n.createElement("base");i.href=t,n.head.appendChild(i)}var r=n.createElement("a");if(r.href=e,n.body.appendChild(r),r.href=r.href,":"===r.protocol||!/:/.test(r.href))throw new TypeError("Invalid URL");Object.defineProperty(this,"_anchorElement",{value:r})},i=n.prototype;["hash","host","hostname","port","protocol","search"].forEach(function(e){!function(e){Object.defineProperty(i,e,{get:function(){return this._anchorElement[e]},set:function(t){this._anchorElement[e]=t},enumerable:!0})}(e)}),Object.defineProperties(i,{toString:{get:function(){var e=this;return function(){return e.href}}},href:{get:function(){return this._anchorElement.href.replace(/\?$/,"")},set:function(e){this._anchorElement.href=e},enumerable:!0},pathname:{get:function(){return this._anchorElement.pathname.replace(/(^\/?)/,"/")},set:function(e){this._anchorElement.pathname=e},enumerable:!0},origin:{get:function(){var e={"http:":80,"https:":443,"ftp:":21}[this._anchorElement.protocol],t=this._anchorElement.port!=e&&""!==this._anchorElement.port;return this._anchorElement.protocol+"//"+this._anchorElement.hostname+(t?":"+this._anchorElement.port:"")},enumerable:!0},password:{get:function(){return""},set:function(e){},enumerable:!0},username:{get:function(){return""},set:function(e){},enumerable:!0},searchParams:{get:function(){var e=new URLSearchParams(this.search),t=this;return["append","delete","set"].forEach(function(n){var i=e[n];e[n]=function(){i.apply(e,arguments),t.search=e.toString()}}),e},enumerable:!0}}),n.createObjectURL=function(e){return t.createObjectURL.apply(t,arguments)},n.revokeObjectURL=function(e){return t.revokeObjectURL.apply(t,arguments)},e.URL=n}(),void 0!==e.location&&!("origin"in e.location)){var t=function(){return e.location.protocol+"//"+e.location.hostname+(e.location.port?":"+e.location.port:"")};try{Object.defineProperty(e.location,"origin",{get:t,enumerable:!0})}catch(n){setInterval(function(){e.location.origin=t()},100)}}}(void 0!==e?e:"undefined"!=typeof window?window:"undefined"!=typeof self?self:e);var Hr=function(e){return null!=e?e.constructor:null},Wr=function(e,t){return Boolean(e&&t&&e instanceof t)},zr={object:function(e){return Hr(e)===Object},number:function(e){return Hr(e)===Number&&!Number.isNaN(e)},string:function(e){return Hr(e)===String},boolean:function(e){return Hr(e)===Boolean},function:function(e){return Hr(e)===Function},array:function(e){return!zr.nullOrUndefined(e)&&Array.isArray(e)},weakMap:function(e){return Wr(e,WeakMap)},nodeList:function(e){return Wr(e,NodeList)},element:function(e){return Wr(e,Element)},textNode:function(e){return Hr(e)===Text},event:function(e){return Wr(e,Event)},cue:function(e){return Wr(e,window.TextTrackCue)||Wr(e,window.VTTCue)},track:function(e){return Wr(e,TextTrack)||!zr.nullOrUndefined(e)&&zr.string(e.kind)},url:function(e){return!zr.nullOrUndefined(e)&&/(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-/]))?/.test(e)},nullOrUndefined:function(e){return null==e},empty:function(e){return zr.nullOrUndefined(e)||(zr.string(e)||zr.array(e)||zr.nodeList(e))&&!e.length||zr.object(e)&&!Object.keys(e).length}},Gr=function(){var e=!1;try{var t=Object.defineProperty({},"passive",{get:function(){return e=!0,null}});window.addEventListener("test",null,t),window.removeEventListener("test",null,t)}catch(e){}return e}();function Yr(e,t,n){var i=arguments.length>3&&void 0!==arguments[3]&&arguments[3],r=this,o=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],a=arguments.length>5&&void 0!==arguments[5]&&arguments[5];if(e&&"addEventListener"in e&&!zr.empty(t)&&zr.function(n)){var s=t.split(" "),l=a;Gr&&(l={passive:o,capture:a}),s.forEach(function(t){r&&r.eventListeners&&i&&r.eventListeners.push({element:e,type:t,callback:n,options:l}),e[i?"addEventListener":"removeEventListener"](t,n,l)})}}function Kr(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments[2],i=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],r=arguments.length>4&&void 0!==arguments[4]&&arguments[4];Yr.call(this,e,t,n,!0,i,r)}function Qr(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments[2],i=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],r=arguments.length>4&&void 0!==arguments[4]&&arguments[4];Yr.call(this,e,t,n,!1,i,r)}function Jr(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments[2],i=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],r=arguments.length>4&&void 0!==arguments[4]&&arguments[4];Yr.call(this,e,t,function o(){Qr(e,t,o,i,r);for(var a=arguments.length,s=Array(a),l=0;l<a;l++)s[l]=arguments[l];n.apply(this,s)},!0,i,r)}function $r(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};if(zr.element(e)&&!zr.empty(t)){var r=new CustomEvent(t,{bubbles:n,detail:Object.assign({},i,{plyr:this})});e.dispatchEvent(r)}}var Xr=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},Zr=function(){function e(e,t){for(var n=0;n<t.length;n++){var i=t[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i)}}return function(t,n,i){return n&&e(t.prototype,n),i&&e(t,i),t}}(),eo=function(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e},to=function(){return function(e,t){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return function(e,t){var n=[],i=!0,r=!1,o=void 0;try{for(var a,s=e[Symbol.iterator]();!(i=(a=s.next()).done)&&(n.push(a.value),!t||n.length!==t);i=!0);}catch(e){r=!0,o=e}finally{try{!i&&s.return&&s.return()}finally{if(r)throw o}}return n}(e,t);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}();function no(e,t){var n=e.length?e:[e];Array.from(n).reverse().forEach(function(e,n){var i=n>0?t.cloneNode(!0):t,r=e.parentNode,o=e.nextSibling;i.appendChild(e),o?r.insertBefore(i,o):r.appendChild(i)})}function io(e,t){zr.element(e)&&!zr.empty(t)&&Object.entries(t).filter(function(e){var t=to(e,2)[1];return!zr.nullOrUndefined(t)}).forEach(function(t){var n=to(t,2),i=n[0],r=n[1];return e.setAttribute(i,r)})}function ro(e,t,n){var i=document.createElement(e);return zr.object(t)&&io(i,t),zr.string(n)&&(i.innerText=n),i}function oo(e,t,n,i){t.appendChild(ro(e,n,i))}function ao(e){zr.nodeList(e)||zr.array(e)?Array.from(e).forEach(ao):zr.element(e)&&zr.element(e.parentNode)&&e.parentNode.removeChild(e)}function so(e){for(var t=e.childNodes.length;t>0;)e.removeChild(e.lastChild),t-=1}function lo(e,t){return zr.element(t)&&zr.element(t.parentNode)&&zr.element(e)?(t.parentNode.replaceChild(e,t),e):null}function co(e,t){if(!zr.string(e)||zr.empty(e))return{};var n={},i=t;return e.split(",").forEach(function(e){var t=e.trim(),r=t.replace(".",""),o=t.replace(/[[\]]/g,"").split("="),a=o[0],s=o.length>1?o[1].replace(/["']/g,""):"";switch(t.charAt(0)){case".":zr.object(i)&&zr.string(i.class)&&(i.class+=" "+r),n.class=r;break;case"#":n.id=t.replace("#","");break;case"[":n[a]=s}}),n}function uo(e,t){if(zr.element(e)){var n=t;zr.boolean(n)||(n=!e.hasAttribute("hidden")),n?e.setAttribute("hidden",""):e.removeAttribute("hidden")}}function fo(e,t,n){if(zr.element(e)){var i="toggle";return void 0!==n&&(i=n?"add":"remove"),e.classList[i](t),e.classList.contains(t)}return null}function ho(e,t){return zr.element(e)&&e.classList.contains(t)}function po(e,t){var n={Element:Element};return(n.matches||n.webkitMatchesSelector||n.mozMatchesSelector||n.msMatchesSelector||function(){return Array.from(document.querySelectorAll(t)).includes(this)}).call(e,t)}function go(e){return this.elements.container.querySelectorAll(e)}function mo(e){return this.elements.container.querySelector(e)}function yo(){var e=document.activeElement;return e=e&&e!==document.body?document.querySelector(":focus"):null}var vo,bo,wo,ko=(vo=document.createElement("span"),bo={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},wo=Object.keys(bo).find(function(e){return void 0!==vo.style[e]}),!!zr.string(wo)&&bo[wo]);var To,So={isIE:!!document.documentMode,isWebkit:"WebkitAppearance"in document.documentElement.style&&!/Edge/.test(navigator.userAgent),isIPhone:/(iPhone|iPod)/gi.test(navigator.platform),isIos:/(iPad|iPhone|iPod)/gi.test(navigator.platform)},Eo={"audio/ogg":"vorbis","audio/wav":"1","video/webm":"vp8, vorbis","video/mp4":"avc1.42E01E, mp4a.40.2","video/ogg":"theora"},_o={audio:"canPlayType"in document.createElement("audio"),video:"canPlayType"in document.createElement("video"),check:function(e,t,n){var i=So.isIPhone&&n&&_o.playsinline,r=_o[e]||"html5"!==t;return{api:r,ui:r&&_o.rangeInput&&("video"!==e||!So.isIPhone||i)}},pip:!So.isIPhone&&zr.function(ro("video").webkitSetPresentationMode),airplay:zr.function(window.WebKitPlaybackTargetAvailabilityEvent),playsinline:"playsInline"in document.createElement("video"),mime:function(e){var t=e.split("/"),n=to(t,1)[0];if(!this.isHTML5||n!==this.type)return!1;var i=void 0;e&&e.includes("codecs=")?i=e:"audio/mpeg"===e?i="audio/mpeg;":e in Eo&&(i=e+'; codecs="'+Eo[e]+'"');try{return Boolean(i&&this.media.canPlayType(i).replace(/no/,""))}catch(e){return!1}},textTracks:"textTracks"in document.createElement("video"),rangeInput:(To=document.createElement("input"),To.type="range","range"===To.type),touch:"ontouchstart"in document.documentElement,transitions:!1!==ko,reducedMotion:"matchMedia"in window&&window.matchMedia("(prefers-reduced-motion)").matches},Ao={getSources:function(){var e=this;return this.isHTML5?Array.from(this.media.querySelectorAll("source")).filter(function(t){return _o.mime.call(e,t.getAttribute("type"))}):[]},getQualityOptions:function(){return Ao.getSources.call(this).map(function(e){return Number(e.getAttribute("size"))}).filter(Boolean)},extend:function(){if(this.isHTML5){var e=this;Object.defineProperty(e.media,"quality",{get:function(){var t=Ao.getSources.call(e).filter(function(t){return t.getAttribute("src")===e.source}),n=to(t,1)[0];return n&&Number(n.getAttribute("size"))},set:function(t){var n=Ao.getSources.call(e).find(function(e){return Number(e.getAttribute("size"))===t});if(n){var i=e.currentTime,r=e.playing;e.media.src=n.getAttribute("src");e.once("loadedmetadata",function(){e.currentTime=i}),e.media.load(),r&&e.play(),$r.call(e,e.media,"qualitychange",!1,{quality:t})}}})}},cancelRequests:function(){this.isHTML5&&(ao(Ao.getSources.call(this)),this.media.setAttribute("src",this.config.blankVideo),this.media.load(),this.debug.log("Cancelled network requests"))}};function Po(e,t){return t.split(".").reduce(function(e,t){return e&&e[t]},e)}function Mo(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length,n=Array(t>1?t-1:0),i=1;i<t;i++)n[i-1]=arguments[i];if(!n.length)return e;var r=n.shift();return zr.object(r)?(Object.keys(r).forEach(function(t){zr.object(r[t])?(Object.keys(e).includes(t)||Object.assign(e,eo({},t,{})),Mo(e[t],r[t])):Object.assign(e,eo({},t,r[t]))}),Mo.apply(void 0,[e].concat(n))):e}function Lo(e){for(var t=arguments.length,n=Array(t>1?t-1:0),i=1;i<t;i++)n[i-1]=arguments[i];return zr.empty(e)?e:e.toString().replace(/{(\d+)}/g,function(e,t){return n[t].toString()})}function xo(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"";return e.replace(new RegExp(t.toString().replace(/([.*+?^=!:${}()|[\]/\\])/g,"\\$1"),"g"),n.toString())}function Co(){return(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"").toString().replace(/\w\S*/g,function(e){return e.charAt(0).toUpperCase()+e.substr(1).toLowerCase()})}function Oo(){var e=(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"").toString();return(e=function(){var e=(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"").toString();return e=xo(e,"-"," "),e=xo(e,"_"," "),xo(e=Co(e)," ","")}(e)).charAt(0).toLowerCase()+e.slice(1)}function No(e){var t=document.createElement("div");return t.appendChild(e),t.innerHTML}var jo=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(zr.empty(e)||zr.empty(t))return"";var n=Po(t.i18n,e);if(zr.empty(n))return"";var i={"{seektime}":t.seekTime,"{title}":t.title};return Object.entries(i).forEach(function(e){var t=to(e,2),i=t[0],r=t[1];n=xo(n,i,r)}),n};function Io(e){return zr.array(e)?e.filter(function(t,n){return e.indexOf(t)===n}):e}var Fo=function(){function e(t){Xr(this,e),this.enabled=t.config.storage.enabled,this.key=t.config.storage.key}return Zr(e,[{key:"get",value:function(t){if(!e.supported||!this.enabled)return null;var n=window.localStorage.getItem(this.key);if(zr.empty(n))return null;var i=JSON.parse(n);return zr.string(t)&&t.length?i[t]:i}},{key:"set",value:function(t){if(e.supported&&this.enabled&&zr.object(t)){var n=this.get();zr.empty(n)&&(n={}),Mo(n,t),window.localStorage.setItem(this.key,JSON.stringify(n))}}}],[{key:"supported",get:function(){try{if(!("localStorage"in window))return!1;return window.localStorage.setItem("___test","___test"),window.localStorage.removeItem("___test"),!0}catch(e){return!1}}}]),e}();function Ro(e,t){if(zr.string(e)){var n=zr.string(t),i=function(){return null!==document.getElementById(t)},r=function(e,t){e.innerHTML=t,n&&i()||document.body.insertAdjacentElement("afterbegin",e)};if(!n||!i()){var o=Fo.supported,a=document.createElement("div");if(a.setAttribute("hidden",""),n&&a.setAttribute("id",t),o){var s=window.localStorage.getItem("cache-"+t);if(null!==s){var l=JSON.parse(s);r(a,l.content)}}fetch(e).then(function(e){zr.empty(e)||(o&&window.localStorage.setItem("cache-"+t,JSON.stringify({content:e})),r(a,e))}).catch(function(){})}}}var qo=function(e){return parseInt(e/60/60%60,10)},Vo=function(e){return parseInt(e/60%60,10)},Bo=function(e){return parseInt(e%60,10)};function Do(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if(!zr.number(e))return Do(null,t,n);var i=function(e){return("0"+e).slice(-2)},r=qo(e),o=Vo(e),a=Bo(e);return t||r>0?r+=":":r="",(n&&e>0?"-":"")+r+i(o)+":"+i(a)}var Uo={getIconUrl:function(){var e=new URL(this.config.iconUrl,window.location).host!==window.location.host||So.isIE&&!window.svg4everybody;return{url:this.config.iconUrl,cors:e}},findElements:function(){try{return this.elements.controls=mo.call(this,this.config.selectors.controls.wrapper),this.elements.buttons={play:go.call(this,this.config.selectors.buttons.play),pause:mo.call(this,this.config.selectors.buttons.pause),restart:mo.call(this,this.config.selectors.buttons.restart),rewind:mo.call(this,this.config.selectors.buttons.rewind),fastForward:mo.call(this,this.config.selectors.buttons.fastForward),mute:mo.call(this,this.config.selectors.buttons.mute),pip:mo.call(this,this.config.selectors.buttons.pip),airplay:mo.call(this,this.config.selectors.buttons.airplay),settings:mo.call(this,this.config.selectors.buttons.settings),captions:mo.call(this,this.config.selectors.buttons.captions),fullscreen:mo.call(this,this.config.selectors.buttons.fullscreen)},this.elements.progress=mo.call(this,this.config.selectors.progress),this.elements.inputs={seek:mo.call(this,this.config.selectors.inputs.seek),volume:mo.call(this,this.config.selectors.inputs.volume)},this.elements.display={buffer:mo.call(this,this.config.selectors.display.buffer),currentTime:mo.call(this,this.config.selectors.display.currentTime),duration:mo.call(this,this.config.selectors.display.duration)},zr.element(this.elements.progress)&&(this.elements.display.seekTooltip=this.elements.progress.querySelector("."+this.config.classNames.tooltip)),!0}catch(e){return this.debug.warn("It looks like there is a problem with your custom controls HTML",e),this.toggleNativeControls(!0),!1}},createIcon:function(e,t){var n=Uo.getIconUrl.call(this),i=(n.cors?"":n.url)+"#"+this.config.iconPrefix,r=document.createElementNS("http://www.w3.org/2000/svg","svg");io(r,Mo(t,{role:"presentation",focusable:"false"}));var o=document.createElementNS("http://www.w3.org/2000/svg","use"),a=i+"-"+e;return"href"in o?o.setAttributeNS("http://www.w3.org/1999/xlink","href",a):o.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href",a),r.appendChild(o),r},createLabel:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n={pip:"PIP",airplay:"AirPlay"}[e]||jo(e,this.config);return ro("span",Object.assign({},t,{class:[t.class,this.config.classNames.hidden].filter(Boolean).join(" ")}),n)},createBadge:function(e){if(zr.empty(e))return null;var t=ro("span",{class:this.config.classNames.menu.value});return t.appendChild(ro("span",{class:this.config.classNames.menu.badge},e)),t},createButton:function(e,t){var n=ro("button"),i=Object.assign({},t),r=Oo(e),o=!1,a=void 0,s=void 0,l=void 0,c=void 0;switch("type"in i||(i.type="button"),"class"in i?i.class.includes(this.config.classNames.control)&&(i.class+=" "+this.config.classNames.control):i.class=this.config.classNames.control,e){case"play":o=!0,a="play",l="pause",s="play",c="pause";break;case"mute":o=!0,a="mute",l="unmute",s="volume",c="muted";break;case"captions":o=!0,a="enableCaptions",l="disableCaptions",s="captions-off",c="captions-on";break;case"fullscreen":o=!0,a="enterFullscreen",l="exitFullscreen",s="enter-fullscreen",c="exit-fullscreen";break;case"play-large":i.class+=" "+this.config.classNames.control+"--overlaid",r="play",a="play",s="play";break;default:a=r,s=e}o?(n.appendChild(Uo.createIcon.call(this,c,{class:"icon--pressed"})),n.appendChild(Uo.createIcon.call(this,s,{class:"icon--not-pressed"})),n.appendChild(Uo.createLabel.call(this,l,{class:"label--pressed"})),n.appendChild(Uo.createLabel.call(this,a,{class:"label--not-pressed"}))):(n.appendChild(Uo.createIcon.call(this,s)),n.appendChild(Uo.createLabel.call(this,a))),Mo(i,co(this.config.selectors.buttons[r],i)),io(n,i),"play"===r?(zr.array(this.elements.buttons[r])||(this.elements.buttons[r]=[]),this.elements.buttons[r].push(n)):this.elements.buttons[r]=n;var u=this.config.classNames.controlPressed;return Object.defineProperty(n,"pressed",{enumerable:!0,get:function(){return ho(n,u)},set:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];fo(n,u,e)}}),n},createRange:function(e,t){var n=ro("input",Mo(co(this.config.selectors.inputs[e]),{type:"range",min:0,max:100,step:.01,value:0,autocomplete:"off",role:"slider","aria-label":jo(e,this.config),"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":0},t));return this.elements.inputs[e]=n,Uo.updateRangeFill.call(this,n),n},createProgress:function(e,t){var n=ro("progress",Mo(co(this.config.selectors.display[e]),{min:0,max:100,value:0,role:"presentation","aria-hidden":!0},t));if("volume"!==e){n.appendChild(ro("span",null,"0"));var i={played:"played",buffer:"buffered"}[e],r=i?jo(i,this.config):"";n.innerText="% "+r.toLowerCase()}return this.elements.display[e]=n,n},createTime:function(e){var t=co(this.config.selectors.display[e]),n=ro("div",Mo(t,{class:"plyr__time "+t.class,"aria-label":jo(e,this.config)}),"00:00");return this.elements.display[e]=n,n},createMenuItem:function(e){var t=e.value,n=e.list,i=e.type,r=e.title,o=e.badge,a=void 0===o?null:o,s=e.checked,l=void 0!==s&&s,c=ro("li"),u=ro("label",{class:this.config.classNames.control}),f=ro("input",Mo(co(this.config.selectors.inputs[i]),{type:"radio",name:"plyr-"+i,value:t,checked:l,class:"plyr__sr-only"})),h=ro("span",{hidden:""});u.appendChild(f),u.appendChild(h),u.insertAdjacentHTML("beforeend",r),zr.element(a)&&u.appendChild(a),c.appendChild(u),n.appendChild(c)},formatTime:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return zr.number(e)?Do(e,qo(this.duration)>0,t):e},updateTimeDisplay:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];zr.element(e)&&zr.number(t)&&(e.innerText=Uo.formatTime(t,n))},updateVolume:function(){this.supported.ui&&(zr.element(this.elements.inputs.volume)&&Uo.setRange.call(this,this.elements.inputs.volume,this.muted?0:this.volume),zr.element(this.elements.buttons.mute)&&(this.elements.buttons.mute.pressed=this.muted||0===this.volume))},setRange:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;zr.element(e)&&(e.value=t,Uo.updateRangeFill.call(this,e))},updateProgress:function(e){var t=this;if(this.supported.ui&&zr.event(e)){var n,i,r=0;if(e)switch(e.type){case"timeupdate":case"seeking":case"seeked":n=this.currentTime,i=this.duration,r=0===n||0===i||Number.isNaN(n)||Number.isNaN(i)?0:(n/i*100).toFixed(2),"timeupdate"===e.type&&Uo.setRange.call(this,this.elements.inputs.seek,r);break;case"playing":case"progress":!function(e,n){var i=zr.number(n)?n:0,r=zr.element(e)?e:t.elements.display.buffer;if(zr.element(r)){r.value=i;var o=r.getElementsByTagName("span")[0];zr.element(o)&&(o.childNodes[0].nodeValue=i)}}(this.elements.display.buffer,100*this.buffered)}}},updateRangeFill:function(e){var t=zr.event(e)?e.target:e;if(zr.element(t)&&"range"===t.getAttribute("type")){if(po(t,this.config.selectors.inputs.seek)){t.setAttribute("aria-valuenow",this.currentTime);var n=Uo.formatTime(this.currentTime),i=Uo.formatTime(this.duration),r=jo("seekLabel",this.config);t.setAttribute("aria-valuetext",r.replace("{currentTime}",n).replace("{duration}",i))}else if(po(t,this.config.selectors.inputs.volume)){var o=100*t.value;t.setAttribute("aria-valuenow",o),t.setAttribute("aria-valuetext",o+"%")}else t.setAttribute("aria-valuenow",t.value);So.isWebkit&&t.style.setProperty("--value",t.value/t.max*100+"%")}},updateSeekTooltip:function(e){var t=this;if(this.config.tooltips.seek&&zr.element(this.elements.inputs.seek)&&zr.element(this.elements.display.seekTooltip)&&0!==this.duration){var n=0,i=this.elements.progress.getBoundingClientRect(),r=this.config.classNames.tooltip+"--visible",o=function(e){fo(t.elements.display.seekTooltip,r,e)};if(this.touch)o(!1);else{if(zr.event(e))n=100/i.width*(e.pageX-i.left);else{if(!ho(this.elements.display.seekTooltip,r))return;n=parseFloat(this.elements.display.seekTooltip.style.left,10)}n<0?n=0:n>100&&(n=100),Uo.updateTimeDisplay.call(this,this.elements.display.seekTooltip,this.duration/100*n),this.elements.display.seekTooltip.style.left=n+"%",zr.event(e)&&["mouseenter","mouseleave"].includes(e.type)&&o("mouseenter"===e.type)}}},timeUpdate:function(e){var t=!zr.element(this.elements.display.duration)&&this.config.invertTime;Uo.updateTimeDisplay.call(this,this.elements.display.currentTime,t?this.duration-this.currentTime:this.currentTime,t),e&&"timeupdate"===e.type&&this.media.seeking||Uo.updateProgress.call(this,e)},durationUpdate:function(){if(this.supported.ui&&(this.config.invertTime||!this.currentTime)){zr.element(this.elements.inputs.seek)&&this.elements.inputs.seek.setAttribute("aria-valuemax",this.duration);var e=zr.element(this.elements.display.duration);!e&&this.config.displayDuration&&this.paused&&Uo.updateTimeDisplay.call(this,this.elements.display.currentTime,this.duration),e&&Uo.updateTimeDisplay.call(this,this.elements.display.duration,this.duration),Uo.updateSeekTooltip.call(this)}},toggleTab:function(e,t){uo(this.elements.settings.tabs[e],!t)},setQualityMenu:function(e){var t=this;if(zr.element(this.elements.settings.panes.quality)){var n=this.elements.settings.panes.quality.querySelector("ul");zr.array(e)&&(this.options.quality=Io(e).filter(function(e){return t.config.quality.options.includes(e)}));var i=!zr.empty(this.options.quality)&&this.options.quality.length>1;if(Uo.toggleTab.call(this,"quality",i),Uo.checkMenu.call(this),i){so(n);this.options.quality.sort(function(e,n){var i=t.config.quality.options;return i.indexOf(e)>i.indexOf(n)?1:-1}).forEach(function(e){Uo.createMenuItem.call(t,{value:e,list:n,type:"quality",title:Uo.getLabel.call(t,"quality",e),badge:function(e){var n=jo("qualityBadge."+e,t.config);return n.length?Uo.createBadge.call(t,n):null}(e)})}),Uo.updateSetting.call(this,"quality",n)}}},getLabel:function(e,t){switch(e){case"speed":return 1===t?jo("normal",this.config):t+"&times;";case"quality":if(zr.number(t)){var n=jo("qualityLabel."+t,this.config);return n.length?n:t+"p"}return Co(t);case"captions":return Go.getLabel.call(this);default:return null}},updateSetting:function(e,t,n){var i=this.elements.settings.panes[e],r=null,o=t;if("captions"===e)r=this.currentTrack;else{if(r=zr.empty(n)?this[e]:n,zr.empty(r)&&(r=this.config[e].default),!zr.empty(this.options[e])&&!this.options[e].includes(r))return void this.debug.warn("Unsupported value of '"+r+"' for "+e);if(!this.config[e].options.includes(r))return void this.debug.warn("Disabled value of '"+r+"' for "+e)}if(zr.element(o)||(o=i&&i.querySelector("ul")),zr.element(o)){this.elements.settings.tabs[e].querySelector("."+this.config.classNames.menu.value).innerHTML=Uo.getLabel.call(this,e,r);var a=o&&o.querySelector('input[value="'+r+'"]');zr.element(a)&&(a.checked=!0)}},setCaptionsMenu:function(){var e=this,t=this.elements.settings.panes.captions.querySelector("ul"),n=Go.getTracks.call(this);if(Uo.toggleTab.call(this,"captions",n.length),so(t),Uo.checkMenu.call(this),n.length){var i=n.map(function(n,i){return{value:i,checked:e.captions.toggled&&e.currentTrack===i,title:Go.getLabel.call(e,n),badge:n.language&&Uo.createBadge.call(e,n.language.toUpperCase()),list:t,type:"language"}});i.unshift({value:-1,checked:!this.captions.toggled,title:jo("disabled",this.config),list:t,type:"language"}),i.forEach(Uo.createMenuItem.bind(this)),Uo.updateSetting.call(this,"captions",t)}},setSpeedMenu:function(e){var t=this;if(this.config.controls.includes("settings")&&this.config.settings.includes("speed")&&zr.element(this.elements.settings.panes.speed)){zr.array(e)?this.options.speed=e:(this.isHTML5||this.isVimeo)&&(this.options.speed=[.5,.75,1,1.25,1.5,1.75,2]),this.options.speed=this.options.speed.filter(function(e){return t.config.speed.options.includes(e)});var n=!zr.empty(this.options.speed)&&this.options.speed.length>1;if(Uo.toggleTab.call(this,"speed",n),Uo.checkMenu.call(this),n){var i=this.elements.settings.panes.speed.querySelector("ul");so(i),this.options.speed.forEach(function(e){Uo.createMenuItem.call(t,{value:e,list:i,type:"speed",title:Uo.getLabel.call(t,"speed",e)})}),Uo.updateSetting.call(this,"speed",i)}}},checkMenu:function(){var e=this.elements.settings.tabs,t=!zr.empty(e)&&Object.values(e).some(function(e){return!e.hidden});uo(this.elements.settings.menu,!t)},toggleMenu:function(e){var t=this.elements.settings.form,n=this.elements.buttons.settings;if(zr.element(t)&&zr.element(n)){var i=zr.boolean(e)?e:zr.element(t)&&t.hasAttribute("hidden");if(zr.event(e)){var r=zr.element(t)&&t.contains(e.target),o=e.target===this.elements.buttons.settings;if(r||!r&&!o&&i)return;o&&e.stopPropagation()}zr.element(n)&&n.setAttribute("aria-expanded",i),zr.element(t)&&(uo(t,!i),fo(this.elements.container,this.config.classNames.menu.open,i),i?t.removeAttribute("tabindex"):t.setAttribute("tabindex",-1))}},getTabSize:function(e){var t=e.cloneNode(!0);t.style.position="absolute",t.style.opacity=0,t.removeAttribute("hidden"),Array.from(t.querySelectorAll("input[name]")).forEach(function(e){var t=e.getAttribute("name");e.setAttribute("name",t+"-clone")}),e.parentNode.appendChild(t);var n=t.scrollWidth,i=t.scrollHeight;return ao(t),{width:n,height:i}},showTab:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",n=this.elements.settings.menu,i=document.getElementById(t);if(zr.element(i)&&"tabpanel"===i.getAttribute("role")){var r=n.querySelector('[role="tabpanel"]:not([hidden])'),o=r.parentNode;if(Array.from(n.querySelectorAll('[aria-controls="'+r.getAttribute("id")+'"]')).forEach(function(e){e.setAttribute("aria-expanded",!1)}),_o.transitions&&!_o.reducedMotion){o.style.width=r.scrollWidth+"px",o.style.height=r.scrollHeight+"px";var a=Uo.getTabSize.call(this,i);Kr.call(this,o,ko,function t(n){n.target===o&&["width","height"].includes(n.propertyName)&&(o.style.width="",o.style.height="",Qr.call(e,o,ko,t))}),o.style.width=a.width+"px",o.style.height=a.height+"px"}uo(r,!0),r.setAttribute("tabindex",-1),uo(i,!1);var s=go.call(this,'[aria-controls="'+t+'"]');Array.from(s).forEach(function(e){e.setAttribute("aria-expanded",!0)}),i.removeAttribute("tabindex"),i.querySelectorAll("button:not(:disabled), input:not(:disabled), [tabindex]")[0].focus()}},create:function(e){var t=this;if(zr.empty(this.config.controls))return null;var n=ro("div",co(this.config.selectors.controls.wrapper));if(this.config.controls.includes("restart")&&n.appendChild(Uo.createButton.call(this,"restart")),this.config.controls.includes("rewind")&&n.appendChild(Uo.createButton.call(this,"rewind")),this.config.controls.includes("play")&&n.appendChild(Uo.createButton.call(this,"play")),this.config.controls.includes("fast-forward")&&n.appendChild(Uo.createButton.call(this,"fast-forward")),this.config.controls.includes("progress")){var i=ro("div",co(this.config.selectors.progress));if(i.appendChild(Uo.createRange.call(this,"seek",{id:"plyr-seek-"+e.id})),i.appendChild(Uo.createProgress.call(this,"buffer")),this.config.tooltips.seek){var r=ro("span",{class:this.config.classNames.tooltip},"00:00");i.appendChild(r),this.elements.display.seekTooltip=r}this.elements.progress=i,n.appendChild(this.elements.progress)}if(this.config.controls.includes("current-time")&&n.appendChild(Uo.createTime.call(this,"currentTime")),this.config.controls.includes("duration")&&n.appendChild(Uo.createTime.call(this,"duration")),this.config.controls.includes("mute")&&n.appendChild(Uo.createButton.call(this,"mute")),this.config.controls.includes("volume")){var o=ro("div",{class:"plyr__volume"}),a={max:1,step:.05,value:this.config.volume};o.appendChild(Uo.createRange.call(this,"volume",Mo(a,{id:"plyr-volume-"+e.id}))),this.elements.volume=o,n.appendChild(o)}if(this.config.controls.includes("captions")&&n.appendChild(Uo.createButton.call(this,"captions")),this.config.controls.includes("settings")&&!zr.empty(this.config.settings)){var s=ro("div",{class:"plyr__menu",hidden:""});s.appendChild(Uo.createButton.call(this,"settings",{id:"plyr-settings-toggle-"+e.id,"aria-haspopup":!0,"aria-controls":"plyr-settings-"+e.id,"aria-expanded":!1}));var l=ro("form",{class:"plyr__menu__container",id:"plyr-settings-"+e.id,hidden:"","aria-labelled-by":"plyr-settings-toggle-"+e.id,role:"tablist",tabindex:-1}),c=ro("div"),u=ro("div",{id:"plyr-settings-"+e.id+"-home","aria-labelled-by":"plyr-settings-toggle-"+e.id,role:"tabpanel"}),f=ro("ul",{role:"tablist"});this.config.settings.forEach(function(n){var i=ro("li",{role:"tab",hidden:""}),r=ro("button",Mo(co(t.config.selectors.buttons.settings),{type:"button",class:t.config.classNames.control+" "+t.config.classNames.control+"--forward",id:"plyr-settings-"+e.id+"-"+n+"-tab","aria-haspopup":!0,"aria-controls":"plyr-settings-"+e.id+"-"+n,"aria-expanded":!1}),jo(n,t.config)),o=ro("span",{class:t.config.classNames.menu.value});o.innerHTML=e[n],r.appendChild(o),i.appendChild(r),f.appendChild(i),t.elements.settings.tabs[n]=i}),u.appendChild(f),c.appendChild(u),this.config.settings.forEach(function(n){var i=ro("div",{id:"plyr-settings-"+e.id+"-"+n,hidden:"","aria-labelled-by":"plyr-settings-"+e.id+"-"+n+"-tab",role:"tabpanel",tabindex:-1}),r=ro("button",{type:"button",class:t.config.classNames.control+" "+t.config.classNames.control+"--back","aria-haspopup":!0,"aria-controls":"plyr-settings-"+e.id+"-home","aria-expanded":!1},jo(n,t.config));i.appendChild(r);var o=ro("ul");i.appendChild(o),c.appendChild(i),t.elements.settings.panes[n]=i}),l.appendChild(c),s.appendChild(l),n.appendChild(s),this.elements.settings.form=l,this.elements.settings.menu=s}return this.config.controls.includes("pip")&&_o.pip&&n.appendChild(Uo.createButton.call(this,"pip")),this.config.controls.includes("airplay")&&_o.airplay&&n.appendChild(Uo.createButton.call(this,"airplay")),this.config.controls.includes("fullscreen")&&n.appendChild(Uo.createButton.call(this,"fullscreen")),this.config.controls.includes("play-large")&&this.elements.container.appendChild(Uo.createButton.call(this,"play-large")),this.elements.controls=n,this.isHTML5&&Uo.setQualityMenu.call(this,Ao.getQualityOptions.call(this)),Uo.setSpeedMenu.call(this),n},inject:function(){var e=this;if(this.config.loadSprite){var t=Uo.getIconUrl.call(this);t.cors&&Ro(t.url,"sprite-plyr")}this.id=Math.floor(1e4*Math.random());var n=null;this.elements.controls=null;var i={id:this.id,seektime:this.config.seekTime,title:this.config.title},r=!0;zr.string(this.config.controls)||zr.element(this.config.controls)?n=this.config.controls:zr.function(this.config.controls)?n=this.config.controls.call(this,i):(n=Uo.create.call(this,{id:this.id,seektime:this.config.seekTime,speed:this.speed,quality:this.quality,captions:Go.getLabel.call(this)}),r=!1);var o=function(e){var t=e;return Object.entries(i).forEach(function(e){var n=to(e,2),i=n[0],r=n[1];t=xo(t,"{"+i+"}",r)}),t};r&&(zr.string(this.config.controls)?n=o(n):zr.element(n)&&(n.innerHTML=o(n.innerHTML)));var a,s=void 0;if(zr.string(this.config.selectors.controls.container)&&(s=document.querySelector(this.config.selectors.controls.container)),zr.element(s)||(s=this.elements.container),zr.element(n)?s.appendChild(n):n&&s.insertAdjacentHTML("beforeend",n),zr.element(this.elements.controls)||Uo.findElements.call(this),window.navigator.userAgent.includes("Edge")&&(a=s,setTimeout(function(){uo(a,!0),a.offsetHeight,uo(a,!1)},0)),this.config.tooltips.controls){var l=this.config,c=l.classNames,u=l.selectors,f=u.controls.wrapper+" "+u.labels+" ."+c.hidden,h=go.call(this,f);Array.from(h).forEach(function(t){fo(t,e.config.classNames.hidden,!1),fo(t,e.config.classNames.tooltip,!0)})}}};function Ho(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"text";return new Promise(function(n,i){try{var r=new XMLHttpRequest;if(!("withCredentials"in r))return;r.addEventListener("load",function(){if("text"===t)try{n(JSON.parse(r.responseText))}catch(e){n(r.responseText)}else n(r.response)}),r.addEventListener("error",function(){throw new Error(r.statusText)}),r.open("GET",e,!0),r.responseType=t,r.send()}catch(e){i(e)}})}function Wo(e){var t=e;if(!(arguments.length>1&&void 0!==arguments[1])||arguments[1]){var n=document.createElement("a");n.href=t,t=n.href}try{return new URL(t)}catch(e){return null}}function zo(e){var t=new URLSearchParams;return zr.object(e)&&Object.entries(e).forEach(function(e){var n=to(e,2),i=n[0],r=n[1];t.set(i,r)}),t}var Go={setup:function(){if(this.supported.ui)if(!this.isVideo||this.isYouTube||this.isHTML5&&!_o.textTracks)zr.array(this.config.controls)&&this.config.controls.includes("settings")&&this.config.settings.includes("captions")&&Uo.setCaptionsMenu.call(this);else{var e,t;if(zr.element(this.elements.captions)||(this.elements.captions=ro("div",co(this.config.selectors.captions)),e=this.elements.captions,(t=this.elements.wrapper).parentNode.insertBefore(e,t.nextSibling)),So.isIE&&window.URL){var n=this.media.querySelectorAll("track");Array.from(n).forEach(function(e){var t=e.getAttribute("src"),n=Wo(t);null!==n&&n.hostname!==window.location.href.hostname&&["http:","https:"].includes(n.protocol)&&Ho(t,"blob").then(function(t){e.setAttribute("src",window.URL.createObjectURL(t))}).catch(function(){ao(e)})})}var i=Io(Array.from(navigator.languages||navigator.userLanguage).map(function(e){return e.split("-")[0]})),r=(this.storage.get("language")||this.config.captions.language||"auto").toLowerCase();if("auto"===r)r=to(i,1)[0];var o=this.storage.get("captions");if(zr.boolean(o)||(o=this.config.captions.active),Object.assign(this.captions,{toggled:!1,active:o,language:r,languages:i}),this.isHTML5){var a=this.config.captions.update?"addtrack removetrack":"removetrack";Kr.call(this,this.media.textTracks,a,Go.update.bind(this))}setTimeout(Go.update.bind(this),0)}},update:function(){var e=this,t=Go.getTracks.call(this,!0),n=this.captions,i=n.active,r=n.language,o=n.meta,a=n.currentTrackNode,s=Boolean(t.find(function(e){return e.language===r}));this.isHTML5&&this.isVideo&&t.filter(function(e){return!o.get(e)}).forEach(function(t){e.debug.log("Track added",t),o.set(t,{default:"showing"===t.mode}),t.mode="hidden",Kr.call(e,t,"cuechange",function(){return Go.updateCues.call(e)})}),(s&&this.language!==r||!t.includes(a))&&(Go.setLanguage.call(this,r),Go.toggle.call(this,i&&s)),fo(this.elements.container,this.config.classNames.captions.enabled,!zr.empty(t)),(this.config.controls||[]).includes("settings")&&this.config.settings.includes("captions")&&Uo.setCaptionsMenu.call(this)},toggle:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(this.supported.ui){var n=this.captions.toggled,i=this.config.classNames.captions.active,r=zr.nullOrUndefined(e)?!n:e;if(r!==n){if(t||(this.captions.active=r,this.storage.set({captions:r})),!this.language&&r&&!t){var o=Go.getTracks.call(this),a=Go.findTrack.call(this,[this.captions.language].concat(function(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t<e.length;t++)n[t]=e[t];return n}return Array.from(e)}(this.captions.languages)),!0);return this.captions.language=a.language,void Go.set.call(this,o.indexOf(a))}this.elements.buttons.captions.pressed=r,fo(this.elements.container,i,r),this.captions.toggled=r,Uo.updateSetting.call(this,"captions"),$r.call(this,this.media,r?"captionsenabled":"captionsdisabled")}}},set:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],n=Go.getTracks.call(this);if(-1!==e)if(zr.number(e))if(e in n){if(this.captions.currentTrack!==e){this.captions.currentTrack=e;var i=n[e],r=(i||{}).language;this.captions.currentTrackNode=i,Uo.updateSetting.call(this,"captions"),t||(this.captions.language=r,this.storage.set({language:r})),this.isVimeo&&this.embed.enableTextTrack(r),$r.call(this,this.media,"languagechange")}Go.toggle.call(this,!0,t),this.isHTML5&&this.isVideo&&Go.updateCues.call(this)}else this.debug.warn("Track not found",e);else this.debug.warn("Invalid caption argument",e);else Go.toggle.call(this,!1,t)},setLanguage:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(zr.string(e)){var n=e.toLowerCase();this.captions.language=n;var i=Go.getTracks.call(this),r=Go.findTrack.call(this,[n]);Go.set.call(this,i.indexOf(r),t)}else this.debug.warn("Invalid language argument",e)},getTracks:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return Array.from((this.media||{}).textTracks||[]).filter(function(n){return!e.isHTML5||t||e.captions.meta.has(n)}).filter(function(e){return["captions","subtitles"].includes(e.kind)})},findTrack:function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=Go.getTracks.call(this),r=function(e){return Number((t.captions.meta.get(e)||{}).default)},o=Array.from(i).sort(function(e,t){return r(t)-r(e)}),a=void 0;return e.every(function(e){return!(a=o.find(function(t){return t.language===e}))}),a||(n?o[0]:void 0)},getCurrentTrack:function(){return Go.getTracks.call(this)[this.currentTrack]},getLabel:function(e){var t=e;return!zr.track(t)&&_o.textTracks&&this.captions.toggled&&(t=Go.getCurrentTrack.call(this)),zr.track(t)?zr.empty(t.label)?zr.empty(t.language)?jo("enabled",this.config):e.language.toUpperCase():t.label:jo("disabled",this.config)},updateCues:function(e){if(this.supported.ui)if(zr.element(this.elements.captions))if(zr.nullOrUndefined(e)||Array.isArray(e)){var t=e;if(!t){var n=Go.getCurrentTrack.call(this);t=Array.from((n||{}).activeCues||[]).map(function(e){return e.getCueAsHTML()}).map(No)}var i=t.map(function(e){return e.trim()}).join("\n");if(i!==this.elements.captions.innerHTML){so(this.elements.captions);var r=ro("span",co(this.config.selectors.caption));r.innerHTML=i,this.elements.captions.appendChild(r),$r.call(this,this.media,"cuechange")}}else this.debug.warn("updateCues: Invalid input",e);else this.debug.warn("No captions element to render to")}},Yo={enabled:!0,title:"",debug:!1,autoplay:!1,autopause:!0,playsinline:!0,seekTime:10,volume:1,muted:!1,duration:null,displayDuration:!0,invertTime:!0,toggleInvert:!0,ratio:"16:9",clickToPlay:!0,hideControls:!0,resetOnEnd:!1,disableContextMenu:!0,loadSprite:!0,iconPrefix:"plyr",iconUrl:"https://cdn.plyr.io/3.3.12/plyr.svg",blankVideo:"https://cdn.plyr.io/static/blank.mp4",quality:{default:576,options:[4320,2880,2160,1440,1080,720,576,480,360,240,"default"]},loop:{active:!1},speed:{selected:1,options:[.5,.75,1,1.25,1.5,1.75,2]},keyboard:{focused:!0,global:!1},tooltips:{controls:!1,seek:!0},captions:{active:!1,language:"auto",update:!1},fullscreen:{enabled:!0,fallback:!0,iosNative:!1},storage:{enabled:!0,key:"plyr"},controls:["play-large","play","progress","current-time","mute","volume","captions","settings","pip","airplay","fullscreen"],settings:["captions","quality","speed"],i18n:{restart:"Restart",rewind:"Rewind {seektime}s",play:"Play",pause:"Pause",fastForward:"Forward {seektime}s",seek:"Seek",seekLabel:"{currentTime} of {duration}",played:"Played",buffered:"Buffered",currentTime:"Current time",duration:"Duration",volume:"Volume",mute:"Mute",unmute:"Unmute",enableCaptions:"Enable captions",disableCaptions:"Disable captions",enterFullscreen:"Enter fullscreen",exitFullscreen:"Exit fullscreen",frameTitle:"Player for {title}",captions:"Captions",settings:"Settings",menuBack:"Go back to previous menu",speed:"Speed",normal:"Normal",quality:"Quality",loop:"Loop",start:"Start",end:"End",all:"All",reset:"Reset",disabled:"Disabled",enabled:"Enabled",advertisement:"Ad",qualityBadge:{2160:"4K",1440:"HD",1080:"HD",720:"HD",576:"SD",480:"SD"}},urls:{vimeo:{sdk:"https://player.vimeo.com/api/player.js",iframe:"https://player.vimeo.com/video/{0}?{1}",api:"https://vimeo.com/api/v2/video/{0}.json"},youtube:{sdk:"https://www.youtube.com/iframe_api",api:"https://www.googleapis.com/youtube/v3/videos?id={0}&key={1}&fields=items(snippet(title))&part=snippet"},googleIMA:{sdk:"https://imasdk.googleapis.com/js/sdkloader/ima3.js"}},listeners:{seek:null,play:null,pause:null,restart:null,rewind:null,fastForward:null,mute:null,volume:null,captions:null,fullscreen:null,pip:null,airplay:null,speed:null,quality:null,loop:null,language:null},events:["ended","progress","stalled","playing","waiting","canplay","canplaythrough","loadstart","loadeddata","loadedmetadata","timeupdate","volumechange","play","pause","error","seeking","seeked","emptied","ratechange","cuechange","enterfullscreen","exitfullscreen","captionsenabled","captionsdisabled","languagechange","controlshidden","controlsshown","ready","statechange","qualitychange","qualityrequested","adsloaded","adscontentpause","adscontentresume","adstarted","adsmidpoint","adscomplete","adsallcomplete","adsimpression","adsclick"],selectors:{editable:"input, textarea, select, [contenteditable]",container:".plyr",controls:{container:null,wrapper:".plyr__controls"},labels:"[data-plyr]",buttons:{play:'[data-plyr="play"]',pause:'[data-plyr="pause"]',restart:'[data-plyr="restart"]',rewind:'[data-plyr="rewind"]',fastForward:'[data-plyr="fast-forward"]',mute:'[data-plyr="mute"]',captions:'[data-plyr="captions"]',fullscreen:'[data-plyr="fullscreen"]',pip:'[data-plyr="pip"]',airplay:'[data-plyr="airplay"]',settings:'[data-plyr="settings"]',loop:'[data-plyr="loop"]'},inputs:{seek:'[data-plyr="seek"]',volume:'[data-plyr="volume"]',speed:'[data-plyr="speed"]',language:'[data-plyr="language"]',quality:'[data-plyr="quality"]'},display:{currentTime:".plyr__time--current",duration:".plyr__time--duration",buffer:".plyr__progress__buffer",loop:".plyr__progress__loop",volume:".plyr__volume--display"},progress:".plyr__progress",captions:".plyr__captions",caption:".plyr__caption",menu:{quality:".js-plyr__menu__list--quality"}},classNames:{type:"plyr--{0}",provider:"plyr--{0}",video:"plyr__video-wrapper",embed:"plyr__video-embed",embedContainer:"plyr__video-embed__container",poster:"plyr__poster",posterEnabled:"plyr__poster-enabled",ads:"plyr__ads",control:"plyr__control",controlPressed:"plyr__control--pressed",playing:"plyr--playing",paused:"plyr--paused",stopped:"plyr--stopped",loading:"plyr--loading",hover:"plyr--hover",tooltip:"plyr__tooltip",cues:"plyr__cues",hidden:"plyr__sr-only",hideControls:"plyr--hide-controls",isIos:"plyr--is-ios",isTouch:"plyr--is-touch",uiSupported:"plyr--full-ui",noTransition:"plyr--no-transition",menu:{value:"plyr__menu__value",badge:"plyr__badge",open:"plyr--menu-open"},captions:{enabled:"plyr--captions-enabled",active:"plyr--captions-active"},fullscreen:{enabled:"plyr--fullscreen-enabled",fallback:"plyr--fullscreen-fallback"},pip:{supported:"plyr--pip-supported",active:"plyr--pip-active"},airplay:{supported:"plyr--airplay-supported",active:"plyr--airplay-active"},tabFocus:"plyr__tab-focus"},attributes:{embed:{provider:"data-plyr-provider",id:"data-plyr-embed-id"}},keys:{google:null},ads:{enabled:!1,publisherId:""}},Ko={html5:"html5",youtube:"youtube",vimeo:"vimeo"},Qo={audio:"audio",video:"video"};var Jo=function(){},$o=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];Xr(this,e),this.enabled=window.console&&t,this.enabled&&this.log("Debugging enabled")}return Zr(e,[{key:"log",get:function(){return this.enabled?Function.prototype.bind.call(console.log,console):Jo}},{key:"warn",get:function(){return this.enabled?Function.prototype.bind.call(console.warn,console):Jo}},{key:"error",get:function(){return this.enabled?Function.prototype.bind.call(console.error,console):Jo}}]),e}();function Xo(){if(this.enabled){var e=this.player.elements.buttons.fullscreen;zr.element(e)&&(e.pressed=this.active),$r.call(this.player,this.target,this.active?"enterfullscreen":"exitfullscreen",!0),So.isIos||function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(zr.element(e)){var n=go.call(this,"button:not(:disabled), input:not(:disabled), [tabindex]"),i=n[0],r=n[n.length-1];Yr.call(this,this.elements.container,"keydown",function(e){if("Tab"===e.key&&9===e.keyCode){var t=yo();t!==r||e.shiftKey?t===i&&e.shiftKey&&(r.focus(),e.preventDefault()):(i.focus(),e.preventDefault())}},t,!1)}}.call(this.player,this.target,this.active)}}function Zo(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];e?this.scrollPosition={x:window.scrollX||0,y:window.scrollY||0}:window.scrollTo(this.scrollPosition.x,this.scrollPosition.y),document.body.style.overflow=e?"hidden":"",fo(this.target,this.player.config.classNames.fullscreen.fallback,e),Xo.call(this)}var ea=function(){function e(t){var n=this;Xr(this,e),this.player=t,this.prefix=e.prefix,this.property=e.property,this.scrollPosition={x:0,y:0},Kr.call(this.player,document,"ms"===this.prefix?"MSFullscreenChange":this.prefix+"fullscreenchange",function(){Xo.call(n)}),Kr.call(this.player,this.player.elements.container,"dblclick",function(e){zr.element(n.player.elements.controls)&&n.player.elements.controls.contains(e.target)||n.toggle()}),this.update()}return Zr(e,[{key:"update",value:function(){this.enabled?this.player.debug.log((e.native?"Native":"Fallback")+" fullscreen enabled"):this.player.debug.log("Fullscreen not supported and fallback disabled"),fo(this.player.elements.container,this.player.config.classNames.fullscreen.enabled,this.enabled)}},{key:"enter",value:function(){this.enabled&&(So.isIos&&this.player.config.fullscreen.iosNative?this.player.playing&&this.target.webkitEnterFullscreen():e.native?this.prefix?zr.empty(this.prefix)||this.target[this.prefix+"Request"+this.property]():this.target.requestFullscreen():Zo.call(this,!0))}},{key:"exit",value:function(){if(this.enabled)if(So.isIos&&this.player.config.fullscreen.iosNative)this.target.webkitExitFullscreen(),this.player.play();else if(e.native)if(this.prefix){if(!zr.empty(this.prefix)){var t="moz"===this.prefix?"Cancel":"Exit";document[""+this.prefix+t+this.property]()}}else(document.cancelFullScreen||document.exitFullscreen).call(document);else Zo.call(this,!1)}},{key:"toggle",value:function(){this.active?this.exit():this.enter()}},{key:"enabled",get:function(){return(e.native||this.player.config.fullscreen.fallback)&&this.player.config.fullscreen.enabled&&this.player.supported.ui&&this.player.isVideo}},{key:"active",get:function(){return!!this.enabled&&(e.native?(this.prefix?document[""+this.prefix+this.property+"Element"]:document.fullscreenElement)===this.target:ho(this.target,this.player.config.classNames.fullscreen.fallback))}},{key:"target",get:function(){return So.isIos&&this.player.config.fullscreen.iosNative?this.player.media:this.player.elements.container}}],[{key:"native",get:function(){return!!(document.fullscreenEnabled||document.webkitFullscreenEnabled||document.mozFullScreenEnabled||document.msFullscreenEnabled)}},{key:"prefix",get:function(){if(zr.function(document.exitFullscreen))return"";var e="";return["webkit","moz","ms"].some(function(t){return!(!zr.function(document[t+"ExitFullscreen"])&&!zr.function(document[t+"CancelFullScreen"]))&&(e=t,!0)}),e}},{key:"property",get:function(){return"moz"===this.prefix?"FullScreen":"Fullscreen"}}]),e}();function ta(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;return new Promise(function(n,i){var r=new Image,o=function(){delete r.onload,delete r.onerror,(r.naturalWidth>=t?n:i)(r)};Object.assign(r,{onload:o,onerror:o,src:e})})}var na={addStyleHook:function(){fo(this.elements.container,this.config.selectors.container.replace(".",""),!0),fo(this.elements.container,this.config.classNames.uiSupported,this.supported.ui)},toggleNativeControls:function(){arguments.length>0&&void 0!==arguments[0]&&arguments[0]&&this.isHTML5?this.media.setAttribute("controls",""):this.media.removeAttribute("controls")},build:function(){var e=this;if(this.listeners.media(),!this.supported.ui)return this.debug.warn("Basic support only for "+this.provider+" "+this.type),void na.toggleNativeControls.call(this,!0);zr.element(this.elements.controls)||(Uo.inject.call(this),this.listeners.controls()),na.toggleNativeControls.call(this),this.isHTML5&&Go.setup.call(this),this.volume=null,this.muted=null,this.speed=null,this.loop=null,this.quality=null,Uo.updateVolume.call(this),Uo.timeUpdate.call(this),na.checkPlaying.call(this),fo(this.elements.container,this.config.classNames.pip.supported,_o.pip&&this.isHTML5&&this.isVideo),fo(this.elements.container,this.config.classNames.airplay.supported,_o.airplay&&this.isHTML5),fo(this.elements.container,this.config.classNames.isIos,So.isIos),fo(this.elements.container,this.config.classNames.isTouch,this.touch),this.ready=!0,setTimeout(function(){$r.call(e,e.media,"ready")},0),na.setTitle.call(this),this.poster&&na.setPoster.call(this,this.poster,!1).catch(function(){}),this.config.duration&&Uo.durationUpdate.call(this)},setTitle:function(){var e=jo("play",this.config);if(zr.string(this.config.title)&&!zr.empty(this.config.title)&&(e+=", "+this.config.title),zr.nodeList(this.elements.buttons.play)&&Array.from(this.elements.buttons.play).forEach(function(t){t.setAttribute("aria-label",e)}),this.isEmbed){var t=mo.call(this,"iframe");if(!zr.element(t))return;var n=zr.empty(this.config.title)?"video":this.config.title,i=jo("frameTitle",this.config);t.setAttribute("title",i.replace("{title}",n))}},togglePoster:function(e){fo(this.elements.container,this.config.classNames.posterEnabled,e)},setPoster:function(e){var t=this;return arguments.length>1&&void 0!==arguments[1]&&!arguments[1]||!this.poster?(this.media.setAttribute("poster",e),function(){var e=this;return new Promise(function(t){return e.ready?setTimeout(t,0):Kr.call(e,e.elements.container,"ready",t)}).then(function(){})}.call(this).then(function(){return ta(e)}).catch(function(n){throw e===t.poster&&na.togglePoster.call(t,!1),n}).then(function(){if(e!==t.poster)throw new Error("setPoster cancelled by later call to setPoster")}).then(function(){return Object.assign(t.elements.poster.style,{backgroundImage:"url('"+e+"')",backgroundSize:""}),na.togglePoster.call(t,!0),e})):Promise.reject(new Error("Poster already set"))},checkPlaying:function(e){var t=this;fo(this.elements.container,this.config.classNames.playing,this.playing),fo(this.elements.container,this.config.classNames.paused,this.paused),fo(this.elements.container,this.config.classNames.stopped,this.stopped),Array.from(this.elements.buttons.play).forEach(function(e){e.pressed=t.playing}),zr.event(e)&&"timeupdate"===e.type||na.toggleControls.call(this)},checkLoading:function(e){var t=this;this.loading=["stalled","waiting"].includes(e.type),clearTimeout(this.timers.loading),this.timers.loading=setTimeout(function(){fo(t.elements.container,t.config.classNames.loading,t.loading),na.toggleControls.call(t)},this.loading?250:0)},toggleControls:function(e){var t=this.elements.controls;t&&this.config.hideControls&&this.toggleControls(Boolean(e||this.loading||this.paused||t.pressed||t.hover))}},ia=function(){function e(t){Xr(this,e),this.player=t,this.lastKey=null,this.handleKey=this.handleKey.bind(this),this.toggleMenu=this.toggleMenu.bind(this),this.firstTouch=this.firstTouch.bind(this)}return Zr(e,[{key:"handleKey",value:function(e){var t=this,n=e.keyCode?e.keyCode:e.which,i="keydown"===e.type,r=i&&n===this.lastKey;if(!(e.altKey||e.ctrlKey||e.metaKey||e.shiftKey)&&zr.number(n)){if(i){var o=yo();if(zr.element(o)&&o!==this.player.elements.inputs.seek&&po(o,this.player.config.selectors.editable))return;switch([32,37,38,39,40,48,49,50,51,52,53,54,56,57,67,70,73,75,76,77,79].includes(n)&&(e.preventDefault(),e.stopPropagation()),n){case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:r||(t.player.currentTime=t.player.duration/10*(n-48));break;case 32:case 75:r||this.player.togglePlay();break;case 38:this.player.increaseVolume(.1);break;case 40:this.player.decreaseVolume(.1);break;case 77:r||(this.player.muted=!this.player.muted);break;case 39:this.player.forward();break;case 37:this.player.rewind();break;case 70:this.player.fullscreen.toggle();break;case 67:r||this.player.toggleCaptions();break;case 76:this.player.loop=!this.player.loop}!this.player.fullscreen.enabled&&this.player.fullscreen.active&&27===n&&this.player.fullscreen.toggle(),this.lastKey=n}else this.lastKey=null}}},{key:"toggleMenu",value:function(e){Uo.toggleMenu.call(this.player,e)}},{key:"firstTouch",value:function(){this.player.touch=!0,fo(this.player.elements.container,this.player.config.classNames.isTouch,!0)}},{key:"global",value:function(){var e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.player.config.keyboard.global&&Yr.call(this.player,window,"keydown keyup",this.handleKey,e,!1),Yr.call(this.player,document.body,"click",this.toggleMenu,e),Jr.call(this.player,document.body,"touchstart",this.firstTouch)}},{key:"container",value:function(){var e=this;!this.player.config.keyboard.global&&this.player.config.keyboard.focused&&Kr.call(this.player,this.player.elements.container,"keydown keyup",this.handleKey,!1),Kr.call(this.player,this.player.elements.container,"focusout",function(t){fo(t.target,e.player.config.classNames.tabFocus,!1)}),Kr.call(this.player,this.player.elements.container,"keydown",function(t){9===t.keyCode&&setTimeout(function(){fo(yo(),e.player.config.classNames.tabFocus,!0)},0)}),Kr.call(this.player,this.player.elements.container,"mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen",function(t){var n=e.player.elements.controls;"enterfullscreen"===t.type&&(n.pressed=!1,n.hover=!1);var i=0;["touchstart","touchmove","mousemove"].includes(t.type)&&(na.toggleControls.call(e.player,!0),i=e.player.touch?3e3:2e3),clearTimeout(e.player.timers.controls),e.player.timers.controls=setTimeout(function(){return na.toggleControls.call(e.player,!1)},i)})}},{key:"media",value:function(){var e=this;if(Kr.call(this.player,this.player.media,"timeupdate seeking seeked",function(t){return Uo.timeUpdate.call(e.player,t)}),Kr.call(this.player,this.player.media,"durationchange loadeddata loadedmetadata",function(t){return Uo.durationUpdate.call(e.player,t)}),Kr.call(this.player,this.player.media,"canplay",function(){uo(e.player.elements.volume,!e.player.hasAudio),uo(e.player.elements.buttons.mute,!e.player.hasAudio)}),Kr.call(this.player,this.player.media,"ended",function(){e.player.isHTML5&&e.player.isVideo&&e.player.config.resetOnEnd&&e.player.restart()}),Kr.call(this.player,this.player.media,"progress playing seeking seeked",function(t){return Uo.updateProgress.call(e.player,t)}),Kr.call(this.player,this.player.media,"volumechange",function(t){return Uo.updateVolume.call(e.player,t)}),Kr.call(this.player,this.player.media,"playing play pause ended emptied timeupdate",function(t){return na.checkPlaying.call(e.player,t)}),Kr.call(this.player,this.player.media,"waiting canplay seeked playing",function(t){return na.checkLoading.call(e.player,t)}),Kr.call(this.player,this.player.media,"playing",function(){e.player.ads&&e.player.ads.enabled&&!e.player.ads.initialized&&e.player.ads.managerPromise.then(function(){return e.player.ads.play()}).catch(function(){return e.player.play()})}),this.player.supported.ui&&this.player.config.clickToPlay&&!this.player.isAudio){var t=mo.call(this.player,"."+this.player.config.classNames.video);if(!zr.element(t))return;Kr.call(this.player,t,"click",function(){e.player.config.hideControls&&e.player.touch&&!e.player.paused||(e.player.paused?e.player.play():e.player.ended?(e.player.restart(),e.player.play()):e.player.pause())})}this.player.supported.ui&&this.player.config.disableContextMenu&&Kr.call(this.player,this.player.elements.wrapper,"contextmenu",function(e){e.preventDefault()},!1),Kr.call(this.player,this.player.media,"volumechange",function(){e.player.storage.set({volume:e.player.volume,muted:e.player.muted})}),Kr.call(this.player,this.player.media,"ratechange",function(){Uo.updateSetting.call(e.player,"speed"),e.player.storage.set({speed:e.player.speed})}),Kr.call(this.player,this.player.media,"qualityrequested",function(t){e.player.storage.set({quality:t.detail.quality})}),Kr.call(this.player,this.player.media,"qualitychange",function(t){Uo.updateSetting.call(e.player,"quality",null,t.detail.quality)});var n=this.player.config.events.concat(["keyup","keydown"]).join(" ");Kr.call(this.player,this.player.media,n,function(t){var n=t.detail,i=void 0===n?{}:n;"error"===t.type&&(i=e.player.media.error),$r.call(e.player,e.player.elements.container,t.type,!0,i)})}},{key:"controls",value:function(){var e=this,t=So.isIE?"change":"input",n=function(t,n,i){var r=e.player.config.listeners[i],o=!0;zr.function(r)&&(o=r.call(e.player,t)),o&&zr.function(n)&&n.call(e.player,t)},i=function(t,i,r,o){var a=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],s=e.player.config.listeners[o],l=zr.function(s);Kr.call(e.player,t,i,function(e){return n(e,r,o)},a&&!l)};Array.from(this.player.elements.buttons.play).forEach(function(t){i(t,"click",e.player.togglePlay,"play")}),i(this.player.elements.buttons.restart,"click",this.player.restart,"restart"),i(this.player.elements.buttons.rewind,"click",this.player.rewind,"rewind"),i(this.player.elements.buttons.fastForward,"click",this.player.forward,"fastForward"),i(this.player.elements.buttons.mute,"click",function(){e.player.muted=!e.player.muted},"mute"),i(this.player.elements.buttons.captions,"click",function(){return e.player.toggleCaptions()}),i(this.player.elements.buttons.fullscreen,"click",function(){e.player.fullscreen.toggle()},"fullscreen"),i(this.player.elements.buttons.pip,"click",function(){e.player.pip="toggle"},"pip"),i(this.player.elements.buttons.airplay,"click",this.player.airplay,"airplay"),i(this.player.elements.buttons.settings,"click",function(t){Uo.toggleMenu.call(e.player,t)}),i(this.player.elements.settings.form,"click",function(t){t.stopPropagation();var i=function(){var t="plyr-settings-"+e.player.id+"-home";Uo.showTab.call(e.player,t)};if(po(t.target,e.player.config.selectors.inputs.language))n(t,function(){e.player.currentTrack=Number(t.target.value),i()},"language");else if(po(t.target,e.player.config.selectors.inputs.quality))n(t,function(){e.player.quality=t.target.value,i()},"quality");else if(po(t.target,e.player.config.selectors.inputs.speed))n(t,function(){e.player.speed=parseFloat(t.target.value),i()},"speed");else{var r=t.target;Uo.showTab.call(e.player,r.getAttribute("aria-controls"))}}),i(this.player.elements.inputs.seek,"mousedown mousemove",function(t){var n=e.player.elements.progress.getBoundingClientRect(),i=100/n.width*(t.pageX-n.left);t.currentTarget.setAttribute("seek-value",i)}),i(this.player.elements.inputs.seek,"mousedown mouseup keydown keyup touchstart touchend",function(t){var n=t.currentTarget,i=t.keyCode?t.keyCode:t.which,r=t.type;if("keydown"!==r&&"keyup"!==r||39===i||37===i){var o=n.hasAttribute("play-on-seeked"),a=["mouseup","touchend","keyup"].includes(t.type);o&&a?(n.removeAttribute("play-on-seeked"),e.player.play()):!a&&e.player.playing&&(n.setAttribute("play-on-seeked",""),e.player.pause())}}),i(this.player.elements.inputs.seek,t,function(t){var n=t.currentTarget,i=n.getAttribute("seek-value");zr.empty(i)&&(i=n.value),n.removeAttribute("seek-value"),e.player.currentTime=i/n.max*e.player.duration},"seek"),this.player.config.toggleInvert&&!zr.element(this.player.elements.display.duration)&&i(this.player.elements.display.currentTime,"click",function(){0!==e.player.currentTime&&(e.player.config.invertTime=!e.player.config.invertTime,Uo.timeUpdate.call(e.player))}),i(this.player.elements.inputs.volume,t,function(t){e.player.volume=t.target.value},"volume"),So.isWebkit&&Array.from(go.call(this.player,'input[type="range"]')).forEach(function(t){i(t,"input",function(t){return Uo.updateRangeFill.call(e.player,t.target)})}),i(this.player.elements.progress,"mouseenter mouseleave mousemove",function(t){return Uo.updateSeekTooltip.call(e.player,t)}),i(this.player.elements.controls,"mouseenter mouseleave",function(t){e.player.elements.controls.hover=!e.player.touch&&"mouseenter"===t.type}),i(this.player.elements.controls,"mousedown mouseup touchstart touchend touchcancel",function(t){e.player.elements.controls.pressed=["mousedown","touchstart"].includes(t.type)}),i(this.player.elements.controls,"focusin focusout",function(t){var n=e.player,i=n.config,r=n.elements,o=n.timers;if(fo(r.controls,i.classNames.noTransition,"focusin"===t.type),na.toggleControls.call(e.player,"focusin"===t.type),"focusin"===t.type){setTimeout(function(){fo(r.controls,i.classNames.noTransition,!1)},0);var a=e.touch?3e3:4e3;clearTimeout(o.controls),o.controls=setTimeout(function(){return na.toggleControls.call(e.player,!1)},a)}}),i(this.player.elements.inputs.volume,"wheel",function(t){var n=t.webkitDirectionInvertedFromDevice,i=0;(t.deltaY<0||t.deltaX>0)&&(n?(e.player.decreaseVolume(.02),i=-1):(e.player.increaseVolume(.02),i=1)),(t.deltaY>0||t.deltaX<0)&&(n?(e.player.increaseVolume(.02),i=1):(e.player.decreaseVolume(.02),i=-1)),(1===i&&e.player.media.volume<1||-1===i&&e.player.media.volume>0)&&t.preventDefault()},"volume",!1)}}]),e}(),ra=t(function(e,t){var n;n=function(){var e=function(){},t={},n={},i={};function r(e,t){if(e){var r=i[e];if(n[e]=t,r)for(;r.length;)r[0](e,t),r.splice(0,1)}}function o(t,n){t.call&&(t={success:t}),n.length?(t.error||e)(n):(t.success||e)(t)}function a(t,n,i,r){var o,s,l=document,c=i.async,u=(i.numRetries||0)+1,f=i.before||e,h=t.replace(/^(css|img)!/,"");r=r||0,/(^css!|\.css$)/.test(t)?(o=!0,(s=l.createElement("link")).rel="stylesheet",s.href=h):/(^img!|\.(png|gif|jpg|svg)$)/.test(t)?(s=l.createElement("img")).src=h:((s=l.createElement("script")).src=t,s.async=void 0===c||c),s.onload=s.onerror=s.onbeforeload=function(e){var l=e.type[0];if(o&&"hideFocus"in s)try{s.sheet.cssText.length||(l="e")}catch(e){l="e"}if("e"==l&&(r+=1)<u)return a(t,n,i,r);n(t,l,e.defaultPrevented)},!1!==f(t,s)&&l.head.appendChild(s)}function s(e,n,i){var s,l;if(n&&n.trim&&(s=n),l=(s?i:n)||{},s){if(s in t)throw"LoadJS";t[s]=!0}!function(e,t,n){var i,r,o=(e=e.push?e:[e]).length,s=o,l=[];for(i=function(e,n,i){if("e"==n&&l.push(e),"b"==n){if(!i)return;l.push(e)}--o||t(l)},r=0;r<s;r++)a(e[r],i,n)}(e,function(e){o(l,e),r(s,e)},l)}return s.ready=function(e,t){return function(e,t){e=e.push?e:[e];var r,o,a,s=[],l=e.length,c=l;for(r=function(e,n){n.length&&s.push(e),--c||t(s)};l--;)o=e[l],(a=n[o])?r(o,a):(i[o]=i[o]||[]).push(r)}(e,function(e){o(t,e)}),s},s.done=function(e){r(e,[])},s.reset=function(){t={},n={},i={}},s.isDefined=function(e){return e in t},s},e.exports=n()});function oa(e){return new Promise(function(t,n){ra(e,{success:t,error:n})})}function aa(e){e&&!this.embed.hasPlayed&&(this.embed.hasPlayed=!0),this.media.paused===e&&(this.media.paused=!e,$r.call(this,this.media,e?"play":"pause"))}var sa={setup:function(){var e=this;fo(this.elements.wrapper,this.config.classNames.embed,!0),sa.setAspectRatio.call(this),zr.object(window.Vimeo)?sa.ready.call(this):oa(this.config.urls.vimeo.sdk).then(function(){sa.ready.call(e)}).catch(function(t){e.debug.warn("Vimeo API failed to load",t)})},setAspectRatio:function(e){var t=(zr.string(e)?e:this.config.ratio).split(":"),n=to(t,2),i=100/n[0]*n[1];if(this.elements.wrapper.style.paddingBottom=i+"%",this.supported.ui){var r=(240-i)/4.8;this.media.style.transform="translateY(-"+r+"%)"}},ready:function(){var e=this,t=this,n=zo({loop:t.config.loop.active,autoplay:t.autoplay,byline:!1,portrait:!1,title:!1,speed:!0,transparent:0,gesture:"media",playsinline:!this.config.fullscreen.iosNative}),i=t.media.getAttribute("src");zr.empty(i)&&(i=t.media.getAttribute(t.config.attributes.embed.id));var r,o=(r=i,zr.empty(r)?null:zr.number(Number(r))?r:r.match(/^.*(vimeo.com\/|video\/)(\d+).*/)?RegExp.$2:r),a=ro("iframe"),s=Lo(t.config.urls.vimeo.iframe,o,n);a.setAttribute("src",s),a.setAttribute("allowfullscreen",""),a.setAttribute("allowtransparency",""),a.setAttribute("allow","autoplay");var l=ro("div",{poster:t.poster,class:t.config.classNames.embedContainer});l.appendChild(a),t.media=lo(l,t.media),Ho(Lo(t.config.urls.vimeo.api,o),"json").then(function(e){if(!zr.empty(e)){var n=new URL(e[0].thumbnail_large);n.pathname=n.pathname.split("_")[0]+".jpg",na.setPoster.call(t,n.href).catch(function(){})}}),t.embed=new window.Vimeo.Player(a,{autopause:t.config.autopause,muted:t.muted}),t.media.paused=!0,t.media.currentTime=0,t.supported.ui&&t.embed.disableTextTrack(),t.media.play=function(){return aa.call(t,!0),t.embed.play()},t.media.pause=function(){return aa.call(t,!1),t.embed.pause()},t.media.stop=function(){t.pause(),t.currentTime=0};var c=t.media.currentTime;Object.defineProperty(t.media,"currentTime",{get:function(){return c},set:function(e){var n=t.embed,i=t.media,r=t.paused,o=t.volume,a=r&&!n.hasPlayed;i.seeking=!0,$r.call(t,i,"seeking"),Promise.resolve(a&&n.setVolume(0)).then(function(){return n.setCurrentTime(e)}).then(function(){return a&&n.pause()}).then(function(){return a&&n.setVolume(o)}).catch(function(){})}});var u=t.config.speed.selected;Object.defineProperty(t.media,"playbackRate",{get:function(){return u},set:function(e){t.embed.setPlaybackRate(e).then(function(){u=e,$r.call(t,t.media,"ratechange")}).catch(function(e){"Error"===e.name&&Uo.setSpeedMenu.call(t,[])})}});var f=t.config.volume;Object.defineProperty(t.media,"volume",{get:function(){return f},set:function(e){t.embed.setVolume(e).then(function(){f=e,$r.call(t,t.media,"volumechange")})}});var h=t.config.muted;Object.defineProperty(t.media,"muted",{get:function(){return h},set:function(e){var n=!!zr.boolean(e)&&e;t.embed.setVolume(n?0:t.config.volume).then(function(){h=n,$r.call(t,t.media,"volumechange")})}});var d=t.config.loop;Object.defineProperty(t.media,"loop",{get:function(){return d},set:function(e){var n=zr.boolean(e)?e:t.config.loop.active;t.embed.setLoop(n).then(function(){d=n})}});var p=void 0;t.embed.getVideoUrl().then(function(e){p=e}).catch(function(t){e.debug.warn(t)}),Object.defineProperty(t.media,"currentSrc",{get:function(){return p}}),Object.defineProperty(t.media,"ended",{get:function(){return t.currentTime===t.duration}}),Promise.all([t.embed.getVideoWidth(),t.embed.getVideoHeight()]).then(function(t){var n=function(e,t){var n=function e(t,n){return 0===n?t:e(n,t%n)}(e,t);return e/n+":"+t/n}(t[0],t[1]);sa.setAspectRatio.call(e,n)}),t.embed.setAutopause(t.config.autopause).then(function(e){t.config.autopause=e}),t.embed.getVideoTitle().then(function(n){t.config.title=n,na.setTitle.call(e)}),t.embed.getCurrentTime().then(function(e){c=e,$r.call(t,t.media,"timeupdate")}),t.embed.getDuration().then(function(e){t.media.duration=e,$r.call(t,t.media,"durationchange")}),t.embed.getTextTracks().then(function(e){t.media.textTracks=e,Go.setup.call(t)}),t.embed.on("cuechange",function(e){var n=e.cues,i=(void 0===n?[]:n).map(function(e){return t=e.text,n=document.createDocumentFragment(),i=document.createElement("div"),n.appendChild(i),i.innerHTML=t,n.firstChild.innerText;var t,n,i});Go.updateCues.call(t,i)}),t.embed.on("loaded",function(){(t.embed.getPaused().then(function(e){aa.call(t,!e),e||$r.call(t,t.media,"playing")}),zr.element(t.embed.element)&&t.supported.ui)&&t.embed.element.setAttribute("tabindex",-1)}),t.embed.on("play",function(){aa.call(t,!0),$r.call(t,t.media,"playing")}),t.embed.on("pause",function(){aa.call(t,!1)}),t.embed.on("timeupdate",function(e){t.media.seeking=!1,c=e.seconds,$r.call(t,t.media,"timeupdate")}),t.embed.on("progress",function(e){t.media.buffered=e.percent,$r.call(t,t.media,"progress"),1===parseInt(e.percent,10)&&$r.call(t,t.media,"canplaythrough"),t.embed.getDuration().then(function(e){e!==t.media.duration&&(t.media.duration=e,$r.call(t,t.media,"durationchange"))})}),t.embed.on("seeked",function(){t.media.seeking=!1,$r.call(t,t.media,"seeked")}),t.embed.on("ended",function(){t.media.paused=!0,$r.call(t,t.media,"ended")}),t.embed.on("error",function(e){t.media.error=e,$r.call(t,t.media,"error")}),setTimeout(function(){return na.build.call(t)},0)}};function la(e){var t=Object.entries({hd2160:2160,hd1440:1440,hd1080:1080,hd720:720,large:480,medium:360,small:240,tiny:144}).find(function(t){return t.includes(e)});return t?t.find(function(t){return t!==e}):"default"}function ca(e){e&&!this.embed.hasPlayed&&(this.embed.hasPlayed=!0),this.media.paused===e&&(this.media.paused=!e,$r.call(this,this.media,e?"play":"pause"))}var ua,fa={setup:function(){var e=this;fo(this.elements.wrapper,this.config.classNames.embed,!0),fa.setAspectRatio.call(this),zr.object(window.YT)&&zr.function(window.YT.Player)?fa.ready.call(this):(oa(this.config.urls.youtube.sdk).catch(function(t){e.debug.warn("YouTube API failed to load",t)}),window.onYouTubeReadyCallbacks=window.onYouTubeReadyCallbacks||[],window.onYouTubeReadyCallbacks.push(function(){fa.ready.call(e)}),window.onYouTubeIframeAPIReady=function(){window.onYouTubeReadyCallbacks.forEach(function(e){e()})})},getTitle:function(e){var t=this;if(zr.function(this.embed.getVideoData)){var n=this.embed.getVideoData().title;if(zr.empty(n))return this.config.title=n,void na.setTitle.call(this)}var i=this.config.keys.google;zr.string(i)&&!zr.empty(i)&&Ho(Lo(this.config.urls.youtube.api,e,i)).then(function(e){zr.object(e)&&(t.config.title=e.items[0].snippet.title,na.setTitle.call(t))}).catch(function(){})},setAspectRatio:function(){var e=this.config.ratio.split(":");this.elements.wrapper.style.paddingBottom=100/e[0]*e[1]+"%"},ready:function(){var e=this,t=e.media.getAttribute("id");if(zr.empty(t)||!t.startsWith("youtube-")){var n=e.media.getAttribute("src");zr.empty(n)&&(n=e.media.getAttribute(this.config.attributes.embed.id));var i,r=(i=n,zr.empty(i)?null:i.match(/^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|&v=)([^#&?]*).*/)?RegExp.$2:i),o=e.provider+"-"+Math.floor(1e4*Math.random()),a=ro("div",{id:o,poster:e.poster});e.media=lo(a,e.media);var s=function(e){return"https://img.youtube.com/vi/"+r+"/"+e+"default.jpg"};ta(s("maxres"),121).catch(function(){return ta(s("sd"),121)}).catch(function(){return ta(s("hq"))}).then(function(t){return na.setPoster.call(e,t.src)}).then(function(t){t.includes("maxres")||(e.elements.poster.style.backgroundSize="cover")}).catch(function(){}),e.embed=new window.YT.Player(o,{videoId:r,playerVars:{autoplay:e.config.autoplay?1:0,controls:e.supported.ui?0:1,rel:0,showinfo:0,iv_load_policy:3,modestbranding:1,disablekb:1,playsinline:1,widget_referrer:window?window.location.href:null,cc_load_policy:e.captions.active?1:0,cc_lang_pref:e.config.captions.language},events:{onError:function(t){if(!e.media.error){var n=t.data,i={2:"The request contains an invalid parameter value. For example, this error occurs if you specify a video ID that does not have 11 characters, or if the video ID contains invalid characters, such as exclamation points or asterisks.",5:"The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.",100:"The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.",101:"The owner of the requested video does not allow it to be played in embedded players.",150:"The owner of the requested video does not allow it to be played in embedded players."}[n]||"An unknown error occured";e.media.error={code:n,message:i},$r.call(e,e.media,"error")}},onPlaybackQualityChange:function(){$r.call(e,e.media,"qualitychange",!1,{quality:e.media.quality})},onPlaybackRateChange:function(t){var n=t.target;e.media.playbackRate=n.getPlaybackRate(),$r.call(e,e.media,"ratechange")},onReady:function(t){var n=t.target;fa.getTitle.call(e,r),e.media.play=function(){ca.call(e,!0),n.playVideo()},e.media.pause=function(){ca.call(e,!1),n.pauseVideo()},e.media.stop=function(){n.stopVideo()},e.media.duration=n.getDuration(),e.media.paused=!0,e.media.currentTime=0,Object.defineProperty(e.media,"currentTime",{get:function(){return Number(n.getCurrentTime())},set:function(t){e.paused&&e.embed.mute(),e.media.seeking=!0,$r.call(e,e.media,"seeking"),n.seekTo(t)}}),Object.defineProperty(e.media,"playbackRate",{get:function(){return n.getPlaybackRate()},set:function(e){n.setPlaybackRate(e)}}),Object.defineProperty(e.media,"quality",{get:function(){return la(n.getPlaybackQuality())},set:function(e){n.setPlaybackQuality(la(e))}});var i=e.config.volume;Object.defineProperty(e.media,"volume",{get:function(){return i},set:function(t){i=t,n.setVolume(100*i),$r.call(e,e.media,"volumechange")}});var o=e.config.muted;Object.defineProperty(e.media,"muted",{get:function(){return o},set:function(t){var i=zr.boolean(t)?t:o;o=i,n[i?"mute":"unMute"](),$r.call(e,e.media,"volumechange")}}),Object.defineProperty(e.media,"currentSrc",{get:function(){return n.getVideoUrl()}}),Object.defineProperty(e.media,"ended",{get:function(){return e.currentTime===e.duration}}),e.options.speed=n.getAvailablePlaybackRates(),e.supported.ui&&e.media.setAttribute("tabindex",-1),$r.call(e,e.media,"timeupdate"),$r.call(e,e.media,"durationchange"),clearInterval(e.timers.buffering),e.timers.buffering=setInterval(function(){e.media.buffered=n.getVideoLoadedFraction(),(null===e.media.lastBuffered||e.media.lastBuffered<e.media.buffered)&&$r.call(e,e.media,"progress"),e.media.lastBuffered=e.media.buffered,1===e.media.buffered&&(clearInterval(e.timers.buffering),$r.call(e,e.media,"canplaythrough"))},200),setTimeout(function(){return na.build.call(e)},50)},onStateChange:function(t){var n,i=t.target;switch(clearInterval(e.timers.playing),e.media.seeking&&[1,2].includes(t.data)&&(e.media.seeking=!1,$r.call(e,e.media,"seeked")),t.data){case-1:$r.call(e,e.media,"timeupdate"),e.media.buffered=i.getVideoLoadedFraction(),$r.call(e,e.media,"progress");break;case 0:ca.call(e,!1),e.media.loop?(i.stopVideo(),i.playVideo()):$r.call(e,e.media,"ended");break;case 1:e.media.paused&&!e.embed.hasPlayed?e.media.pause():(ca.call(e,!0),$r.call(e,e.media,"playing"),e.timers.playing=setInterval(function(){$r.call(e,e.media,"timeupdate")},50),e.media.duration!==i.getDuration()&&(e.media.duration=i.getDuration(),$r.call(e,e.media,"durationchange")),Uo.setQualityMenu.call(e,(n=i.getAvailableQualityLevels(),zr.empty(n)?n:Io(n.map(function(e){return la(e)})))));break;case 2:e.muted||e.embed.unMute(),ca.call(e,!1)}$r.call(e,e.elements.container,"statechange",!1,{code:t.data})}}})}}},ha={setup:function(){this.media?(fo(this.elements.container,this.config.classNames.type.replace("{0}",this.type),!0),fo(this.elements.container,this.config.classNames.provider.replace("{0}",this.provider),!0),this.isEmbed&&fo(this.elements.container,this.config.classNames.type.replace("{0}","video"),!0),this.isVideo&&(this.elements.wrapper=ro("div",{class:this.config.classNames.video}),no(this.media,this.elements.wrapper),this.elements.poster=ro("div",{class:this.config.classNames.poster}),this.elements.wrapper.appendChild(this.elements.poster)),this.isHTML5?Ao.extend.call(this):this.isYouTube?fa.setup.call(this):this.isVimeo&&sa.setup.call(this)):this.debug.warn("No media element found!")}},da=function(){function e(t){var n=this;Xr(this,e),this.player=t,this.publisherId=t.config.ads.publisherId,this.playing=!1,this.initialized=!1,this.elements={container:null,displayContainer:null},this.manager=null,this.loader=null,this.cuePoints=null,this.events={},this.safetyTimer=null,this.countdownTimer=null,this.managerPromise=new Promise(function(e,t){n.on("loaded",e),n.on("error",t)}),this.load()}return Zr(e,[{key:"load",value:function(){var e=this;this.enabled&&(zr.object(window.google)&&zr.object(window.google.ima)?this.ready():oa(this.player.config.urls.googleIMA.sdk).then(function(){e.ready()}).catch(function(){e.trigger("error",new Error("Google IMA SDK failed to load"))}))}},{key:"ready",value:function(){var e=this;this.startSafetyTimer(12e3,"ready()"),this.managerPromise.then(function(){e.clearSafetyTimer("onAdsManagerLoaded()")}),this.listeners(),this.setupIMA()}},{key:"setupIMA",value:function(){this.elements.container=ro("div",{class:this.player.config.classNames.ads}),this.player.elements.container.appendChild(this.elements.container),google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED),google.ima.settings.setLocale(this.player.config.ads.language),this.elements.displayContainer=new google.ima.AdDisplayContainer(this.elements.container),this.requestAds()}},{key:"requestAds",value:function(){var e=this,t=this.player.elements.container;try{this.loader=new google.ima.AdsLoader(this.elements.displayContainer),this.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED,function(t){return e.onAdsManagerLoaded(t)},!1),this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR,function(t){return e.onAdError(t)},!1);var n=new google.ima.AdsRequest;n.adTagUrl=this.tagUrl,n.linearAdSlotWidth=t.offsetWidth,n.linearAdSlotHeight=t.offsetHeight,n.nonLinearAdSlotWidth=t.offsetWidth,n.nonLinearAdSlotHeight=t.offsetHeight,n.forceNonLinearFullSlot=!1,n.setAdWillPlayMuted(!this.player.muted),this.loader.requestAds(n)}catch(e){this.onAdError(e)}}},{key:"pollCountdown",value:function(){var e=this;if(!(arguments.length>0&&void 0!==arguments[0]&&arguments[0]))return clearInterval(this.countdownTimer),void this.elements.container.removeAttribute("data-badge-text");this.countdownTimer=setInterval(function(){var t=Do(Math.max(e.manager.getRemainingTime(),0)),n=jo("advertisement",e.player.config)+" - "+t;e.elements.container.setAttribute("data-badge-text",n)},100)}},{key:"onAdsManagerLoaded",value:function(e){var t=this,n=new google.ima.AdsRenderingSettings;n.restoreCustomPlaybackStateOnAdBreakComplete=!0,n.enablePreloading=!0,this.manager=e.getAdsManager(this.player,n),this.cuePoints=this.manager.getCuePoints(),zr.empty(this.cuePoints)||this.cuePoints.forEach(function(e){if(0!==e&&-1!==e&&e<t.player.duration){var n=t.player.elements.progress;if(zr.element(n)){var i=100/t.player.duration*e,r=ro("span",{class:t.player.config.classNames.cues});r.style.left=i.toString()+"%",n.appendChild(r)}}}),this.manager.setVolume(this.player.volume),this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR,function(e){return t.onAdError(e)}),Object.keys(google.ima.AdEvent.Type).forEach(function(e){t.manager.addEventListener(google.ima.AdEvent.Type[e],function(e){return t.onAdEvent(e)})}),this.trigger("loaded")}},{key:"onAdEvent",value:function(e){var t=this,n=this.player.elements.container,i=e.getAd(),r=function(e){var n="ads"+e.replace(/_/g,"").toLowerCase();$r.call(t.player,t.player.media,n)};switch(e.type){case google.ima.AdEvent.Type.LOADED:this.trigger("loaded"),r(e.type),this.pollCountdown(!0),i.isLinear()||(i.width=n.offsetWidth,i.height=n.offsetHeight);break;case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:r(e.type),this.loadAds();break;case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:r(e.type),this.pauseContent();break;case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:r(e.type),this.pollCountdown(),this.resumeContent();break;case google.ima.AdEvent.Type.STARTED:case google.ima.AdEvent.Type.MIDPOINT:case google.ima.AdEvent.Type.COMPLETE:case google.ima.AdEvent.Type.IMPRESSION:case google.ima.AdEvent.Type.CLICK:r(e.type)}}},{key:"onAdError",value:function(e){this.cancel(),this.player.debug.warn("Ads error",e)}},{key:"listeners",value:function(){var e=this,t=this.player.elements.container,n=void 0;this.player.on("ended",function(){e.loader.contentComplete()}),this.player.on("seeking",function(){return n=e.player.currentTime}),this.player.on("seeked",function(){var t=e.player.currentTime;zr.empty(e.cuePoints)||e.cuePoints.forEach(function(i,r){n<i&&i<t&&(e.manager.discardAdBreak(),e.cuePoints.splice(r,1))})}),window.addEventListener("resize",function(){e.manager&&e.manager.resize(t.offsetWidth,t.offsetHeight,google.ima.ViewMode.NORMAL)})}},{key:"play",value:function(){var e=this,t=this.player.elements.container;this.managerPromise||this.resumeContent(),this.managerPromise.then(function(){e.elements.displayContainer.initialize();try{e.initialized||(e.manager.init(t.offsetWidth,t.offsetHeight,google.ima.ViewMode.NORMAL),e.manager.start()),e.initialized=!0}catch(t){e.onAdError(t)}}).catch(function(){})}},{key:"resumeContent",value:function(){this.elements.container.style.zIndex="",this.playing=!1,this.player.currentTime<this.player.duration&&this.player.play()}},{key:"pauseContent",value:function(){this.elements.container.style.zIndex=3,this.playing=!0,this.player.pause()}},{key:"cancel",value:function(){this.initialized&&this.resumeContent(),this.trigger("error"),this.loadAds()}},{key:"loadAds",value:function(){var e=this;this.managerPromise.then(function(){e.manager&&e.manager.destroy(),e.managerPromise=new Promise(function(t){e.on("loaded",t),e.player.debug.log(e.manager)}),e.requestAds()}).catch(function(){})}},{key:"trigger",value:function(e){for(var t=this,n=arguments.length,i=Array(n>1?n-1:0),r=1;r<n;r++)i[r-1]=arguments[r];var o=this.events[e];zr.array(o)&&o.forEach(function(e){zr.function(e)&&e.apply(t,i)})}},{key:"on",value:function(e,t){return zr.array(this.events[e])||(this.events[e]=[]),this.events[e].push(t),this}},{key:"startSafetyTimer",value:function(e,t){var n=this;this.player.debug.log("Safety timer invoked from: "+t),this.safetyTimer=setTimeout(function(){n.cancel(),n.clearSafetyTimer("startSafetyTimer()")},e)}},{key:"clearSafetyTimer",value:function(e){zr.nullOrUndefined(this.safetyTimer)||(this.player.debug.log("Safety timer cleared from: "+e),clearTimeout(this.safetyTimer),this.safetyTimer=null)}},{key:"enabled",get:function(){return this.player.isVideo&&this.player.config.ads.enabled&&!zr.empty(this.publisherId)}},{key:"tagUrl",get:function(){return"https://go.aniview.com/api/adserver6/vast/?"+zo({AV_PUBLISHERID:"58c25bb0073ef448b1087ad6",AV_CHANNELID:"5a0458dc28a06145e4519d21",AV_URL:location.hostname,cb:Date.now(),AV_WIDTH:640,AV_HEIGHT:480,AV_CDIM2:this.publisherId})}}]),e}(),pa={insertElements:function(e,t){var n=this;zr.string(t)?oo(e,this.media,{src:t}):zr.array(t)&&t.forEach(function(t){oo(e,n.media,t)})},change:function(e){var t=this;Po(e,"sources.length")?(Ao.cancelRequests.call(this),this.destroy.call(this,function(){t.options.quality=[],ao(t.media),t.media=null,zr.element(t.elements.container)&&t.elements.container.removeAttribute("class");var n=e.sources,i=e.type,r=to(n,1)[0],o=r.provider,a=void 0===o?Ko.html5:o,s=r.src,l="html5"===a?i:"div",c="html5"===a?{}:{src:s};Object.assign(t,{provider:a,type:i,supported:_o.check(i,a,t.config.playsinline),media:ro(l,c)}),t.elements.container.appendChild(t.media),zr.boolean(e.autoplay)&&(t.config.autoplay=e.autoplay),t.isHTML5&&(t.config.crossorigin&&t.media.setAttribute("crossorigin",""),t.config.autoplay&&t.media.setAttribute("autoplay",""),zr.empty(e.poster)||(t.poster=e.poster),t.config.loop.active&&t.media.setAttribute("loop",""),t.config.muted&&t.media.setAttribute("muted",""),t.config.playsinline&&t.media.setAttribute("playsinline","")),na.addStyleHook.call(t),t.isHTML5&&pa.insertElements.call(t,"source",n),t.config.title=e.title,ha.setup.call(t),t.isHTML5&&("tracks"in e&&pa.insertElements.call(t,"track",e.tracks),t.media.load()),(t.isHTML5||t.isEmbed&&!t.supported.ui)&&na.build.call(t),t.fullscreen.update()},!0)):this.debug.warn("Invalid source format")}},ga=function(){function e(t,n){var i=this;if(Xr(this,e),this.timers={},this.ready=!1,this.loading=!1,this.failed=!1,this.touch=_o.touch,this.media=t,zr.string(this.media)&&(this.media=document.querySelectorAll(this.media)),(window.jQuery&&this.media instanceof jQuery||zr.nodeList(this.media)||zr.array(this.media))&&(this.media=this.media[0]),this.config=Mo({},Yo,e.defaults,n||{},function(){try{return JSON.parse(i.media.getAttribute("data-plyr-config"))}catch(e){return{}}}()),this.elements={container:null,buttons:{},display:{},progress:{},inputs:{},settings:{menu:null,panes:{},tabs:{}},captions:null},this.captions={active:null,currentTrack:-1,meta:new WeakMap},this.fullscreen={active:!1},this.options={speed:[],quality:[]},this.debug=new $o(this.config.debug),this.debug.log("Config",this.config),this.debug.log("Support",_o),!zr.nullOrUndefined(this.media)&&zr.element(this.media))if(this.media.plyr)this.debug.warn("Target already setup");else if(this.config.enabled)if(_o.check().api){var r=this.media.cloneNode(!0);r.autoplay=!1,this.elements.original=r;var o=this.media.tagName.toLowerCase(),a=null,s=null;switch(o){case"div":if(a=this.media.querySelector("iframe"),zr.element(a)){if(s=Wo(a.getAttribute("src")),this.provider=function(e){return/^(https?:\/\/)?(www\.)?(youtube\.com|youtu\.?be)\/.+$/.test(e)?Ko.youtube:/^https?:\/\/player.vimeo.com\/video\/\d{0,9}(?=\b|\/)/.test(e)?Ko.vimeo:null}(s.toString()),this.elements.container=this.media,this.media=a,this.elements.container.className="",s.searchParams.length){var l=["1","true"];l.includes(s.searchParams.get("autoplay"))&&(this.config.autoplay=!0),l.includes(s.searchParams.get("loop"))&&(this.config.loop.active=!0),this.isYouTube?this.config.playsinline=l.includes(s.searchParams.get("playsinline")):this.config.playsinline=!0}}else this.provider=this.media.getAttribute(this.config.attributes.embed.provider),this.media.removeAttribute(this.config.attributes.embed.provider);if(zr.empty(this.provider)||!Object.keys(Ko).includes(this.provider))return void this.debug.error("Setup failed: Invalid provider");this.type=Qo.video;break;case"video":case"audio":this.type=o,this.provider=Ko.html5,this.media.hasAttribute("crossorigin")&&(this.config.crossorigin=!0),this.media.hasAttribute("autoplay")&&(this.config.autoplay=!0),this.media.hasAttribute("playsinline")&&(this.config.playsinline=!0),this.media.hasAttribute("muted")&&(this.config.muted=!0),this.media.hasAttribute("loop")&&(this.config.loop.active=!0);break;default:return void this.debug.error("Setup failed: unsupported type")}this.supported=_o.check(this.type,this.provider,this.config.playsinline),this.supported.api?(this.eventListeners=[],this.listeners=new ia(this),this.storage=new Fo(this),this.media.plyr=this,zr.element(this.elements.container)||(this.elements.container=ro("div"),no(this.media,this.elements.container)),na.addStyleHook.call(this),ha.setup.call(this),this.config.debug&&Kr.call(this,this.elements.container,this.config.events.join(" "),function(e){i.debug.log("event: "+e.type)}),(this.isHTML5||this.isEmbed&&!this.supported.ui)&&na.build.call(this),this.listeners.container(),this.listeners.global(),this.fullscreen=new ea(this),this.ads=new da(this),this.config.autoplay&&this.play()):this.debug.error("Setup failed: no support")}else this.debug.error("Setup failed: no support");else this.debug.error("Setup failed: disabled by config");else this.debug.error("Setup failed: no suitable element passed")}return Zr(e,[{key:"play",value:function(){return zr.function(this.media.play)?this.media.play():null}},{key:"pause",value:function(){this.playing&&zr.function(this.media.pause)&&this.media.pause()}},{key:"togglePlay",value:function(e){(zr.boolean(e)?e:!this.playing)?this.play():this.pause()}},{key:"stop",value:function(){this.isHTML5?(this.pause(),this.restart()):zr.function(this.media.stop)&&this.media.stop()}},{key:"restart",value:function(){this.currentTime=0}},{key:"rewind",value:function(e){this.currentTime=this.currentTime-(zr.number(e)?e:this.config.seekTime)}},{key:"forward",value:function(e){this.currentTime=this.currentTime+(zr.number(e)?e:this.config.seekTime)}},{key:"increaseVolume",value:function(e){var t=this.media.muted?0:this.volume;this.volume=t+(zr.number(e)?e:1)}},{key:"decreaseVolume",value:function(e){var t=this.media.muted?0:this.volume;this.volume=t-(zr.number(e)?e:1)}},{key:"toggleCaptions",value:function(e){Go.toggle.call(this,e,!1)}},{key:"airplay",value:function(){_o.airplay&&this.media.webkitShowPlaybackTargetPicker()}},{key:"toggleControls",value:function(e){if(this.supported.ui&&!this.isAudio){var t=ho(this.elements.container,this.config.classNames.hideControls),n=void 0===e?void 0:!e,i=fo(this.elements.container,this.config.classNames.hideControls,n);if(i&&this.config.controls.includes("settings")&&!zr.empty(this.config.settings)&&Uo.toggleMenu.call(this,!1),i!==t){var r=i?"controlshidden":"controlsshown";$r.call(this,this.media,r)}return!i}return!1}},{key:"on",value:function(e,t){Kr.call(this,this.elements.container,e,t)}},{key:"once",value:function(e,t){Jr.call(this,this.elements.container,e,t)}},{key:"off",value:function(e,t){Qr(this.elements.container,e,t)}},{key:"destroy",value:function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(this.ready){var i=function(){document.body.style.overflow="",t.embed=null,n?(Object.keys(t.elements).length&&(ao(t.elements.buttons.play),ao(t.elements.captions),ao(t.elements.controls),ao(t.elements.wrapper),t.elements.buttons.play=null,t.elements.captions=null,t.elements.controls=null,t.elements.wrapper=null),zr.function(e)&&e()):(function(){this&&this.eventListeners&&(this.eventListeners.forEach(function(e){var t=e.element,n=e.type,i=e.callback,r=e.options;t.removeEventListener(n,i,r)}),this.eventListeners=[])}.call(t),lo(t.elements.original,t.elements.container),$r.call(t,t.elements.original,"destroyed",!0),zr.function(e)&&e.call(t.elements.original),t.ready=!1,setTimeout(function(){t.elements=null,t.media=null},200))};this.stop(),this.isHTML5?(clearTimeout(this.timers.loading),na.toggleNativeControls.call(this,!0),i()):this.isYouTube?(clearInterval(this.timers.buffering),clearInterval(this.timers.playing),null!==this.embed&&zr.function(this.embed.destroy)&&this.embed.destroy(),i()):this.isVimeo&&(null!==this.embed&&this.embed.unload().then(i),setTimeout(i,200))}}},{key:"supports",value:function(e){return _o.mime.call(this,e)}},{key:"isHTML5",get:function(){return Boolean(this.provider===Ko.html5)}},{key:"isEmbed",get:function(){return Boolean(this.isYouTube||this.isVimeo)}},{key:"isYouTube",get:function(){return Boolean(this.provider===Ko.youtube)}},{key:"isVimeo",get:function(){return Boolean(this.provider===Ko.vimeo)}},{key:"isVideo",get:function(){return Boolean(this.type===Qo.video)}},{key:"isAudio",get:function(){return Boolean(this.type===Qo.audio)}},{key:"playing",get:function(){return Boolean(this.ready&&!this.paused&&!this.ended)}},{key:"paused",get:function(){return Boolean(this.media.paused)}},{key:"stopped",get:function(){return Boolean(this.paused&&0===this.currentTime)}},{key:"ended",get:function(){return Boolean(this.media.ended)}},{key:"currentTime",set:function(e){if(this.duration){var t=zr.number(e)&&e>0;this.media.currentTime=t?Math.min(e,this.duration):0,this.debug.log("Seeking to "+this.currentTime+" seconds")}},get:function(){return Number(this.media.currentTime)}},{key:"buffered",get:function(){var e=this.media.buffered;return zr.number(e)?e:e&&e.length&&this.duration>0?e.end(0)/this.duration:0}},{key:"seeking",get:function(){return Boolean(this.media.seeking)}},{key:"duration",get:function(){var e=parseFloat(this.config.duration),t=(this.media||{}).duration||0;return e||t}},{key:"volume",set:function(e){var t=e;zr.string(t)&&(t=Number(t)),zr.number(t)||(t=this.storage.get("volume")),zr.number(t)||(t=this.config.volume),t>1&&(t=1),t<0&&(t=0),this.config.volume=t,this.media.volume=t,!zr.empty(e)&&this.muted&&t>0&&(this.muted=!1)},get:function(){return Number(this.media.volume)}},{key:"muted",set:function(e){var t=e;zr.boolean(t)||(t=this.storage.get("muted")),zr.boolean(t)||(t=this.config.muted),this.config.muted=t,this.media.muted=t},get:function(){return Boolean(this.media.muted)}},{key:"hasAudio",get:function(){return!this.isHTML5||(!!this.isAudio||(Boolean(this.media.mozHasAudio)||Boolean(this.media.webkitAudioDecodedByteCount)||Boolean(this.media.audioTracks&&this.media.audioTracks.length)))}},{key:"speed",set:function(e){var t=null;zr.number(e)&&(t=e),zr.number(t)||(t=this.storage.get("speed")),zr.number(t)||(t=this.config.speed.selected),t<.1&&(t=.1),t>2&&(t=2),this.config.speed.options.includes(t)?(this.config.speed.selected=t,this.media.playbackRate=t):this.debug.warn("Unsupported speed ("+t+")")},get:function(){return Number(this.media.playbackRate)}},{key:"quality",set:function(e){var t=this.config.quality,n=this.options.quality;if(n.length){var i=[!zr.empty(e)&&Number(e),this.storage.get("quality"),t.selected,t.default].find(zr.number);if(!n.includes(i)){var r=function(e,t){return zr.array(e)&&e.length?e.reduce(function(e,n){return Math.abs(n-t)<Math.abs(e-t)?n:e}):null}(n,i);this.debug.warn("Unsupported quality option: "+i+", using "+r+" instead"),i=r}$r.call(this,this.media,"qualityrequested",!1,{quality:i}),t.selected=i,this.media.quality=i}},get:function(){return this.media.quality}},{key:"loop",set:function(e){var t=zr.boolean(e)?e:this.config.loop.active;this.config.loop.active=t,this.media.loop=t},get:function(){return Boolean(this.media.loop)}},{key:"source",set:function(e){pa.change.call(this,e)},get:function(){return this.media.currentSrc}},{key:"poster",set:function(e){this.isVideo?na.setPoster.call(this,e,!1).catch(function(){}):this.debug.warn("Poster can only be set for video")},get:function(){return this.isVideo?this.media.getAttribute("poster"):null}},{key:"autoplay",set:function(e){var t=zr.boolean(e)?e:this.config.autoplay;this.config.autoplay=t},get:function(){return Boolean(this.config.autoplay)}},{key:"currentTrack",set:function(e){Go.set.call(this,e,!1)},get:function(){var e=this.captions,t=e.toggled,n=e.currentTrack;return t?n:-1}},{key:"language",set:function(e){Go.setLanguage.call(this,e,!1)},get:function(){return(Go.getCurrentTrack.call(this)||{}).language}},{key:"pip",set:function(e){var t="picture-in-picture",n="inline";if(_o.pip){var i=zr.boolean(e)?e:this.pip===n;this.media.webkitSetPresentationMode(i?t:n)}},get:function(){return _o.pip?this.media.webkitPresentationMode:null}}],[{key:"supported",value:function(e,t,n){return _o.check(e,t,n)}},{key:"loadSprite",value:function(e,t){return Ro(e,t)}},{key:"setup",value:function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=null;return zr.string(t)?i=Array.from(document.querySelectorAll(t)):zr.nodeList(t)?i=Array.from(t):zr.array(t)&&(i=t.filter(zr.element)),zr.empty(i)?null:i.map(function(t){return new e(t,n)})}}]),e}();return ga.defaults=(ua=Yo,JSON.parse(JSON.stringify(ua))),ga});
//# sourceMappingURL=plyr.polyfilled.min.js.map
diff --git a/dist/plyr.polyfilled.min.js.map b/dist/plyr.polyfilled.min.js.map
index c789a0f4..5b5d55ce 100644
--- a/dist/plyr.polyfilled.min.js.map
+++ b/dist/plyr.polyfilled.min.js.map
@@ -1 +1 @@
-{"version":3,"sources":["../../node_modules/core-js/modules/_global.js","../../node_modules/core-js/modules/_core.js","../../node_modules/core-js/modules/_is-object.js","../../node_modules/core-js/modules/_an-object.js","../../node_modules/core-js/modules/_fails.js","../../node_modules/core-js/modules/_descriptors.js","../../node_modules/core-js/modules/_dom-create.js","../../node_modules/core-js/modules/_ie8-dom-define.js","../../node_modules/core-js/modules/_to-primitive.js","../../node_modules/core-js/modules/_object-dp.js","../../node_modules/core-js/modules/_property-desc.js","../../node_modules/core-js/modules/_hide.js","../../node_modules/core-js/modules/_has.js","../../node_modules/core-js/modules/_uid.js","../../node_modules/core-js/modules/_redefine.js","../../node_modules/core-js/modules/_a-function.js","../../node_modules/core-js/modules/_ctx.js","../../node_modules/core-js/modules/_export.js","../../node_modules/core-js/modules/_typed.js","../../node_modules/core-js/modules/_redefine-all.js","../../node_modules/core-js/modules/_an-instance.js","../../node_modules/core-js/modules/_to-integer.js","../../node_modules/core-js/modules/_to-length.js","../../node_modules/core-js/modules/_to-index.js","../../node_modules/core-js/modules/_cof.js","../../node_modules/core-js/modules/_iobject.js","../../node_modules/core-js/modules/_defined.js","../../node_modules/core-js/modules/_to-iobject.js","../../node_modules/core-js/modules/_to-absolute-index.js","../../node_modules/core-js/modules/_array-includes.js","../../node_modules/core-js/modules/_shared.js","../../node_modules/core-js/modules/_shared-key.js","../../node_modules/core-js/modules/_object-keys-internal.js","../../node_modules/core-js/modules/_enum-bug-keys.js","../../node_modules/core-js/modules/_object-gopn.js","../../node_modules/core-js/modules/_to-object.js","../../node_modules/core-js/modules/_array-fill.js","../../node_modules/core-js/modules/_wks.js","../../node_modules/core-js/modules/_set-to-string-tag.js","../../node_modules/core-js/modules/_typed-buffer.js","../../node_modules/core-js/modules/_species-constructor.js","../../node_modules/core-js/modules/_set-species.js","../../node_modules/core-js/modules/es6.typed.array-buffer.js","../../node_modules/core-js/modules/_classof.js","../../node_modules/core-js/modules/_iterators.js","../../node_modules/core-js/modules/_is-array-iter.js","../../node_modules/core-js/modules/_object-keys.js","../../node_modules/core-js/modules/_object-dps.js","../../node_modules/core-js/modules/_html.js","../../node_modules/core-js/modules/_object-create.js","../../node_modules/core-js/modules/_object-gpo.js","../../node_modules/core-js/modules/core.get-iterator-method.js","../../node_modules/core-js/modules/_is-array.js","../../node_modules/core-js/modules/_array-species-constructor.js","../../node_modules/core-js/modules/_array-species-create.js","../../node_modules/core-js/modules/_array-methods.js","../../node_modules/core-js/modules/_add-to-unscopables.js","../../node_modules/core-js/modules/_iter-step.js","../../node_modules/core-js/modules/_iter-create.js","../../node_modules/core-js/modules/_iter-define.js","../../node_modules/core-js/modules/es6.array.iterator.js","../../node_modules/core-js/modules/_iter-detect.js","../../node_modules/core-js/modules/_array-copy-within.js","../../node_modules/core-js/modules/_object-pie.js","../../node_modules/core-js/modules/_object-gopd.js","../../node_modules/core-js/modules/_typed-array.js","../../node_modules/core-js/modules/es6.typed.int8-array.js","../../node_modules/core-js/modules/es6.typed.uint8-array.js","../../node_modules/core-js/modules/es6.typed.uint8-clamped-array.js","../../node_modules/core-js/modules/es6.typed.int16-array.js","../../node_modules/core-js/modules/es6.typed.uint16-array.js","../../node_modules/core-js/modules/es6.typed.int32-array.js","../../node_modules/core-js/modules/es6.typed.uint32-array.js","../../node_modules/core-js/modules/es6.typed.float32-array.js","../../node_modules/core-js/modules/es6.typed.float64-array.js","../../node_modules/core-js/modules/_iter-call.js","../../node_modules/core-js/modules/_for-of.js","../../node_modules/core-js/modules/_meta.js","../../node_modules/core-js/modules/_validate-collection.js","../../node_modules/core-js/modules/_collection-strong.js","../../node_modules/core-js/modules/_set-proto.js","../../node_modules/core-js/modules/_inherit-if-required.js","../../node_modules/core-js/modules/_collection.js","../../node_modules/core-js/modules/es6.map.js","../../node_modules/core-js/modules/es6.set.js","../../node_modules/core-js/modules/_object-gops.js","../../node_modules/core-js/modules/_object-assign.js","../../node_modules/core-js/modules/_collection-weak.js","../../node_modules/core-js/modules/es6.weak-map.js","../../node_modules/core-js/modules/es6.weak-set.js","../../node_modules/core-js/modules/es6.reflect.apply.js","../../node_modules/core-js/modules/_invoke.js","../../node_modules/core-js/modules/_bind.js","../../node_modules/core-js/modules/es6.reflect.construct.js","../../node_modules/core-js/modules/es6.reflect.define-property.js","../../node_modules/core-js/modules/es6.reflect.delete-property.js","../../node_modules/core-js/modules/es6.reflect.get.js","../../node_modules/core-js/modules/es6.reflect.get-own-property-descriptor.js","../../node_modules/core-js/modules/es6.reflect.get-prototype-of.js","../../node_modules/core-js/modules/es6.reflect.has.js","../../node_modules/core-js/modules/es6.reflect.is-extensible.js","../../node_modules/core-js/modules/_own-keys.js","../../node_modules/core-js/modules/es6.reflect.own-keys.js","../../node_modules/core-js/modules/es6.reflect.prevent-extensions.js","../../node_modules/core-js/modules/es6.reflect.set.js","../../node_modules/core-js/modules/es6.reflect.set-prototype-of.js","../../node_modules/core-js/modules/_task.js","../../node_modules/core-js/modules/_microtask.js","../../node_modules/core-js/modules/_new-promise-capability.js","../../node_modules/core-js/modules/es6.promise.js","../../node_modules/core-js/modules/_perform.js","../../node_modules/core-js/modules/_promise-resolve.js","../../node_modules/core-js/modules/_wks-ext.js","../../node_modules/core-js/modules/_wks-define.js","../../node_modules/core-js/modules/_object-gopn-ext.js","../../node_modules/core-js/modules/es6.symbol.js","../../node_modules/core-js/modules/_enum-keys.js","../../node_modules/core-js/modules/_object-sap.js","../../node_modules/core-js/modules/es6.object.freeze.js","../../node_modules/core-js/modules/es6.object.seal.js","../../node_modules/core-js/modules/es6.object.prevent-extensions.js","../../node_modules/core-js/modules/es6.object.is-frozen.js","../../node_modules/core-js/modules/es6.object.is-sealed.js","../../node_modules/core-js/modules/es6.object.is-extensible.js","../../node_modules/core-js/modules/es6.object.get-own-property-descriptor.js","../../node_modules/core-js/modules/es6.object.get-prototype-of.js","../../node_modules/core-js/modules/es6.object.keys.js","../../node_modules/core-js/modules/es6.object.get-own-property-names.js","../../node_modules/core-js/modules/es6.object.assign.js","../../node_modules/core-js/modules/_same-value.js","../../node_modules/core-js/modules/es6.object.is.js","../../node_modules/core-js/modules/es6.function.name.js","../../node_modules/core-js/modules/es6.string.raw.js","../../node_modules/core-js/modules/es6.string.from-code-point.js","../../node_modules/core-js/modules/_string-at.js","../../node_modules/core-js/modules/es6.string.code-point-at.js","../../node_modules/core-js/modules/_string-repeat.js","../../node_modules/core-js/modules/es6.string.repeat.js","../../node_modules/core-js/modules/_is-regexp.js","../../node_modules/core-js/modules/_string-context.js","../../node_modules/core-js/modules/_fails-is-regexp.js","../../node_modules/core-js/modules/es6.string.starts-with.js","../../node_modules/core-js/modules/es6.string.ends-with.js","../../node_modules/core-js/modules/es6.string.includes.js","../../node_modules/core-js/modules/es6.regexp.flags.js","../../node_modules/core-js/modules/_flags.js","../../node_modules/core-js/modules/_fix-re-wks.js","../../node_modules/core-js/modules/es6.regexp.match.js","../../node_modules/core-js/modules/es6.regexp.replace.js","../../node_modules/core-js/modules/es6.regexp.split.js","../../node_modules/core-js/modules/es6.regexp.search.js","../../node_modules/core-js/modules/_create-property.js","../../node_modules/core-js/modules/es6.array.from.js","../../node_modules/core-js/modules/es6.array.of.js","../../node_modules/core-js/modules/es6.array.copy-within.js","../../node_modules/core-js/modules/es6.array.find.js","../../node_modules/core-js/modules/es6.array.find-index.js","../../node_modules/core-js/modules/es6.array.fill.js","../../node_modules/core-js/modules/es6.number.is-finite.js","../../node_modules/core-js/modules/_is-integer.js","../../node_modules/core-js/modules/es6.number.is-integer.js","../../node_modules/core-js/modules/es6.number.is-safe-integer.js","../../node_modules/core-js/modules/es6.number.is-nan.js","../../node_modules/core-js/modules/es6.number.epsilon.js","../../node_modules/core-js/modules/es6.number.min-safe-integer.js","../../node_modules/core-js/modules/es6.number.max-safe-integer.js","../../node_modules/core-js/modules/_math-log1p.js","../../node_modules/core-js/modules/es6.math.acosh.js","../../node_modules/core-js/modules/es6.math.asinh.js","../../node_modules/core-js/modules/es6.math.atanh.js","../../node_modules/core-js/modules/_math-sign.js","../../node_modules/core-js/modules/es6.math.cbrt.js","../../node_modules/core-js/modules/es6.math.clz32.js","../../node_modules/core-js/modules/es6.math.cosh.js","../../node_modules/core-js/modules/_math-expm1.js","../../node_modules/core-js/modules/es6.math.expm1.js","../../node_modules/core-js/modules/_math-fround.js","../../node_modules/core-js/modules/es6.math.fround.js","../../node_modules/core-js/modules/es6.math.hypot.js","../../node_modules/core-js/modules/es6.math.imul.js","../../node_modules/core-js/modules/es6.math.log1p.js","../../node_modules/core-js/modules/es6.math.log10.js","../../node_modules/core-js/modules/es6.math.log2.js","../../node_modules/core-js/modules/es6.math.sign.js","../../node_modules/core-js/modules/es6.math.sinh.js","../../node_modules/core-js/modules/es6.math.tanh.js","../../node_modules/core-js/modules/es6.math.trunc.js","../../node_modules/core-js/modules/es7.array.includes.js","../../node_modules/core-js/modules/_object-to-array.js","../../node_modules/core-js/modules/es7.object.values.js","../../node_modules/core-js/modules/es7.object.entries.js","../../node_modules/core-js/modules/es7.object.get-own-property-descriptors.js","../../node_modules/core-js/modules/_string-pad.js","../../node_modules/core-js/modules/_user-agent.js","../../node_modules/core-js/modules/es7.string.pad-start.js","../../node_modules/core-js/modules/es7.string.pad-end.js","../../node_modules/core-js/modules/web.timers.js","../../node_modules/core-js/modules/web.immediate.js","../../node_modules/core-js/modules/web.dom.iterable.js","../../node_modules/regenerator-runtime/runtime.js","../../node_modules/custom-event-polyfill/custom-event-polyfill.js","../../node_modules/url-polyfill/url-polyfill.js","support.js","../../node_modules/loadjs/dist/loadjs.umd.js","storage.js","types.js","utils.js","html5.js","i18n.js","controls.js","captions.js","console.js","defaults.js","fullscreen.js","ui.js","listeners.js","plugins/vimeo.js","plugins/youtube.js","media.js","plugins/ads.js","source.js","plyr.js"],"names":["global","module","exports","window","Math","self","Function","__g","core","version","__e","_isObject","it","_anObject","isObject","TypeError","_fails","exec","e","_descriptors","require$$0","Object","defineProperty","get","a","document","is","createElement","_domCreate","_ie8DomDefine","require$$1","require$$2","_toPrimitive","S","fn","val","toString","call","valueOf","dP","O","P","Attributes","anObject","toPrimitive","IE8_DOM_DEFINE","value","_propertyDesc","bitmap","enumerable","configurable","writable","_hide","object","key","f","createDesc","hasOwnProperty","_has","id","px","random","_uid","concat","undefined","SRC","$toString","TPL","split","inspectSource","safe","isFunction","has","hide","join","String","prototype","this","_aFunction","_ctx","that","length","aFunction","b","c","apply","arguments","$export","type","name","source","own","out","exp","IS_FORCED","F","IS_GLOBAL","G","IS_STATIC","IS_PROTO","IS_BIND","B","target","expProto","ctx","redefine","U","W","R","Typed","_export","TYPED","uid","VIEW","ABV","ArrayBuffer","DataView","CONSTR","i","TypedArrayConstructors","_typed","_redefineAll","src","_anInstance","Constructor","forbiddenField","ceil","floor","_toInteger","isNaN","min","_toLength","toInteger","_toIndex","number","toLength","RangeError","_cof","slice","_iobject","propertyIsEnumerable","cof","_defined","_toIobject","IObject","defined","max","_toAbsoluteIndex","index","_arrayIncludes","IS_INCLUDES","$this","el","fromIndex","toIObject","toAbsoluteIndex","store","_shared","shared","_sharedKey","arrayIndexOf","IE_PROTO","_objectKeysInternal","names","result","push","_enumBugKeys","hiddenKeys","getOwnPropertyNames","$keys","_toObject","_arrayFill","toObject","aLen","end","endPos","Symbol","USE_SYMBOL","def","TAG","_setToStringTag","tag","stat","gOPN","PROTOTYPE","WRONG_INDEX","$ArrayBuffer","$DataView","Infinity","BaseBuffer","abs","pow","log","LN2","$BUFFER","DESCRIPTORS","$LENGTH","$OFFSET","packIEEE754","mLen","nBytes","m","buffer","Array","eLen","eMax","eBias","rt","s","unpackIEEE754","nBits","NaN","unpackI32","bytes","packI8","packI16","packI32","packF64","packF32","addGetter","C","internal","view","isLittleEndian","intIndex","toIndex","_b","start","pack","reverse","set","conversion","$typed","fails","ArrayBufferProto","anInstance","keys","j","constructor","$setInt8","setInt8","getInt8","redefineAll","byteOffset","setUint8","byteLength","arrayFill","bufferLength","offset","getUint8","getInt16","getUint16","getInt32","getUint32","getFloat32","getFloat64","setInt16","setUint16","setInt32","setUint32","setFloat32","setFloat64","setToStringTag","SPECIES","_speciesConstructor","D","_setSpecies","KEY","$isView","isView","$slice","len","first","final","speciesConstructor","viewS","viewT","ARG","_classof","T","tryGet","callee","_iterators","ITERATOR","ArrayProto","_isArrayIter","Iterators","_objectKeys","enumBugKeys","_objectDps","defineProperties","Properties","getKeys","_html","documentElement","Empty","createDict","iframeDocument","iframe","style","display","appendChild","contentWindow","open","write","lt","close","_objectCreate","create","dPs","ObjectProto","_objectGpo","getPrototypeOf","core_getIteratorMethod","getIteratorMethod","classof","_isArray","isArray","arg","_arraySpeciesCreate","original","_arrayMethods","TYPE","$create","IS_MAP","IS_FILTER","IS_SOME","IS_EVERY","IS_FIND_INDEX","NO_HOLES","asc","callbackfn","res","UNSCOPABLES","_addToUnscopables","_iterStep","done","IteratorPrototype","_iterCreate","NAME","next","descriptor","BUGGY","returnThis","_iterDefine","Base","DEFAULT","IS_SET","FORCED","$iterCreate","methods","getMethod","kind","proto","DEF_VALUES","VALUES_BUG","$native","$default","$entries","$anyNative","entries","values","es6_array_iterator","iterated","_t","_i","_k","step","Arguments","addToUnscopables","SAFE_CLOSING","_iterDetect","skipClosing","arr","iter","_arrayCopyWithin","copyWithin","to","from","count","inc","gOPD","getOwnPropertyDescriptor","pIE","require$$3","require$$4","require$$5","$buffer","require$$6","require$$7","require$$8","propertyDesc","require$$9","require$$10","require$$11","require$$12","require$$13","require$$14","require$$15","require$$16","require$$17","require$$18","require$$19","require$$20","isArrayIter","require$$21","require$$22","require$$23","require$$24","getIterFn","require$$25","require$$26","wks","require$$27","createArrayMethod","require$$28","createArrayIncludes","require$$29","require$$30","ArrayIterators","require$$31","require$$32","$iterDetect","require$$33","setSpecies","require$$34","require$$35","arrayCopyWithin","require$$36","$DP","require$$37","$GOPD","require$$38","Uint8Array","arrayForEach","arrayFilter","arraySome","arrayEvery","arrayFind","arrayFindIndex","arrayIncludes","arrayValues","arrayKeys","arrayEntries","arrayLastIndexOf","lastIndexOf","arrayReduce","reduce","arrayReduceRight","reduceRight","arrayJoin","arraySort","sort","arraySlice","arrayToString","arrayToLocaleString","toLocaleString","TYPED_CONSTRUCTOR","DEF_CONSTRUCTOR","ALL_CONSTRUCTORS","TYPED_ARRAY","$map","allocate","LITTLE_ENDIAN","Uint16Array","FORCED_SET","toOffset","BYTES","validate","speciesFromList","list","fromList","_d","$from","iterator","mapfn","mapping","iterFn","$of","TO_LOCALE_BUG","$toLocaleString","every","fill","filter","find","predicate","findIndex","forEach","indexOf","searchElement","includes","separator","map","middle","some","comparefn","subarray","begin","$begin","BYTES_PER_ELEMENT","$set","arrayLike","$iterators","isTAIndex","$getDesc","$setDesc","desc","$TypedArrayPrototype$","wrapper","CLAMPED","GETTER","SETTER","TypedArray","TAC","TypedArrayPrototype","addElement","data","v","o","getter","round","setter","$offset","$length","klass","$len","l","$nativeIterator","CORRECT_ITER_NAME","$iterator","of","init","_iterCall","ret","BREAK","RETURN","iterable","META","setDesc","isExtensible","FREEZE","preventExtensions","setMeta","w","meta","NEED","fastKey","getWeak","onFreeze","_validateCollection","SIZE","getEntry","entry","_f","n","k","_collectionStrong","getConstructor","ADDER","_l","forOf","clear","r","p","delete","prev","setStrong","$iterDefine","check","_setProto","setPrototypeOf","test","buggy","__proto__","_collection","common","IS_WEAK","fixMethod","instance","HASNT_CHAINING","THROWS_ON_PRIMITIVES","ACCEPT_ITERABLES","BUGGY_ZERO","$instance","inheritIfRequired","strong","add","getOwnPropertySymbols","$assign","assign","_objectAssign","A","K","getSymbols","gOPS","isEnum","uncaughtFrozenStore","UncaughtFrozenStore","findUncaughtFrozen","splice","_collectionWeak","$has","ufstore","InternalMap","each","weak","tmp","$WeakMap","freeze","method","rApply","Reflect","fApply","thisArgument","argumentsList","L","_invoke","args","un","factories","_bind","bind","partArgs","bound","construct","invoke","rConstruct","NEW_TARGET_BUG","ARGS_BUG","Target","newTarget","$args","propertyKey","attributes","deleteProperty","receiver","getProto","$isExtensible","_ownKeys","ownKeys","$preventExtensions","V","existingDescriptor","ownDesc","setProto","defer","channel","port","process","setTask","setImmediate","clearTask","clearImmediate","MessageChannel","Dispatch","counter","queue","run","listener","event","nextTick","now","port2","port1","onmessage","postMessage","addEventListener","importScripts","cel","html","removeChild","setTimeout","_task","macrotask","Observer","MutationObserver","WebKitMutationObserver","Promise","isNode","PromiseCapability","resolve","reject","promise","$$resolve","$$reject","Internal","newGenericPromiseCapability","OwnPromiseCapability","Wrapper","_perform","task","microtask","head","last","notify","flush","parent","domain","exit","enter","navigator","standalone","then","toggle","node","createTextNode","observe","characterData","$Promise","empty","newPromiseCapability","newPromiseCapabilityModule","USE_NATIVE","FakePromise","PromiseRejectionEvent","isThenable","isReject","_n","chain","_c","_v","ok","_s","reaction","handler","fail","_h","onHandleUnhandled","onUnhandled","console","unhandled","isUnhandled","perform","emit","onunhandledrejection","reason","error","_a","onrejectionhandled","$reject","_w","$resolve","executor","err","onFulfilled","onRejected","catch","capability","x","promiseCapability","promiseResolve","all","remaining","$index","alreadyCalled","race","_wksDefine","$Symbol","charAt","wksExt","windowNames","getWindowNames","gOPNExt","$JSON","JSON","_stringify","stringify","HIDDEN","TO_PRIMITIVE","SymbolRegistry","AllSymbols","OPSymbols","QObject","findChild","setSymbolDesc","$fails","_create","protoDesc","wrap","sym","isSymbol","$defineProperty","$defineProperties","symbols","enumKeys","$propertyIsEnumerable","E","$getOwnPropertyDescriptor","$getOwnPropertyNames","$getOwnPropertySymbols","IS_OP","es6Symbols","wellKnownSymbols","wksDefine","for","keyFor","useSetter","useSimple","replacer","$replacer","_objectSap","$freeze","$seal","$isFrozen","$isSealed","$getPrototypeOf","_sameValue","y","FProto","nameRE","match","raw","callSite","tpl","fromCharCode","$fromCodePoint","fromCodePoint","code","TO_STRING","$at","pos","charCodeAt","codePointAt","_stringRepeat","str","repeat","MATCH","_isRegexp","isRegExp","_stringContext","searchString","_failsIsRegexp","re","$startsWith","startsWith","context","search","$endsWith","endsWith","endPosition","flags","RegExp","ignoreCase","multiline","unicode","sticky","_fixReWks","SYMBOL","fns","strfn","rxfn","string","$match","regexp","REPLACE","$replace","searchValue","replaceValue","SPLIT","$split","_split","$push","NPCG","limit","separator2","lastIndex","lastLength","output","lastLastIndex","splitLimit","separatorCopy","replace","SEARCH","$search","_createProperty","createProperty","$find","forced","_isFinite","isFinite","_isInteger","isInteger","isSafeInteger","EPSILON","MIN_SAFE_INTEGER","MAX_SAFE_INTEGER","_mathLog1p","log1p","sqrt","$acosh","acosh","Number","MAX_VALUE","$asinh","asinh","$atanh","atanh","_mathSign","sign","cbrt","clz32","LOG2E","cosh","$expm1","expm1","_mathExpm1","EPSILON32","MAX32","MIN32","_mathFround","fround","$abs","$sign","hypot","value1","value2","div","sum","larg","$imul","imul","xn","yn","xl","yl","log10","LOG10E","log2","sinh","tanh","trunc","$includes","_objectToArray","isEntries","$values","getOwnPropertyDescriptors","getDesc","_stringPad","maxLength","fillString","left","stringLength","fillStr","intMaxLength","fillLen","stringFiller","_userAgent","userAgent","padStart","$pad","padEnd","MSIE","time","boundArgs","setInterval","$task","TO_STRING_TAG","ArrayValues","DOMIterables","CSSRuleList","CSSStyleDeclaration","CSSValueList","ClientRectList","DOMRectList","DOMStringList","DOMTokenList","DataTransferItemList","FileList","HTMLAllCollection","HTMLCollection","HTMLFormElement","HTMLSelectElement","MediaList","MimeTypeArray","NamedNodeMap","NodeList","PaintRequestList","Plugin","PluginArray","SVGLengthList","SVGNumberList","SVGPathSegList","SVGPointList","SVGStringList","SVGTransformList","SourceBufferList","StyleSheetList","TextTrackCueList","TextTrackList","TouchList","collections","explicit","Collection","Op","hasOwn","iteratorSymbol","asyncIteratorSymbol","asyncIterator","toStringTagSymbol","toStringTag","runtime","regeneratorRuntime","GenStateSuspendedStart","GenStateSuspendedYield","GenStateExecuting","GenStateCompleted","ContinueSentinel","NativeIteratorPrototype","Gp","GeneratorFunctionPrototype","Generator","GeneratorFunction","displayName","isGeneratorFunction","genFun","ctor","mark","awrap","__await","defineIteratorMethods","AsyncIterator","async","innerFn","outerFn","tryLocsList","pop","Context","reset","skipTempReset","sent","_sent","delegate","tryEntries","resetTryEntry","stop","rootRecord","completion","rval","dispatchException","exception","handle","loc","caught","record","tryLoc","hasCatch","hasFinally","catchLoc","finallyLoc","Error","abrupt","finallyEntry","complete","afterLoc","finish","thrown","delegateYield","resultName","nextLoc","protoGenerator","generator","state","doneResult","delegateResult","maybeInvokeDelegate","tryCatch","makeInvokeMethod","obj","unwrapped","previousPromise","callInvokeWithMethodAndArg","return","info","pushTryEntry","locs","iteratorMethod","ce","CustomEvent","preventDefault","defaultPrevented","params","evt","origPrevent","bubbles","cancelable","detail","createEvent","initCustomEvent","Event","iteratorSupported","checkIfIteratorIsSupported","createIterator","items","shift","serializeParam","encodeURIComponent","deserializeParam","decodeURIComponent","URLSearchParams","attribute","append","_this","_entries","getAll","callback","thisArg","polyfillURLSearchParams","u","URL","pathname","href","searchParams","checkIfURLIsSupported","_URL","url","base","doc","implementation","createHTMLDocument","baseElement","anchorElement","body","protocol","attributeName","_anchorElement","linkURLWithAnchorAttribute","origin","expectedPort","http:","https:","ftp:","addPortToOrigin","hostname","password","username","methodName","createObjectURL","blob","revokeObjectURL","polyfillURL","location","getOrigin","range","factory","devnull","bundleIdCache","bundleResultCache","bundleCallbackQueue","publish","bundleId","pathsNotFound","q","executeCallbacks","depsNotFound","success","loadFile","path","callbackFn","numTries","isCss","maxTries","numRetries","beforeCallbackFn","before","pathStripped","rel","onload","onerror","onbeforeload","ev","sheet","cssText","loadjs","paths","arg1","arg2","trim","numWaiting","loadFiles","ready","deps","bundleIds","subscribe","isDefined","Storage","player","enabled","config","storage","supported","localStorage","getItem","utils","json","parse","extend","setItem","removeItem","providers","types","input","Boolean","nullOrUndefined","instanceof","WeakMap","Element","Text","TextTrackCue","VTTCue","TextTrack","array","nodeList","documentMode","platform","responseType","request","XMLHttpRequest","responseText","response","statusText","send","minWidth","image","Image","naturalWidth","hasId","exists","getElementById","update","container","innerHTML","insertAdjacentElement","useStorage","toggleHidden","setAttribute","cached","prefix","content","fetch","elements","targets","element","child","cloneNode","parentNode","sibling","nextSibling","insertBefore","text","setAttributes","innerText","removeElement","childNodes","lastChild","newChild","oldChild","replaceChild","_ref","_ref2","sel","existingAttributes","existing","selector","className","parts","class","hidden","boolean","hasAttribute","removeAttribute","force","classList","contains","matches","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","querySelectorAll","querySelector","focused","activeElement","focusable","getElements","trap","keyCode","getFocusElement","shiftKey","focus","on","off","passive","capture","function","Node","toggleListener","events","options","support","passiveListeners","dispatchEvent","_len","_key","current","toFixed","parseInt","displayHours","inverted","formatTime","format","hours","getHours","mins","getMinutes","secs","getSeconds","toUpperCase","substr","toLowerCase","replaceAll","toTitleCase","toPascalCase","sources","_len2","_key2","defineProperty$1","toConsumableArray","item","curr","youtube","vimeo","$2","parser","parseUrl","hash","_hash$split2","fragment","createDocumentFragment","firstChild","width","height","ratio","getRatio","h","offsetHeight","provider","playsinline","api","ui","browser","getBrowser","canPlayInline","isIPhone","video","rangeInput","audio","webkitSetPresentationMode","WebKitPlaybackTargetAvailabilityEvent","media","isHTML5","canPlayType","isVideo","isAudio","removeEventListener","transitionEndEvent","matchMedia","html5","getSources","sizes","getAttribute","dedupe","mime","currentTime","playing","onLoadedMetaData","load","play","blankVideo","debug","i18n","getDeep","seekTime","title","controls","cors","iconUrl","host","isIE","svg4everybody","getElement","selectors","buttons","pause","restart","rewind","fastForward","mute","pip","airplay","settings","captions","fullscreen","progress","inputs","seek","volume","duration","seekTooltip","classNames","tooltip","warn","toggleNativeControls","getIconUrl","iconPath","iconPrefix","icon","createElementNS","use","setAttributeNS","attr","badge","menu","buttonType","button","toCamelCase","label","labelPressed","iconPressed","control","createIcon","createLabel","getAttributesFromSelector","controlPressed","hasClass","pressed","toggleClass","updateRangeFill","suffix","_ref$badge","checked","_ref$checked","radio","faux","insertAdjacentHTML","forceHours","setRange","muted","getPercentage","getElementsByTagName","nodeValue","buffered","percent","isWebkit","setProperty","tooltips","clientRect","getBoundingClientRect","visible","_toggle","_this2","touch","pageX","parseFloat","updateTimeDisplay","invert","invertTime","seeking","updateProgress","hasDuration","displayDuration","paused","updateSeekTooltip","setting","tabs","panes","quality","_this3","toggleTab","checkMenu","emptyElement","sorting","createMenuItem","getLabel","createBadge","getBadge","updateSetting","pane","currentTrack","default","tracks","getTracks","track","_this4","active","language","unshift","speed","isVimeo","_this5","tab","form","show","isMenuItem","isButton","stopPropagation","clone","position","opacity","scrollWidth","scrollHeight","transitions","reducedMotion","size","getTabSize","restore","propertyName","createButton","createRange","createProgress","createTime","inner","home","_this6","back","setQualityMenu","getQualityOptions","setSpeedMenu","loadSprite","props","_ref3","findElements","repaint","labels","_this7","isYouTube","textTracks","setCaptionsMenu","insertAfter","userLanguage","setLanguage","trackEvents","_captions","mode","updateCues","trackRemoved","currentTrackNode","firstMatch","getCurrentTrack","embed","enableTextTrack","toggleCaptions","fromLanguage","sortIsDefault","sorted","cues","activeCues","cue","getCueAsHTML","getHTML","cueText","caption","noop","Console","defaults","onChange","isIos","trapFocus","toggleFallback","scrollPosition","scrollX","scrollY","scrollTo","overflow","fallback","Fullscreen","property","native","iosNative","webkitEnterFullscreen","requestFullscreen","webkitExitFullscreen","action","cancelFullScreen","exitFullscreen","fullscreenElement","fullscreenEnabled","webkitFullscreenEnabled","mozFullScreenEnabled","msFullscreenEnabled","pre","uiSupported","listeners","inject","setup","loop","updateVolume","timeUpdate","checkPlaying","isTouch","setTitle","poster","backgroundImage","setPoster","durationUpdate","isEmbed","enable","posterEnabled","loadPromise","loadImage","togglePoster","stopped","toggleControls","loading","timers","hideControls","hover","Listeners","lastKey","handleKey","toggleMenu","firstTouch","which","altKey","ctrlKey","metaKey","editable","togglePlay","increaseVolume","decreaseVolume","forward","keyboard","tabFocus","delay","hasAudio","resetOnEnd","checkLoading","ads","initialized","managerPromise","clickToPlay","ended","disableContextMenu","_event$detail","inputEvent","proxy","defaultHandler","customHandlerKey","customHandler","returned","hasCustomHandler","showHomeTab","showTab","currentTarget","eventType","seekTo","toggleInvert","_player","noTransition","webkitDirectionInvertedFromDevice","direction","deltaY","deltaX","assurePlaybackState","hasPlayed","setAspectRatio","Vimeo","loadScript","urls","sdk","padding","paddingBottom","transform","autoplay","buildUrlParams","parseVimeoId","embedContainer","replaceElement","thumbnail_large","Player","autopause","disableTextTrack","restorePause","setVolume","setCurrentTime","selected","setPlaybackRate","setLoop","currentSrc","getVideoUrl","getVideoWidth","getVideoHeight","dimensions","getAspectRatio","setAutopause","getVideoTitle","getCurrentTime","getDuration","getTextTracks","strippedCues","_ref$cues","stripHTML","getPaused","seconds","build","mapQualityUnit","YT","onYouTubeReadyCallbacks","onYouTubeIframeAPIReady","videoId","getVideoData","google","snippet","currentId","parseYouTubeId","generateId","posterSrc","backgroundSize","message","playbackRate","getPlaybackRate","getTitle","playVideo","pauseVideo","stopVideo","getPlaybackQuality","setPlaybackQuality","getAvailablePlaybackRates","buffering","getVideoLoadedFraction","lastBuffered","levels","getAvailableQualityLevels","level","unMute","Ads","publisherId","manager","loader","cuePoints","safetyTimer","countdownTimer","ima","googleIMA","trigger","startSafetyTimer","clearSafetyTimer","setupIMA","setVpaidMode","ImaSdkSettings","VpaidMode","ENABLED","setLocale","displayContainer","AdDisplayContainer","requestAds","AdsLoader","AdsManagerLoadedEvent","Type","ADS_MANAGER_LOADED","onAdsManagerLoaded","AdErrorEvent","AD_ERROR","onAdError","AdsRequest","adTagUrl","tagUrl","linearAdSlotWidth","offsetWidth","linearAdSlotHeight","nonLinearAdSlotWidth","nonLinearAdSlotHeight","forceNonLinearFullSlot","setAdWillPlayMuted","getRemainingTime","AdsRenderingSettings","restoreCustomPlaybackStateOnAdBreakComplete","enablePreloading","getAdsManager","getCuePoints","cuePoint","seekElement","cuePercentage","AdEvent","onAdEvent","ad","getAd","LOADED","pollCountdown","isLinear","ALL_ADS_COMPLETED","loadAds","CONTENT_PAUSE_REQUESTED","pauseContent","CONTENT_RESUME_REQUESTED","resumeContent","STARTED","MIDPOINT","COMPLETE","IMPRESSION","CLICK","cancel","contentComplete","_this8","seekedTime","discardAdBreak","resize","ViewMode","NORMAL","initialize","_this9","adError","zIndex","_this10","destroy","handlers","_this11","Date","insertElement","cancelRequests","crossorigin","addStyleHook","insertElements","Plyr","failed","jQuery","plyr","tagName","getProviderByUrl","getUrlParams","truthy","webkitShowPlaybackTargetPicker","isHidden","hiding","eventName","soft","unload","inputIsValid","fauxDuration","mozHasAudio","webkitAudioDecodedByteCount","audioTracks","closest","change","states","webkitPresentationMode","inline","t","cloneDeep"],"mappings":"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W+zB,SAnBhEC,GCFfC,aAEO,QAGF,UAGA,YAGG,aAGC,eAIE,WAGH,UAGF,SACD,WAGG,sBAIO,cAGL,gBAGE,QAGP,oBAGM,gBAGC,cAGF,sBAGQ,cAGR,aACA,eACH,iDAGG,wDAIC,aAEL,KACA,KACA,KACA,KACA,KACA,IACA,IACA,IACA,IACA,IACA,0BAMI,mBAOE,WAEN,GACA,IACA,EACA,KACA,IACA,KACA,uBAMK,UACD,uBAKE,QACJ,qBAKE,WACE,eAGF,wBAKC,YACC,aACC,qBAKF,MACJ,kBAKL,+BAMA,eACA,OACA,SACA,WACA,WACA,MACA,UACA,wBAGA,WACA,UACA,uBAKS,iBACD,0BACF,aACC,oBACM,2BACP,iBACK,qCACH,kBACE,uBACG,wBACH,kBACF,cACF,cACE,wBACQ,kCACC,mCACA,kCACD,6BACJ,8BACF,oBACA,oBACA,iCACH,eACC,iBACC,eACH,aACC,YACF,UACA,YACE,iBACG,mBACD,wBACM,wBAEL,UACA,UACA,SACD,SACA,SACA,wBAOA,gDACG,6CACH,wDAGA,yCACA,wHAGA,uEAMH,UACA,WACC,aACE,YACD,iBACK,UACP,YACE,cACE,gBACE,SACP,aACI,WACF,aACE,UACH,cACI,sBAQV,WACA,UACA,UACA,UACA,UACA,iBACA,YACA,aACA,iBACA,aACA,eACA,OACA,QACA,QACA,UACA,SACA,UACA,aACA,8BAIA,iBACA,kBACA,mBACA,iBACA,iBACA,gBACA,sBAIA,gBACA,+BAIA,kBACA,mBACA,YACA,cACA,cACA,iBACA,gBACA,gCAMU,uDACC,4BAEI,aACF,0BAEL,4BAEE,2BACC,8BACE,+BACD,mCACK,kCACP,8BACI,oCACE,+BACP,4BACI,iCACC,8BACJ,mCAGA,4BACE,6BACD,+BACG,iCACD,8CAGI,gCACH,+BACF,+BACF,+BACE,mCAEF,2BACA,0BACD,+BAEI,mDAMP,qBACI,kBACH,4BACA,mCACS,sCACR,6BACO,2BACV,oBACI,+BACO,iCACP,uBACD,uBACC,wBACA,sBACF,sBACE,qBACH,oBACE,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","file":"plyr.polyfilled.min.js","sourcesContent":["// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nvar global = module.exports = typeof window != 'undefined' && window.Math == Math\n ? window : typeof self != 'undefined' && self.Math == Math ? self\n // eslint-disable-next-line no-new-func\n : Function('return this')();\nif (typeof __g == 'number') __g = global; // eslint-disable-line no-undef\n","var core = module.exports = { version: '2.5.3' };\nif (typeof __e == 'number') __e = core; // eslint-disable-line no-undef\n","module.exports = function (it) {\n return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n","var isObject = require('./_is-object');\nmodule.exports = function (it) {\n if (!isObject(it)) throw TypeError(it + ' is not an object!');\n return it;\n};\n","module.exports = function (exec) {\n try {\n return !!exec();\n } catch (e) {\n return true;\n }\n};\n","// Thank's IE8 for his funny defineProperty\nmodule.exports = !require('./_fails')(function () {\n return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;\n});\n","var isObject = require('./_is-object');\nvar document = require('./_global').document;\n// typeof document.createElement is 'object' in old IE\nvar is = isObject(document) && isObject(document.createElement);\nmodule.exports = function (it) {\n return is ? document.createElement(it) : {};\n};\n","module.exports = !require('./_descriptors') && !require('./_fails')(function () {\n return Object.defineProperty(require('./_dom-create')('div'), 'a', { get: function () { return 7; } }).a != 7;\n});\n","// 7.1.1 ToPrimitive(input [, PreferredType])\nvar isObject = require('./_is-object');\n// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n// and the second argument - flag - preferred type is a string\nmodule.exports = function (it, S) {\n if (!isObject(it)) return it;\n var fn, val;\n if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;\n if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n throw TypeError(\"Can't convert object to primitive value\");\n};\n","var anObject = require('./_an-object');\nvar IE8_DOM_DEFINE = require('./_ie8-dom-define');\nvar toPrimitive = require('./_to-primitive');\nvar dP = Object.defineProperty;\n\nexports.f = require('./_descriptors') ? Object.defineProperty : function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPrimitive(P, true);\n anObject(Attributes);\n if (IE8_DOM_DEFINE) try {\n return dP(O, P, Attributes);\n } catch (e) { /* empty */ }\n if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');\n if ('value' in Attributes) O[P] = Attributes.value;\n return O;\n};\n","module.exports = function (bitmap, value) {\n return {\n enumerable: !(bitmap & 1),\n configurable: !(bitmap & 2),\n writable: !(bitmap & 4),\n value: value\n };\n};\n","var dP = require('./_object-dp');\nvar createDesc = require('./_property-desc');\nmodule.exports = require('./_descriptors') ? function (object, key, value) {\n return dP.f(object, key, createDesc(1, value));\n} : function (object, key, value) {\n object[key] = value;\n return object;\n};\n","var hasOwnProperty = {}.hasOwnProperty;\nmodule.exports = function (it, key) {\n return hasOwnProperty.call(it, key);\n};\n","var id = 0;\nvar px = Math.random();\nmodule.exports = function (key) {\n return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));\n};\n","var global = require('./_global');\nvar hide = require('./_hide');\nvar has = require('./_has');\nvar SRC = require('./_uid')('src');\nvar TO_STRING = 'toString';\nvar $toString = Function[TO_STRING];\nvar TPL = ('' + $toString).split(TO_STRING);\n\nrequire('./_core').inspectSource = function (it) {\n return $toString.call(it);\n};\n\n(module.exports = function (O, key, val, safe) {\n var isFunction = typeof val == 'function';\n if (isFunction) has(val, 'name') || hide(val, 'name', key);\n if (O[key] === val) return;\n if (isFunction) has(val, SRC) || hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key)));\n if (O === global) {\n O[key] = val;\n } else if (!safe) {\n delete O[key];\n hide(O, key, val);\n } else if (O[key]) {\n O[key] = val;\n } else {\n hide(O, key, val);\n }\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n})(Function.prototype, TO_STRING, function toString() {\n return typeof this == 'function' && this[SRC] || $toString.call(this);\n});\n","module.exports = function (it) {\n if (typeof it != 'function') throw TypeError(it + ' is not a function!');\n return it;\n};\n","// optional / simple context binding\nvar aFunction = require('./_a-function');\nmodule.exports = function (fn, that, length) {\n aFunction(fn);\n if (that === undefined) return fn;\n switch (length) {\n case 1: return function (a) {\n return fn.call(that, a);\n };\n case 2: return function (a, b) {\n return fn.call(that, a, b);\n };\n case 3: return function (a, b, c) {\n return fn.call(that, a, b, c);\n };\n }\n return function (/* ...args */) {\n return fn.apply(that, arguments);\n };\n};\n","var global = require('./_global');\nvar core = require('./_core');\nvar hide = require('./_hide');\nvar redefine = require('./_redefine');\nvar ctx = require('./_ctx');\nvar PROTOTYPE = 'prototype';\n\nvar $export = function (type, name, source) {\n var IS_FORCED = type & $export.F;\n var IS_GLOBAL = type & $export.G;\n var IS_STATIC = type & $export.S;\n var IS_PROTO = type & $export.P;\n var IS_BIND = type & $export.B;\n var target = IS_GLOBAL ? global : IS_STATIC ? global[name] || (global[name] = {}) : (global[name] || {})[PROTOTYPE];\n var exports = IS_GLOBAL ? core : core[name] || (core[name] = {});\n var expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {});\n var key, own, out, exp;\n if (IS_GLOBAL) source = name;\n for (key in source) {\n // contains in native\n own = !IS_FORCED && target && target[key] !== undefined;\n // export native or passed\n out = (own ? target : source)[key];\n // bind timers to global for call from export context\n exp = IS_BIND && own ? ctx(out, global) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;\n // extend global\n if (target) redefine(target, key, out, type & $export.U);\n // export\n if (exports[key] != out) hide(exports, key, exp);\n if (IS_PROTO && expProto[key] != out) expProto[key] = out;\n }\n};\nglobal.core = core;\n// type bitmap\n$export.F = 1; // forced\n$export.G = 2; // global\n$export.S = 4; // static\n$export.P = 8; // proto\n$export.B = 16; // bind\n$export.W = 32; // wrap\n$export.U = 64; // safe\n$export.R = 128; // real proto method for `library`\nmodule.exports = $export;\n","var global = require('./_global');\nvar hide = require('./_hide');\nvar uid = require('./_uid');\nvar TYPED = uid('typed_array');\nvar VIEW = uid('view');\nvar ABV = !!(global.ArrayBuffer && global.DataView);\nvar CONSTR = ABV;\nvar i = 0;\nvar l = 9;\nvar Typed;\n\nvar TypedArrayConstructors = (\n 'Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array'\n).split(',');\n\nwhile (i < l) {\n if (Typed = global[TypedArrayConstructors[i++]]) {\n hide(Typed.prototype, TYPED, true);\n hide(Typed.prototype, VIEW, true);\n } else CONSTR = false;\n}\n\nmodule.exports = {\n ABV: ABV,\n CONSTR: CONSTR,\n TYPED: TYPED,\n VIEW: VIEW\n};\n","var redefine = require('./_redefine');\nmodule.exports = function (target, src, safe) {\n for (var key in src) redefine(target, key, src[key], safe);\n return target;\n};\n","module.exports = function (it, Constructor, name, forbiddenField) {\n if (!(it instanceof Constructor) || (forbiddenField !== undefined && forbiddenField in it)) {\n throw TypeError(name + ': incorrect invocation!');\n } return it;\n};\n","// 7.1.4 ToInteger\nvar ceil = Math.ceil;\nvar floor = Math.floor;\nmodule.exports = function (it) {\n return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);\n};\n","// 7.1.15 ToLength\nvar toInteger = require('./_to-integer');\nvar min = Math.min;\nmodule.exports = function (it) {\n return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991\n};\n","// https://tc39.github.io/ecma262/#sec-toindex\nvar toInteger = require('./_to-integer');\nvar toLength = require('./_to-length');\nmodule.exports = function (it) {\n if (it === undefined) return 0;\n var number = toInteger(it);\n var length = toLength(number);\n if (number !== length) throw RangeError('Wrong length!');\n return length;\n};\n","var toString = {}.toString;\n\nmodule.exports = function (it) {\n return toString.call(it).slice(8, -1);\n};\n","// fallback for non-array-like ES3 and non-enumerable old V8 strings\nvar cof = require('./_cof');\n// eslint-disable-next-line no-prototype-builtins\nmodule.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) {\n return cof(it) == 'String' ? it.split('') : Object(it);\n};\n","// 7.2.1 RequireObjectCoercible(argument)\nmodule.exports = function (it) {\n if (it == undefined) throw TypeError(\"Can't call method on \" + it);\n return it;\n};\n","// to indexed object, toObject with fallback for non-array-like ES3 strings\nvar IObject = require('./_iobject');\nvar defined = require('./_defined');\nmodule.exports = function (it) {\n return IObject(defined(it));\n};\n","var toInteger = require('./_to-integer');\nvar max = Math.max;\nvar min = Math.min;\nmodule.exports = function (index, length) {\n index = toInteger(index);\n return index < 0 ? max(index + length, 0) : min(index, length);\n};\n","// false -> Array#indexOf\n// true -> Array#includes\nvar toIObject = require('./_to-iobject');\nvar toLength = require('./_to-length');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nmodule.exports = function (IS_INCLUDES) {\n return function ($this, el, fromIndex) {\n var O = toIObject($this);\n var length = toLength(O.length);\n var index = toAbsoluteIndex(fromIndex, length);\n var value;\n // Array#includes uses SameValueZero equality algorithm\n // eslint-disable-next-line no-self-compare\n if (IS_INCLUDES && el != el) while (length > index) {\n value = O[index++];\n // eslint-disable-next-line no-self-compare\n if (value != value) return true;\n // Array#indexOf ignores holes, Array#includes - not\n } else for (;length > index; index++) if (IS_INCLUDES || index in O) {\n if (O[index] === el) return IS_INCLUDES || index || 0;\n } return !IS_INCLUDES && -1;\n };\n};\n","var global = require('./_global');\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || (global[SHARED] = {});\nmodule.exports = function (key) {\n return store[key] || (store[key] = {});\n};\n","var shared = require('./_shared')('keys');\nvar uid = require('./_uid');\nmodule.exports = function (key) {\n return shared[key] || (shared[key] = uid(key));\n};\n","var has = require('./_has');\nvar toIObject = require('./_to-iobject');\nvar arrayIndexOf = require('./_array-includes')(false);\nvar IE_PROTO = require('./_shared-key')('IE_PROTO');\n\nmodule.exports = function (object, names) {\n var O = toIObject(object);\n var i = 0;\n var result = [];\n var key;\n for (key in O) if (key != IE_PROTO) has(O, key) && result.push(key);\n // Don't enum bug & hidden keys\n while (names.length > i) if (has(O, key = names[i++])) {\n ~arrayIndexOf(result, key) || result.push(key);\n }\n return result;\n};\n","// IE 8- don't enum bug keys\nmodule.exports = (\n 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'\n).split(',');\n","// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)\nvar $keys = require('./_object-keys-internal');\nvar hiddenKeys = require('./_enum-bug-keys').concat('length', 'prototype');\n\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n return $keys(O, hiddenKeys);\n};\n","// 7.1.13 ToObject(argument)\nvar defined = require('./_defined');\nmodule.exports = function (it) {\n return Object(defined(it));\n};\n","// 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length)\n'use strict';\nvar toObject = require('./_to-object');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nvar toLength = require('./_to-length');\nmodule.exports = function fill(value /* , start = 0, end = @length */) {\n var O = toObject(this);\n var length = toLength(O.length);\n var aLen = arguments.length;\n var index = toAbsoluteIndex(aLen > 1 ? arguments[1] : undefined, length);\n var end = aLen > 2 ? arguments[2] : undefined;\n var endPos = end === undefined ? length : toAbsoluteIndex(end, length);\n while (endPos > index) O[index++] = value;\n return O;\n};\n","var store = require('./_shared')('wks');\nvar uid = require('./_uid');\nvar Symbol = require('./_global').Symbol;\nvar USE_SYMBOL = typeof Symbol == 'function';\n\nvar $exports = module.exports = function (name) {\n return store[name] || (store[name] =\n USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name));\n};\n\n$exports.store = store;\n","var def = require('./_object-dp').f;\nvar has = require('./_has');\nvar TAG = require('./_wks')('toStringTag');\n\nmodule.exports = function (it, tag, stat) {\n if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag });\n};\n","'use strict';\nvar global = require('./_global');\nvar DESCRIPTORS = require('./_descriptors');\nvar LIBRARY = require('./_library');\nvar $typed = require('./_typed');\nvar hide = require('./_hide');\nvar redefineAll = require('./_redefine-all');\nvar fails = require('./_fails');\nvar anInstance = require('./_an-instance');\nvar toInteger = require('./_to-integer');\nvar toLength = require('./_to-length');\nvar toIndex = require('./_to-index');\nvar gOPN = require('./_object-gopn').f;\nvar dP = require('./_object-dp').f;\nvar arrayFill = require('./_array-fill');\nvar setToStringTag = require('./_set-to-string-tag');\nvar ARRAY_BUFFER = 'ArrayBuffer';\nvar DATA_VIEW = 'DataView';\nvar PROTOTYPE = 'prototype';\nvar WRONG_LENGTH = 'Wrong length!';\nvar WRONG_INDEX = 'Wrong index!';\nvar $ArrayBuffer = global[ARRAY_BUFFER];\nvar $DataView = global[DATA_VIEW];\nvar Math = global.Math;\nvar RangeError = global.RangeError;\n// eslint-disable-next-line no-shadow-restricted-names\nvar Infinity = global.Infinity;\nvar BaseBuffer = $ArrayBuffer;\nvar abs = Math.abs;\nvar pow = Math.pow;\nvar floor = Math.floor;\nvar log = Math.log;\nvar LN2 = Math.LN2;\nvar BUFFER = 'buffer';\nvar BYTE_LENGTH = 'byteLength';\nvar BYTE_OFFSET = 'byteOffset';\nvar $BUFFER = DESCRIPTORS ? '_b' : BUFFER;\nvar $LENGTH = DESCRIPTORS ? '_l' : BYTE_LENGTH;\nvar $OFFSET = DESCRIPTORS ? '_o' : BYTE_OFFSET;\n\n// IEEE754 conversions based on https://github.com/feross/ieee754\nfunction packIEEE754(value, mLen, nBytes) {\n var buffer = new Array(nBytes);\n var eLen = nBytes * 8 - mLen - 1;\n var eMax = (1 << eLen) - 1;\n var eBias = eMax >> 1;\n var rt = mLen === 23 ? pow(2, -24) - pow(2, -77) : 0;\n var i = 0;\n var s = value < 0 || value === 0 && 1 / value < 0 ? 1 : 0;\n var e, m, c;\n value = abs(value);\n // eslint-disable-next-line no-self-compare\n if (value != value || value === Infinity) {\n // eslint-disable-next-line no-self-compare\n m = value != value ? 1 : 0;\n e = eMax;\n } else {\n e = floor(log(value) / LN2);\n if (value * (c = pow(2, -e)) < 1) {\n e--;\n c *= 2;\n }\n if (e + eBias >= 1) {\n value += rt / c;\n } else {\n value += rt * pow(2, 1 - eBias);\n }\n if (value * c >= 2) {\n e++;\n c /= 2;\n }\n if (e + eBias >= eMax) {\n m = 0;\n e = eMax;\n } else if (e + eBias >= 1) {\n m = (value * c - 1) * pow(2, mLen);\n e = e + eBias;\n } else {\n m = value * pow(2, eBias - 1) * pow(2, mLen);\n e = 0;\n }\n }\n for (; mLen >= 8; buffer[i++] = m & 255, m /= 256, mLen -= 8);\n e = e << mLen | m;\n eLen += mLen;\n for (; eLen > 0; buffer[i++] = e & 255, e /= 256, eLen -= 8);\n buffer[--i] |= s * 128;\n return buffer;\n}\nfunction unpackIEEE754(buffer, mLen, nBytes) {\n var eLen = nBytes * 8 - mLen - 1;\n var eMax = (1 << eLen) - 1;\n var eBias = eMax >> 1;\n var nBits = eLen - 7;\n var i = nBytes - 1;\n var s = buffer[i--];\n var e = s & 127;\n var m;\n s >>= 7;\n for (; nBits > 0; e = e * 256 + buffer[i], i--, nBits -= 8);\n m = e & (1 << -nBits) - 1;\n e >>= -nBits;\n nBits += mLen;\n for (; nBits > 0; m = m * 256 + buffer[i], i--, nBits -= 8);\n if (e === 0) {\n e = 1 - eBias;\n } else if (e === eMax) {\n return m ? NaN : s ? -Infinity : Infinity;\n } else {\n m = m + pow(2, mLen);\n e = e - eBias;\n } return (s ? -1 : 1) * m * pow(2, e - mLen);\n}\n\nfunction unpackI32(bytes) {\n return bytes[3] << 24 | bytes[2] << 16 | bytes[1] << 8 | bytes[0];\n}\nfunction packI8(it) {\n return [it & 0xff];\n}\nfunction packI16(it) {\n return [it & 0xff, it >> 8 & 0xff];\n}\nfunction packI32(it) {\n return [it & 0xff, it >> 8 & 0xff, it >> 16 & 0xff, it >> 24 & 0xff];\n}\nfunction packF64(it) {\n return packIEEE754(it, 52, 8);\n}\nfunction packF32(it) {\n return packIEEE754(it, 23, 4);\n}\n\nfunction addGetter(C, key, internal) {\n dP(C[PROTOTYPE], key, { get: function () { return this[internal]; } });\n}\n\nfunction get(view, bytes, index, isLittleEndian) {\n var numIndex = +index;\n var intIndex = toIndex(numIndex);\n if (intIndex + bytes > view[$LENGTH]) throw RangeError(WRONG_INDEX);\n var store = view[$BUFFER]._b;\n var start = intIndex + view[$OFFSET];\n var pack = store.slice(start, start + bytes);\n return isLittleEndian ? pack : pack.reverse();\n}\nfunction set(view, bytes, index, conversion, value, isLittleEndian) {\n var numIndex = +index;\n var intIndex = toIndex(numIndex);\n if (intIndex + bytes > view[$LENGTH]) throw RangeError(WRONG_INDEX);\n var store = view[$BUFFER]._b;\n var start = intIndex + view[$OFFSET];\n var pack = conversion(+value);\n for (var i = 0; i < bytes; i++) store[start + i] = pack[isLittleEndian ? i : bytes - i - 1];\n}\n\nif (!$typed.ABV) {\n $ArrayBuffer = function ArrayBuffer(length) {\n anInstance(this, $ArrayBuffer, ARRAY_BUFFER);\n var byteLength = toIndex(length);\n this._b = arrayFill.call(new Array(byteLength), 0);\n this[$LENGTH] = byteLength;\n };\n\n $DataView = function DataView(buffer, byteOffset, byteLength) {\n anInstance(this, $DataView, DATA_VIEW);\n anInstance(buffer, $ArrayBuffer, DATA_VIEW);\n var bufferLength = buffer[$LENGTH];\n var offset = toInteger(byteOffset);\n if (offset < 0 || offset > bufferLength) throw RangeError('Wrong offset!');\n byteLength = byteLength === undefined ? bufferLength - offset : toLength(byteLength);\n if (offset + byteLength > bufferLength) throw RangeError(WRONG_LENGTH);\n this[$BUFFER] = buffer;\n this[$OFFSET] = offset;\n this[$LENGTH] = byteLength;\n };\n\n if (DESCRIPTORS) {\n addGetter($ArrayBuffer, BYTE_LENGTH, '_l');\n addGetter($DataView, BUFFER, '_b');\n addGetter($DataView, BYTE_LENGTH, '_l');\n addGetter($DataView, BYTE_OFFSET, '_o');\n }\n\n redefineAll($DataView[PROTOTYPE], {\n getInt8: function getInt8(byteOffset) {\n return get(this, 1, byteOffset)[0] << 24 >> 24;\n },\n getUint8: function getUint8(byteOffset) {\n return get(this, 1, byteOffset)[0];\n },\n getInt16: function getInt16(byteOffset /* , littleEndian */) {\n var bytes = get(this, 2, byteOffset, arguments[1]);\n return (bytes[1] << 8 | bytes[0]) << 16 >> 16;\n },\n getUint16: function getUint16(byteOffset /* , littleEndian */) {\n var bytes = get(this, 2, byteOffset, arguments[1]);\n return bytes[1] << 8 | bytes[0];\n },\n getInt32: function getInt32(byteOffset /* , littleEndian */) {\n return unpackI32(get(this, 4, byteOffset, arguments[1]));\n },\n getUint32: function getUint32(byteOffset /* , littleEndian */) {\n return unpackI32(get(this, 4, byteOffset, arguments[1])) >>> 0;\n },\n getFloat32: function getFloat32(byteOffset /* , littleEndian */) {\n return unpackIEEE754(get(this, 4, byteOffset, arguments[1]), 23, 4);\n },\n getFloat64: function getFloat64(byteOffset /* , littleEndian */) {\n return unpackIEEE754(get(this, 8, byteOffset, arguments[1]), 52, 8);\n },\n setInt8: function setInt8(byteOffset, value) {\n set(this, 1, byteOffset, packI8, value);\n },\n setUint8: function setUint8(byteOffset, value) {\n set(this, 1, byteOffset, packI8, value);\n },\n setInt16: function setInt16(byteOffset, value /* , littleEndian */) {\n set(this, 2, byteOffset, packI16, value, arguments[2]);\n },\n setUint16: function setUint16(byteOffset, value /* , littleEndian */) {\n set(this, 2, byteOffset, packI16, value, arguments[2]);\n },\n setInt32: function setInt32(byteOffset, value /* , littleEndian */) {\n set(this, 4, byteOffset, packI32, value, arguments[2]);\n },\n setUint32: function setUint32(byteOffset, value /* , littleEndian */) {\n set(this, 4, byteOffset, packI32, value, arguments[2]);\n },\n setFloat32: function setFloat32(byteOffset, value /* , littleEndian */) {\n set(this, 4, byteOffset, packF32, value, arguments[2]);\n },\n setFloat64: function setFloat64(byteOffset, value /* , littleEndian */) {\n set(this, 8, byteOffset, packF64, value, arguments[2]);\n }\n });\n} else {\n if (!fails(function () {\n $ArrayBuffer(1);\n }) || !fails(function () {\n new $ArrayBuffer(-1); // eslint-disable-line no-new\n }) || fails(function () {\n new $ArrayBuffer(); // eslint-disable-line no-new\n new $ArrayBuffer(1.5); // eslint-disable-line no-new\n new $ArrayBuffer(NaN); // eslint-disable-line no-new\n return $ArrayBuffer.name != ARRAY_BUFFER;\n })) {\n $ArrayBuffer = function ArrayBuffer(length) {\n anInstance(this, $ArrayBuffer);\n return new BaseBuffer(toIndex(length));\n };\n var ArrayBufferProto = $ArrayBuffer[PROTOTYPE] = BaseBuffer[PROTOTYPE];\n for (var keys = gOPN(BaseBuffer), j = 0, key; keys.length > j;) {\n if (!((key = keys[j++]) in $ArrayBuffer)) hide($ArrayBuffer, key, BaseBuffer[key]);\n }\n if (!LIBRARY) ArrayBufferProto.constructor = $ArrayBuffer;\n }\n // iOS Safari 7.x bug\n var view = new $DataView(new $ArrayBuffer(2));\n var $setInt8 = $DataView[PROTOTYPE].setInt8;\n view.setInt8(0, 2147483648);\n view.setInt8(1, 2147483649);\n if (view.getInt8(0) || !view.getInt8(1)) redefineAll($DataView[PROTOTYPE], {\n setInt8: function setInt8(byteOffset, value) {\n $setInt8.call(this, byteOffset, value << 24 >> 24);\n },\n setUint8: function setUint8(byteOffset, value) {\n $setInt8.call(this, byteOffset, value << 24 >> 24);\n }\n }, true);\n}\nsetToStringTag($ArrayBuffer, ARRAY_BUFFER);\nsetToStringTag($DataView, DATA_VIEW);\nhide($DataView[PROTOTYPE], $typed.VIEW, true);\nexports[ARRAY_BUFFER] = $ArrayBuffer;\nexports[DATA_VIEW] = $DataView;\n","// 7.3.20 SpeciesConstructor(O, defaultConstructor)\nvar anObject = require('./_an-object');\nvar aFunction = require('./_a-function');\nvar SPECIES = require('./_wks')('species');\nmodule.exports = function (O, D) {\n var C = anObject(O).constructor;\n var S;\n return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? D : aFunction(S);\n};\n","'use strict';\nvar global = require('./_global');\nvar dP = require('./_object-dp');\nvar DESCRIPTORS = require('./_descriptors');\nvar SPECIES = require('./_wks')('species');\n\nmodule.exports = function (KEY) {\n var C = global[KEY];\n if (DESCRIPTORS && C && !C[SPECIES]) dP.f(C, SPECIES, {\n configurable: true,\n get: function () { return this; }\n });\n};\n","'use strict';\nvar $export = require('./_export');\nvar $typed = require('./_typed');\nvar buffer = require('./_typed-buffer');\nvar anObject = require('./_an-object');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nvar toLength = require('./_to-length');\nvar isObject = require('./_is-object');\nvar ArrayBuffer = require('./_global').ArrayBuffer;\nvar speciesConstructor = require('./_species-constructor');\nvar $ArrayBuffer = buffer.ArrayBuffer;\nvar $DataView = buffer.DataView;\nvar $isView = $typed.ABV && ArrayBuffer.isView;\nvar $slice = $ArrayBuffer.prototype.slice;\nvar VIEW = $typed.VIEW;\nvar ARRAY_BUFFER = 'ArrayBuffer';\n\n$export($export.G + $export.W + $export.F * (ArrayBuffer !== $ArrayBuffer), { ArrayBuffer: $ArrayBuffer });\n\n$export($export.S + $export.F * !$typed.CONSTR, ARRAY_BUFFER, {\n // 24.1.3.1 ArrayBuffer.isView(arg)\n isView: function isView(it) {\n return $isView && $isView(it) || isObject(it) && VIEW in it;\n }\n});\n\n$export($export.P + $export.U + $export.F * require('./_fails')(function () {\n return !new $ArrayBuffer(2).slice(1, undefined).byteLength;\n}), ARRAY_BUFFER, {\n // 24.1.4.3 ArrayBuffer.prototype.slice(start, end)\n slice: function slice(start, end) {\n if ($slice !== undefined && end === undefined) return $slice.call(anObject(this), start); // FF fix\n var len = anObject(this).byteLength;\n var first = toAbsoluteIndex(start, len);\n var final = toAbsoluteIndex(end === undefined ? len : end, len);\n var result = new (speciesConstructor(this, $ArrayBuffer))(toLength(final - first));\n var viewS = new $DataView(this);\n var viewT = new $DataView(result);\n var index = 0;\n while (first < final) {\n viewT.setUint8(index++, viewS.getUint8(first++));\n } return result;\n }\n});\n\nrequire('./_set-species')(ARRAY_BUFFER);\n","// getting tag from 19.1.3.6 Object.prototype.toString()\nvar cof = require('./_cof');\nvar TAG = require('./_wks')('toStringTag');\n// ES3 wrong here\nvar ARG = cof(function () { return arguments; }()) == 'Arguments';\n\n// fallback for IE11 Script Access Denied error\nvar tryGet = function (it, key) {\n try {\n return it[key];\n } catch (e) { /* empty */ }\n};\n\nmodule.exports = function (it) {\n var O, T, B;\n return it === undefined ? 'Undefined' : it === null ? 'Null'\n // @@toStringTag case\n : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T\n // builtinTag case\n : ARG ? cof(O)\n // ES3 arguments fallback\n : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;\n};\n","module.exports = {};\n","// check on default Array iterator\nvar Iterators = require('./_iterators');\nvar ITERATOR = require('./_wks')('iterator');\nvar ArrayProto = Array.prototype;\n\nmodule.exports = function (it) {\n return it !== undefined && (Iterators.Array === it || ArrayProto[ITERATOR] === it);\n};\n","// 19.1.2.14 / 15.2.3.14 Object.keys(O)\nvar $keys = require('./_object-keys-internal');\nvar enumBugKeys = require('./_enum-bug-keys');\n\nmodule.exports = Object.keys || function keys(O) {\n return $keys(O, enumBugKeys);\n};\n","var dP = require('./_object-dp');\nvar anObject = require('./_an-object');\nvar getKeys = require('./_object-keys');\n\nmodule.exports = require('./_descriptors') ? Object.defineProperties : function defineProperties(O, Properties) {\n anObject(O);\n var keys = getKeys(Properties);\n var length = keys.length;\n var i = 0;\n var P;\n while (length > i) dP.f(O, P = keys[i++], Properties[P]);\n return O;\n};\n","var document = require('./_global').document;\nmodule.exports = document && document.documentElement;\n","// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])\nvar anObject = require('./_an-object');\nvar dPs = require('./_object-dps');\nvar enumBugKeys = require('./_enum-bug-keys');\nvar IE_PROTO = require('./_shared-key')('IE_PROTO');\nvar Empty = function () { /* empty */ };\nvar PROTOTYPE = 'prototype';\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar createDict = function () {\n // Thrash, waste and sodomy: IE GC bug\n var iframe = require('./_dom-create')('iframe');\n var i = enumBugKeys.length;\n var lt = '<';\n var gt = '>';\n var iframeDocument;\n iframe.style.display = 'none';\n require('./_html').appendChild(iframe);\n iframe.src = 'javascript:'; // eslint-disable-line no-script-url\n // createDict = iframe.contentWindow.Object;\n // html.removeChild(iframe);\n iframeDocument = iframe.contentWindow.document;\n iframeDocument.open();\n iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);\n iframeDocument.close();\n createDict = iframeDocument.F;\n while (i--) delete createDict[PROTOTYPE][enumBugKeys[i]];\n return createDict();\n};\n\nmodule.exports = Object.create || function create(O, Properties) {\n var result;\n if (O !== null) {\n Empty[PROTOTYPE] = anObject(O);\n result = new Empty();\n Empty[PROTOTYPE] = null;\n // add \"__proto__\" for Object.getPrototypeOf polyfill\n result[IE_PROTO] = O;\n } else result = createDict();\n return Properties === undefined ? result : dPs(result, Properties);\n};\n","// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)\nvar has = require('./_has');\nvar toObject = require('./_to-object');\nvar IE_PROTO = require('./_shared-key')('IE_PROTO');\nvar ObjectProto = Object.prototype;\n\nmodule.exports = Object.getPrototypeOf || function (O) {\n O = toObject(O);\n if (has(O, IE_PROTO)) return O[IE_PROTO];\n if (typeof O.constructor == 'function' && O instanceof O.constructor) {\n return O.constructor.prototype;\n } return O instanceof Object ? ObjectProto : null;\n};\n","var classof = require('./_classof');\nvar ITERATOR = require('./_wks')('iterator');\nvar Iterators = require('./_iterators');\nmodule.exports = require('./_core').getIteratorMethod = function (it) {\n if (it != undefined) return it[ITERATOR]\n || it['@@iterator']\n || Iterators[classof(it)];\n};\n","// 7.2.2 IsArray(argument)\nvar cof = require('./_cof');\nmodule.exports = Array.isArray || function isArray(arg) {\n return cof(arg) == 'Array';\n};\n","var isObject = require('./_is-object');\nvar isArray = require('./_is-array');\nvar SPECIES = require('./_wks')('species');\n\nmodule.exports = function (original) {\n var C;\n if (isArray(original)) {\n C = original.constructor;\n // cross-realm fallback\n if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;\n if (isObject(C)) {\n C = C[SPECIES];\n if (C === null) C = undefined;\n }\n } return C === undefined ? Array : C;\n};\n","// 9.4.2.3 ArraySpeciesCreate(originalArray, length)\nvar speciesConstructor = require('./_array-species-constructor');\n\nmodule.exports = function (original, length) {\n return new (speciesConstructor(original))(length);\n};\n","// 0 -> Array#forEach\n// 1 -> Array#map\n// 2 -> Array#filter\n// 3 -> Array#some\n// 4 -> Array#every\n// 5 -> Array#find\n// 6 -> Array#findIndex\nvar ctx = require('./_ctx');\nvar IObject = require('./_iobject');\nvar toObject = require('./_to-object');\nvar toLength = require('./_to-length');\nvar asc = require('./_array-species-create');\nmodule.exports = function (TYPE, $create) {\n var IS_MAP = TYPE == 1;\n var IS_FILTER = TYPE == 2;\n var IS_SOME = TYPE == 3;\n var IS_EVERY = TYPE == 4;\n var IS_FIND_INDEX = TYPE == 6;\n var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;\n var create = $create || asc;\n return function ($this, callbackfn, that) {\n var O = toObject($this);\n var self = IObject(O);\n var f = ctx(callbackfn, that, 3);\n var length = toLength(self.length);\n var index = 0;\n var result = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined;\n var val, res;\n for (;length > index; index++) if (NO_HOLES || index in self) {\n val = self[index];\n res = f(val, index, O);\n if (TYPE) {\n if (IS_MAP) result[index] = res; // map\n else if (res) switch (TYPE) {\n case 3: return true; // some\n case 5: return val; // find\n case 6: return index; // findIndex\n case 2: result.push(val); // filter\n } else if (IS_EVERY) return false; // every\n }\n }\n return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : result;\n };\n};\n","// 22.1.3.31 Array.prototype[@@unscopables]\nvar UNSCOPABLES = require('./_wks')('unscopables');\nvar ArrayProto = Array.prototype;\nif (ArrayProto[UNSCOPABLES] == undefined) require('./_hide')(ArrayProto, UNSCOPABLES, {});\nmodule.exports = function (key) {\n ArrayProto[UNSCOPABLES][key] = true;\n};\n","module.exports = function (done, value) {\n return { value: value, done: !!done };\n};\n","'use strict';\nvar create = require('./_object-create');\nvar descriptor = require('./_property-desc');\nvar setToStringTag = require('./_set-to-string-tag');\nvar IteratorPrototype = {};\n\n// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\nrequire('./_hide')(IteratorPrototype, require('./_wks')('iterator'), function () { return this; });\n\nmodule.exports = function (Constructor, NAME, next) {\n Constructor.prototype = create(IteratorPrototype, { next: descriptor(1, next) });\n setToStringTag(Constructor, NAME + ' Iterator');\n};\n","'use strict';\nvar LIBRARY = require('./_library');\nvar $export = require('./_export');\nvar redefine = require('./_redefine');\nvar hide = require('./_hide');\nvar has = require('./_has');\nvar Iterators = require('./_iterators');\nvar $iterCreate = require('./_iter-create');\nvar setToStringTag = require('./_set-to-string-tag');\nvar getPrototypeOf = require('./_object-gpo');\nvar ITERATOR = require('./_wks')('iterator');\nvar BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next`\nvar FF_ITERATOR = '@@iterator';\nvar KEYS = 'keys';\nvar VALUES = 'values';\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {\n $iterCreate(Constructor, NAME, next);\n var getMethod = function (kind) {\n if (!BUGGY && kind in proto) return proto[kind];\n switch (kind) {\n case KEYS: return function keys() { return new Constructor(this, kind); };\n case VALUES: return function values() { return new Constructor(this, kind); };\n } return function entries() { return new Constructor(this, kind); };\n };\n var TAG = NAME + ' Iterator';\n var DEF_VALUES = DEFAULT == VALUES;\n var VALUES_BUG = false;\n var proto = Base.prototype;\n var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT];\n var $default = (!BUGGY && $native) || getMethod(DEFAULT);\n var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined;\n var $anyNative = NAME == 'Array' ? proto.entries || $native : $native;\n var methods, key, IteratorPrototype;\n // Fix native\n if ($anyNative) {\n IteratorPrototype = getPrototypeOf($anyNative.call(new Base()));\n if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) {\n // Set @@toStringTag to native iterators\n setToStringTag(IteratorPrototype, TAG, true);\n // fix for some old engines\n if (!LIBRARY && !has(IteratorPrototype, ITERATOR)) hide(IteratorPrototype, ITERATOR, returnThis);\n }\n }\n // fix Array#{values, @@iterator}.name in V8 / FF\n if (DEF_VALUES && $native && $native.name !== VALUES) {\n VALUES_BUG = true;\n $default = function values() { return $native.call(this); };\n }\n // Define iterator\n if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) {\n hide(proto, ITERATOR, $default);\n }\n // Plug for library\n Iterators[NAME] = $default;\n Iterators[TAG] = returnThis;\n if (DEFAULT) {\n methods = {\n values: DEF_VALUES ? $default : getMethod(VALUES),\n keys: IS_SET ? $default : getMethod(KEYS),\n entries: $entries\n };\n if (FORCED) for (key in methods) {\n if (!(key in proto)) redefine(proto, key, methods[key]);\n } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods);\n }\n return methods;\n};\n","'use strict';\nvar addToUnscopables = require('./_add-to-unscopables');\nvar step = require('./_iter-step');\nvar Iterators = require('./_iterators');\nvar toIObject = require('./_to-iobject');\n\n// 22.1.3.4 Array.prototype.entries()\n// 22.1.3.13 Array.prototype.keys()\n// 22.1.3.29 Array.prototype.values()\n// 22.1.3.30 Array.prototype[@@iterator]()\nmodule.exports = require('./_iter-define')(Array, 'Array', function (iterated, kind) {\n this._t = toIObject(iterated); // target\n this._i = 0; // next index\n this._k = kind; // kind\n// 22.1.5.2.1 %ArrayIteratorPrototype%.next()\n}, function () {\n var O = this._t;\n var kind = this._k;\n var index = this._i++;\n if (!O || index >= O.length) {\n this._t = undefined;\n return step(1);\n }\n if (kind == 'keys') return step(0, index);\n if (kind == 'values') return step(0, O[index]);\n return step(0, [index, O[index]]);\n}, 'values');\n\n// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)\nIterators.Arguments = Iterators.Array;\n\naddToUnscopables('keys');\naddToUnscopables('values');\naddToUnscopables('entries');\n","var ITERATOR = require('./_wks')('iterator');\nvar SAFE_CLOSING = false;\n\ntry {\n var riter = [7][ITERATOR]();\n riter['return'] = function () { SAFE_CLOSING = true; };\n // eslint-disable-next-line no-throw-literal\n Array.from(riter, function () { throw 2; });\n} catch (e) { /* empty */ }\n\nmodule.exports = function (exec, skipClosing) {\n if (!skipClosing && !SAFE_CLOSING) return false;\n var safe = false;\n try {\n var arr = [7];\n var iter = arr[ITERATOR]();\n iter.next = function () { return { done: safe = true }; };\n arr[ITERATOR] = function () { return iter; };\n exec(arr);\n } catch (e) { /* empty */ }\n return safe;\n};\n","// 22.1.3.3 Array.prototype.copyWithin(target, start, end = this.length)\n'use strict';\nvar toObject = require('./_to-object');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nvar toLength = require('./_to-length');\n\nmodule.exports = [].copyWithin || function copyWithin(target /* = 0 */, start /* = 0, end = @length */) {\n var O = toObject(this);\n var len = toLength(O.length);\n var to = toAbsoluteIndex(target, len);\n var from = toAbsoluteIndex(start, len);\n var end = arguments.length > 2 ? arguments[2] : undefined;\n var count = Math.min((end === undefined ? len : toAbsoluteIndex(end, len)) - from, len - to);\n var inc = 1;\n if (from < to && to < from + count) {\n inc = -1;\n from += count - 1;\n to += count - 1;\n }\n while (count-- > 0) {\n if (from in O) O[to] = O[from];\n else delete O[to];\n to += inc;\n from += inc;\n } return O;\n};\n","exports.f = {}.propertyIsEnumerable;\n","var pIE = require('./_object-pie');\nvar createDesc = require('./_property-desc');\nvar toIObject = require('./_to-iobject');\nvar toPrimitive = require('./_to-primitive');\nvar has = require('./_has');\nvar IE8_DOM_DEFINE = require('./_ie8-dom-define');\nvar gOPD = Object.getOwnPropertyDescriptor;\n\nexports.f = require('./_descriptors') ? gOPD : function getOwnPropertyDescriptor(O, P) {\n O = toIObject(O);\n P = toPrimitive(P, true);\n if (IE8_DOM_DEFINE) try {\n return gOPD(O, P);\n } catch (e) { /* empty */ }\n if (has(O, P)) return createDesc(!pIE.f.call(O, P), O[P]);\n};\n","'use strict';\nif (require('./_descriptors')) {\n var LIBRARY = require('./_library');\n var global = require('./_global');\n var fails = require('./_fails');\n var $export = require('./_export');\n var $typed = require('./_typed');\n var $buffer = require('./_typed-buffer');\n var ctx = require('./_ctx');\n var anInstance = require('./_an-instance');\n var propertyDesc = require('./_property-desc');\n var hide = require('./_hide');\n var redefineAll = require('./_redefine-all');\n var toInteger = require('./_to-integer');\n var toLength = require('./_to-length');\n var toIndex = require('./_to-index');\n var toAbsoluteIndex = require('./_to-absolute-index');\n var toPrimitive = require('./_to-primitive');\n var has = require('./_has');\n var classof = require('./_classof');\n var isObject = require('./_is-object');\n var toObject = require('./_to-object');\n var isArrayIter = require('./_is-array-iter');\n var create = require('./_object-create');\n var getPrototypeOf = require('./_object-gpo');\n var gOPN = require('./_object-gopn').f;\n var getIterFn = require('./core.get-iterator-method');\n var uid = require('./_uid');\n var wks = require('./_wks');\n var createArrayMethod = require('./_array-methods');\n var createArrayIncludes = require('./_array-includes');\n var speciesConstructor = require('./_species-constructor');\n var ArrayIterators = require('./es6.array.iterator');\n var Iterators = require('./_iterators');\n var $iterDetect = require('./_iter-detect');\n var setSpecies = require('./_set-species');\n var arrayFill = require('./_array-fill');\n var arrayCopyWithin = require('./_array-copy-within');\n var $DP = require('./_object-dp');\n var $GOPD = require('./_object-gopd');\n var dP = $DP.f;\n var gOPD = $GOPD.f;\n var RangeError = global.RangeError;\n var TypeError = global.TypeError;\n var Uint8Array = global.Uint8Array;\n var ARRAY_BUFFER = 'ArrayBuffer';\n var SHARED_BUFFER = 'Shared' + ARRAY_BUFFER;\n var BYTES_PER_ELEMENT = 'BYTES_PER_ELEMENT';\n var PROTOTYPE = 'prototype';\n var ArrayProto = Array[PROTOTYPE];\n var $ArrayBuffer = $buffer.ArrayBuffer;\n var $DataView = $buffer.DataView;\n var arrayForEach = createArrayMethod(0);\n var arrayFilter = createArrayMethod(2);\n var arraySome = createArrayMethod(3);\n var arrayEvery = createArrayMethod(4);\n var arrayFind = createArrayMethod(5);\n var arrayFindIndex = createArrayMethod(6);\n var arrayIncludes = createArrayIncludes(true);\n var arrayIndexOf = createArrayIncludes(false);\n var arrayValues = ArrayIterators.values;\n var arrayKeys = ArrayIterators.keys;\n var arrayEntries = ArrayIterators.entries;\n var arrayLastIndexOf = ArrayProto.lastIndexOf;\n var arrayReduce = ArrayProto.reduce;\n var arrayReduceRight = ArrayProto.reduceRight;\n var arrayJoin = ArrayProto.join;\n var arraySort = ArrayProto.sort;\n var arraySlice = ArrayProto.slice;\n var arrayToString = ArrayProto.toString;\n var arrayToLocaleString = ArrayProto.toLocaleString;\n var ITERATOR = wks('iterator');\n var TAG = wks('toStringTag');\n var TYPED_CONSTRUCTOR = uid('typed_constructor');\n var DEF_CONSTRUCTOR = uid('def_constructor');\n var ALL_CONSTRUCTORS = $typed.CONSTR;\n var TYPED_ARRAY = $typed.TYPED;\n var VIEW = $typed.VIEW;\n var WRONG_LENGTH = 'Wrong length!';\n\n var $map = createArrayMethod(1, function (O, length) {\n return allocate(speciesConstructor(O, O[DEF_CONSTRUCTOR]), length);\n });\n\n var LITTLE_ENDIAN = fails(function () {\n // eslint-disable-next-line no-undef\n return new Uint8Array(new Uint16Array([1]).buffer)[0] === 1;\n });\n\n var FORCED_SET = !!Uint8Array && !!Uint8Array[PROTOTYPE].set && fails(function () {\n new Uint8Array(1).set({});\n });\n\n var toOffset = function (it, BYTES) {\n var offset = toInteger(it);\n if (offset < 0 || offset % BYTES) throw RangeError('Wrong offset!');\n return offset;\n };\n\n var validate = function (it) {\n if (isObject(it) && TYPED_ARRAY in it) return it;\n throw TypeError(it + ' is not a typed array!');\n };\n\n var allocate = function (C, length) {\n if (!(isObject(C) && TYPED_CONSTRUCTOR in C)) {\n throw TypeError('It is not a typed array constructor!');\n } return new C(length);\n };\n\n var speciesFromList = function (O, list) {\n return fromList(speciesConstructor(O, O[DEF_CONSTRUCTOR]), list);\n };\n\n var fromList = function (C, list) {\n var index = 0;\n var length = list.length;\n var result = allocate(C, length);\n while (length > index) result[index] = list[index++];\n return result;\n };\n\n var addGetter = function (it, key, internal) {\n dP(it, key, { get: function () { return this._d[internal]; } });\n };\n\n var $from = function from(source /* , mapfn, thisArg */) {\n var O = toObject(source);\n var aLen = arguments.length;\n var mapfn = aLen > 1 ? arguments[1] : undefined;\n var mapping = mapfn !== undefined;\n var iterFn = getIterFn(O);\n var i, length, values, result, step, iterator;\n if (iterFn != undefined && !isArrayIter(iterFn)) {\n for (iterator = iterFn.call(O), values = [], i = 0; !(step = iterator.next()).done; i++) {\n values.push(step.value);\n } O = values;\n }\n if (mapping && aLen > 2) mapfn = ctx(mapfn, arguments[2], 2);\n for (i = 0, length = toLength(O.length), result = allocate(this, length); length > i; i++) {\n result[i] = mapping ? mapfn(O[i], i) : O[i];\n }\n return result;\n };\n\n var $of = function of(/* ...items */) {\n var index = 0;\n var length = arguments.length;\n var result = allocate(this, length);\n while (length > index) result[index] = arguments[index++];\n return result;\n };\n\n // iOS Safari 6.x fails here\n var TO_LOCALE_BUG = !!Uint8Array && fails(function () { arrayToLocaleString.call(new Uint8Array(1)); });\n\n var $toLocaleString = function toLocaleString() {\n return arrayToLocaleString.apply(TO_LOCALE_BUG ? arraySlice.call(validate(this)) : validate(this), arguments);\n };\n\n var proto = {\n copyWithin: function copyWithin(target, start /* , end */) {\n return arrayCopyWithin.call(validate(this), target, start, arguments.length > 2 ? arguments[2] : undefined);\n },\n every: function every(callbackfn /* , thisArg */) {\n return arrayEvery(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n },\n fill: function fill(value /* , start, end */) { // eslint-disable-line no-unused-vars\n return arrayFill.apply(validate(this), arguments);\n },\n filter: function filter(callbackfn /* , thisArg */) {\n return speciesFromList(this, arrayFilter(validate(this), callbackfn,\n arguments.length > 1 ? arguments[1] : undefined));\n },\n find: function find(predicate /* , thisArg */) {\n return arrayFind(validate(this), predicate, arguments.length > 1 ? arguments[1] : undefined);\n },\n findIndex: function findIndex(predicate /* , thisArg */) {\n return arrayFindIndex(validate(this), predicate, arguments.length > 1 ? arguments[1] : undefined);\n },\n forEach: function forEach(callbackfn /* , thisArg */) {\n arrayForEach(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n },\n indexOf: function indexOf(searchElement /* , fromIndex */) {\n return arrayIndexOf(validate(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);\n },\n includes: function includes(searchElement /* , fromIndex */) {\n return arrayIncludes(validate(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);\n },\n join: function join(separator) { // eslint-disable-line no-unused-vars\n return arrayJoin.apply(validate(this), arguments);\n },\n lastIndexOf: function lastIndexOf(searchElement /* , fromIndex */) { // eslint-disable-line no-unused-vars\n return arrayLastIndexOf.apply(validate(this), arguments);\n },\n map: function map(mapfn /* , thisArg */) {\n return $map(validate(this), mapfn, arguments.length > 1 ? arguments[1] : undefined);\n },\n reduce: function reduce(callbackfn /* , initialValue */) { // eslint-disable-line no-unused-vars\n return arrayReduce.apply(validate(this), arguments);\n },\n reduceRight: function reduceRight(callbackfn /* , initialValue */) { // eslint-disable-line no-unused-vars\n return arrayReduceRight.apply(validate(this), arguments);\n },\n reverse: function reverse() {\n var that = this;\n var length = validate(that).length;\n var middle = Math.floor(length / 2);\n var index = 0;\n var value;\n while (index < middle) {\n value = that[index];\n that[index++] = that[--length];\n that[length] = value;\n } return that;\n },\n some: function some(callbackfn /* , thisArg */) {\n return arraySome(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n },\n sort: function sort(comparefn) {\n return arraySort.call(validate(this), comparefn);\n },\n subarray: function subarray(begin, end) {\n var O = validate(this);\n var length = O.length;\n var $begin = toAbsoluteIndex(begin, length);\n return new (speciesConstructor(O, O[DEF_CONSTRUCTOR]))(\n O.buffer,\n O.byteOffset + $begin * O.BYTES_PER_ELEMENT,\n toLength((end === undefined ? length : toAbsoluteIndex(end, length)) - $begin)\n );\n }\n };\n\n var $slice = function slice(start, end) {\n return speciesFromList(this, arraySlice.call(validate(this), start, end));\n };\n\n var $set = function set(arrayLike /* , offset */) {\n validate(this);\n var offset = toOffset(arguments[1], 1);\n var length = this.length;\n var src = toObject(arrayLike);\n var len = toLength(src.length);\n var index = 0;\n if (len + offset > length) throw RangeError(WRONG_LENGTH);\n while (index < len) this[offset + index] = src[index++];\n };\n\n var $iterators = {\n entries: function entries() {\n return arrayEntries.call(validate(this));\n },\n keys: function keys() {\n return arrayKeys.call(validate(this));\n },\n values: function values() {\n return arrayValues.call(validate(this));\n }\n };\n\n var isTAIndex = function (target, key) {\n return isObject(target)\n && target[TYPED_ARRAY]\n && typeof key != 'symbol'\n && key in target\n && String(+key) == String(key);\n };\n var $getDesc = function getOwnPropertyDescriptor(target, key) {\n return isTAIndex(target, key = toPrimitive(key, true))\n ? propertyDesc(2, target[key])\n : gOPD(target, key);\n };\n var $setDesc = function defineProperty(target, key, desc) {\n if (isTAIndex(target, key = toPrimitive(key, true))\n && isObject(desc)\n && has(desc, 'value')\n && !has(desc, 'get')\n && !has(desc, 'set')\n // TODO: add validation descriptor w/o calling accessors\n && !desc.configurable\n && (!has(desc, 'writable') || desc.writable)\n && (!has(desc, 'enumerable') || desc.enumerable)\n ) {\n target[key] = desc.value;\n return target;\n } return dP(target, key, desc);\n };\n\n if (!ALL_CONSTRUCTORS) {\n $GOPD.f = $getDesc;\n $DP.f = $setDesc;\n }\n\n $export($export.S + $export.F * !ALL_CONSTRUCTORS, 'Object', {\n getOwnPropertyDescriptor: $getDesc,\n defineProperty: $setDesc\n });\n\n if (fails(function () { arrayToString.call({}); })) {\n arrayToString = arrayToLocaleString = function toString() {\n return arrayJoin.call(this);\n };\n }\n\n var $TypedArrayPrototype$ = redefineAll({}, proto);\n redefineAll($TypedArrayPrototype$, $iterators);\n hide($TypedArrayPrototype$, ITERATOR, $iterators.values);\n redefineAll($TypedArrayPrototype$, {\n slice: $slice,\n set: $set,\n constructor: function () { /* noop */ },\n toString: arrayToString,\n toLocaleString: $toLocaleString\n });\n addGetter($TypedArrayPrototype$, 'buffer', 'b');\n addGetter($TypedArrayPrototype$, 'byteOffset', 'o');\n addGetter($TypedArrayPrototype$, 'byteLength', 'l');\n addGetter($TypedArrayPrototype$, 'length', 'e');\n dP($TypedArrayPrototype$, TAG, {\n get: function () { return this[TYPED_ARRAY]; }\n });\n\n // eslint-disable-next-line max-statements\n module.exports = function (KEY, BYTES, wrapper, CLAMPED) {\n CLAMPED = !!CLAMPED;\n var NAME = KEY + (CLAMPED ? 'Clamped' : '') + 'Array';\n var GETTER = 'get' + KEY;\n var SETTER = 'set' + KEY;\n var TypedArray = global[NAME];\n var Base = TypedArray || {};\n var TAC = TypedArray && getPrototypeOf(TypedArray);\n var FORCED = !TypedArray || !$typed.ABV;\n var O = {};\n var TypedArrayPrototype = TypedArray && TypedArray[PROTOTYPE];\n var getter = function (that, index) {\n var data = that._d;\n return data.v[GETTER](index * BYTES + data.o, LITTLE_ENDIAN);\n };\n var setter = function (that, index, value) {\n var data = that._d;\n if (CLAMPED) value = (value = Math.round(value)) < 0 ? 0 : value > 0xff ? 0xff : value & 0xff;\n data.v[SETTER](index * BYTES + data.o, value, LITTLE_ENDIAN);\n };\n var addElement = function (that, index) {\n dP(that, index, {\n get: function () {\n return getter(this, index);\n },\n set: function (value) {\n return setter(this, index, value);\n },\n enumerable: true\n });\n };\n if (FORCED) {\n TypedArray = wrapper(function (that, data, $offset, $length) {\n anInstance(that, TypedArray, NAME, '_d');\n var index = 0;\n var offset = 0;\n var buffer, byteLength, length, klass;\n if (!isObject(data)) {\n length = toIndex(data);\n byteLength = length * BYTES;\n buffer = new $ArrayBuffer(byteLength);\n } else if (data instanceof $ArrayBuffer || (klass = classof(data)) == ARRAY_BUFFER || klass == SHARED_BUFFER) {\n buffer = data;\n offset = toOffset($offset, BYTES);\n var $len = data.byteLength;\n if ($length === undefined) {\n if ($len % BYTES) throw RangeError(WRONG_LENGTH);\n byteLength = $len - offset;\n if (byteLength < 0) throw RangeError(WRONG_LENGTH);\n } else {\n byteLength = toLength($length) * BYTES;\n if (byteLength + offset > $len) throw RangeError(WRONG_LENGTH);\n }\n length = byteLength / BYTES;\n } else if (TYPED_ARRAY in data) {\n return fromList(TypedArray, data);\n } else {\n return $from.call(TypedArray, data);\n }\n hide(that, '_d', {\n b: buffer,\n o: offset,\n l: byteLength,\n e: length,\n v: new $DataView(buffer)\n });\n while (index < length) addElement(that, index++);\n });\n TypedArrayPrototype = TypedArray[PROTOTYPE] = create($TypedArrayPrototype$);\n hide(TypedArrayPrototype, 'constructor', TypedArray);\n } else if (!fails(function () {\n TypedArray(1);\n }) || !fails(function () {\n new TypedArray(-1); // eslint-disable-line no-new\n }) || !$iterDetect(function (iter) {\n new TypedArray(); // eslint-disable-line no-new\n new TypedArray(null); // eslint-disable-line no-new\n new TypedArray(1.5); // eslint-disable-line no-new\n new TypedArray(iter); // eslint-disable-line no-new\n }, true)) {\n TypedArray = wrapper(function (that, data, $offset, $length) {\n anInstance(that, TypedArray, NAME);\n var klass;\n // `ws` module bug, temporarily remove validation length for Uint8Array\n // https://github.com/websockets/ws/pull/645\n if (!isObject(data)) return new Base(toIndex(data));\n if (data instanceof $ArrayBuffer || (klass = classof(data)) == ARRAY_BUFFER || klass == SHARED_BUFFER) {\n return $length !== undefined\n ? new Base(data, toOffset($offset, BYTES), $length)\n : $offset !== undefined\n ? new Base(data, toOffset($offset, BYTES))\n : new Base(data);\n }\n if (TYPED_ARRAY in data) return fromList(TypedArray, data);\n return $from.call(TypedArray, data);\n });\n arrayForEach(TAC !== Function.prototype ? gOPN(Base).concat(gOPN(TAC)) : gOPN(Base), function (key) {\n if (!(key in TypedArray)) hide(TypedArray, key, Base[key]);\n });\n TypedArray[PROTOTYPE] = TypedArrayPrototype;\n if (!LIBRARY) TypedArrayPrototype.constructor = TypedArray;\n }\n var $nativeIterator = TypedArrayPrototype[ITERATOR];\n var CORRECT_ITER_NAME = !!$nativeIterator\n && ($nativeIterator.name == 'values' || $nativeIterator.name == undefined);\n var $iterator = $iterators.values;\n hide(TypedArray, TYPED_CONSTRUCTOR, true);\n hide(TypedArrayPrototype, TYPED_ARRAY, NAME);\n hide(TypedArrayPrototype, VIEW, true);\n hide(TypedArrayPrototype, DEF_CONSTRUCTOR, TypedArray);\n\n if (CLAMPED ? new TypedArray(1)[TAG] != NAME : !(TAG in TypedArrayPrototype)) {\n dP(TypedArrayPrototype, TAG, {\n get: function () { return NAME; }\n });\n }\n\n O[NAME] = TypedArray;\n\n $export($export.G + $export.W + $export.F * (TypedArray != Base), O);\n\n $export($export.S, NAME, {\n BYTES_PER_ELEMENT: BYTES\n });\n\n $export($export.S + $export.F * fails(function () { Base.of.call(TypedArray, 1); }), NAME, {\n from: $from,\n of: $of\n });\n\n if (!(BYTES_PER_ELEMENT in TypedArrayPrototype)) hide(TypedArrayPrototype, BYTES_PER_ELEMENT, BYTES);\n\n $export($export.P, NAME, proto);\n\n setSpecies(NAME);\n\n $export($export.P + $export.F * FORCED_SET, NAME, { set: $set });\n\n $export($export.P + $export.F * !CORRECT_ITER_NAME, NAME, $iterators);\n\n if (!LIBRARY && TypedArrayPrototype.toString != arrayToString) TypedArrayPrototype.toString = arrayToString;\n\n $export($export.P + $export.F * fails(function () {\n new TypedArray(1).slice();\n }), NAME, { slice: $slice });\n\n $export($export.P + $export.F * (fails(function () {\n return [1, 2].toLocaleString() != new TypedArray([1, 2]).toLocaleString();\n }) || !fails(function () {\n TypedArrayPrototype.toLocaleString.call([1, 2]);\n })), NAME, { toLocaleString: $toLocaleString });\n\n Iterators[NAME] = CORRECT_ITER_NAME ? $nativeIterator : $iterator;\n if (!LIBRARY && !CORRECT_ITER_NAME) hide(TypedArrayPrototype, ITERATOR, $iterator);\n };\n} else module.exports = function () { /* empty */ };\n","require('./_typed-array')('Int8', 1, function (init) {\n return function Int8Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Uint8', 1, function (init) {\n return function Uint8Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Uint8', 1, function (init) {\n return function Uint8ClampedArray(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n}, true);\n","require('./_typed-array')('Int16', 2, function (init) {\n return function Int16Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Uint16', 2, function (init) {\n return function Uint16Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Int32', 4, function (init) {\n return function Int32Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Uint32', 4, function (init) {\n return function Uint32Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Float32', 4, function (init) {\n return function Float32Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Float64', 8, function (init) {\n return function Float64Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","// call something on iterator step with safe closing on error\nvar anObject = require('./_an-object');\nmodule.exports = function (iterator, fn, value, entries) {\n try {\n return entries ? fn(anObject(value)[0], value[1]) : fn(value);\n // 7.4.6 IteratorClose(iterator, completion)\n } catch (e) {\n var ret = iterator['return'];\n if (ret !== undefined) anObject(ret.call(iterator));\n throw e;\n }\n};\n","var ctx = require('./_ctx');\nvar call = require('./_iter-call');\nvar isArrayIter = require('./_is-array-iter');\nvar anObject = require('./_an-object');\nvar toLength = require('./_to-length');\nvar getIterFn = require('./core.get-iterator-method');\nvar BREAK = {};\nvar RETURN = {};\nvar exports = module.exports = function (iterable, entries, fn, that, ITERATOR) {\n var iterFn = ITERATOR ? function () { return iterable; } : getIterFn(iterable);\n var f = ctx(fn, that, entries ? 2 : 1);\n var index = 0;\n var length, step, iterator, result;\n if (typeof iterFn != 'function') throw TypeError(iterable + ' is not iterable!');\n // fast case for arrays with default iterator\n if (isArrayIter(iterFn)) for (length = toLength(iterable.length); length > index; index++) {\n result = entries ? f(anObject(step = iterable[index])[0], step[1]) : f(iterable[index]);\n if (result === BREAK || result === RETURN) return result;\n } else for (iterator = iterFn.call(iterable); !(step = iterator.next()).done;) {\n result = call(iterator, f, step.value, entries);\n if (result === BREAK || result === RETURN) return result;\n }\n};\nexports.BREAK = BREAK;\nexports.RETURN = RETURN;\n","var META = require('./_uid')('meta');\nvar isObject = require('./_is-object');\nvar has = require('./_has');\nvar setDesc = require('./_object-dp').f;\nvar id = 0;\nvar isExtensible = Object.isExtensible || function () {\n return true;\n};\nvar FREEZE = !require('./_fails')(function () {\n return isExtensible(Object.preventExtensions({}));\n});\nvar setMeta = function (it) {\n setDesc(it, META, { value: {\n i: 'O' + ++id, // object ID\n w: {} // weak collections IDs\n } });\n};\nvar fastKey = function (it, create) {\n // return primitive with prefix\n if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;\n if (!has(it, META)) {\n // can't set metadata to uncaught frozen object\n if (!isExtensible(it)) return 'F';\n // not necessary to add metadata\n if (!create) return 'E';\n // add missing metadata\n setMeta(it);\n // return object ID\n } return it[META].i;\n};\nvar getWeak = function (it, create) {\n if (!has(it, META)) {\n // can't set metadata to uncaught frozen object\n if (!isExtensible(it)) return true;\n // not necessary to add metadata\n if (!create) return false;\n // add missing metadata\n setMeta(it);\n // return hash weak collections IDs\n } return it[META].w;\n};\n// add metadata on freeze-family methods calling\nvar onFreeze = function (it) {\n if (FREEZE && meta.NEED && isExtensible(it) && !has(it, META)) setMeta(it);\n return it;\n};\nvar meta = module.exports = {\n KEY: META,\n NEED: false,\n fastKey: fastKey,\n getWeak: getWeak,\n onFreeze: onFreeze\n};\n","var isObject = require('./_is-object');\nmodule.exports = function (it, TYPE) {\n if (!isObject(it) || it._t !== TYPE) throw TypeError('Incompatible receiver, ' + TYPE + ' required!');\n return it;\n};\n","'use strict';\nvar dP = require('./_object-dp').f;\nvar create = require('./_object-create');\nvar redefineAll = require('./_redefine-all');\nvar ctx = require('./_ctx');\nvar anInstance = require('./_an-instance');\nvar forOf = require('./_for-of');\nvar $iterDefine = require('./_iter-define');\nvar step = require('./_iter-step');\nvar setSpecies = require('./_set-species');\nvar DESCRIPTORS = require('./_descriptors');\nvar fastKey = require('./_meta').fastKey;\nvar validate = require('./_validate-collection');\nvar SIZE = DESCRIPTORS ? '_s' : 'size';\n\nvar getEntry = function (that, key) {\n // fast case\n var index = fastKey(key);\n var entry;\n if (index !== 'F') return that._i[index];\n // frozen object case\n for (entry = that._f; entry; entry = entry.n) {\n if (entry.k == key) return entry;\n }\n};\n\nmodule.exports = {\n getConstructor: function (wrapper, NAME, IS_MAP, ADDER) {\n var C = wrapper(function (that, iterable) {\n anInstance(that, C, NAME, '_i');\n that._t = NAME; // collection type\n that._i = create(null); // index\n that._f = undefined; // first entry\n that._l = undefined; // last entry\n that[SIZE] = 0; // size\n if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n });\n redefineAll(C.prototype, {\n // 23.1.3.1 Map.prototype.clear()\n // 23.2.3.2 Set.prototype.clear()\n clear: function clear() {\n for (var that = validate(this, NAME), data = that._i, entry = that._f; entry; entry = entry.n) {\n entry.r = true;\n if (entry.p) entry.p = entry.p.n = undefined;\n delete data[entry.i];\n }\n that._f = that._l = undefined;\n that[SIZE] = 0;\n },\n // 23.1.3.3 Map.prototype.delete(key)\n // 23.2.3.4 Set.prototype.delete(value)\n 'delete': function (key) {\n var that = validate(this, NAME);\n var entry = getEntry(that, key);\n if (entry) {\n var next = entry.n;\n var prev = entry.p;\n delete that._i[entry.i];\n entry.r = true;\n if (prev) prev.n = next;\n if (next) next.p = prev;\n if (that._f == entry) that._f = next;\n if (that._l == entry) that._l = prev;\n that[SIZE]--;\n } return !!entry;\n },\n // 23.2.3.6 Set.prototype.forEach(callbackfn, thisArg = undefined)\n // 23.1.3.5 Map.prototype.forEach(callbackfn, thisArg = undefined)\n forEach: function forEach(callbackfn /* , that = undefined */) {\n validate(this, NAME);\n var f = ctx(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3);\n var entry;\n while (entry = entry ? entry.n : this._f) {\n f(entry.v, entry.k, this);\n // revert to the last existing entry\n while (entry && entry.r) entry = entry.p;\n }\n },\n // 23.1.3.7 Map.prototype.has(key)\n // 23.2.3.7 Set.prototype.has(value)\n has: function has(key) {\n return !!getEntry(validate(this, NAME), key);\n }\n });\n if (DESCRIPTORS) dP(C.prototype, 'size', {\n get: function () {\n return validate(this, NAME)[SIZE];\n }\n });\n return C;\n },\n def: function (that, key, value) {\n var entry = getEntry(that, key);\n var prev, index;\n // change existing entry\n if (entry) {\n entry.v = value;\n // create new entry\n } else {\n that._l = entry = {\n i: index = fastKey(key, true), // <- index\n k: key, // <- key\n v: value, // <- value\n p: prev = that._l, // <- previous entry\n n: undefined, // <- next entry\n r: false // <- removed\n };\n if (!that._f) that._f = entry;\n if (prev) prev.n = entry;\n that[SIZE]++;\n // add to index\n if (index !== 'F') that._i[index] = entry;\n } return that;\n },\n getEntry: getEntry,\n setStrong: function (C, NAME, IS_MAP) {\n // add .keys, .values, .entries, [@@iterator]\n // 23.1.3.4, 23.1.3.8, 23.1.3.11, 23.1.3.12, 23.2.3.5, 23.2.3.8, 23.2.3.10, 23.2.3.11\n $iterDefine(C, NAME, function (iterated, kind) {\n this._t = validate(iterated, NAME); // target\n this._k = kind; // kind\n this._l = undefined; // previous\n }, function () {\n var that = this;\n var kind = that._k;\n var entry = that._l;\n // revert to the last existing entry\n while (entry && entry.r) entry = entry.p;\n // get next entry\n if (!that._t || !(that._l = entry = entry ? entry.n : that._t._f)) {\n // or finish the iteration\n that._t = undefined;\n return step(1);\n }\n // return step by kind\n if (kind == 'keys') return step(0, entry.k);\n if (kind == 'values') return step(0, entry.v);\n return step(0, [entry.k, entry.v]);\n }, IS_MAP ? 'entries' : 'values', !IS_MAP, true);\n\n // add [@@species], 23.1.2.2, 23.2.2.2\n setSpecies(NAME);\n }\n};\n","// Works with __proto__ only. Old v8 can't work with null proto objects.\n/* eslint-disable no-proto */\nvar isObject = require('./_is-object');\nvar anObject = require('./_an-object');\nvar check = function (O, proto) {\n anObject(O);\n if (!isObject(proto) && proto !== null) throw TypeError(proto + \": can't set as prototype!\");\n};\nmodule.exports = {\n set: Object.setPrototypeOf || ('__proto__' in {} ? // eslint-disable-line\n function (test, buggy, set) {\n try {\n set = require('./_ctx')(Function.call, require('./_object-gopd').f(Object.prototype, '__proto__').set, 2);\n set(test, []);\n buggy = !(test instanceof Array);\n } catch (e) { buggy = true; }\n return function setPrototypeOf(O, proto) {\n check(O, proto);\n if (buggy) O.__proto__ = proto;\n else set(O, proto);\n return O;\n };\n }({}, false) : undefined),\n check: check\n};\n","var isObject = require('./_is-object');\nvar setPrototypeOf = require('./_set-proto').set;\nmodule.exports = function (that, target, C) {\n var S = target.constructor;\n var P;\n if (S !== C && typeof S == 'function' && (P = S.prototype) !== C.prototype && isObject(P) && setPrototypeOf) {\n setPrototypeOf(that, P);\n } return that;\n};\n","'use strict';\nvar global = require('./_global');\nvar $export = require('./_export');\nvar redefine = require('./_redefine');\nvar redefineAll = require('./_redefine-all');\nvar meta = require('./_meta');\nvar forOf = require('./_for-of');\nvar anInstance = require('./_an-instance');\nvar isObject = require('./_is-object');\nvar fails = require('./_fails');\nvar $iterDetect = require('./_iter-detect');\nvar setToStringTag = require('./_set-to-string-tag');\nvar inheritIfRequired = require('./_inherit-if-required');\n\nmodule.exports = function (NAME, wrapper, methods, common, IS_MAP, IS_WEAK) {\n var Base = global[NAME];\n var C = Base;\n var ADDER = IS_MAP ? 'set' : 'add';\n var proto = C && C.prototype;\n var O = {};\n var fixMethod = function (KEY) {\n var fn = proto[KEY];\n redefine(proto, KEY,\n KEY == 'delete' ? function (a) {\n return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);\n } : KEY == 'has' ? function has(a) {\n return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);\n } : KEY == 'get' ? function get(a) {\n return IS_WEAK && !isObject(a) ? undefined : fn.call(this, a === 0 ? 0 : a);\n } : KEY == 'add' ? function add(a) { fn.call(this, a === 0 ? 0 : a); return this; }\n : function set(a, b) { fn.call(this, a === 0 ? 0 : a, b); return this; }\n );\n };\n if (typeof C != 'function' || !(IS_WEAK || proto.forEach && !fails(function () {\n new C().entries().next();\n }))) {\n // create collection constructor\n C = common.getConstructor(wrapper, NAME, IS_MAP, ADDER);\n redefineAll(C.prototype, methods);\n meta.NEED = true;\n } else {\n var instance = new C();\n // early implementations not supports chaining\n var HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) != instance;\n // V8 ~ Chromium 40- weak-collections throws on primitives, but should return false\n var THROWS_ON_PRIMITIVES = fails(function () { instance.has(1); });\n // most early implementations doesn't supports iterables, most modern - not close it correctly\n var ACCEPT_ITERABLES = $iterDetect(function (iter) { new C(iter); }); // eslint-disable-line no-new\n // for early implementations -0 and +0 not the same\n var BUGGY_ZERO = !IS_WEAK && fails(function () {\n // V8 ~ Chromium 42- fails only with 5+ elements\n var $instance = new C();\n var index = 5;\n while (index--) $instance[ADDER](index, index);\n return !$instance.has(-0);\n });\n if (!ACCEPT_ITERABLES) {\n C = wrapper(function (target, iterable) {\n anInstance(target, C, NAME);\n var that = inheritIfRequired(new Base(), target, C);\n if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n return that;\n });\n C.prototype = proto;\n proto.constructor = C;\n }\n if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) {\n fixMethod('delete');\n fixMethod('has');\n IS_MAP && fixMethod('get');\n }\n if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER);\n // weak collections should not contains .clear method\n if (IS_WEAK && proto.clear) delete proto.clear;\n }\n\n setToStringTag(C, NAME);\n\n O[NAME] = C;\n $export($export.G + $export.W + $export.F * (C != Base), O);\n\n if (!IS_WEAK) common.setStrong(C, NAME, IS_MAP);\n\n return C;\n};\n","'use strict';\nvar strong = require('./_collection-strong');\nvar validate = require('./_validate-collection');\nvar MAP = 'Map';\n\n// 23.1 Map Objects\nmodule.exports = require('./_collection')(MAP, function (get) {\n return function Map() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };\n}, {\n // 23.1.3.6 Map.prototype.get(key)\n get: function get(key) {\n var entry = strong.getEntry(validate(this, MAP), key);\n return entry && entry.v;\n },\n // 23.1.3.9 Map.prototype.set(key, value)\n set: function set(key, value) {\n return strong.def(validate(this, MAP), key === 0 ? 0 : key, value);\n }\n}, strong, true);\n","'use strict';\nvar strong = require('./_collection-strong');\nvar validate = require('./_validate-collection');\nvar SET = 'Set';\n\n// 23.2 Set Objects\nmodule.exports = require('./_collection')(SET, function (get) {\n return function Set() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };\n}, {\n // 23.2.3.1 Set.prototype.add(value)\n add: function add(value) {\n return strong.def(validate(this, SET), value = value === 0 ? 0 : value, value);\n }\n}, strong);\n","exports.f = Object.getOwnPropertySymbols;\n","'use strict';\n// 19.1.2.1 Object.assign(target, source, ...)\nvar getKeys = require('./_object-keys');\nvar gOPS = require('./_object-gops');\nvar pIE = require('./_object-pie');\nvar toObject = require('./_to-object');\nvar IObject = require('./_iobject');\nvar $assign = Object.assign;\n\n// should work with symbols and should have deterministic property order (V8 bug)\nmodule.exports = !$assign || require('./_fails')(function () {\n var A = {};\n var B = {};\n // eslint-disable-next-line no-undef\n var S = Symbol();\n var K = 'abcdefghijklmnopqrst';\n A[S] = 7;\n K.split('').forEach(function (k) { B[k] = k; });\n return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K;\n}) ? function assign(target, source) { // eslint-disable-line no-unused-vars\n var T = toObject(target);\n var aLen = arguments.length;\n var index = 1;\n var getSymbols = gOPS.f;\n var isEnum = pIE.f;\n while (aLen > index) {\n var S = IObject(arguments[index++]);\n var keys = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S);\n var length = keys.length;\n var j = 0;\n var key;\n while (length > j) if (isEnum.call(S, key = keys[j++])) T[key] = S[key];\n } return T;\n} : $assign;\n","'use strict';\nvar redefineAll = require('./_redefine-all');\nvar getWeak = require('./_meta').getWeak;\nvar anObject = require('./_an-object');\nvar isObject = require('./_is-object');\nvar anInstance = require('./_an-instance');\nvar forOf = require('./_for-of');\nvar createArrayMethod = require('./_array-methods');\nvar $has = require('./_has');\nvar validate = require('./_validate-collection');\nvar arrayFind = createArrayMethod(5);\nvar arrayFindIndex = createArrayMethod(6);\nvar id = 0;\n\n// fallback for uncaught frozen keys\nvar uncaughtFrozenStore = function (that) {\n return that._l || (that._l = new UncaughtFrozenStore());\n};\nvar UncaughtFrozenStore = function () {\n this.a = [];\n};\nvar findUncaughtFrozen = function (store, key) {\n return arrayFind(store.a, function (it) {\n return it[0] === key;\n });\n};\nUncaughtFrozenStore.prototype = {\n get: function (key) {\n var entry = findUncaughtFrozen(this, key);\n if (entry) return entry[1];\n },\n has: function (key) {\n return !!findUncaughtFrozen(this, key);\n },\n set: function (key, value) {\n var entry = findUncaughtFrozen(this, key);\n if (entry) entry[1] = value;\n else this.a.push([key, value]);\n },\n 'delete': function (key) {\n var index = arrayFindIndex(this.a, function (it) {\n return it[0] === key;\n });\n if (~index) this.a.splice(index, 1);\n return !!~index;\n }\n};\n\nmodule.exports = {\n getConstructor: function (wrapper, NAME, IS_MAP, ADDER) {\n var C = wrapper(function (that, iterable) {\n anInstance(that, C, NAME, '_i');\n that._t = NAME; // collection type\n that._i = id++; // collection id\n that._l = undefined; // leak store for uncaught frozen objects\n if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n });\n redefineAll(C.prototype, {\n // 23.3.3.2 WeakMap.prototype.delete(key)\n // 23.4.3.3 WeakSet.prototype.delete(value)\n 'delete': function (key) {\n if (!isObject(key)) return false;\n var data = getWeak(key);\n if (data === true) return uncaughtFrozenStore(validate(this, NAME))['delete'](key);\n return data && $has(data, this._i) && delete data[this._i];\n },\n // 23.3.3.4 WeakMap.prototype.has(key)\n // 23.4.3.4 WeakSet.prototype.has(value)\n has: function has(key) {\n if (!isObject(key)) return false;\n var data = getWeak(key);\n if (data === true) return uncaughtFrozenStore(validate(this, NAME)).has(key);\n return data && $has(data, this._i);\n }\n });\n return C;\n },\n def: function (that, key, value) {\n var data = getWeak(anObject(key), true);\n if (data === true) uncaughtFrozenStore(that).set(key, value);\n else data[that._i] = value;\n return that;\n },\n ufstore: uncaughtFrozenStore\n};\n","'use strict';\nvar each = require('./_array-methods')(0);\nvar redefine = require('./_redefine');\nvar meta = require('./_meta');\nvar assign = require('./_object-assign');\nvar weak = require('./_collection-weak');\nvar isObject = require('./_is-object');\nvar fails = require('./_fails');\nvar validate = require('./_validate-collection');\nvar WEAK_MAP = 'WeakMap';\nvar getWeak = meta.getWeak;\nvar isExtensible = Object.isExtensible;\nvar uncaughtFrozenStore = weak.ufstore;\nvar tmp = {};\nvar InternalMap;\n\nvar wrapper = function (get) {\n return function WeakMap() {\n return get(this, arguments.length > 0 ? arguments[0] : undefined);\n };\n};\n\nvar methods = {\n // 23.3.3.3 WeakMap.prototype.get(key)\n get: function get(key) {\n if (isObject(key)) {\n var data = getWeak(key);\n if (data === true) return uncaughtFrozenStore(validate(this, WEAK_MAP)).get(key);\n return data ? data[this._i] : undefined;\n }\n },\n // 23.3.3.5 WeakMap.prototype.set(key, value)\n set: function set(key, value) {\n return weak.def(validate(this, WEAK_MAP), key, value);\n }\n};\n\n// 23.3 WeakMap Objects\nvar $WeakMap = module.exports = require('./_collection')(WEAK_MAP, wrapper, methods, weak, true, true);\n\n// IE11 WeakMap frozen keys fix\nif (fails(function () { return new $WeakMap().set((Object.freeze || Object)(tmp), 7).get(tmp) != 7; })) {\n InternalMap = weak.getConstructor(wrapper, WEAK_MAP);\n assign(InternalMap.prototype, methods);\n meta.NEED = true;\n each(['delete', 'has', 'get', 'set'], function (key) {\n var proto = $WeakMap.prototype;\n var method = proto[key];\n redefine(proto, key, function (a, b) {\n // store frozen objects on internal weakmap shim\n if (isObject(a) && !isExtensible(a)) {\n if (!this._f) this._f = new InternalMap();\n var result = this._f[key](a, b);\n return key == 'set' ? this : result;\n // store all the rest on native weakmap\n } return method.call(this, a, b);\n });\n });\n}\n","'use strict';\nvar weak = require('./_collection-weak');\nvar validate = require('./_validate-collection');\nvar WEAK_SET = 'WeakSet';\n\n// 23.4 WeakSet Objects\nrequire('./_collection')(WEAK_SET, function (get) {\n return function WeakSet() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };\n}, {\n // 23.4.3.1 WeakSet.prototype.add(value)\n add: function add(value) {\n return weak.def(validate(this, WEAK_SET), value, true);\n }\n}, weak, false, true);\n","// 26.1.1 Reflect.apply(target, thisArgument, argumentsList)\nvar $export = require('./_export');\nvar aFunction = require('./_a-function');\nvar anObject = require('./_an-object');\nvar rApply = (require('./_global').Reflect || {}).apply;\nvar fApply = Function.apply;\n// MS Edge argumentsList argument is optional\n$export($export.S + $export.F * !require('./_fails')(function () {\n rApply(function () { /* empty */ });\n}), 'Reflect', {\n apply: function apply(target, thisArgument, argumentsList) {\n var T = aFunction(target);\n var L = anObject(argumentsList);\n return rApply ? rApply(T, thisArgument, L) : fApply.call(T, thisArgument, L);\n }\n});\n","// fast apply, http://jsperf.lnkit.com/fast-apply/5\nmodule.exports = function (fn, args, that) {\n var un = that === undefined;\n switch (args.length) {\n case 0: return un ? fn()\n : fn.call(that);\n case 1: return un ? fn(args[0])\n : fn.call(that, args[0]);\n case 2: return un ? fn(args[0], args[1])\n : fn.call(that, args[0], args[1]);\n case 3: return un ? fn(args[0], args[1], args[2])\n : fn.call(that, args[0], args[1], args[2]);\n case 4: return un ? fn(args[0], args[1], args[2], args[3])\n : fn.call(that, args[0], args[1], args[2], args[3]);\n } return fn.apply(that, args);\n};\n","'use strict';\nvar aFunction = require('./_a-function');\nvar isObject = require('./_is-object');\nvar invoke = require('./_invoke');\nvar arraySlice = [].slice;\nvar factories = {};\n\nvar construct = function (F, len, args) {\n if (!(len in factories)) {\n for (var n = [], i = 0; i < len; i++) n[i] = 'a[' + i + ']';\n // eslint-disable-next-line no-new-func\n factories[len] = Function('F,a', 'return new F(' + n.join(',') + ')');\n } return factories[len](F, args);\n};\n\nmodule.exports = Function.bind || function bind(that /* , ...args */) {\n var fn = aFunction(this);\n var partArgs = arraySlice.call(arguments, 1);\n var bound = function (/* args... */) {\n var args = partArgs.concat(arraySlice.call(arguments));\n return this instanceof bound ? construct(fn, args.length, args) : invoke(fn, args, that);\n };\n if (isObject(fn.prototype)) bound.prototype = fn.prototype;\n return bound;\n};\n","// 26.1.2 Reflect.construct(target, argumentsList [, newTarget])\nvar $export = require('./_export');\nvar create = require('./_object-create');\nvar aFunction = require('./_a-function');\nvar anObject = require('./_an-object');\nvar isObject = require('./_is-object');\nvar fails = require('./_fails');\nvar bind = require('./_bind');\nvar rConstruct = (require('./_global').Reflect || {}).construct;\n\n// MS Edge supports only 2 arguments and argumentsList argument is optional\n// FF Nightly sets third argument as `new.target`, but does not create `this` from it\nvar NEW_TARGET_BUG = fails(function () {\n function F() { /* empty */ }\n return !(rConstruct(function () { /* empty */ }, [], F) instanceof F);\n});\nvar ARGS_BUG = !fails(function () {\n rConstruct(function () { /* empty */ });\n});\n\n$export($export.S + $export.F * (NEW_TARGET_BUG || ARGS_BUG), 'Reflect', {\n construct: function construct(Target, args /* , newTarget */) {\n aFunction(Target);\n anObject(args);\n var newTarget = arguments.length < 3 ? Target : aFunction(arguments[2]);\n if (ARGS_BUG && !NEW_TARGET_BUG) return rConstruct(Target, args, newTarget);\n if (Target == newTarget) {\n // w/o altered newTarget, optimization for 0-4 arguments\n switch (args.length) {\n case 0: return new Target();\n case 1: return new Target(args[0]);\n case 2: return new Target(args[0], args[1]);\n case 3: return new Target(args[0], args[1], args[2]);\n case 4: return new Target(args[0], args[1], args[2], args[3]);\n }\n // w/o altered newTarget, lot of arguments case\n var $args = [null];\n $args.push.apply($args, args);\n return new (bind.apply(Target, $args))();\n }\n // with altered newTarget, not support built-in constructors\n var proto = newTarget.prototype;\n var instance = create(isObject(proto) ? proto : Object.prototype);\n var result = Function.apply.call(Target, instance, args);\n return isObject(result) ? result : instance;\n }\n});\n","// 26.1.3 Reflect.defineProperty(target, propertyKey, attributes)\nvar dP = require('./_object-dp');\nvar $export = require('./_export');\nvar anObject = require('./_an-object');\nvar toPrimitive = require('./_to-primitive');\n\n// MS Edge has broken Reflect.defineProperty - throwing instead of returning false\n$export($export.S + $export.F * require('./_fails')(function () {\n // eslint-disable-next-line no-undef\n Reflect.defineProperty(dP.f({}, 1, { value: 1 }), 1, { value: 2 });\n}), 'Reflect', {\n defineProperty: function defineProperty(target, propertyKey, attributes) {\n anObject(target);\n propertyKey = toPrimitive(propertyKey, true);\n anObject(attributes);\n try {\n dP.f(target, propertyKey, attributes);\n return true;\n } catch (e) {\n return false;\n }\n }\n});\n","// 26.1.4 Reflect.deleteProperty(target, propertyKey)\nvar $export = require('./_export');\nvar gOPD = require('./_object-gopd').f;\nvar anObject = require('./_an-object');\n\n$export($export.S, 'Reflect', {\n deleteProperty: function deleteProperty(target, propertyKey) {\n var desc = gOPD(anObject(target), propertyKey);\n return desc && !desc.configurable ? false : delete target[propertyKey];\n }\n});\n","// 26.1.6 Reflect.get(target, propertyKey [, receiver])\nvar gOPD = require('./_object-gopd');\nvar getPrototypeOf = require('./_object-gpo');\nvar has = require('./_has');\nvar $export = require('./_export');\nvar isObject = require('./_is-object');\nvar anObject = require('./_an-object');\n\nfunction get(target, propertyKey /* , receiver */) {\n var receiver = arguments.length < 3 ? target : arguments[2];\n var desc, proto;\n if (anObject(target) === receiver) return target[propertyKey];\n if (desc = gOPD.f(target, propertyKey)) return has(desc, 'value')\n ? desc.value\n : desc.get !== undefined\n ? desc.get.call(receiver)\n : undefined;\n if (isObject(proto = getPrototypeOf(target))) return get(proto, propertyKey, receiver);\n}\n\n$export($export.S, 'Reflect', { get: get });\n","// 26.1.7 Reflect.getOwnPropertyDescriptor(target, propertyKey)\nvar gOPD = require('./_object-gopd');\nvar $export = require('./_export');\nvar anObject = require('./_an-object');\n\n$export($export.S, 'Reflect', {\n getOwnPropertyDescriptor: function getOwnPropertyDescriptor(target, propertyKey) {\n return gOPD.f(anObject(target), propertyKey);\n }\n});\n","// 26.1.8 Reflect.getPrototypeOf(target)\nvar $export = require('./_export');\nvar getProto = require('./_object-gpo');\nvar anObject = require('./_an-object');\n\n$export($export.S, 'Reflect', {\n getPrototypeOf: function getPrototypeOf(target) {\n return getProto(anObject(target));\n }\n});\n","// 26.1.9 Reflect.has(target, propertyKey)\nvar $export = require('./_export');\n\n$export($export.S, 'Reflect', {\n has: function has(target, propertyKey) {\n return propertyKey in target;\n }\n});\n","// 26.1.10 Reflect.isExtensible(target)\nvar $export = require('./_export');\nvar anObject = require('./_an-object');\nvar $isExtensible = Object.isExtensible;\n\n$export($export.S, 'Reflect', {\n isExtensible: function isExtensible(target) {\n anObject(target);\n return $isExtensible ? $isExtensible(target) : true;\n }\n});\n","// all object keys, includes non-enumerable and symbols\nvar gOPN = require('./_object-gopn');\nvar gOPS = require('./_object-gops');\nvar anObject = require('./_an-object');\nvar Reflect = require('./_global').Reflect;\nmodule.exports = Reflect && Reflect.ownKeys || function ownKeys(it) {\n var keys = gOPN.f(anObject(it));\n var getSymbols = gOPS.f;\n return getSymbols ? keys.concat(getSymbols(it)) : keys;\n};\n","// 26.1.11 Reflect.ownKeys(target)\nvar $export = require('./_export');\n\n$export($export.S, 'Reflect', { ownKeys: require('./_own-keys') });\n","// 26.1.12 Reflect.preventExtensions(target)\nvar $export = require('./_export');\nvar anObject = require('./_an-object');\nvar $preventExtensions = Object.preventExtensions;\n\n$export($export.S, 'Reflect', {\n preventExtensions: function preventExtensions(target) {\n anObject(target);\n try {\n if ($preventExtensions) $preventExtensions(target);\n return true;\n } catch (e) {\n return false;\n }\n }\n});\n","// 26.1.13 Reflect.set(target, propertyKey, V [, receiver])\nvar dP = require('./_object-dp');\nvar gOPD = require('./_object-gopd');\nvar getPrototypeOf = require('./_object-gpo');\nvar has = require('./_has');\nvar $export = require('./_export');\nvar createDesc = require('./_property-desc');\nvar anObject = require('./_an-object');\nvar isObject = require('./_is-object');\n\nfunction set(target, propertyKey, V /* , receiver */) {\n var receiver = arguments.length < 4 ? target : arguments[3];\n var ownDesc = gOPD.f(anObject(target), propertyKey);\n var existingDescriptor, proto;\n if (!ownDesc) {\n if (isObject(proto = getPrototypeOf(target))) {\n return set(proto, propertyKey, V, receiver);\n }\n ownDesc = createDesc(0);\n }\n if (has(ownDesc, 'value')) {\n if (ownDesc.writable === false || !isObject(receiver)) return false;\n existingDescriptor = gOPD.f(receiver, propertyKey) || createDesc(0);\n existingDescriptor.value = V;\n dP.f(receiver, propertyKey, existingDescriptor);\n return true;\n }\n return ownDesc.set === undefined ? false : (ownDesc.set.call(receiver, V), true);\n}\n\n$export($export.S, 'Reflect', { set: set });\n","// 26.1.14 Reflect.setPrototypeOf(target, proto)\nvar $export = require('./_export');\nvar setProto = require('./_set-proto');\n\nif (setProto) $export($export.S, 'Reflect', {\n setPrototypeOf: function setPrototypeOf(target, proto) {\n setProto.check(target, proto);\n try {\n setProto.set(target, proto);\n return true;\n } catch (e) {\n return false;\n }\n }\n});\n","var ctx = require('./_ctx');\nvar invoke = require('./_invoke');\nvar html = require('./_html');\nvar cel = require('./_dom-create');\nvar global = require('./_global');\nvar process = global.process;\nvar setTask = global.setImmediate;\nvar clearTask = global.clearImmediate;\nvar MessageChannel = global.MessageChannel;\nvar Dispatch = global.Dispatch;\nvar counter = 0;\nvar queue = {};\nvar ONREADYSTATECHANGE = 'onreadystatechange';\nvar defer, channel, port;\nvar run = function () {\n var id = +this;\n // eslint-disable-next-line no-prototype-builtins\n if (queue.hasOwnProperty(id)) {\n var fn = queue[id];\n delete queue[id];\n fn();\n }\n};\nvar listener = function (event) {\n run.call(event.data);\n};\n// Node.js 0.9+ & IE10+ has setImmediate, otherwise:\nif (!setTask || !clearTask) {\n setTask = function setImmediate(fn) {\n var args = [];\n var i = 1;\n while (arguments.length > i) args.push(arguments[i++]);\n queue[++counter] = function () {\n // eslint-disable-next-line no-new-func\n invoke(typeof fn == 'function' ? fn : Function(fn), args);\n };\n defer(counter);\n return counter;\n };\n clearTask = function clearImmediate(id) {\n delete queue[id];\n };\n // Node.js 0.8-\n if (require('./_cof')(process) == 'process') {\n defer = function (id) {\n process.nextTick(ctx(run, id, 1));\n };\n // Sphere (JS game engine) Dispatch API\n } else if (Dispatch && Dispatch.now) {\n defer = function (id) {\n Dispatch.now(ctx(run, id, 1));\n };\n // Browsers with MessageChannel, includes WebWorkers\n } else if (MessageChannel) {\n channel = new MessageChannel();\n port = channel.port2;\n channel.port1.onmessage = listener;\n defer = ctx(port.postMessage, port, 1);\n // Browsers with postMessage, skip WebWorkers\n // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'\n } else if (global.addEventListener && typeof postMessage == 'function' && !global.importScripts) {\n defer = function (id) {\n global.postMessage(id + '', '*');\n };\n global.addEventListener('message', listener, false);\n // IE8-\n } else if (ONREADYSTATECHANGE in cel('script')) {\n defer = function (id) {\n html.appendChild(cel('script'))[ONREADYSTATECHANGE] = function () {\n html.removeChild(this);\n run.call(id);\n };\n };\n // Rest old browsers\n } else {\n defer = function (id) {\n setTimeout(ctx(run, id, 1), 0);\n };\n }\n}\nmodule.exports = {\n set: setTask,\n clear: clearTask\n};\n","var global = require('./_global');\nvar macrotask = require('./_task').set;\nvar Observer = global.MutationObserver || global.WebKitMutationObserver;\nvar process = global.process;\nvar Promise = global.Promise;\nvar isNode = require('./_cof')(process) == 'process';\n\nmodule.exports = function () {\n var head, last, notify;\n\n var flush = function () {\n var parent, fn;\n if (isNode && (parent = process.domain)) parent.exit();\n while (head) {\n fn = head.fn;\n head = head.next;\n try {\n fn();\n } catch (e) {\n if (head) notify();\n else last = undefined;\n throw e;\n }\n } last = undefined;\n if (parent) parent.enter();\n };\n\n // Node.js\n if (isNode) {\n notify = function () {\n process.nextTick(flush);\n };\n // browsers with MutationObserver, except iOS Safari - https://github.com/zloirock/core-js/issues/339\n } else if (Observer && !(global.navigator && global.navigator.standalone)) {\n var toggle = true;\n var node = document.createTextNode('');\n new Observer(flush).observe(node, { characterData: true }); // eslint-disable-line no-new\n notify = function () {\n node.data = toggle = !toggle;\n };\n // environments with maybe non-completely correct, but existent Promise\n } else if (Promise && Promise.resolve) {\n var promise = Promise.resolve();\n notify = function () {\n promise.then(flush);\n };\n // for other environments - macrotask based on:\n // - setImmediate\n // - MessageChannel\n // - window.postMessag\n // - onreadystatechange\n // - setTimeout\n } else {\n notify = function () {\n // strange IE + webpack dev server bug - use .call(global)\n macrotask.call(global, flush);\n };\n }\n\n return function (fn) {\n var task = { fn: fn, next: undefined };\n if (last) last.next = task;\n if (!head) {\n head = task;\n notify();\n } last = task;\n };\n};\n","'use strict';\n// 25.4.1.5 NewPromiseCapability(C)\nvar aFunction = require('./_a-function');\n\nfunction PromiseCapability(C) {\n var resolve, reject;\n this.promise = new C(function ($$resolve, $$reject) {\n if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor');\n resolve = $$resolve;\n reject = $$reject;\n });\n this.resolve = aFunction(resolve);\n this.reject = aFunction(reject);\n}\n\nmodule.exports.f = function (C) {\n return new PromiseCapability(C);\n};\n","'use strict';\nvar LIBRARY = require('./_library');\nvar global = require('./_global');\nvar ctx = require('./_ctx');\nvar classof = require('./_classof');\nvar $export = require('./_export');\nvar isObject = require('./_is-object');\nvar aFunction = require('./_a-function');\nvar anInstance = require('./_an-instance');\nvar forOf = require('./_for-of');\nvar speciesConstructor = require('./_species-constructor');\nvar task = require('./_task').set;\nvar microtask = require('./_microtask')();\nvar newPromiseCapabilityModule = require('./_new-promise-capability');\nvar perform = require('./_perform');\nvar promiseResolve = require('./_promise-resolve');\nvar PROMISE = 'Promise';\nvar TypeError = global.TypeError;\nvar process = global.process;\nvar $Promise = global[PROMISE];\nvar isNode = classof(process) == 'process';\nvar empty = function () { /* empty */ };\nvar Internal, newGenericPromiseCapability, OwnPromiseCapability, Wrapper;\nvar newPromiseCapability = newGenericPromiseCapability = newPromiseCapabilityModule.f;\n\nvar USE_NATIVE = !!function () {\n try {\n // correct subclassing with @@species support\n var promise = $Promise.resolve(1);\n var FakePromise = (promise.constructor = {})[require('./_wks')('species')] = function (exec) {\n exec(empty, empty);\n };\n // unhandled rejections tracking support, NodeJS Promise without it fails @@species test\n return (isNode || typeof PromiseRejectionEvent == 'function') && promise.then(empty) instanceof FakePromise;\n } catch (e) { /* empty */ }\n}();\n\n// helpers\nvar isThenable = function (it) {\n var then;\n return isObject(it) && typeof (then = it.then) == 'function' ? then : false;\n};\nvar notify = function (promise, isReject) {\n if (promise._n) return;\n promise._n = true;\n var chain = promise._c;\n microtask(function () {\n var value = promise._v;\n var ok = promise._s == 1;\n var i = 0;\n var run = function (reaction) {\n var handler = ok ? reaction.ok : reaction.fail;\n var resolve = reaction.resolve;\n var reject = reaction.reject;\n var domain = reaction.domain;\n var result, then;\n try {\n if (handler) {\n if (!ok) {\n if (promise._h == 2) onHandleUnhandled(promise);\n promise._h = 1;\n }\n if (handler === true) result = value;\n else {\n if (domain) domain.enter();\n result = handler(value);\n if (domain) domain.exit();\n }\n if (result === reaction.promise) {\n reject(TypeError('Promise-chain cycle'));\n } else if (then = isThenable(result)) {\n then.call(result, resolve, reject);\n } else resolve(result);\n } else reject(value);\n } catch (e) {\n reject(e);\n }\n };\n while (chain.length > i) run(chain[i++]); // variable length - can't use forEach\n promise._c = [];\n promise._n = false;\n if (isReject && !promise._h) onUnhandled(promise);\n });\n};\nvar onUnhandled = function (promise) {\n task.call(global, function () {\n var value = promise._v;\n var unhandled = isUnhandled(promise);\n var result, handler, console;\n if (unhandled) {\n result = perform(function () {\n if (isNode) {\n process.emit('unhandledRejection', value, promise);\n } else if (handler = global.onunhandledrejection) {\n handler({ promise: promise, reason: value });\n } else if ((console = global.console) && console.error) {\n console.error('Unhandled promise rejection', value);\n }\n });\n // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should\n promise._h = isNode || isUnhandled(promise) ? 2 : 1;\n } promise._a = undefined;\n if (unhandled && result.e) throw result.v;\n });\n};\nvar isUnhandled = function (promise) {\n return promise._h !== 1 && (promise._a || promise._c).length === 0;\n};\nvar onHandleUnhandled = function (promise) {\n task.call(global, function () {\n var handler;\n if (isNode) {\n process.emit('rejectionHandled', promise);\n } else if (handler = global.onrejectionhandled) {\n handler({ promise: promise, reason: promise._v });\n }\n });\n};\nvar $reject = function (value) {\n var promise = this;\n if (promise._d) return;\n promise._d = true;\n promise = promise._w || promise; // unwrap\n promise._v = value;\n promise._s = 2;\n if (!promise._a) promise._a = promise._c.slice();\n notify(promise, true);\n};\nvar $resolve = function (value) {\n var promise = this;\n var then;\n if (promise._d) return;\n promise._d = true;\n promise = promise._w || promise; // unwrap\n try {\n if (promise === value) throw TypeError(\"Promise can't be resolved itself\");\n if (then = isThenable(value)) {\n microtask(function () {\n var wrapper = { _w: promise, _d: false }; // wrap\n try {\n then.call(value, ctx($resolve, wrapper, 1), ctx($reject, wrapper, 1));\n } catch (e) {\n $reject.call(wrapper, e);\n }\n });\n } else {\n promise._v = value;\n promise._s = 1;\n notify(promise, false);\n }\n } catch (e) {\n $reject.call({ _w: promise, _d: false }, e); // wrap\n }\n};\n\n// constructor polyfill\nif (!USE_NATIVE) {\n // 25.4.3.1 Promise(executor)\n $Promise = function Promise(executor) {\n anInstance(this, $Promise, PROMISE, '_h');\n aFunction(executor);\n Internal.call(this);\n try {\n executor(ctx($resolve, this, 1), ctx($reject, this, 1));\n } catch (err) {\n $reject.call(this, err);\n }\n };\n // eslint-disable-next-line no-unused-vars\n Internal = function Promise(executor) {\n this._c = []; // <- awaiting reactions\n this._a = undefined; // <- checked in isUnhandled reactions\n this._s = 0; // <- state\n this._d = false; // <- done\n this._v = undefined; // <- value\n this._h = 0; // <- rejection state, 0 - default, 1 - handled, 2 - unhandled\n this._n = false; // <- notify\n };\n Internal.prototype = require('./_redefine-all')($Promise.prototype, {\n // 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected)\n then: function then(onFulfilled, onRejected) {\n var reaction = newPromiseCapability(speciesConstructor(this, $Promise));\n reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;\n reaction.fail = typeof onRejected == 'function' && onRejected;\n reaction.domain = isNode ? process.domain : undefined;\n this._c.push(reaction);\n if (this._a) this._a.push(reaction);\n if (this._s) notify(this, false);\n return reaction.promise;\n },\n // 25.4.5.1 Promise.prototype.catch(onRejected)\n 'catch': function (onRejected) {\n return this.then(undefined, onRejected);\n }\n });\n OwnPromiseCapability = function () {\n var promise = new Internal();\n this.promise = promise;\n this.resolve = ctx($resolve, promise, 1);\n this.reject = ctx($reject, promise, 1);\n };\n newPromiseCapabilityModule.f = newPromiseCapability = function (C) {\n return C === $Promise || C === Wrapper\n ? new OwnPromiseCapability(C)\n : newGenericPromiseCapability(C);\n };\n}\n\n$export($export.G + $export.W + $export.F * !USE_NATIVE, { Promise: $Promise });\nrequire('./_set-to-string-tag')($Promise, PROMISE);\nrequire('./_set-species')(PROMISE);\nWrapper = require('./_core')[PROMISE];\n\n// statics\n$export($export.S + $export.F * !USE_NATIVE, PROMISE, {\n // 25.4.4.5 Promise.reject(r)\n reject: function reject(r) {\n var capability = newPromiseCapability(this);\n var $$reject = capability.reject;\n $$reject(r);\n return capability.promise;\n }\n});\n$export($export.S + $export.F * (LIBRARY || !USE_NATIVE), PROMISE, {\n // 25.4.4.6 Promise.resolve(x)\n resolve: function resolve(x) {\n return promiseResolve(LIBRARY && this === Wrapper ? $Promise : this, x);\n }\n});\n$export($export.S + $export.F * !(USE_NATIVE && require('./_iter-detect')(function (iter) {\n $Promise.all(iter)['catch'](empty);\n})), PROMISE, {\n // 25.4.4.1 Promise.all(iterable)\n all: function all(iterable) {\n var C = this;\n var capability = newPromiseCapability(C);\n var resolve = capability.resolve;\n var reject = capability.reject;\n var result = perform(function () {\n var values = [];\n var index = 0;\n var remaining = 1;\n forOf(iterable, false, function (promise) {\n var $index = index++;\n var alreadyCalled = false;\n values.push(undefined);\n remaining++;\n C.resolve(promise).then(function (value) {\n if (alreadyCalled) return;\n alreadyCalled = true;\n values[$index] = value;\n --remaining || resolve(values);\n }, reject);\n });\n --remaining || resolve(values);\n });\n if (result.e) reject(result.v);\n return capability.promise;\n },\n // 25.4.4.4 Promise.race(iterable)\n race: function race(iterable) {\n var C = this;\n var capability = newPromiseCapability(C);\n var reject = capability.reject;\n var result = perform(function () {\n forOf(iterable, false, function (promise) {\n C.resolve(promise).then(capability.resolve, reject);\n });\n });\n if (result.e) reject(result.v);\n return capability.promise;\n }\n});\n","module.exports = function (exec) {\n try {\n return { e: false, v: exec() };\n } catch (e) {\n return { e: true, v: e };\n }\n};\n","var anObject = require('./_an-object');\nvar isObject = require('./_is-object');\nvar newPromiseCapability = require('./_new-promise-capability');\n\nmodule.exports = function (C, x) {\n anObject(C);\n if (isObject(x) && x.constructor === C) return x;\n var promiseCapability = newPromiseCapability.f(C);\n var resolve = promiseCapability.resolve;\n resolve(x);\n return promiseCapability.promise;\n};\n","exports.f = require('./_wks');\n","var global = require('./_global');\nvar core = require('./_core');\nvar LIBRARY = require('./_library');\nvar wksExt = require('./_wks-ext');\nvar defineProperty = require('./_object-dp').f;\nmodule.exports = function (name) {\n var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {});\n if (name.charAt(0) != '_' && !(name in $Symbol)) defineProperty($Symbol, name, { value: wksExt.f(name) });\n};\n","// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window\nvar toIObject = require('./_to-iobject');\nvar gOPN = require('./_object-gopn').f;\nvar toString = {}.toString;\n\nvar windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames\n ? Object.getOwnPropertyNames(window) : [];\n\nvar getWindowNames = function (it) {\n try {\n return gOPN(it);\n } catch (e) {\n return windowNames.slice();\n }\n};\n\nmodule.exports.f = function getOwnPropertyNames(it) {\n return windowNames && toString.call(it) == '[object Window]' ? getWindowNames(it) : gOPN(toIObject(it));\n};\n","'use strict';\n// ECMAScript 6 symbols shim\nvar global = require('./_global');\nvar has = require('./_has');\nvar DESCRIPTORS = require('./_descriptors');\nvar $export = require('./_export');\nvar redefine = require('./_redefine');\nvar META = require('./_meta').KEY;\nvar $fails = require('./_fails');\nvar shared = require('./_shared');\nvar setToStringTag = require('./_set-to-string-tag');\nvar uid = require('./_uid');\nvar wks = require('./_wks');\nvar wksExt = require('./_wks-ext');\nvar wksDefine = require('./_wks-define');\nvar enumKeys = require('./_enum-keys');\nvar isArray = require('./_is-array');\nvar anObject = require('./_an-object');\nvar isObject = require('./_is-object');\nvar toIObject = require('./_to-iobject');\nvar toPrimitive = require('./_to-primitive');\nvar createDesc = require('./_property-desc');\nvar _create = require('./_object-create');\nvar gOPNExt = require('./_object-gopn-ext');\nvar $GOPD = require('./_object-gopd');\nvar $DP = require('./_object-dp');\nvar $keys = require('./_object-keys');\nvar gOPD = $GOPD.f;\nvar dP = $DP.f;\nvar gOPN = gOPNExt.f;\nvar $Symbol = global.Symbol;\nvar $JSON = global.JSON;\nvar _stringify = $JSON && $JSON.stringify;\nvar PROTOTYPE = 'prototype';\nvar HIDDEN = wks('_hidden');\nvar TO_PRIMITIVE = wks('toPrimitive');\nvar isEnum = {}.propertyIsEnumerable;\nvar SymbolRegistry = shared('symbol-registry');\nvar AllSymbols = shared('symbols');\nvar OPSymbols = shared('op-symbols');\nvar ObjectProto = Object[PROTOTYPE];\nvar USE_NATIVE = typeof $Symbol == 'function';\nvar QObject = global.QObject;\n// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173\nvar setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;\n\n// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687\nvar setSymbolDesc = DESCRIPTORS && $fails(function () {\n return _create(dP({}, 'a', {\n get: function () { return dP(this, 'a', { value: 7 }).a; }\n })).a != 7;\n}) ? function (it, key, D) {\n var protoDesc = gOPD(ObjectProto, key);\n if (protoDesc) delete ObjectProto[key];\n dP(it, key, D);\n if (protoDesc && it !== ObjectProto) dP(ObjectProto, key, protoDesc);\n} : dP;\n\nvar wrap = function (tag) {\n var sym = AllSymbols[tag] = _create($Symbol[PROTOTYPE]);\n sym._k = tag;\n return sym;\n};\n\nvar isSymbol = USE_NATIVE && typeof $Symbol.iterator == 'symbol' ? function (it) {\n return typeof it == 'symbol';\n} : function (it) {\n return it instanceof $Symbol;\n};\n\nvar $defineProperty = function defineProperty(it, key, D) {\n if (it === ObjectProto) $defineProperty(OPSymbols, key, D);\n anObject(it);\n key = toPrimitive(key, true);\n anObject(D);\n if (has(AllSymbols, key)) {\n if (!D.enumerable) {\n if (!has(it, HIDDEN)) dP(it, HIDDEN, createDesc(1, {}));\n it[HIDDEN][key] = true;\n } else {\n if (has(it, HIDDEN) && it[HIDDEN][key]) it[HIDDEN][key] = false;\n D = _create(D, { enumerable: createDesc(0, false) });\n } return setSymbolDesc(it, key, D);\n } return dP(it, key, D);\n};\nvar $defineProperties = function defineProperties(it, P) {\n anObject(it);\n var keys = enumKeys(P = toIObject(P));\n var i = 0;\n var l = keys.length;\n var key;\n while (l > i) $defineProperty(it, key = keys[i++], P[key]);\n return it;\n};\nvar $create = function create(it, P) {\n return P === undefined ? _create(it) : $defineProperties(_create(it), P);\n};\nvar $propertyIsEnumerable = function propertyIsEnumerable(key) {\n var E = isEnum.call(this, key = toPrimitive(key, true));\n if (this === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return false;\n return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true;\n};\nvar $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key) {\n it = toIObject(it);\n key = toPrimitive(key, true);\n if (it === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return;\n var D = gOPD(it, key);\n if (D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) D.enumerable = true;\n return D;\n};\nvar $getOwnPropertyNames = function getOwnPropertyNames(it) {\n var names = gOPN(toIObject(it));\n var result = [];\n var i = 0;\n var key;\n while (names.length > i) {\n if (!has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META) result.push(key);\n } return result;\n};\nvar $getOwnPropertySymbols = function getOwnPropertySymbols(it) {\n var IS_OP = it === ObjectProto;\n var names = gOPN(IS_OP ? OPSymbols : toIObject(it));\n var result = [];\n var i = 0;\n var key;\n while (names.length > i) {\n if (has(AllSymbols, key = names[i++]) && (IS_OP ? has(ObjectProto, key) : true)) result.push(AllSymbols[key]);\n } return result;\n};\n\n// 19.4.1.1 Symbol([description])\nif (!USE_NATIVE) {\n $Symbol = function Symbol() {\n if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor!');\n var tag = uid(arguments.length > 0 ? arguments[0] : undefined);\n var $set = function (value) {\n if (this === ObjectProto) $set.call(OPSymbols, value);\n if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;\n setSymbolDesc(this, tag, createDesc(1, value));\n };\n if (DESCRIPTORS && setter) setSymbolDesc(ObjectProto, tag, { configurable: true, set: $set });\n return wrap(tag);\n };\n redefine($Symbol[PROTOTYPE], 'toString', function toString() {\n return this._k;\n });\n\n $GOPD.f = $getOwnPropertyDescriptor;\n $DP.f = $defineProperty;\n require('./_object-gopn').f = gOPNExt.f = $getOwnPropertyNames;\n require('./_object-pie').f = $propertyIsEnumerable;\n require('./_object-gops').f = $getOwnPropertySymbols;\n\n if (DESCRIPTORS && !require('./_library')) {\n redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true);\n }\n\n wksExt.f = function (name) {\n return wrap(wks(name));\n };\n}\n\n$export($export.G + $export.W + $export.F * !USE_NATIVE, { Symbol: $Symbol });\n\nfor (var es6Symbols = (\n // 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14\n 'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'\n).split(','), j = 0; es6Symbols.length > j;)wks(es6Symbols[j++]);\n\nfor (var wellKnownSymbols = $keys(wks.store), k = 0; wellKnownSymbols.length > k;) wksDefine(wellKnownSymbols[k++]);\n\n$export($export.S + $export.F * !USE_NATIVE, 'Symbol', {\n // 19.4.2.1 Symbol.for(key)\n 'for': function (key) {\n return has(SymbolRegistry, key += '')\n ? SymbolRegistry[key]\n : SymbolRegistry[key] = $Symbol(key);\n },\n // 19.4.2.5 Symbol.keyFor(sym)\n keyFor: function keyFor(sym) {\n if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol!');\n for (var key in SymbolRegistry) if (SymbolRegistry[key] === sym) return key;\n },\n useSetter: function () { setter = true; },\n useSimple: function () { setter = false; }\n});\n\n$export($export.S + $export.F * !USE_NATIVE, 'Object', {\n // 19.1.2.2 Object.create(O [, Properties])\n create: $create,\n // 19.1.2.4 Object.defineProperty(O, P, Attributes)\n defineProperty: $defineProperty,\n // 19.1.2.3 Object.defineProperties(O, Properties)\n defineProperties: $defineProperties,\n // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)\n getOwnPropertyDescriptor: $getOwnPropertyDescriptor,\n // 19.1.2.7 Object.getOwnPropertyNames(O)\n getOwnPropertyNames: $getOwnPropertyNames,\n // 19.1.2.8 Object.getOwnPropertySymbols(O)\n getOwnPropertySymbols: $getOwnPropertySymbols\n});\n\n// 24.3.2 JSON.stringify(value [, replacer [, space]])\n$JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function () {\n var S = $Symbol();\n // MS Edge converts symbol values to JSON as {}\n // WebKit converts symbol values to JSON as null\n // V8 throws on boxed symbols\n return _stringify([S]) != '[null]' || _stringify({ a: S }) != '{}' || _stringify(Object(S)) != '{}';\n})), 'JSON', {\n stringify: function stringify(it) {\n var args = [it];\n var i = 1;\n var replacer, $replacer;\n while (arguments.length > i) args.push(arguments[i++]);\n $replacer = replacer = args[1];\n if (!isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined\n if (!isArray(replacer)) replacer = function (key, value) {\n if (typeof $replacer == 'function') value = $replacer.call(this, key, value);\n if (!isSymbol(value)) return value;\n };\n args[1] = replacer;\n return _stringify.apply($JSON, args);\n }\n});\n\n// 19.4.3.4 Symbol.prototype[@@toPrimitive](hint)\n$Symbol[PROTOTYPE][TO_PRIMITIVE] || require('./_hide')($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf);\n// 19.4.3.5 Symbol.prototype[@@toStringTag]\nsetToStringTag($Symbol, 'Symbol');\n// 20.2.1.9 Math[@@toStringTag]\nsetToStringTag(Math, 'Math', true);\n// 24.3.3 JSON[@@toStringTag]\nsetToStringTag(global.JSON, 'JSON', true);\n","// all enumerable object keys, includes symbols\nvar getKeys = require('./_object-keys');\nvar gOPS = require('./_object-gops');\nvar pIE = require('./_object-pie');\nmodule.exports = function (it) {\n var result = getKeys(it);\n var getSymbols = gOPS.f;\n if (getSymbols) {\n var symbols = getSymbols(it);\n var isEnum = pIE.f;\n var i = 0;\n var key;\n while (symbols.length > i) if (isEnum.call(it, key = symbols[i++])) result.push(key);\n } return result;\n};\n","// most Object methods by ES6 should accept primitives\nvar $export = require('./_export');\nvar core = require('./_core');\nvar fails = require('./_fails');\nmodule.exports = function (KEY, exec) {\n var fn = (core.Object || {})[KEY] || Object[KEY];\n var exp = {};\n exp[KEY] = exec(fn);\n $export($export.S + $export.F * fails(function () { fn(1); }), 'Object', exp);\n};\n","// 19.1.2.5 Object.freeze(O)\nvar isObject = require('./_is-object');\nvar meta = require('./_meta').onFreeze;\n\nrequire('./_object-sap')('freeze', function ($freeze) {\n return function freeze(it) {\n return $freeze && isObject(it) ? $freeze(meta(it)) : it;\n };\n});\n","// 19.1.2.17 Object.seal(O)\nvar isObject = require('./_is-object');\nvar meta = require('./_meta').onFreeze;\n\nrequire('./_object-sap')('seal', function ($seal) {\n return function seal(it) {\n return $seal && isObject(it) ? $seal(meta(it)) : it;\n };\n});\n","// 19.1.2.15 Object.preventExtensions(O)\nvar isObject = require('./_is-object');\nvar meta = require('./_meta').onFreeze;\n\nrequire('./_object-sap')('preventExtensions', function ($preventExtensions) {\n return function preventExtensions(it) {\n return $preventExtensions && isObject(it) ? $preventExtensions(meta(it)) : it;\n };\n});\n","// 19.1.2.12 Object.isFrozen(O)\nvar isObject = require('./_is-object');\n\nrequire('./_object-sap')('isFrozen', function ($isFrozen) {\n return function isFrozen(it) {\n return isObject(it) ? $isFrozen ? $isFrozen(it) : false : true;\n };\n});\n","// 19.1.2.13 Object.isSealed(O)\nvar isObject = require('./_is-object');\n\nrequire('./_object-sap')('isSealed', function ($isSealed) {\n return function isSealed(it) {\n return isObject(it) ? $isSealed ? $isSealed(it) : false : true;\n };\n});\n","// 19.1.2.11 Object.isExtensible(O)\nvar isObject = require('./_is-object');\n\nrequire('./_object-sap')('isExtensible', function ($isExtensible) {\n return function isExtensible(it) {\n return isObject(it) ? $isExtensible ? $isExtensible(it) : true : false;\n };\n});\n","// 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)\nvar toIObject = require('./_to-iobject');\nvar $getOwnPropertyDescriptor = require('./_object-gopd').f;\n\nrequire('./_object-sap')('getOwnPropertyDescriptor', function () {\n return function getOwnPropertyDescriptor(it, key) {\n return $getOwnPropertyDescriptor(toIObject(it), key);\n };\n});\n","// 19.1.2.9 Object.getPrototypeOf(O)\nvar toObject = require('./_to-object');\nvar $getPrototypeOf = require('./_object-gpo');\n\nrequire('./_object-sap')('getPrototypeOf', function () {\n return function getPrototypeOf(it) {\n return $getPrototypeOf(toObject(it));\n };\n});\n","// 19.1.2.14 Object.keys(O)\nvar toObject = require('./_to-object');\nvar $keys = require('./_object-keys');\n\nrequire('./_object-sap')('keys', function () {\n return function keys(it) {\n return $keys(toObject(it));\n };\n});\n","// 19.1.2.7 Object.getOwnPropertyNames(O)\nrequire('./_object-sap')('getOwnPropertyNames', function () {\n return require('./_object-gopn-ext').f;\n});\n","// 19.1.3.1 Object.assign(target, source)\nvar $export = require('./_export');\n\n$export($export.S + $export.F, 'Object', { assign: require('./_object-assign') });\n","// 7.2.9 SameValue(x, y)\nmodule.exports = Object.is || function is(x, y) {\n // eslint-disable-next-line no-self-compare\n return x === y ? x !== 0 || 1 / x === 1 / y : x != x && y != y;\n};\n","// 19.1.3.10 Object.is(value1, value2)\nvar $export = require('./_export');\n$export($export.S, 'Object', { is: require('./_same-value') });\n","var dP = require('./_object-dp').f;\nvar FProto = Function.prototype;\nvar nameRE = /^\\s*function ([^ (]*)/;\nvar NAME = 'name';\n\n// 19.2.4.2 name\nNAME in FProto || require('./_descriptors') && dP(FProto, NAME, {\n configurable: true,\n get: function () {\n try {\n return ('' + this).match(nameRE)[1];\n } catch (e) {\n return '';\n }\n }\n});\n","var $export = require('./_export');\nvar toIObject = require('./_to-iobject');\nvar toLength = require('./_to-length');\n\n$export($export.S, 'String', {\n // 21.1.2.4 String.raw(callSite, ...substitutions)\n raw: function raw(callSite) {\n var tpl = toIObject(callSite.raw);\n var len = toLength(tpl.length);\n var aLen = arguments.length;\n var res = [];\n var i = 0;\n while (len > i) {\n res.push(String(tpl[i++]));\n if (i < aLen) res.push(String(arguments[i]));\n } return res.join('');\n }\n});\n","var $export = require('./_export');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nvar fromCharCode = String.fromCharCode;\nvar $fromCodePoint = String.fromCodePoint;\n\n// length should be 1, old FF problem\n$export($export.S + $export.F * (!!$fromCodePoint && $fromCodePoint.length != 1), 'String', {\n // 21.1.2.2 String.fromCodePoint(...codePoints)\n fromCodePoint: function fromCodePoint(x) { // eslint-disable-line no-unused-vars\n var res = [];\n var aLen = arguments.length;\n var i = 0;\n var code;\n while (aLen > i) {\n code = +arguments[i++];\n if (toAbsoluteIndex(code, 0x10ffff) !== code) throw RangeError(code + ' is not a valid code point');\n res.push(code < 0x10000\n ? fromCharCode(code)\n : fromCharCode(((code -= 0x10000) >> 10) + 0xd800, code % 0x400 + 0xdc00)\n );\n } return res.join('');\n }\n});\n","var toInteger = require('./_to-integer');\nvar defined = require('./_defined');\n// true -> String#at\n// false -> String#codePointAt\nmodule.exports = function (TO_STRING) {\n return function (that, pos) {\n var s = String(defined(that));\n var i = toInteger(pos);\n var l = s.length;\n var a, b;\n if (i < 0 || i >= l) return TO_STRING ? '' : undefined;\n a = s.charCodeAt(i);\n return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff\n ? TO_STRING ? s.charAt(i) : a\n : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;\n };\n};\n","'use strict';\nvar $export = require('./_export');\nvar $at = require('./_string-at')(false);\n$export($export.P, 'String', {\n // 21.1.3.3 String.prototype.codePointAt(pos)\n codePointAt: function codePointAt(pos) {\n return $at(this, pos);\n }\n});\n","'use strict';\nvar toInteger = require('./_to-integer');\nvar defined = require('./_defined');\n\nmodule.exports = function repeat(count) {\n var str = String(defined(this));\n var res = '';\n var n = toInteger(count);\n if (n < 0 || n == Infinity) throw RangeError(\"Count can't be negative\");\n for (;n > 0; (n >>>= 1) && (str += str)) if (n & 1) res += str;\n return res;\n};\n","var $export = require('./_export');\n\n$export($export.P, 'String', {\n // 21.1.3.13 String.prototype.repeat(count)\n repeat: require('./_string-repeat')\n});\n","// 7.2.8 IsRegExp(argument)\nvar isObject = require('./_is-object');\nvar cof = require('./_cof');\nvar MATCH = require('./_wks')('match');\nmodule.exports = function (it) {\n var isRegExp;\n return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : cof(it) == 'RegExp');\n};\n","// helper for String#{startsWith, endsWith, includes}\nvar isRegExp = require('./_is-regexp');\nvar defined = require('./_defined');\n\nmodule.exports = function (that, searchString, NAME) {\n if (isRegExp(searchString)) throw TypeError('String#' + NAME + \" doesn't accept regex!\");\n return String(defined(that));\n};\n","var MATCH = require('./_wks')('match');\nmodule.exports = function (KEY) {\n var re = /./;\n try {\n '/./'[KEY](re);\n } catch (e) {\n try {\n re[MATCH] = false;\n return !'/./'[KEY](re);\n } catch (f) { /* empty */ }\n } return true;\n};\n","// 21.1.3.18 String.prototype.startsWith(searchString [, position ])\n'use strict';\nvar $export = require('./_export');\nvar toLength = require('./_to-length');\nvar context = require('./_string-context');\nvar STARTS_WITH = 'startsWith';\nvar $startsWith = ''[STARTS_WITH];\n\n$export($export.P + $export.F * require('./_fails-is-regexp')(STARTS_WITH), 'String', {\n startsWith: function startsWith(searchString /* , position = 0 */) {\n var that = context(this, searchString, STARTS_WITH);\n var index = toLength(Math.min(arguments.length > 1 ? arguments[1] : undefined, that.length));\n var search = String(searchString);\n return $startsWith\n ? $startsWith.call(that, search, index)\n : that.slice(index, index + search.length) === search;\n }\n});\n","// 21.1.3.6 String.prototype.endsWith(searchString [, endPosition])\n'use strict';\nvar $export = require('./_export');\nvar toLength = require('./_to-length');\nvar context = require('./_string-context');\nvar ENDS_WITH = 'endsWith';\nvar $endsWith = ''[ENDS_WITH];\n\n$export($export.P + $export.F * require('./_fails-is-regexp')(ENDS_WITH), 'String', {\n endsWith: function endsWith(searchString /* , endPosition = @length */) {\n var that = context(this, searchString, ENDS_WITH);\n var endPosition = arguments.length > 1 ? arguments[1] : undefined;\n var len = toLength(that.length);\n var end = endPosition === undefined ? len : Math.min(toLength(endPosition), len);\n var search = String(searchString);\n return $endsWith\n ? $endsWith.call(that, search, end)\n : that.slice(end - search.length, end) === search;\n }\n});\n","// 21.1.3.7 String.prototype.includes(searchString, position = 0)\n'use strict';\nvar $export = require('./_export');\nvar context = require('./_string-context');\nvar INCLUDES = 'includes';\n\n$export($export.P + $export.F * require('./_fails-is-regexp')(INCLUDES), 'String', {\n includes: function includes(searchString /* , position = 0 */) {\n return !!~context(this, searchString, INCLUDES)\n .indexOf(searchString, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","// 21.2.5.3 get RegExp.prototype.flags()\nif (require('./_descriptors') && /./g.flags != 'g') require('./_object-dp').f(RegExp.prototype, 'flags', {\n configurable: true,\n get: require('./_flags')\n});\n","'use strict';\n// 21.2.5.3 get RegExp.prototype.flags\nvar anObject = require('./_an-object');\nmodule.exports = function () {\n var that = anObject(this);\n var result = '';\n if (that.global) result += 'g';\n if (that.ignoreCase) result += 'i';\n if (that.multiline) result += 'm';\n if (that.unicode) result += 'u';\n if (that.sticky) result += 'y';\n return result;\n};\n","'use strict';\nvar hide = require('./_hide');\nvar redefine = require('./_redefine');\nvar fails = require('./_fails');\nvar defined = require('./_defined');\nvar wks = require('./_wks');\n\nmodule.exports = function (KEY, length, exec) {\n var SYMBOL = wks(KEY);\n var fns = exec(defined, SYMBOL, ''[KEY]);\n var strfn = fns[0];\n var rxfn = fns[1];\n if (fails(function () {\n var O = {};\n O[SYMBOL] = function () { return 7; };\n return ''[KEY](O) != 7;\n })) {\n redefine(String.prototype, KEY, strfn);\n hide(RegExp.prototype, SYMBOL, length == 2\n // 21.2.5.8 RegExp.prototype[@@replace](string, replaceValue)\n // 21.2.5.11 RegExp.prototype[@@split](string, limit)\n ? function (string, arg) { return rxfn.call(string, this, arg); }\n // 21.2.5.6 RegExp.prototype[@@match](string)\n // 21.2.5.9 RegExp.prototype[@@search](string)\n : function (string) { return rxfn.call(string, this); }\n );\n }\n};\n","// @@match logic\nrequire('./_fix-re-wks')('match', 1, function (defined, MATCH, $match) {\n // 21.1.3.11 String.prototype.match(regexp)\n return [function match(regexp) {\n 'use strict';\n var O = defined(this);\n var fn = regexp == undefined ? undefined : regexp[MATCH];\n return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[MATCH](String(O));\n }, $match];\n});\n","// @@replace logic\nrequire('./_fix-re-wks')('replace', 2, function (defined, REPLACE, $replace) {\n // 21.1.3.14 String.prototype.replace(searchValue, replaceValue)\n return [function replace(searchValue, replaceValue) {\n 'use strict';\n var O = defined(this);\n var fn = searchValue == undefined ? undefined : searchValue[REPLACE];\n return fn !== undefined\n ? fn.call(searchValue, O, replaceValue)\n : $replace.call(String(O), searchValue, replaceValue);\n }, $replace];\n});\n","// @@split logic\nrequire('./_fix-re-wks')('split', 2, function (defined, SPLIT, $split) {\n 'use strict';\n var isRegExp = require('./_is-regexp');\n var _split = $split;\n var $push = [].push;\n var $SPLIT = 'split';\n var LENGTH = 'length';\n var LAST_INDEX = 'lastIndex';\n if (\n 'abbc'[$SPLIT](/(b)*/)[1] == 'c' ||\n 'test'[$SPLIT](/(?:)/, -1)[LENGTH] != 4 ||\n 'ab'[$SPLIT](/(?:ab)*/)[LENGTH] != 2 ||\n '.'[$SPLIT](/(.?)(.?)/)[LENGTH] != 4 ||\n '.'[$SPLIT](/()()/)[LENGTH] > 1 ||\n ''[$SPLIT](/.?/)[LENGTH]\n ) {\n var NPCG = /()??/.exec('')[1] === undefined; // nonparticipating capturing group\n // based on es5-shim implementation, need to rework it\n $split = function (separator, limit) {\n var string = String(this);\n if (separator === undefined && limit === 0) return [];\n // If `separator` is not a regex, use native split\n if (!isRegExp(separator)) return _split.call(string, separator, limit);\n var output = [];\n var flags = (separator.ignoreCase ? 'i' : '') +\n (separator.multiline ? 'm' : '') +\n (separator.unicode ? 'u' : '') +\n (separator.sticky ? 'y' : '');\n var lastLastIndex = 0;\n var splitLimit = limit === undefined ? 4294967295 : limit >>> 0;\n // Make `global` and avoid `lastIndex` issues by working with a copy\n var separatorCopy = new RegExp(separator.source, flags + 'g');\n var separator2, match, lastIndex, lastLength, i;\n // Doesn't need flags gy, but they don't hurt\n if (!NPCG) separator2 = new RegExp('^' + separatorCopy.source + '$(?!\\\\s)', flags);\n while (match = separatorCopy.exec(string)) {\n // `separatorCopy.lastIndex` is not reliable cross-browser\n lastIndex = match.index + match[0][LENGTH];\n if (lastIndex > lastLastIndex) {\n output.push(string.slice(lastLastIndex, match.index));\n // Fix browsers whose `exec` methods don't consistently return `undefined` for NPCG\n // eslint-disable-next-line no-loop-func\n if (!NPCG && match[LENGTH] > 1) match[0].replace(separator2, function () {\n for (i = 1; i < arguments[LENGTH] - 2; i++) if (arguments[i] === undefined) match[i] = undefined;\n });\n if (match[LENGTH] > 1 && match.index < string[LENGTH]) $push.apply(output, match.slice(1));\n lastLength = match[0][LENGTH];\n lastLastIndex = lastIndex;\n if (output[LENGTH] >= splitLimit) break;\n }\n if (separatorCopy[LAST_INDEX] === match.index) separatorCopy[LAST_INDEX]++; // Avoid an infinite loop\n }\n if (lastLastIndex === string[LENGTH]) {\n if (lastLength || !separatorCopy.test('')) output.push('');\n } else output.push(string.slice(lastLastIndex));\n return output[LENGTH] > splitLimit ? output.slice(0, splitLimit) : output;\n };\n // Chakra, V8\n } else if ('0'[$SPLIT](undefined, 0)[LENGTH]) {\n $split = function (separator, limit) {\n return separator === undefined && limit === 0 ? [] : _split.call(this, separator, limit);\n };\n }\n // 21.1.3.17 String.prototype.split(separator, limit)\n return [function split(separator, limit) {\n var O = defined(this);\n var fn = separator == undefined ? undefined : separator[SPLIT];\n return fn !== undefined ? fn.call(separator, O, limit) : $split.call(String(O), separator, limit);\n }, $split];\n});\n","// @@search logic\nrequire('./_fix-re-wks')('search', 1, function (defined, SEARCH, $search) {\n // 21.1.3.15 String.prototype.search(regexp)\n return [function search(regexp) {\n 'use strict';\n var O = defined(this);\n var fn = regexp == undefined ? undefined : regexp[SEARCH];\n return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[SEARCH](String(O));\n }, $search];\n});\n","'use strict';\nvar $defineProperty = require('./_object-dp');\nvar createDesc = require('./_property-desc');\n\nmodule.exports = function (object, index, value) {\n if (index in object) $defineProperty.f(object, index, createDesc(0, value));\n else object[index] = value;\n};\n","'use strict';\nvar ctx = require('./_ctx');\nvar $export = require('./_export');\nvar toObject = require('./_to-object');\nvar call = require('./_iter-call');\nvar isArrayIter = require('./_is-array-iter');\nvar toLength = require('./_to-length');\nvar createProperty = require('./_create-property');\nvar getIterFn = require('./core.get-iterator-method');\n\n$export($export.S + $export.F * !require('./_iter-detect')(function (iter) { Array.from(iter); }), 'Array', {\n // 22.1.2.1 Array.from(arrayLike, mapfn = undefined, thisArg = undefined)\n from: function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {\n var O = toObject(arrayLike);\n var C = typeof this == 'function' ? this : Array;\n var aLen = arguments.length;\n var mapfn = aLen > 1 ? arguments[1] : undefined;\n var mapping = mapfn !== undefined;\n var index = 0;\n var iterFn = getIterFn(O);\n var length, result, step, iterator;\n if (mapping) mapfn = ctx(mapfn, aLen > 2 ? arguments[2] : undefined, 2);\n // if object isn't iterable or it's array with default iterator - use simple case\n if (iterFn != undefined && !(C == Array && isArrayIter(iterFn))) {\n for (iterator = iterFn.call(O), result = new C(); !(step = iterator.next()).done; index++) {\n createProperty(result, index, mapping ? call(iterator, mapfn, [step.value, index], true) : step.value);\n }\n } else {\n length = toLength(O.length);\n for (result = new C(length); length > index; index++) {\n createProperty(result, index, mapping ? mapfn(O[index], index) : O[index]);\n }\n }\n result.length = index;\n return result;\n }\n});\n","'use strict';\nvar $export = require('./_export');\nvar createProperty = require('./_create-property');\n\n// WebKit Array.of isn't generic\n$export($export.S + $export.F * require('./_fails')(function () {\n function F() { /* empty */ }\n return !(Array.of.call(F) instanceof F);\n}), 'Array', {\n // 22.1.2.3 Array.of( ...items)\n of: function of(/* ...args */) {\n var index = 0;\n var aLen = arguments.length;\n var result = new (typeof this == 'function' ? this : Array)(aLen);\n while (aLen > index) createProperty(result, index, arguments[index++]);\n result.length = aLen;\n return result;\n }\n});\n","// 22.1.3.3 Array.prototype.copyWithin(target, start, end = this.length)\nvar $export = require('./_export');\n\n$export($export.P, 'Array', { copyWithin: require('./_array-copy-within') });\n\nrequire('./_add-to-unscopables')('copyWithin');\n","'use strict';\n// 22.1.3.8 Array.prototype.find(predicate, thisArg = undefined)\nvar $export = require('./_export');\nvar $find = require('./_array-methods')(5);\nvar KEY = 'find';\nvar forced = true;\n// Shouldn't skip holes\nif (KEY in []) Array(1)[KEY](function () { forced = false; });\n$export($export.P + $export.F * forced, 'Array', {\n find: function find(callbackfn /* , that = undefined */) {\n return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\nrequire('./_add-to-unscopables')(KEY);\n","'use strict';\n// 22.1.3.9 Array.prototype.findIndex(predicate, thisArg = undefined)\nvar $export = require('./_export');\nvar $find = require('./_array-methods')(6);\nvar KEY = 'findIndex';\nvar forced = true;\n// Shouldn't skip holes\nif (KEY in []) Array(1)[KEY](function () { forced = false; });\n$export($export.P + $export.F * forced, 'Array', {\n findIndex: function findIndex(callbackfn /* , that = undefined */) {\n return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\nrequire('./_add-to-unscopables')(KEY);\n","// 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length)\nvar $export = require('./_export');\n\n$export($export.P, 'Array', { fill: require('./_array-fill') });\n\nrequire('./_add-to-unscopables')('fill');\n","// 20.1.2.2 Number.isFinite(number)\nvar $export = require('./_export');\nvar _isFinite = require('./_global').isFinite;\n\n$export($export.S, 'Number', {\n isFinite: function isFinite(it) {\n return typeof it == 'number' && _isFinite(it);\n }\n});\n","// 20.1.2.3 Number.isInteger(number)\nvar isObject = require('./_is-object');\nvar floor = Math.floor;\nmodule.exports = function isInteger(it) {\n return !isObject(it) && isFinite(it) && floor(it) === it;\n};\n","// 20.1.2.3 Number.isInteger(number)\nvar $export = require('./_export');\n\n$export($export.S, 'Number', { isInteger: require('./_is-integer') });\n","// 20.1.2.5 Number.isSafeInteger(number)\nvar $export = require('./_export');\nvar isInteger = require('./_is-integer');\nvar abs = Math.abs;\n\n$export($export.S, 'Number', {\n isSafeInteger: function isSafeInteger(number) {\n return isInteger(number) && abs(number) <= 0x1fffffffffffff;\n }\n});\n","// 20.1.2.4 Number.isNaN(number)\nvar $export = require('./_export');\n\n$export($export.S, 'Number', {\n isNaN: function isNaN(number) {\n // eslint-disable-next-line no-self-compare\n return number != number;\n }\n});\n","// 20.1.2.1 Number.EPSILON\nvar $export = require('./_export');\n\n$export($export.S, 'Number', { EPSILON: Math.pow(2, -52) });\n","// 20.1.2.10 Number.MIN_SAFE_INTEGER\nvar $export = require('./_export');\n\n$export($export.S, 'Number', { MIN_SAFE_INTEGER: -0x1fffffffffffff });\n","// 20.1.2.6 Number.MAX_SAFE_INTEGER\nvar $export = require('./_export');\n\n$export($export.S, 'Number', { MAX_SAFE_INTEGER: 0x1fffffffffffff });\n","// 20.2.2.20 Math.log1p(x)\nmodule.exports = Math.log1p || function log1p(x) {\n return (x = +x) > -1e-8 && x < 1e-8 ? x - x * x / 2 : Math.log(1 + x);\n};\n","// 20.2.2.3 Math.acosh(x)\nvar $export = require('./_export');\nvar log1p = require('./_math-log1p');\nvar sqrt = Math.sqrt;\nvar $acosh = Math.acosh;\n\n$export($export.S + $export.F * !($acosh\n // V8 bug: https://code.google.com/p/v8/issues/detail?id=3509\n && Math.floor($acosh(Number.MAX_VALUE)) == 710\n // Tor Browser bug: Math.acosh(Infinity) -> NaN\n && $acosh(Infinity) == Infinity\n), 'Math', {\n acosh: function acosh(x) {\n return (x = +x) < 1 ? NaN : x > 94906265.62425156\n ? Math.log(x) + Math.LN2\n : log1p(x - 1 + sqrt(x - 1) * sqrt(x + 1));\n }\n});\n","// 20.2.2.5 Math.asinh(x)\nvar $export = require('./_export');\nvar $asinh = Math.asinh;\n\nfunction asinh(x) {\n return !isFinite(x = +x) || x == 0 ? x : x < 0 ? -asinh(-x) : Math.log(x + Math.sqrt(x * x + 1));\n}\n\n// Tor Browser bug: Math.asinh(0) -> -0\n$export($export.S + $export.F * !($asinh && 1 / $asinh(0) > 0), 'Math', { asinh: asinh });\n","// 20.2.2.7 Math.atanh(x)\nvar $export = require('./_export');\nvar $atanh = Math.atanh;\n\n// Tor Browser bug: Math.atanh(-0) -> 0\n$export($export.S + $export.F * !($atanh && 1 / $atanh(-0) < 0), 'Math', {\n atanh: function atanh(x) {\n return (x = +x) == 0 ? x : Math.log((1 + x) / (1 - x)) / 2;\n }\n});\n","// 20.2.2.28 Math.sign(x)\nmodule.exports = Math.sign || function sign(x) {\n // eslint-disable-next-line no-self-compare\n return (x = +x) == 0 || x != x ? x : x < 0 ? -1 : 1;\n};\n","// 20.2.2.9 Math.cbrt(x)\nvar $export = require('./_export');\nvar sign = require('./_math-sign');\n\n$export($export.S, 'Math', {\n cbrt: function cbrt(x) {\n return sign(x = +x) * Math.pow(Math.abs(x), 1 / 3);\n }\n});\n","// 20.2.2.11 Math.clz32(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n clz32: function clz32(x) {\n return (x >>>= 0) ? 31 - Math.floor(Math.log(x + 0.5) * Math.LOG2E) : 32;\n }\n});\n","// 20.2.2.12 Math.cosh(x)\nvar $export = require('./_export');\nvar exp = Math.exp;\n\n$export($export.S, 'Math', {\n cosh: function cosh(x) {\n return (exp(x = +x) + exp(-x)) / 2;\n }\n});\n","// 20.2.2.14 Math.expm1(x)\nvar $expm1 = Math.expm1;\nmodule.exports = (!$expm1\n // Old FF bug\n || $expm1(10) > 22025.465794806719 || $expm1(10) < 22025.4657948067165168\n // Tor Browser bug\n || $expm1(-2e-17) != -2e-17\n) ? function expm1(x) {\n return (x = +x) == 0 ? x : x > -1e-6 && x < 1e-6 ? x + x * x / 2 : Math.exp(x) - 1;\n} : $expm1;\n","// 20.2.2.14 Math.expm1(x)\nvar $export = require('./_export');\nvar $expm1 = require('./_math-expm1');\n\n$export($export.S + $export.F * ($expm1 != Math.expm1), 'Math', { expm1: $expm1 });\n","// 20.2.2.16 Math.fround(x)\nvar sign = require('./_math-sign');\nvar pow = Math.pow;\nvar EPSILON = pow(2, -52);\nvar EPSILON32 = pow(2, -23);\nvar MAX32 = pow(2, 127) * (2 - EPSILON32);\nvar MIN32 = pow(2, -126);\n\nvar roundTiesToEven = function (n) {\n return n + 1 / EPSILON - 1 / EPSILON;\n};\n\nmodule.exports = Math.fround || function fround(x) {\n var $abs = Math.abs(x);\n var $sign = sign(x);\n var a, result;\n if ($abs < MIN32) return $sign * roundTiesToEven($abs / MIN32 / EPSILON32) * MIN32 * EPSILON32;\n a = (1 + EPSILON32 / EPSILON) * $abs;\n result = a - (a - $abs);\n // eslint-disable-next-line no-self-compare\n if (result > MAX32 || result != result) return $sign * Infinity;\n return $sign * result;\n};\n","// 20.2.2.16 Math.fround(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', { fround: require('./_math-fround') });\n","// 20.2.2.17 Math.hypot([value1[, value2[, … ]]])\nvar $export = require('./_export');\nvar abs = Math.abs;\n\n$export($export.S, 'Math', {\n hypot: function hypot(value1, value2) { // eslint-disable-line no-unused-vars\n var sum = 0;\n var i = 0;\n var aLen = arguments.length;\n var larg = 0;\n var arg, div;\n while (i < aLen) {\n arg = abs(arguments[i++]);\n if (larg < arg) {\n div = larg / arg;\n sum = sum * div * div + 1;\n larg = arg;\n } else if (arg > 0) {\n div = arg / larg;\n sum += div * div;\n } else sum += arg;\n }\n return larg === Infinity ? Infinity : larg * Math.sqrt(sum);\n }\n});\n","// 20.2.2.18 Math.imul(x, y)\nvar $export = require('./_export');\nvar $imul = Math.imul;\n\n// some WebKit versions fails with big numbers, some has wrong arity\n$export($export.S + $export.F * require('./_fails')(function () {\n return $imul(0xffffffff, 5) != -5 || $imul.length != 2;\n}), 'Math', {\n imul: function imul(x, y) {\n var UINT16 = 0xffff;\n var xn = +x;\n var yn = +y;\n var xl = UINT16 & xn;\n var yl = UINT16 & yn;\n return 0 | xl * yl + ((UINT16 & xn >>> 16) * yl + xl * (UINT16 & yn >>> 16) << 16 >>> 0);\n }\n});\n","// 20.2.2.20 Math.log1p(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', { log1p: require('./_math-log1p') });\n","// 20.2.2.21 Math.log10(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n log10: function log10(x) {\n return Math.log(x) * Math.LOG10E;\n }\n});\n","// 20.2.2.22 Math.log2(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n log2: function log2(x) {\n return Math.log(x) / Math.LN2;\n }\n});\n","// 20.2.2.28 Math.sign(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', { sign: require('./_math-sign') });\n","// 20.2.2.30 Math.sinh(x)\nvar $export = require('./_export');\nvar expm1 = require('./_math-expm1');\nvar exp = Math.exp;\n\n// V8 near Chromium 38 has a problem with very small numbers\n$export($export.S + $export.F * require('./_fails')(function () {\n return !Math.sinh(-2e-17) != -2e-17;\n}), 'Math', {\n sinh: function sinh(x) {\n return Math.abs(x = +x) < 1\n ? (expm1(x) - expm1(-x)) / 2\n : (exp(x - 1) - exp(-x - 1)) * (Math.E / 2);\n }\n});\n","// 20.2.2.33 Math.tanh(x)\nvar $export = require('./_export');\nvar expm1 = require('./_math-expm1');\nvar exp = Math.exp;\n\n$export($export.S, 'Math', {\n tanh: function tanh(x) {\n var a = expm1(x = +x);\n var b = expm1(-x);\n return a == Infinity ? 1 : b == Infinity ? -1 : (a - b) / (exp(x) + exp(-x));\n }\n});\n","// 20.2.2.34 Math.trunc(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n trunc: function trunc(it) {\n return (it > 0 ? Math.floor : Math.ceil)(it);\n }\n});\n","'use strict';\n// https://github.com/tc39/Array.prototype.includes\nvar $export = require('./_export');\nvar $includes = require('./_array-includes')(true);\n\n$export($export.P, 'Array', {\n includes: function includes(el /* , fromIndex = 0 */) {\n return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\nrequire('./_add-to-unscopables')('includes');\n","var getKeys = require('./_object-keys');\nvar toIObject = require('./_to-iobject');\nvar isEnum = require('./_object-pie').f;\nmodule.exports = function (isEntries) {\n return function (it) {\n var O = toIObject(it);\n var keys = getKeys(O);\n var length = keys.length;\n var i = 0;\n var result = [];\n var key;\n while (length > i) if (isEnum.call(O, key = keys[i++])) {\n result.push(isEntries ? [key, O[key]] : O[key]);\n } return result;\n };\n};\n","// https://github.com/tc39/proposal-object-values-entries\nvar $export = require('./_export');\nvar $values = require('./_object-to-array')(false);\n\n$export($export.S, 'Object', {\n values: function values(it) {\n return $values(it);\n }\n});\n","// https://github.com/tc39/proposal-object-values-entries\nvar $export = require('./_export');\nvar $entries = require('./_object-to-array')(true);\n\n$export($export.S, 'Object', {\n entries: function entries(it) {\n return $entries(it);\n }\n});\n","// https://github.com/tc39/proposal-object-getownpropertydescriptors\nvar $export = require('./_export');\nvar ownKeys = require('./_own-keys');\nvar toIObject = require('./_to-iobject');\nvar gOPD = require('./_object-gopd');\nvar createProperty = require('./_create-property');\n\n$export($export.S, 'Object', {\n getOwnPropertyDescriptors: function getOwnPropertyDescriptors(object) {\n var O = toIObject(object);\n var getDesc = gOPD.f;\n var keys = ownKeys(O);\n var result = {};\n var i = 0;\n var key, desc;\n while (keys.length > i) {\n desc = getDesc(O, key = keys[i++]);\n if (desc !== undefined) createProperty(result, key, desc);\n }\n return result;\n }\n});\n","// https://github.com/tc39/proposal-string-pad-start-end\nvar toLength = require('./_to-length');\nvar repeat = require('./_string-repeat');\nvar defined = require('./_defined');\n\nmodule.exports = function (that, maxLength, fillString, left) {\n var S = String(defined(that));\n var stringLength = S.length;\n var fillStr = fillString === undefined ? ' ' : String(fillString);\n var intMaxLength = toLength(maxLength);\n if (intMaxLength <= stringLength || fillStr == '') return S;\n var fillLen = intMaxLength - stringLength;\n var stringFiller = repeat.call(fillStr, Math.ceil(fillLen / fillStr.length));\n if (stringFiller.length > fillLen) stringFiller = stringFiller.slice(0, fillLen);\n return left ? stringFiller + S : S + stringFiller;\n};\n","var global = require('./_global');\nvar navigator = global.navigator;\n\nmodule.exports = navigator && navigator.userAgent || '';\n","'use strict';\n// https://github.com/tc39/proposal-string-pad-start-end\nvar $export = require('./_export');\nvar $pad = require('./_string-pad');\nvar userAgent = require('./_user-agent');\n\n// https://github.com/zloirock/core-js/issues/280\n$export($export.P + $export.F * /Version\\/10\\.\\d+(\\.\\d+)? Safari\\//.test(userAgent), 'String', {\n padStart: function padStart(maxLength /* , fillString = ' ' */) {\n return $pad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, true);\n }\n});\n","'use strict';\n// https://github.com/tc39/proposal-string-pad-start-end\nvar $export = require('./_export');\nvar $pad = require('./_string-pad');\nvar userAgent = require('./_user-agent');\n\n// https://github.com/zloirock/core-js/issues/280\n$export($export.P + $export.F * /Version\\/10\\.\\d+(\\.\\d+)? Safari\\//.test(userAgent), 'String', {\n padEnd: function padEnd(maxLength /* , fillString = ' ' */) {\n return $pad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, false);\n }\n});\n","// ie9- setTimeout & setInterval additional parameters fix\nvar global = require('./_global');\nvar $export = require('./_export');\nvar userAgent = require('./_user-agent');\nvar slice = [].slice;\nvar MSIE = /MSIE .\\./.test(userAgent); // <- dirty ie9- check\nvar wrap = function (set) {\n return function (fn, time /* , ...args */) {\n var boundArgs = arguments.length > 2;\n var args = boundArgs ? slice.call(arguments, 2) : false;\n return set(boundArgs ? function () {\n // eslint-disable-next-line no-new-func\n (typeof fn == 'function' ? fn : Function(fn)).apply(this, args);\n } : fn, time);\n };\n};\n$export($export.G + $export.B + $export.F * MSIE, {\n setTimeout: wrap(global.setTimeout),\n setInterval: wrap(global.setInterval)\n});\n","var $export = require('./_export');\nvar $task = require('./_task');\n$export($export.G + $export.B, {\n setImmediate: $task.set,\n clearImmediate: $task.clear\n});\n","var $iterators = require('./es6.array.iterator');\nvar getKeys = require('./_object-keys');\nvar redefine = require('./_redefine');\nvar global = require('./_global');\nvar hide = require('./_hide');\nvar Iterators = require('./_iterators');\nvar wks = require('./_wks');\nvar ITERATOR = wks('iterator');\nvar TO_STRING_TAG = wks('toStringTag');\nvar ArrayValues = Iterators.Array;\n\nvar DOMIterables = {\n CSSRuleList: true, // TODO: Not spec compliant, should be false.\n CSSStyleDeclaration: false,\n CSSValueList: false,\n ClientRectList: false,\n DOMRectList: false,\n DOMStringList: false,\n DOMTokenList: true,\n DataTransferItemList: false,\n FileList: false,\n HTMLAllCollection: false,\n HTMLCollection: false,\n HTMLFormElement: false,\n HTMLSelectElement: false,\n MediaList: true, // TODO: Not spec compliant, should be false.\n MimeTypeArray: false,\n NamedNodeMap: false,\n NodeList: true,\n PaintRequestList: false,\n Plugin: false,\n PluginArray: false,\n SVGLengthList: false,\n SVGNumberList: false,\n SVGPathSegList: false,\n SVGPointList: false,\n SVGStringList: false,\n SVGTransformList: false,\n SourceBufferList: false,\n StyleSheetList: true, // TODO: Not spec compliant, should be false.\n TextTrackCueList: false,\n TextTrackList: false,\n TouchList: false\n};\n\nfor (var collections = getKeys(DOMIterables), i = 0; i < collections.length; i++) {\n var NAME = collections[i];\n var explicit = DOMIterables[NAME];\n var Collection = global[NAME];\n var proto = Collection && Collection.prototype;\n var key;\n if (proto) {\n if (!proto[ITERATOR]) hide(proto, ITERATOR, ArrayValues);\n if (!proto[TO_STRING_TAG]) hide(proto, TO_STRING_TAG, NAME);\n Iterators[NAME] = ArrayValues;\n if (explicit) for (key in $iterators) if (!proto[key]) redefine(proto, key, $iterators[key], true);\n }\n}\n","/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * https://raw.github.com/facebook/regenerator/master/LICENSE file. An\n * additional grant of patent rights can be found in the PATENTS file in\n * the same directory.\n */\n\n!(function(global) {\n \"use strict\";\n\n var Op = Object.prototype;\n var hasOwn = Op.hasOwnProperty;\n var undefined; // More compressible than void 0.\n var $Symbol = typeof Symbol === \"function\" ? Symbol : {};\n var iteratorSymbol = $Symbol.iterator || \"@@iterator\";\n var asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\";\n var toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n\n var inModule = typeof module === \"object\";\n var runtime = global.regeneratorRuntime;\n if (runtime) {\n if (inModule) {\n // If regeneratorRuntime is defined globally and we're in a module,\n // make the exports object identical to regeneratorRuntime.\n module.exports = runtime;\n }\n // Don't bother evaluating the rest of this file if the runtime was\n // already defined globally.\n return;\n }\n\n // Define the runtime globally (as expected by generated code) as either\n // module.exports (if we're in a module) or a new, empty object.\n runtime = global.regeneratorRuntime = inModule ? module.exports : {};\n\n function wrap(innerFn, outerFn, self, tryLocsList) {\n // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.\n var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;\n var generator = Object.create(protoGenerator.prototype);\n var context = new Context(tryLocsList || []);\n\n // The ._invoke method unifies the implementations of the .next,\n // .throw, and .return methods.\n generator._invoke = makeInvokeMethod(innerFn, self, context);\n\n return generator;\n }\n runtime.wrap = wrap;\n\n // Try/catch helper to minimize deoptimizations. Returns a completion\n // record like context.tryEntries[i].completion. This interface could\n // have been (and was previously) designed to take a closure to be\n // invoked without arguments, but in all the cases we care about we\n // already have an existing method we want to call, so there's no need\n // to create a new function object. We can even get away with assuming\n // the method takes exactly one argument, since that happens to be true\n // in every case, so we don't have to touch the arguments object. The\n // only additional allocation required is the completion record, which\n // has a stable shape and so hopefully should be cheap to allocate.\n function tryCatch(fn, obj, arg) {\n try {\n return { type: \"normal\", arg: fn.call(obj, arg) };\n } catch (err) {\n return { type: \"throw\", arg: err };\n }\n }\n\n var GenStateSuspendedStart = \"suspendedStart\";\n var GenStateSuspendedYield = \"suspendedYield\";\n var GenStateExecuting = \"executing\";\n var GenStateCompleted = \"completed\";\n\n // Returning this object from the innerFn has the same effect as\n // breaking out of the dispatch switch statement.\n var ContinueSentinel = {};\n\n // Dummy constructor functions that we use as the .constructor and\n // .constructor.prototype properties for functions that return Generator\n // objects. For full spec compliance, you may wish to configure your\n // minifier not to mangle the names of these two functions.\n function Generator() {}\n function GeneratorFunction() {}\n function GeneratorFunctionPrototype() {}\n\n // This is a polyfill for %IteratorPrototype% for environments that\n // don't natively support it.\n var IteratorPrototype = {};\n IteratorPrototype[iteratorSymbol] = function () {\n return this;\n };\n\n var getProto = Object.getPrototypeOf;\n var NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n if (NativeIteratorPrototype &&\n NativeIteratorPrototype !== Op &&\n hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {\n // This environment has a native %IteratorPrototype%; use it instead\n // of the polyfill.\n IteratorPrototype = NativeIteratorPrototype;\n }\n\n var Gp = GeneratorFunctionPrototype.prototype =\n Generator.prototype = Object.create(IteratorPrototype);\n GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;\n GeneratorFunctionPrototype.constructor = GeneratorFunction;\n GeneratorFunctionPrototype[toStringTagSymbol] =\n GeneratorFunction.displayName = \"GeneratorFunction\";\n\n // Helper for defining the .next, .throw, and .return methods of the\n // Iterator interface in terms of a single ._invoke method.\n function defineIteratorMethods(prototype) {\n [\"next\", \"throw\", \"return\"].forEach(function(method) {\n prototype[method] = function(arg) {\n return this._invoke(method, arg);\n };\n });\n }\n\n runtime.isGeneratorFunction = function(genFun) {\n var ctor = typeof genFun === \"function\" && genFun.constructor;\n return ctor\n ? ctor === GeneratorFunction ||\n // For the native GeneratorFunction constructor, the best we can\n // do is to check its .name property.\n (ctor.displayName || ctor.name) === \"GeneratorFunction\"\n : false;\n };\n\n runtime.mark = function(genFun) {\n if (Object.setPrototypeOf) {\n Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);\n } else {\n genFun.__proto__ = GeneratorFunctionPrototype;\n if (!(toStringTagSymbol in genFun)) {\n genFun[toStringTagSymbol] = \"GeneratorFunction\";\n }\n }\n genFun.prototype = Object.create(Gp);\n return genFun;\n };\n\n // Within the body of any async function, `await x` is transformed to\n // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n // `hasOwn.call(value, \"__await\")` to determine if the yielded value is\n // meant to be awaited.\n runtime.awrap = function(arg) {\n return { __await: arg };\n };\n\n function AsyncIterator(generator) {\n function invoke(method, arg, resolve, reject) {\n var record = tryCatch(generator[method], generator, arg);\n if (record.type === \"throw\") {\n reject(record.arg);\n } else {\n var result = record.arg;\n var value = result.value;\n if (value &&\n typeof value === \"object\" &&\n hasOwn.call(value, \"__await\")) {\n return Promise.resolve(value.__await).then(function(value) {\n invoke(\"next\", value, resolve, reject);\n }, function(err) {\n invoke(\"throw\", err, resolve, reject);\n });\n }\n\n return Promise.resolve(value).then(function(unwrapped) {\n // When a yielded Promise is resolved, its final value becomes\n // the .value of the Promise<{value,done}> result for the\n // current iteration. If the Promise is rejected, however, the\n // result for this iteration will be rejected with the same\n // reason. Note that rejections of yielded Promises are not\n // thrown back into the generator function, as is the case\n // when an awaited Promise is rejected. This difference in\n // behavior between yield and await is important, because it\n // allows the consumer to decide what to do with the yielded\n // rejection (swallow it and continue, manually .throw it back\n // into the generator, abandon iteration, whatever). With\n // await, by contrast, there is no opportunity to examine the\n // rejection reason outside the generator function, so the\n // only option is to throw it from the await expression, and\n // let the generator function handle the exception.\n result.value = unwrapped;\n resolve(result);\n }, reject);\n }\n }\n\n if (typeof global.process === \"object\" && global.process.domain) {\n invoke = global.process.domain.bind(invoke);\n }\n\n var previousPromise;\n\n function enqueue(method, arg) {\n function callInvokeWithMethodAndArg() {\n return new Promise(function(resolve, reject) {\n invoke(method, arg, resolve, reject);\n });\n }\n\n return previousPromise =\n // If enqueue has been called before, then we want to wait until\n // all previous Promises have been resolved before calling invoke,\n // so that results are always delivered in the correct order. If\n // enqueue has not been called before, then it is important to\n // call invoke immediately, without waiting on a callback to fire,\n // so that the async generator function has the opportunity to do\n // any necessary setup in a predictable way. This predictability\n // is why the Promise constructor synchronously invokes its\n // executor callback, and why async functions synchronously\n // execute code before the first await. Since we implement simple\n // async functions in terms of async generators, it is especially\n // important to get this right, even though it requires care.\n previousPromise ? previousPromise.then(\n callInvokeWithMethodAndArg,\n // Avoid propagating failures to Promises returned by later\n // invocations of the iterator.\n callInvokeWithMethodAndArg\n ) : callInvokeWithMethodAndArg();\n }\n\n // Define the unified helper method that is used to implement .next,\n // .throw, and .return (see defineIteratorMethods).\n this._invoke = enqueue;\n }\n\n defineIteratorMethods(AsyncIterator.prototype);\n AsyncIterator.prototype[asyncIteratorSymbol] = function () {\n return this;\n };\n runtime.AsyncIterator = AsyncIterator;\n\n // Note that simple async functions are implemented on top of\n // AsyncIterator objects; they just return a Promise for the value of\n // the final result produced by the iterator.\n runtime.async = function(innerFn, outerFn, self, tryLocsList) {\n var iter = new AsyncIterator(\n wrap(innerFn, outerFn, self, tryLocsList)\n );\n\n return runtime.isGeneratorFunction(outerFn)\n ? iter // If outerFn is a generator, return the full iterator.\n : iter.next().then(function(result) {\n return result.done ? result.value : iter.next();\n });\n };\n\n function makeInvokeMethod(innerFn, self, context) {\n var state = GenStateSuspendedStart;\n\n return function invoke(method, arg) {\n if (state === GenStateExecuting) {\n throw new Error(\"Generator is already running\");\n }\n\n if (state === GenStateCompleted) {\n if (method === \"throw\") {\n throw arg;\n }\n\n // Be forgiving, per 25.3.3.3.3 of the spec:\n // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n return doneResult();\n }\n\n context.method = method;\n context.arg = arg;\n\n while (true) {\n var delegate = context.delegate;\n if (delegate) {\n var delegateResult = maybeInvokeDelegate(delegate, context);\n if (delegateResult) {\n if (delegateResult === ContinueSentinel) continue;\n return delegateResult;\n }\n }\n\n if (context.method === \"next\") {\n // Setting context._sent for legacy support of Babel's\n // function.sent implementation.\n context.sent = context._sent = context.arg;\n\n } else if (context.method === \"throw\") {\n if (state === GenStateSuspendedStart) {\n state = GenStateCompleted;\n throw context.arg;\n }\n\n context.dispatchException(context.arg);\n\n } else if (context.method === \"return\") {\n context.abrupt(\"return\", context.arg);\n }\n\n state = GenStateExecuting;\n\n var record = tryCatch(innerFn, self, context);\n if (record.type === \"normal\") {\n // If an exception is thrown from innerFn, we leave state ===\n // GenStateExecuting and loop back for another invocation.\n state = context.done\n ? GenStateCompleted\n : GenStateSuspendedYield;\n\n if (record.arg === ContinueSentinel) {\n continue;\n }\n\n return {\n value: record.arg,\n done: context.done\n };\n\n } else if (record.type === \"throw\") {\n state = GenStateCompleted;\n // Dispatch the exception by looping back around to the\n // context.dispatchException(context.arg) call above.\n context.method = \"throw\";\n context.arg = record.arg;\n }\n }\n };\n }\n\n // Call delegate.iterator[context.method](context.arg) and handle the\n // result, either by returning a { value, done } result from the\n // delegate iterator, or by modifying context.method and context.arg,\n // setting context.delegate to null, and returning the ContinueSentinel.\n function maybeInvokeDelegate(delegate, context) {\n var method = delegate.iterator[context.method];\n if (method === undefined) {\n // A .throw or .return when the delegate iterator has no .throw\n // method always terminates the yield* loop.\n context.delegate = null;\n\n if (context.method === \"throw\") {\n if (delegate.iterator.return) {\n // If the delegate iterator has a return method, give it a\n // chance to clean up.\n context.method = \"return\";\n context.arg = undefined;\n maybeInvokeDelegate(delegate, context);\n\n if (context.method === \"throw\") {\n // If maybeInvokeDelegate(context) changed context.method from\n // \"return\" to \"throw\", let that override the TypeError below.\n return ContinueSentinel;\n }\n }\n\n context.method = \"throw\";\n context.arg = new TypeError(\n \"The iterator does not provide a 'throw' method\");\n }\n\n return ContinueSentinel;\n }\n\n var record = tryCatch(method, delegate.iterator, context.arg);\n\n if (record.type === \"throw\") {\n context.method = \"throw\";\n context.arg = record.arg;\n context.delegate = null;\n return ContinueSentinel;\n }\n\n var info = record.arg;\n\n if (! info) {\n context.method = \"throw\";\n context.arg = new TypeError(\"iterator result is not an object\");\n context.delegate = null;\n return ContinueSentinel;\n }\n\n if (info.done) {\n // Assign the result of the finished delegate to the temporary\n // variable specified by delegate.resultName (see delegateYield).\n context[delegate.resultName] = info.value;\n\n // Resume execution at the desired location (see delegateYield).\n context.next = delegate.nextLoc;\n\n // If context.method was \"throw\" but the delegate handled the\n // exception, let the outer generator proceed normally. If\n // context.method was \"next\", forget context.arg since it has been\n // \"consumed\" by the delegate iterator. If context.method was\n // \"return\", allow the original .return call to continue in the\n // outer generator.\n if (context.method !== \"return\") {\n context.method = \"next\";\n context.arg = undefined;\n }\n\n } else {\n // Re-yield the result returned by the delegate method.\n return info;\n }\n\n // The delegate iterator is finished, so forget it and continue with\n // the outer generator.\n context.delegate = null;\n return ContinueSentinel;\n }\n\n // Define Generator.prototype.{next,throw,return} in terms of the\n // unified ._invoke helper method.\n defineIteratorMethods(Gp);\n\n Gp[toStringTagSymbol] = \"Generator\";\n\n // A Generator should always return itself as the iterator object when the\n // @@iterator function is called on it. Some browsers' implementations of the\n // iterator prototype chain incorrectly implement this, causing the Generator\n // object to not be returned from this call. This ensures that doesn't happen.\n // See https://github.com/facebook/regenerator/issues/274 for more details.\n Gp[iteratorSymbol] = function() {\n return this;\n };\n\n Gp.toString = function() {\n return \"[object Generator]\";\n };\n\n function pushTryEntry(locs) {\n var entry = { tryLoc: locs[0] };\n\n if (1 in locs) {\n entry.catchLoc = locs[1];\n }\n\n if (2 in locs) {\n entry.finallyLoc = locs[2];\n entry.afterLoc = locs[3];\n }\n\n this.tryEntries.push(entry);\n }\n\n function resetTryEntry(entry) {\n var record = entry.completion || {};\n record.type = \"normal\";\n delete record.arg;\n entry.completion = record;\n }\n\n function Context(tryLocsList) {\n // The root entry object (effectively a try statement without a catch\n // or a finally block) gives us a place to store values thrown from\n // locations where there is no enclosing try statement.\n this.tryEntries = [{ tryLoc: \"root\" }];\n tryLocsList.forEach(pushTryEntry, this);\n this.reset(true);\n }\n\n runtime.keys = function(object) {\n var keys = [];\n for (var key in object) {\n keys.push(key);\n }\n keys.reverse();\n\n // Rather than returning an object with a next method, we keep\n // things simple and return the next function itself.\n return function next() {\n while (keys.length) {\n var key = keys.pop();\n if (key in object) {\n next.value = key;\n next.done = false;\n return next;\n }\n }\n\n // To avoid creating an additional object, we just hang the .value\n // and .done properties off the next function object itself. This\n // also ensures that the minifier will not anonymize the function.\n next.done = true;\n return next;\n };\n };\n\n function values(iterable) {\n if (iterable) {\n var iteratorMethod = iterable[iteratorSymbol];\n if (iteratorMethod) {\n return iteratorMethod.call(iterable);\n }\n\n if (typeof iterable.next === \"function\") {\n return iterable;\n }\n\n if (!isNaN(iterable.length)) {\n var i = -1, next = function next() {\n while (++i < iterable.length) {\n if (hasOwn.call(iterable, i)) {\n next.value = iterable[i];\n next.done = false;\n return next;\n }\n }\n\n next.value = undefined;\n next.done = true;\n\n return next;\n };\n\n return next.next = next;\n }\n }\n\n // Return an iterator with no values.\n return { next: doneResult };\n }\n runtime.values = values;\n\n function doneResult() {\n return { value: undefined, done: true };\n }\n\n Context.prototype = {\n constructor: Context,\n\n reset: function(skipTempReset) {\n this.prev = 0;\n this.next = 0;\n // Resetting context._sent for legacy support of Babel's\n // function.sent implementation.\n this.sent = this._sent = undefined;\n this.done = false;\n this.delegate = null;\n\n this.method = \"next\";\n this.arg = undefined;\n\n this.tryEntries.forEach(resetTryEntry);\n\n if (!skipTempReset) {\n for (var name in this) {\n // Not sure about the optimal order of these conditions:\n if (name.charAt(0) === \"t\" &&\n hasOwn.call(this, name) &&\n !isNaN(+name.slice(1))) {\n this[name] = undefined;\n }\n }\n }\n },\n\n stop: function() {\n this.done = true;\n\n var rootEntry = this.tryEntries[0];\n var rootRecord = rootEntry.completion;\n if (rootRecord.type === \"throw\") {\n throw rootRecord.arg;\n }\n\n return this.rval;\n },\n\n dispatchException: function(exception) {\n if (this.done) {\n throw exception;\n }\n\n var context = this;\n function handle(loc, caught) {\n record.type = \"throw\";\n record.arg = exception;\n context.next = loc;\n\n if (caught) {\n // If the dispatched exception was caught by a catch block,\n // then let that catch block handle the exception normally.\n context.method = \"next\";\n context.arg = undefined;\n }\n\n return !! caught;\n }\n\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n var record = entry.completion;\n\n if (entry.tryLoc === \"root\") {\n // Exception thrown outside of any try block that could handle\n // it, so set the completion value of the entire function to\n // throw the exception.\n return handle(\"end\");\n }\n\n if (entry.tryLoc <= this.prev) {\n var hasCatch = hasOwn.call(entry, \"catchLoc\");\n var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n if (hasCatch && hasFinally) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n } else if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else if (hasCatch) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n }\n\n } else if (hasFinally) {\n if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else {\n throw new Error(\"try statement without catch or finally\");\n }\n }\n }\n },\n\n abrupt: function(type, arg) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc <= this.prev &&\n hasOwn.call(entry, \"finallyLoc\") &&\n this.prev < entry.finallyLoc) {\n var finallyEntry = entry;\n break;\n }\n }\n\n if (finallyEntry &&\n (type === \"break\" ||\n type === \"continue\") &&\n finallyEntry.tryLoc <= arg &&\n arg <= finallyEntry.finallyLoc) {\n // Ignore the finally entry if control is not jumping to a\n // location outside the try/catch block.\n finallyEntry = null;\n }\n\n var record = finallyEntry ? finallyEntry.completion : {};\n record.type = type;\n record.arg = arg;\n\n if (finallyEntry) {\n this.method = \"next\";\n this.next = finallyEntry.finallyLoc;\n return ContinueSentinel;\n }\n\n return this.complete(record);\n },\n\n complete: function(record, afterLoc) {\n if (record.type === \"throw\") {\n throw record.arg;\n }\n\n if (record.type === \"break\" ||\n record.type === \"continue\") {\n this.next = record.arg;\n } else if (record.type === \"return\") {\n this.rval = this.arg = record.arg;\n this.method = \"return\";\n this.next = \"end\";\n } else if (record.type === \"normal\" && afterLoc) {\n this.next = afterLoc;\n }\n\n return ContinueSentinel;\n },\n\n finish: function(finallyLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.finallyLoc === finallyLoc) {\n this.complete(entry.completion, entry.afterLoc);\n resetTryEntry(entry);\n return ContinueSentinel;\n }\n }\n },\n\n \"catch\": function(tryLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc === tryLoc) {\n var record = entry.completion;\n if (record.type === \"throw\") {\n var thrown = record.arg;\n resetTryEntry(entry);\n }\n return thrown;\n }\n }\n\n // The context.catch method must only be called with a location\n // argument that corresponds to a known catch block.\n throw new Error(\"illegal catch attempt\");\n },\n\n delegateYield: function(iterable, resultName, nextLoc) {\n this.delegate = {\n iterator: values(iterable),\n resultName: resultName,\n nextLoc: nextLoc\n };\n\n if (this.method === \"next\") {\n // Deliberately forget the last sent value so that we don't\n // accidentally pass it on to the delegate.\n this.arg = undefined;\n }\n\n return ContinueSentinel;\n }\n };\n})(\n // Among the various tricks for obtaining a reference to the global\n // object, this seems to be the most reliable technique that does not\n // use indirect eval (which violates Content Security Policy).\n typeof global === \"object\" ? global :\n typeof window === \"object\" ? window :\n typeof self === \"object\" ? self : this\n);\n","// Polyfill for creating CustomEvents on IE9/10/11\n\n// code pulled from:\n// https://github.com/d4tocchini/customevent-polyfill\n// https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent#Polyfill\n\ntry {\n var ce = new window.CustomEvent('test');\n ce.preventDefault();\n if (ce.defaultPrevented !== true) {\n // IE has problems with .preventDefault() on custom events\n // http://stackoverflow.com/questions/23349191\n throw new Error('Could not prevent default');\n }\n} catch(e) {\n var CustomEvent = function(event, params) {\n var evt, origPrevent;\n params = params || {\n bubbles: false,\n cancelable: false,\n detail: undefined\n };\n\n evt = document.createEvent(\"CustomEvent\");\n evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);\n origPrevent = evt.preventDefault;\n evt.preventDefault = function () {\n origPrevent.call(this);\n try {\n Object.defineProperty(this, 'defaultPrevented', {\n get: function () {\n return true;\n }\n });\n } catch(e) {\n this.defaultPrevented = true;\n }\n };\n return evt;\n };\n\n CustomEvent.prototype = window.Event.prototype;\n window.CustomEvent = CustomEvent; // expose definition to window\n}\n","(function(global) {\r\n /**\r\n * Polyfill URLSearchParams\r\n *\r\n * Inspired from : https://github.com/WebReflection/url-search-params/blob/master/src/url-search-params.js\r\n */\r\n\r\n var checkIfIteratorIsSupported = function() {\r\n try {\r\n return !!Symbol.iterator;\r\n } catch(error) {\r\n return false;\r\n }\r\n };\r\n\r\n\r\n var iteratorSupported = checkIfIteratorIsSupported();\r\n\r\n var createIterator = function(items) {\r\n var iterator = {\r\n next: function() {\r\n var value = items.shift();\r\n return { done: value === void 0, value: value };\r\n }\r\n };\r\n\r\n if(iteratorSupported) {\r\n iterator[Symbol.iterator] = function() {\r\n return iterator;\r\n };\r\n }\r\n\r\n return iterator;\r\n };\r\n\r\n /**\r\n * Search param name and values should be encoded according to https://url.spec.whatwg.org/#urlencoded-serializing\r\n * encodeURIComponent() produces the same result except encoding spaces as `%20` instead of `+`.\r\n */\r\n var serializeParam = function(value) {\r\n return encodeURIComponent(value).replace(/%20/g, '+');\r\n };\r\n\r\n var deserializeParam = function(value) {\r\n return decodeURIComponent(value).replace(/\\+/g, ' ');\r\n };\r\n\r\n var polyfillURLSearchParams= function() {\r\n\r\n var URLSearchParams = function(searchString) {\r\n Object.defineProperty(this, '_entries', { value: {} });\r\n\r\n if(typeof searchString === 'string') {\r\n if(searchString !== '') {\r\n searchString = searchString.replace(/^\\?/, '');\r\n var attributes = searchString.split('&');\r\n var attribute;\r\n for(var i = 0; i < attributes.length; i++) {\r\n attribute = attributes[i].split('=');\r\n this.append(\r\n deserializeParam(attribute[0]),\r\n (attribute.length > 1) ? deserializeParam(attribute[1]) : ''\r\n );\r\n }\r\n }\r\n } else if(searchString instanceof URLSearchParams) {\r\n var _this = this;\r\n searchString.forEach(function(value, name) {\r\n _this.append(value, name);\r\n });\r\n }\r\n };\r\n\r\n var proto = URLSearchParams.prototype;\r\n\r\n proto.append = function(name, value) {\r\n if(name in this._entries) {\r\n this._entries[name].push(value.toString());\r\n } else {\r\n this._entries[name] = [value.toString()];\r\n }\r\n };\r\n\r\n proto.delete = function(name) {\r\n delete this._entries[name];\r\n };\r\n\r\n proto.get = function(name) {\r\n return (name in this._entries) ? this._entries[name][0] : null;\r\n };\r\n\r\n proto.getAll = function(name) {\r\n return (name in this._entries) ? this._entries[name].slice(0) : [];\r\n };\r\n\r\n proto.has = function(name) {\r\n return (name in this._entries);\r\n };\r\n\r\n proto.set = function(name, value) {\r\n this._entries[name] = [value.toString()];\r\n };\r\n\r\n proto.forEach = function(callback, thisArg) {\r\n var entries;\r\n for(var name in this._entries) {\r\n if(this._entries.hasOwnProperty(name)) {\r\n entries = this._entries[name];\r\n for(var i = 0; i < entries.length; i++) {\r\n callback.call(thisArg, entries[i], name, this);\r\n }\r\n }\r\n }\r\n };\r\n\r\n proto.keys = function() {\r\n var items = [];\r\n this.forEach(function(value, name) { items.push(name); });\r\n return createIterator(items);\r\n };\r\n\r\n proto.values = function() {\r\n var items = [];\r\n this.forEach(function(value) { items.push(value); });\r\n return createIterator(items);\r\n };\r\n\r\n proto.entries = function() {\r\n var items = [];\r\n this.forEach(function(value, name) { items.push([name, value]); });\r\n return createIterator(items);\r\n };\r\n\r\n if(iteratorSupported) {\r\n proto[Symbol.iterator] = proto.entries;\r\n }\r\n\r\n proto.toString = function() {\r\n var searchString = '';\r\n this.forEach(function(value, name) {\r\n if(searchString.length > 0) searchString+= '&';\r\n searchString += serializeParam(name) + '=' + serializeParam(value);\r\n });\r\n return searchString;\r\n };\r\n\r\n global.URLSearchParams = URLSearchParams;\r\n };\r\n\r\n if(!('URLSearchParams' in global) || (new URLSearchParams('?a=1').toString() !== 'a=1')) {\r\n polyfillURLSearchParams();\r\n }\r\n\r\n // HTMLAnchorElement\r\n\r\n})(\r\n (typeof global !== 'undefined') ? global\r\n : ((typeof window !== 'undefined') ? window\r\n : ((typeof self !== 'undefined') ? self : this))\r\n);\r\n\r\n(function(global) {\r\n /**\r\n * Polyfill URL\r\n *\r\n * Inspired from : https://github.com/arv/DOM-URL-Polyfill/blob/master/src/url.js\r\n */\r\n\r\n var checkIfURLIsSupported = function() {\r\n try {\r\n var u = new URL('b', 'http://a');\r\n u.pathname = 'c%20d';\r\n return (u.href === 'http://a/c%20d') && u.searchParams;\r\n } catch(e) {\r\n return false;\r\n }\r\n };\r\n\r\n\r\n var polyfillURL = function() {\r\n var _URL = global.URL;\r\n\r\n var URL = function(url, base) {\r\n if(typeof url !== 'string') url = String(url);\r\n\r\n var doc = document.implementation.createHTMLDocument('');\r\n window.doc = doc;\r\n if(base) {\r\n var baseElement = doc.createElement('base');\r\n baseElement.href = base;\r\n doc.head.appendChild(baseElement);\r\n }\r\n\r\n var anchorElement = doc.createElement('a');\r\n anchorElement.href = url;\r\n doc.body.appendChild(anchorElement);\r\n anchorElement.href = anchorElement.href; // force href to refresh\r\n\r\n if(anchorElement.protocol === ':' || !/:/.test(anchorElement.href)) {\r\n throw new TypeError('Invalid URL');\r\n }\r\n\r\n Object.defineProperty(this, '_anchorElement', {\r\n value: anchorElement\r\n });\r\n };\r\n\r\n var proto = URL.prototype;\r\n\r\n var linkURLWithAnchorAttribute = function(attributeName) {\r\n Object.defineProperty(proto, attributeName, {\r\n get: function() {\r\n return this._anchorElement[attributeName];\r\n },\r\n set: function(value) {\r\n this._anchorElement[attributeName] = value;\r\n },\r\n enumerable: true\r\n });\r\n };\r\n\r\n ['hash', 'host', 'hostname', 'port', 'protocol', 'search']\r\n .forEach(function(attributeName) {\r\n linkURLWithAnchorAttribute(attributeName);\r\n });\r\n\r\n Object.defineProperties(proto, {\r\n\r\n 'toString': {\r\n get: function() {\r\n var _this = this;\r\n return function() {\r\n return _this.href;\r\n };\r\n }\r\n },\r\n\r\n 'href' : {\r\n get: function() {\r\n return this._anchorElement.href.replace(/\\?$/,'');\r\n },\r\n set: function(value) {\r\n this._anchorElement.href = value;\r\n },\r\n enumerable: true\r\n },\r\n\r\n 'pathname' : {\r\n get: function() {\r\n return this._anchorElement.pathname.replace(/(^\\/?)/,'/');\r\n },\r\n set: function(value) {\r\n this._anchorElement.pathname = value;\r\n },\r\n enumerable: true\r\n },\r\n\r\n 'origin': {\r\n get: function() {\r\n // get expected port from protocol\r\n var expectedPort = {'http:': 80, 'https:': 443, 'ftp:': 21}[this._anchorElement.protocol];\r\n // add port to origin if, expected port is different than actual port\r\n // and it is not empty f.e http://foo:8080\r\n // 8080 != 80 && 8080 != ''\r\n var addPortToOrigin = this._anchorElement.port != expectedPort &&\r\n this._anchorElement.port !== ''\r\n\r\n return this._anchorElement.protocol +\r\n '//' +\r\n this._anchorElement.hostname +\r\n (addPortToOrigin ? (':' + this._anchorElement.port) : '');\r\n },\r\n enumerable: true\r\n },\r\n\r\n 'password': { // TODO\r\n get: function() {\r\n return '';\r\n },\r\n set: function(value) {\r\n },\r\n enumerable: true\r\n },\r\n\r\n 'username': { // TODO\r\n get: function() {\r\n return '';\r\n },\r\n set: function(value) {\r\n },\r\n enumerable: true\r\n },\r\n\r\n 'searchParams': {\r\n get: function() {\r\n var searchParams = new URLSearchParams(this.search);\r\n var _this = this;\r\n ['append', 'delete', 'set'].forEach(function(methodName) {\r\n var method = searchParams[methodName];\r\n searchParams[methodName] = function() {\r\n method.apply(searchParams, arguments);\r\n _this.search = searchParams.toString();\r\n };\r\n });\r\n return searchParams;\r\n },\r\n enumerable: true\r\n }\r\n });\r\n\r\n URL.createObjectURL = function(blob) {\r\n return _URL.createObjectURL.apply(_URL, arguments);\r\n };\r\n\r\n URL.revokeObjectURL = function(url) {\r\n return _URL.revokeObjectURL.apply(_URL, arguments);\r\n };\r\n\r\n global.URL = URL;\r\n\r\n };\r\n\r\n if(!checkIfURLIsSupported()) {\r\n polyfillURL();\r\n }\r\n\r\n if((global.location !== void 0) && !('origin' in global.location)) {\r\n var getOrigin = function() {\r\n return global.location.protocol + '//' + global.location.hostname + (global.location.port ? (':' + global.location.port) : '');\r\n };\r\n\r\n try {\r\n Object.defineProperty(global.location, 'origin', {\r\n get: getOrigin,\r\n enumerable: true\r\n });\r\n } catch(e) {\r\n setInterval(function() {\r\n global.location.origin = getOrigin();\r\n }, 100);\r\n }\r\n }\r\n\r\n})(\r\n (typeof global !== 'undefined') ? global\r\n : ((typeof window !== 'undefined') ? window\r\n : ((typeof self !== 'undefined') ? self : this))\r\n);\r\n","// ==========================================================================\n// Plyr support checks\n// ==========================================================================\n\nimport utils from './utils';\n\n// Check for feature support\nconst support = {\n // Basic support\n audio: 'canPlayType' in document.createElement('audio'),\n video: 'canPlayType' in document.createElement('video'),\n\n // Check for support\n // Basic functionality vs full UI\n check(type, provider, playsinline) {\n let api = false;\n let ui = false;\n const browser = utils.getBrowser();\n const canPlayInline = browser.isIPhone && playsinline && support.playsinline;\n\n switch (`${provider}:${type}`) {\n case 'html5:video':\n api = support.video;\n ui = api && support.rangeInput && (!browser.isIPhone || canPlayInline);\n break;\n\n case 'html5:audio':\n api = support.audio;\n ui = api && support.rangeInput;\n break;\n\n case 'youtube:video':\n case 'vimeo:video':\n api = true;\n ui = support.rangeInput && (!browser.isIPhone || canPlayInline);\n break;\n\n default:\n api = support.audio && support.video;\n ui = api && support.rangeInput;\n }\n\n return {\n api,\n ui,\n };\n },\n\n // Picture-in-picture support\n // Safari only currently\n pip: (() => {\n const browser = utils.getBrowser();\n return !browser.isIPhone && utils.is.function(utils.createElement('video').webkitSetPresentationMode);\n })(),\n\n // Airplay support\n // Safari only currently\n airplay: utils.is.function(window.WebKitPlaybackTargetAvailabilityEvent),\n\n // Inline playback support\n // https://webkit.org/blog/6784/new-video-policies-for-ios/\n playsinline: 'playsInline' in document.createElement('video'),\n\n // Check for mime type support against a player instance\n // Credits: http://diveintohtml5.info/everything.html\n // Related: http://www.leanbackplayer.com/test/h5mt.html\n mime(type) {\n const { media } = this;\n\n try {\n // Bail if no checking function\n if (!this.isHTML5 || !utils.is.function(media.canPlayType)) {\n return false;\n }\n\n // Check directly if codecs specified\n if (type.includes('codecs=')) {\n return media.canPlayType(type).replace(/no/, '');\n }\n\n // Type specific checks\n if (this.isVideo) {\n switch (type) {\n case 'video/webm':\n return media.canPlayType('video/webm; codecs=\"vp8, vorbis\"').replace(/no/, '');\n\n case 'video/mp4':\n return media.canPlayType('video/mp4; codecs=\"avc1.42E01E, mp4a.40.2\"').replace(/no/, '');\n\n case 'video/ogg':\n return media.canPlayType('video/ogg; codecs=\"theora\"').replace(/no/, '');\n\n default:\n return false;\n }\n } else if (this.isAudio) {\n switch (type) {\n case 'audio/mpeg':\n return media.canPlayType('audio/mpeg;').replace(/no/, '');\n\n case 'audio/ogg':\n return media.canPlayType('audio/ogg; codecs=\"vorbis\"').replace(/no/, '');\n\n case 'audio/wav':\n return media.canPlayType('audio/wav; codecs=\"1\"').replace(/no/, '');\n\n default:\n return false;\n }\n }\n } catch (e) {\n return false;\n }\n\n // If we got this far, we're stuffed\n return false;\n },\n\n // Check for textTracks support\n textTracks: 'textTracks' in document.createElement('video'),\n\n // Check for passive event listener support\n // https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md\n // https://www.youtube.com/watch?v=NPM6172J22g\n passiveListeners: (() => {\n // Test via a getter in the options object to see if the passive property is accessed\n let supported = false;\n try {\n const options = Object.defineProperty({}, 'passive', {\n get() {\n supported = true;\n return null;\n },\n });\n window.addEventListener('test', null, options);\n window.removeEventListener('test', null, options);\n } catch (e) {\n // Do nothing\n }\n\n return supported;\n })(),\n\n // <input type=\"range\"> Sliders\n rangeInput: (() => {\n const range = document.createElement('input');\n range.type = 'range';\n return range.type === 'range';\n })(),\n\n // Touch\n // NOTE: Remember a device can be mouse + touch enabled so we check on first touch event\n touch: 'ontouchstart' in document.documentElement,\n\n // Detect transitions support\n transitions: utils.transitionEndEvent !== false,\n\n // Reduced motion iOS & MacOS setting\n // https://webkit.org/blog/7551/responsive-design-for-motion/\n reducedMotion: 'matchMedia' in window && window.matchMedia('(prefers-reduced-motion)').matches,\n};\n\nexport default support;\n","(function(root, factory) {\n if (typeof define === 'function' && define.amd) {\n define([], factory);\n } else if (typeof exports === 'object') {\n module.exports = factory();\n } else {\n root.loadjs = factory();\n }\n}(this, function() {\n/**\n * Global dependencies.\n * @global {Object} document - DOM\n */\n\nvar devnull = function() {},\n bundleIdCache = {},\n bundleResultCache = {},\n bundleCallbackQueue = {};\n\n\n/**\n * Subscribe to bundle load event.\n * @param {string[]} bundleIds - Bundle ids\n * @param {Function} callbackFn - The callback function\n */\nfunction subscribe(bundleIds, callbackFn) {\n // listify\n bundleIds = bundleIds.push ? bundleIds : [bundleIds];\n\n var depsNotFound = [],\n i = bundleIds.length,\n numWaiting = i,\n fn,\n bundleId,\n r,\n q;\n\n // define callback function\n fn = function (bundleId, pathsNotFound) {\n if (pathsNotFound.length) depsNotFound.push(bundleId);\n\n numWaiting--;\n if (!numWaiting) callbackFn(depsNotFound);\n };\n\n // register callback\n while (i--) {\n bundleId = bundleIds[i];\n\n // execute callback if in result cache\n r = bundleResultCache[bundleId];\n if (r) {\n fn(bundleId, r);\n continue;\n }\n\n // add to callback queue\n q = bundleCallbackQueue[bundleId] = bundleCallbackQueue[bundleId] || [];\n q.push(fn);\n }\n}\n\n\n/**\n * Publish bundle load event.\n * @param {string} bundleId - Bundle id\n * @param {string[]} pathsNotFound - List of files not found\n */\nfunction publish(bundleId, pathsNotFound) {\n // exit if id isn't defined\n if (!bundleId) return;\n\n var q = bundleCallbackQueue[bundleId];\n\n // cache result\n bundleResultCache[bundleId] = pathsNotFound;\n\n // exit if queue is empty\n if (!q) return;\n\n // empty callback queue\n while (q.length) {\n q[0](bundleId, pathsNotFound);\n q.splice(0, 1);\n }\n}\n\n\n/**\n * Execute callbacks.\n * @param {Object or Function} args - The callback args\n * @param {string[]} depsNotFound - List of dependencies not found\n */\nfunction executeCallbacks(args, depsNotFound) {\n // accept function as argument\n if (args.call) args = {success: args};\n\n // success and error callbacks\n if (depsNotFound.length) (args.error || devnull)(depsNotFound);\n else (args.success || devnull)(args);\n}\n\n\n/**\n * Load individual file.\n * @param {string} path - The file path\n * @param {Function} callbackFn - The callback function\n */\nfunction loadFile(path, callbackFn, args, numTries) {\n var doc = document,\n async = args.async,\n maxTries = (args.numRetries || 0) + 1,\n beforeCallbackFn = args.before || devnull,\n pathStripped = path.replace(/^(css|img)!/, ''),\n isCss,\n e;\n\n numTries = numTries || 0;\n\n if (/(^css!|\\.css$)/.test(path)) {\n isCss = true;\n\n // css\n e = doc.createElement('link');\n e.rel = 'stylesheet';\n e.href = pathStripped; //.replace(/^css!/, ''); // remove \"css!\" prefix\n } else if (/(^img!|\\.(png|gif|jpg|svg)$)/.test(path)) {\n // image\n e = doc.createElement('img');\n e.src = pathStripped; \n } else {\n // javascript\n e = doc.createElement('script');\n e.src = path;\n e.async = async === undefined ? true : async;\n }\n\n e.onload = e.onerror = e.onbeforeload = function (ev) {\n var result = ev.type[0];\n\n // Note: The following code isolates IE using `hideFocus` and treats empty\n // stylesheets as failures to get around lack of onerror support\n if (isCss && 'hideFocus' in e) {\n try {\n if (!e.sheet.cssText.length) result = 'e';\n } catch (x) {\n // sheets objects created from load errors don't allow access to\n // `cssText`\n result = 'e';\n }\n }\n\n // handle retries in case of load failure\n if (result == 'e') {\n // increment counter\n numTries += 1;\n\n // exit function and try again\n if (numTries < maxTries) {\n return loadFile(path, callbackFn, args, numTries);\n }\n }\n\n // execute callback\n callbackFn(path, result, ev.defaultPrevented);\n };\n\n // add to document (unless callback returns `false`)\n if (beforeCallbackFn(path, e) !== false) doc.head.appendChild(e);\n}\n\n\n/**\n * Load multiple files.\n * @param {string[]} paths - The file paths\n * @param {Function} callbackFn - The callback function\n */\nfunction loadFiles(paths, callbackFn, args) {\n // listify paths\n paths = paths.push ? paths : [paths];\n\n var numWaiting = paths.length,\n x = numWaiting,\n pathsNotFound = [],\n fn,\n i;\n\n // define callback function\n fn = function(path, result, defaultPrevented) {\n // handle error\n if (result == 'e') pathsNotFound.push(path);\n\n // handle beforeload event. If defaultPrevented then that means the load\n // will be blocked (ex. Ghostery/ABP on Safari)\n if (result == 'b') {\n if (defaultPrevented) pathsNotFound.push(path);\n else return;\n }\n\n numWaiting--;\n if (!numWaiting) callbackFn(pathsNotFound);\n };\n\n // load scripts\n for (i=0; i < x; i++) loadFile(paths[i], fn, args);\n}\n\n\n/**\n * Initiate script load and register bundle.\n * @param {(string|string[])} paths - The file paths\n * @param {(string|Function)} [arg1] - The bundleId or success callback\n * @param {Function} [arg2] - The success or error callback\n * @param {Function} [arg3] - The error callback\n */\nfunction loadjs(paths, arg1, arg2) {\n var bundleId,\n args;\n\n // bundleId (if string)\n if (arg1 && arg1.trim) bundleId = arg1;\n\n // args (default is {})\n args = (bundleId ? arg2 : arg1) || {};\n\n // throw error if bundle is already defined\n if (bundleId) {\n if (bundleId in bundleIdCache) {\n throw \"LoadJS\";\n } else {\n bundleIdCache[bundleId] = true;\n }\n }\n\n // load scripts\n loadFiles(paths, function (pathsNotFound) {\n // execute callbacks\n executeCallbacks(args, pathsNotFound);\n\n // publish bundle load event\n publish(bundleId, pathsNotFound);\n }, args);\n}\n\n\n/**\n * Execute callbacks when dependencies have been satisfied.\n * @param {(string|string[])} deps - List of bundle ids\n * @param {Object} args - success/error arguments\n */\nloadjs.ready = function ready(deps, args) {\n // subscribe to bundle load event\n subscribe(deps, function (depsNotFound) {\n // execute callbacks\n executeCallbacks(args, depsNotFound);\n });\n\n return loadjs;\n};\n\n\n/**\n * Manually satisfy bundle dependencies.\n * @param {string} bundleId - The bundle id\n */\nloadjs.done = function done(bundleId) {\n publish(bundleId, []);\n};\n\n\n/**\n * Reset loadjs dependencies statuses\n */\nloadjs.reset = function reset() {\n bundleIdCache = {};\n bundleResultCache = {};\n bundleCallbackQueue = {};\n};\n\n\n/**\n * Determine if bundle has already been defined\n * @param String} bundleId - The bundle id\n */\nloadjs.isDefined = function isDefined(bundleId) {\n return bundleId in bundleIdCache;\n};\n\n\n// export\nreturn loadjs;\n\n}));\n","// ==========================================================================\n// Plyr storage\n// ==========================================================================\n\nimport utils from './utils';\n\nclass Storage {\n constructor(player) {\n this.enabled = player.config.storage.enabled;\n this.key = player.config.storage.key;\n }\n\n // Check for actual support (see if we can use it)\n static get supported() {\n try {\n if (!('localStorage' in window)) {\n return false;\n }\n\n const test = '___test';\n\n // Try to use it (it might be disabled, e.g. user is in private mode)\n // see: https://github.com/sampotts/plyr/issues/131\n window.localStorage.setItem(test, test);\n window.localStorage.removeItem(test);\n\n return true;\n } catch (e) {\n return false;\n }\n }\n\n get(key) {\n if (!Storage.supported || !this.enabled) {\n return null;\n }\n\n const store = window.localStorage.getItem(this.key);\n\n if (utils.is.empty(store)) {\n return null;\n }\n\n const json = JSON.parse(store);\n\n return utils.is.string(key) && key.length ? json[key] : json;\n }\n\n set(object) {\n // Bail if we don't have localStorage support or it's disabled\n if (!Storage.supported || !this.enabled) {\n return;\n }\n\n // Can only store objectst\n if (!utils.is.object(object)) {\n return;\n }\n\n // Get current storage\n let storage = this.get();\n\n // Default to empty object\n if (utils.is.empty(storage)) {\n storage = {};\n }\n\n // Update the working copy of the values\n utils.extend(storage, object);\n\n // Update storage\n window.localStorage.setItem(this.key, JSON.stringify(storage));\n }\n}\n\nexport default Storage;\n","// ==========================================================================\n// Plyr supported types and providers\n// ==========================================================================\n\nexport const providers = {\n html5: 'html5',\n youtube: 'youtube',\n vimeo: 'vimeo',\n};\n\nexport const types = {\n audio: 'audio',\n video: 'video',\n};\n\nexport default { providers, types };\n","// ==========================================================================\n// Plyr utils\n// ==========================================================================\n\nimport loadjs from 'loadjs';\nimport Storage from './storage';\nimport support from './support';\nimport { providers } from './types';\n\nconst utils = {\n // Check variable types\n is: {\n object(input) {\n return utils.getConstructor(input) === Object;\n },\n number(input) {\n return utils.getConstructor(input) === Number && !Number.isNaN(input);\n },\n string(input) {\n return utils.getConstructor(input) === String;\n },\n boolean(input) {\n return utils.getConstructor(input) === Boolean;\n },\n function(input) {\n return utils.getConstructor(input) === Function;\n },\n array(input) {\n return !utils.is.nullOrUndefined(input) && Array.isArray(input);\n },\n weakMap(input) {\n return utils.is.instanceof(input, WeakMap);\n },\n nodeList(input) {\n return utils.is.instanceof(input, NodeList);\n },\n element(input) {\n return utils.is.instanceof(input, Element);\n },\n textNode(input) {\n return utils.getConstructor(input) === Text;\n },\n event(input) {\n return utils.is.instanceof(input, Event);\n },\n cue(input) {\n return utils.is.instanceof(input, window.TextTrackCue) || utils.is.instanceof(input, window.VTTCue);\n },\n track(input) {\n return utils.is.instanceof(input, TextTrack) || (!utils.is.nullOrUndefined(input) && utils.is.string(input.kind));\n },\n url(input) {\n return !utils.is.nullOrUndefined(input) && /(ftp|http|https):\\/\\/(\\w+:{0,1}\\w*@)?(\\S+)(:[0-9]+)?(\\/|\\/([\\w#!:.?+=&%@!\\-/]))?/.test(input);\n },\n nullOrUndefined(input) {\n return input === null || typeof input === 'undefined';\n },\n empty(input) {\n return (\n utils.is.nullOrUndefined(input) ||\n ((utils.is.string(input) || utils.is.array(input) || utils.is.nodeList(input)) && !input.length) ||\n (utils.is.object(input) && !Object.keys(input).length)\n );\n },\n instanceof(input, constructor) {\n return Boolean(input && constructor && input instanceof constructor);\n },\n },\n\n getConstructor(input) {\n return !utils.is.nullOrUndefined(input) ? input.constructor : null;\n },\n\n // Unfortunately, due to mixed support, UA sniffing is required\n getBrowser() {\n return {\n isIE: /* @cc_on!@ */ false || !!document.documentMode,\n isWebkit: 'WebkitAppearance' in document.documentElement.style && !/Edge/.test(navigator.userAgent),\n isIPhone: /(iPhone|iPod)/gi.test(navigator.platform),\n isIos: /(iPad|iPhone|iPod)/gi.test(navigator.platform),\n };\n },\n\n // Fetch wrapper\n // Using XHR to avoid issues with older browsers\n fetch(url, responseType = 'text') {\n return new Promise((resolve, reject) => {\n try {\n const request = new XMLHttpRequest();\n\n // Check for CORS support\n if (!('withCredentials' in request)) {\n return;\n }\n\n request.addEventListener('load', () => {\n if (responseType === 'text') {\n try {\n resolve(JSON.parse(request.responseText));\n } catch (e) {\n resolve(request.responseText);\n }\n } else {\n resolve(request.response);\n }\n });\n\n request.addEventListener('error', () => {\n throw new Error(request.statusText);\n });\n\n request.open('GET', url, true);\n\n // Set the required response type\n request.responseType = responseType;\n\n request.send();\n } catch (e) {\n reject(e);\n }\n });\n },\n\n // Load image avoiding xhr/fetch CORS issues\n // Server status can't be obtained this way unfortunately, so this uses \"naturalWidth\" to determine if the image has loaded.\n // By default it checks if it is at least 1px, but you can add a second argument to change this.\n loadImage(src, minWidth = 1) {\n return new Promise((resolve, reject) => {\n const image = new Image();\n const handler = () => {\n delete image.onload;\n delete image.onerror;\n (image.naturalWidth >= minWidth ? resolve : reject)(image);\n };\n Object.assign(image, {onload: handler, onerror: handler, src});\n });\n },\n\n // Load an external script\n loadScript(url) {\n return new Promise((resolve, reject) => {\n loadjs(url, {\n success: resolve,\n error: reject,\n });\n });\n },\n\n // Load an external SVG sprite\n loadSprite(url, id) {\n if (!utils.is.string(url)) {\n return;\n }\n\n const prefix = 'cache';\n const hasId = utils.is.string(id);\n let isCached = false;\n\n const exists = () => document.getElementById(id) !== null;\n\n const update = (container, data) => {\n container.innerHTML = data;\n\n // Check again incase of race condition\n if (hasId && exists()) {\n return;\n }\n\n // Inject the SVG to the body\n document.body.insertAdjacentElement('afterbegin', container);\n };\n\n // Only load once if ID set\n if (!hasId || !exists()) {\n const useStorage = Storage.supported;\n\n // Create container\n const container = document.createElement('div');\n utils.toggleHidden(container, true);\n\n if (hasId) {\n container.setAttribute('id', id);\n }\n\n // Check in cache\n if (useStorage) {\n const cached = window.localStorage.getItem(`${prefix}-${id}`);\n isCached = cached !== null;\n\n if (isCached) {\n const data = JSON.parse(cached);\n update(container, data.content);\n }\n }\n\n // Get the sprite\n utils\n .fetch(url)\n .then(result => {\n if (utils.is.empty(result)) {\n return;\n }\n\n if (useStorage) {\n window.localStorage.setItem(\n `${prefix}-${id}`,\n JSON.stringify({\n content: result,\n }),\n );\n }\n\n update(container, result);\n })\n .catch(() => {});\n }\n },\n\n // Generate a random ID\n generateId(prefix) {\n return `${prefix}-${Math.floor(Math.random() * 10000)}`;\n },\n\n // Wrap an element\n wrap(elements, wrapper) {\n // Convert `elements` to an array, if necessary.\n const targets = elements.length ? elements : [elements];\n\n // Loops backwards to prevent having to clone the wrapper on the\n // first element (see `child` below).\n Array.from(targets)\n .reverse()\n .forEach((element, index) => {\n const child = index > 0 ? wrapper.cloneNode(true) : wrapper;\n\n // Cache the current parent and sibling.\n const parent = element.parentNode;\n const sibling = element.nextSibling;\n\n // Wrap the element (is automatically removed from its current\n // parent).\n child.appendChild(element);\n\n // If the element had a sibling, insert the wrapper before\n // the sibling to maintain the HTML structure; otherwise, just\n // append it to the parent.\n if (sibling) {\n parent.insertBefore(child, sibling);\n } else {\n parent.appendChild(child);\n }\n });\n },\n\n // Create a DocumentFragment\n createElement(type, attributes, text) {\n // Create a new <element>\n const element = document.createElement(type);\n\n // Set all passed attributes\n if (utils.is.object(attributes)) {\n utils.setAttributes(element, attributes);\n }\n\n // Add text node\n if (utils.is.string(text)) {\n element.innerText = text;\n }\n\n // Return built element\n return element;\n },\n\n // Inaert an element after another\n insertAfter(element, target) {\n target.parentNode.insertBefore(element, target.nextSibling);\n },\n\n // Insert a DocumentFragment\n insertElement(type, parent, attributes, text) {\n // Inject the new <element>\n parent.appendChild(utils.createElement(type, attributes, text));\n },\n\n // Remove element(s)\n removeElement(element) {\n if (utils.is.nodeList(element) || utils.is.array(element)) {\n Array.from(element).forEach(utils.removeElement);\n return;\n }\n\n if (!utils.is.element(element) || !utils.is.element(element.parentNode)) {\n return;\n }\n\n element.parentNode.removeChild(element);\n },\n\n // Remove all child elements\n emptyElement(element) {\n let { length } = element.childNodes;\n\n while (length > 0) {\n element.removeChild(element.lastChild);\n length -= 1;\n }\n },\n\n // Replace element\n replaceElement(newChild, oldChild) {\n if (!utils.is.element(oldChild) || !utils.is.element(oldChild.parentNode) || !utils.is.element(newChild)) {\n return null;\n }\n\n oldChild.parentNode.replaceChild(newChild, oldChild);\n\n return newChild;\n },\n\n // Set attributes\n setAttributes(element, attributes) {\n if (!utils.is.element(element) || utils.is.empty(attributes)) {\n return;\n }\n\n Object.entries(attributes).forEach(([\n key,\n value,\n ]) => {\n element.setAttribute(key, value);\n });\n },\n\n // Get an attribute object from a string selector\n getAttributesFromSelector(sel, existingAttributes) {\n // For example:\n // '.test' to { class: 'test' }\n // '#test' to { id: 'test' }\n // '[data-test=\"test\"]' to { 'data-test': 'test' }\n\n if (!utils.is.string(sel) || utils.is.empty(sel)) {\n return {};\n }\n\n const attributes = {};\n const existing = existingAttributes;\n\n sel.split(',').forEach(s => {\n // Remove whitespace\n const selector = s.trim();\n const className = selector.replace('.', '');\n const stripped = selector.replace(/[[\\]]/g, '');\n\n // Get the parts and value\n const parts = stripped.split('=');\n const key = parts[0];\n const value = parts.length > 1 ? parts[1].replace(/[\"']/g, '') : '';\n\n // Get the first character\n const start = selector.charAt(0);\n\n switch (start) {\n case '.':\n // Add to existing classname\n if (utils.is.object(existing) && utils.is.string(existing.class)) {\n existing.class += ` ${className}`;\n }\n\n attributes.class = className;\n break;\n\n case '#':\n // ID selector\n attributes.id = selector.replace('#', '');\n break;\n\n case '[':\n // Attribute selector\n attributes[key] = value;\n\n break;\n\n default:\n break;\n }\n });\n\n return attributes;\n },\n\n // Toggle hidden\n toggleHidden(element, hidden) {\n if (!utils.is.element(element)) {\n return;\n }\n\n let hide = hidden;\n\n if (!utils.is.boolean(hide)) {\n hide = !element.hasAttribute('hidden');\n }\n\n if (hide) {\n element.setAttribute('hidden', '');\n } else {\n element.removeAttribute('hidden');\n }\n },\n\n // Mirror Element.classList.toggle, with IE compatibility for \"force\" argument\n toggleClass(element, className, force) {\n if (utils.is.element(element)) {\n let method = 'toggle';\n if (typeof force !== 'undefined') {\n method = force ? 'add' : 'remove';\n }\n\n element.classList[method](className);\n return element.classList.contains(className);\n }\n\n return null;\n },\n\n // Has class name\n hasClass(element, className) {\n return utils.is.element(element) && element.classList.contains(className);\n },\n\n // Element matches selector\n matches(element, selector) {\n const prototype = { Element };\n\n function match() {\n return Array.from(document.querySelectorAll(selector)).includes(this);\n }\n\n const matches = prototype.matches || prototype.webkitMatchesSelector || prototype.mozMatchesSelector || prototype.msMatchesSelector || match;\n\n return matches.call(element, selector);\n },\n\n // Find all elements\n getElements(selector) {\n return this.elements.container.querySelectorAll(selector);\n },\n\n // Find a single element\n getElement(selector) {\n return this.elements.container.querySelector(selector);\n },\n\n // Get the focused element\n getFocusElement() {\n let focused = document.activeElement;\n\n if (!focused || focused === document.body) {\n focused = null;\n } else {\n focused = document.querySelector(':focus');\n }\n\n return focused;\n },\n\n // Trap focus inside container\n trapFocus(element = null, toggle = false) {\n if (!utils.is.element(element)) {\n return;\n }\n\n const focusable = utils.getElements.call(this, 'button:not(:disabled), input:not(:disabled), [tabindex]');\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n\n const trap = event => {\n // Bail if not tab key or not fullscreen\n if (event.key !== 'Tab' || event.keyCode !== 9) {\n return;\n }\n\n // Get the current focused element\n const focused = utils.getFocusElement();\n\n if (focused === last && !event.shiftKey) {\n // Move focus to first element that can be tabbed if Shift isn't used\n first.focus();\n event.preventDefault();\n } else if (focused === first && event.shiftKey) {\n // Move focus to last element that can be tabbed if Shift is used\n last.focus();\n event.preventDefault();\n }\n };\n\n if (toggle) {\n utils.on(this.elements.container, 'keydown', trap, false);\n } else {\n utils.off(this.elements.container, 'keydown', trap, false);\n }\n },\n\n // Toggle event listener\n toggleListener(elements, event, callback, toggle = false, passive = true, capture = false) {\n // Bail if no elemetns, event, or callback\n if (utils.is.empty(elements) || utils.is.empty(event) || !utils.is.function(callback)) {\n return;\n }\n\n // If a nodelist is passed, call itself on each node\n if (utils.is.nodeList(elements) || utils.is.array(elements)) {\n // Create listener for each node\n Array.from(elements).forEach(element => {\n if (element instanceof Node) {\n utils.toggleListener.call(null, element, event, callback, toggle, passive, capture);\n }\n });\n\n return;\n }\n\n // Allow multiple events\n const events = event.split(' ');\n\n // Build options\n // Default to just the capture boolean for browsers with no passive listener support\n let options = capture;\n\n // If passive events listeners are supported\n if (support.passiveListeners) {\n options = {\n // Whether the listener can be passive (i.e. default never prevented)\n passive,\n // Whether the listener is a capturing listener or not\n capture,\n };\n }\n\n // If a single node is passed, bind the event listener\n events.forEach(type => {\n elements[toggle ? 'addEventListener' : 'removeEventListener'](type, callback, options);\n });\n },\n\n // Bind event handler\n on(element, events = '', callback, passive = true, capture = false) {\n utils.toggleListener(element, events, callback, true, passive, capture);\n },\n\n // Unbind event handler\n off(element, events = '', callback, passive = true, capture = false) {\n utils.toggleListener(element, events, callback, false, passive, capture);\n },\n\n // Trigger event\n dispatchEvent(element, type = '', bubbles = false, detail = {}) {\n // Bail if no element\n if (!utils.is.element(element) || utils.is.empty(type)) {\n return;\n }\n\n // Create and dispatch the event\n const event = new CustomEvent(type, {\n bubbles,\n detail: Object.assign({}, detail, {\n plyr: this,\n }),\n });\n\n // Dispatch the event\n element.dispatchEvent(event);\n },\n\n // Format string\n format(input, ...args) {\n if (utils.is.empty(input)) {\n return input;\n }\n\n return input.toString().replace(/{(\\d+)}/g, (match, i) => (utils.is.string(args[i]) ? args[i] : ''));\n },\n\n // Get percentage\n getPercentage(current, max) {\n if (current === 0 || max === 0 || Number.isNaN(current) || Number.isNaN(max)) {\n return 0;\n }\n\n return (current / max * 100).toFixed(2);\n },\n\n // Time helpers\n getHours(value) {\n return parseInt((value / 60 / 60) % 60, 10);\n },\n getMinutes(value) {\n return parseInt((value / 60) % 60, 10);\n },\n getSeconds(value) {\n return parseInt(value % 60, 10);\n },\n\n // Format time to UI friendly string\n formatTime(time = 0, displayHours = false, inverted = false) {\n // Bail if the value isn't a number\n if (!utils.is.number(time)) {\n return utils.formatTime(null, displayHours, inverted);\n }\n\n // Format time component to add leading zero\n const format = value => `0${value}`.slice(-2);\n\n // Breakdown to hours, mins, secs\n let hours = utils.getHours(time);\n const mins = utils.getMinutes(time);\n const secs = utils.getSeconds(time);\n\n // Do we need to display hours?\n if (displayHours || hours > 0) {\n hours = `${hours}:`;\n } else {\n hours = '';\n }\n\n // Render\n return `${inverted ? '-' : ''}${hours}${format(mins)}:${format(secs)}`;\n },\n\n // Replace all occurances of a string in a string\n replaceAll(input = '', find = '', replace = '') {\n return input.replace(new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\\]/\\\\])/g, '\\\\$1'), 'g'), replace.toString());\n },\n\n // Convert to title case\n toTitleCase(input = '') {\n return input.toString().replace(/\\w\\S*/g, text => text.charAt(0).toUpperCase() + text.substr(1).toLowerCase());\n },\n\n // Convert string to pascalCase\n toPascalCase(input = '') {\n let string = input.toString();\n\n // Convert kebab case\n string = utils.replaceAll(string, '-', ' ');\n\n // Convert snake case\n string = utils.replaceAll(string, '_', ' ');\n\n // Convert to title case\n string = utils.toTitleCase(string);\n\n // Convert to pascal case\n return utils.replaceAll(string, ' ', '');\n },\n\n // Convert string to pascalCase\n toCamelCase(input = '') {\n let string = input.toString();\n\n // Convert to pascal case\n string = utils.toPascalCase(string);\n\n // Convert first character to lowercase\n return string.charAt(0).toLowerCase() + string.slice(1);\n },\n\n // Deep extend destination object with N more objects\n extend(target = {}, ...sources) {\n if (!sources.length) {\n return target;\n }\n\n const source = sources.shift();\n\n if (!utils.is.object(source)) {\n return target;\n }\n\n Object.keys(source).forEach(key => {\n if (utils.is.object(source[key])) {\n if (!Object.keys(target).includes(key)) {\n Object.assign(target, { [key]: {} });\n }\n\n utils.extend(target[key], source[key]);\n } else {\n Object.assign(target, { [key]: source[key] });\n }\n });\n\n return utils.extend(target, ...sources);\n },\n\n // Remove duplicates in an array\n dedupe(array) {\n if (!utils.is.array(array)) {\n return array;\n }\n\n return array.filter((item, index) => array.indexOf(item) === index);\n },\n\n // Clone nested objects\n cloneDeep(object) {\n return JSON.parse(JSON.stringify(object));\n },\n\n // Get a nested value in an object\n getDeep(object, path) {\n return path.split('.').reduce((obj, key) => obj && obj[key], object);\n },\n\n // Get the closest value in an array\n closest(array, value) {\n if (!utils.is.array(array) || !array.length) {\n return null;\n }\n\n return array.reduce((prev, curr) => (Math.abs(curr - value) < Math.abs(prev - value) ? curr : prev));\n },\n\n // Get the provider for a given URL\n getProviderByUrl(url) {\n // YouTube\n if (/^(https?:\\/\\/)?(www\\.)?(youtube\\.com|youtu\\.?be)\\/.+$/.test(url)) {\n return providers.youtube;\n }\n\n // Vimeo\n if (/^https?:\\/\\/player.vimeo.com\\/video\\/\\d{0,9}(?=\\b|\\/)/.test(url)) {\n return providers.vimeo;\n }\n\n return null;\n },\n\n // Parse YouTube ID from URL\n parseYouTubeId(url) {\n if (utils.is.empty(url)) {\n return null;\n }\n\n const regex = /^.*(youtu.be\\/|v\\/|u\\/\\w\\/|embed\\/|watch\\?v=|&v=)([^#&?]*).*/;\n return url.match(regex) ? RegExp.$2 : url;\n },\n\n // Parse Vimeo ID from URL\n parseVimeoId(url) {\n if (utils.is.empty(url)) {\n return null;\n }\n\n if (utils.is.number(Number(url))) {\n return url;\n }\n\n const regex = /^.*(vimeo.com\\/|video\\/)(\\d+).*/;\n return url.match(regex) ? RegExp.$2 : url;\n },\n\n // Convert a URL to a location object\n parseUrl(url) {\n const parser = document.createElement('a');\n parser.href = url;\n return parser;\n },\n\n // Get URL query parameters\n getUrlParams(input) {\n let search = input;\n\n // Parse URL if needed\n if (input.startsWith('http://') || input.startsWith('https://')) {\n ({ search } = utils.parseUrl(input));\n }\n\n if (utils.is.empty(search)) {\n return null;\n }\n\n const hashes = search.slice(search.indexOf('?') + 1).split('&');\n\n return hashes.reduce((params, hash) => {\n const [\n key,\n val,\n ] = hash.split('=');\n\n return Object.assign(params, { [key]: decodeURIComponent(val) });\n }, {});\n },\n\n // Convert object to URL parameters\n buildUrlParams(input) {\n if (!utils.is.object(input)) {\n return '';\n }\n\n return Object.keys(input)\n .map(key => `${encodeURIComponent(key)}=${encodeURIComponent(input[key])}`)\n .join('&');\n },\n\n // Remove HTML from a string\n stripHTML(source) {\n const fragment = document.createDocumentFragment();\n const element = document.createElement('div');\n fragment.appendChild(element);\n element.innerHTML = source;\n return fragment.firstChild.innerText;\n },\n\n // Like outerHTML, but also works for DocumentFragment\n getHTML(element) {\n const wrapper = document.createElement('div');\n wrapper.appendChild(element);\n return wrapper.innerHTML;\n },\n\n // Get aspect ratio for dimensions\n getAspectRatio(width, height) {\n const getRatio = (w, h) => (h === 0 ? w : getRatio(h, w % h));\n const ratio = getRatio(width, height);\n return `${width / ratio}:${height / ratio}`;\n },\n\n // Get the transition end event\n get transitionEndEvent() {\n const element = document.createElement('span');\n\n const events = {\n WebkitTransition: 'webkitTransitionEnd',\n MozTransition: 'transitionend',\n OTransition: 'oTransitionEnd otransitionend',\n transition: 'transitionend',\n };\n\n const type = Object.keys(events).find(event => element.style[event] !== undefined);\n\n return utils.is.string(type) ? events[type] : false;\n },\n\n // Force repaint of element\n repaint(element) {\n setTimeout(() => {\n utils.toggleHidden(element, true);\n element.offsetHeight; // eslint-disable-line\n utils.toggleHidden(element, false);\n }, 0);\n },\n};\n\nexport default utils;\n","// ==========================================================================\n// Plyr HTML5 helpers\n// ==========================================================================\n\nimport support from './support';\nimport utils from './utils';\n\nconst html5 = {\n getSources() {\n if (!this.isHTML5) {\n return null;\n }\n\n return this.media.querySelectorAll('source');\n },\n\n // Get quality levels\n getQualityOptions() {\n if (!this.isHTML5) {\n return null;\n }\n\n // Get sources\n const sources = html5.getSources.call(this);\n\n if (utils.is.empty(sources)) {\n return null;\n }\n\n // Get <source> with size attribute\n const sizes = Array.from(sources).filter(source => !utils.is.empty(source.getAttribute('size')));\n\n // If none, bail\n if (utils.is.empty(sizes)) {\n return null;\n }\n\n // Reduce to unique list\n return utils.dedupe(sizes.map(source => Number(source.getAttribute('size'))));\n },\n\n extend() {\n if (!this.isHTML5) {\n return;\n }\n\n const player = this;\n\n // Quality\n Object.defineProperty(player.media, 'quality', {\n get() {\n // Get sources\n const sources = html5.getSources.call(player);\n\n if (utils.is.empty(sources)) {\n return null;\n }\n\n const matches = Array.from(sources).filter(source => source.getAttribute('src') === player.source);\n\n if (utils.is.empty(matches)) {\n return null;\n }\n\n return Number(matches[0].getAttribute('size'));\n },\n set(input) {\n // Get sources\n const sources = html5.getSources.call(player);\n\n if (utils.is.empty(sources)) {\n return;\n }\n\n // Get matches for requested size\n const matches = Array.from(sources).filter(source => Number(source.getAttribute('size')) === input);\n\n // No matches for requested size\n if (utils.is.empty(matches)) {\n return;\n }\n\n // Get supported sources\n const supported = matches.filter(source => support.mime.call(player, source.getAttribute('type')));\n\n // No supported sources\n if (utils.is.empty(supported)) {\n return;\n }\n\n // Trigger change event\n utils.dispatchEvent.call(player, player.media, 'qualityrequested', false, {\n quality: input,\n });\n\n // Get current state\n const { currentTime, playing } = player;\n\n // Set new source\n player.media.src = supported[0].getAttribute('src');\n\n // Restore time\n const onLoadedMetaData = () => {\n player.currentTime = currentTime;\n player.off('loadedmetadata', onLoadedMetaData);\n };\n player.on('loadedmetadata', onLoadedMetaData);\n\n // Load new source\n player.media.load();\n\n // Resume playing\n if (playing) {\n player.play();\n }\n\n // Trigger change event\n utils.dispatchEvent.call(player, player.media, 'qualitychange', false, {\n quality: input,\n });\n },\n });\n },\n\n // Cancel current network requests\n // See https://github.com/sampotts/plyr/issues/174\n cancelRequests() {\n if (!this.isHTML5) {\n return;\n }\n\n // Remove child sources\n utils.removeElement(html5.getSources());\n\n // Set blank video src attribute\n // This is to prevent a MEDIA_ERR_SRC_NOT_SUPPORTED error\n // Info: http://stackoverflow.com/questions/32231579/how-to-properly-dispose-of-an-html5-video-and-close-socket-or-connection\n this.media.setAttribute('src', this.config.blankVideo);\n\n // Load the new empty source\n // This will cancel existing requests\n // See https://github.com/sampotts/plyr/issues/174\n this.media.load();\n\n // Debugging\n this.debug.log('Cancelled network requests');\n },\n};\n\nexport default html5;\n","// ==========================================================================\n// Plyr internationalization\n// ==========================================================================\n\nimport utils from './utils';\n\nconst i18n = {\n get(key = '', config = {}) {\n if (utils.is.empty(key) || utils.is.empty(config)) {\n return '';\n }\n\n let string = utils.getDeep(config.i18n, key);\n\n if (utils.is.empty(string)) {\n return '';\n }\n\n const replace = {\n '{seektime}': config.seekTime,\n '{title}': config.title,\n };\n\n Object.entries(replace).forEach(([\n key,\n value,\n ]) => {\n string = utils.replaceAll(string, key, value);\n });\n\n return string;\n },\n};\n\nexport default i18n;\n","// ==========================================================================\n// Plyr controls\n// ==========================================================================\n\nimport captions from './captions';\nimport html5 from './html5';\nimport i18n from './i18n';\nimport support from './support';\nimport utils from './utils';\n\n// Sniff out the browser\nconst browser = utils.getBrowser();\n\nconst controls = {\n // Get icon URL\n getIconUrl() {\n const url = new URL(this.config.iconUrl, window.location);\n const cors = url.host !== window.location.host || (browser.isIE && !window.svg4everybody);\n\n return {\n url: this.config.iconUrl,\n cors,\n };\n },\n\n // Find the UI controls and store references in custom controls\n // TODO: Allow settings menus with custom controls\n findElements() {\n try {\n this.elements.controls = utils.getElement.call(this, this.config.selectors.controls.wrapper);\n\n // Buttons\n this.elements.buttons = {\n play: utils.getElements.call(this, this.config.selectors.buttons.play),\n pause: utils.getElement.call(this, this.config.selectors.buttons.pause),\n restart: utils.getElement.call(this, this.config.selectors.buttons.restart),\n rewind: utils.getElement.call(this, this.config.selectors.buttons.rewind),\n fastForward: utils.getElement.call(this, this.config.selectors.buttons.fastForward),\n mute: utils.getElement.call(this, this.config.selectors.buttons.mute),\n pip: utils.getElement.call(this, this.config.selectors.buttons.pip),\n airplay: utils.getElement.call(this, this.config.selectors.buttons.airplay),\n settings: utils.getElement.call(this, this.config.selectors.buttons.settings),\n captions: utils.getElement.call(this, this.config.selectors.buttons.captions),\n fullscreen: utils.getElement.call(this, this.config.selectors.buttons.fullscreen),\n };\n\n // Progress\n this.elements.progress = utils.getElement.call(this, this.config.selectors.progress);\n\n // Inputs\n this.elements.inputs = {\n seek: utils.getElement.call(this, this.config.selectors.inputs.seek),\n volume: utils.getElement.call(this, this.config.selectors.inputs.volume),\n };\n\n // Display\n this.elements.display = {\n buffer: utils.getElement.call(this, this.config.selectors.display.buffer),\n currentTime: utils.getElement.call(this, this.config.selectors.display.currentTime),\n duration: utils.getElement.call(this, this.config.selectors.display.duration),\n };\n\n // Seek tooltip\n if (utils.is.element(this.elements.progress)) {\n this.elements.display.seekTooltip = this.elements.progress.querySelector(`.${this.config.classNames.tooltip}`);\n }\n\n return true;\n } catch (error) {\n // Log it\n this.debug.warn('It looks like there is a problem with your custom controls HTML', error);\n\n // Restore native video controls\n this.toggleNativeControls(true);\n\n return false;\n }\n },\n\n // Create <svg> icon\n createIcon(type, attributes) {\n const namespace = 'http://www.w3.org/2000/svg';\n const iconUrl = controls.getIconUrl.call(this);\n const iconPath = `${!iconUrl.cors ? iconUrl.url : ''}#${this.config.iconPrefix}`;\n\n // Create <svg>\n const icon = document.createElementNS(namespace, 'svg');\n utils.setAttributes(\n icon,\n utils.extend(attributes, {\n role: 'presentation',\n focusable: 'false',\n }),\n );\n\n // Create the <use> to reference sprite\n const use = document.createElementNS(namespace, 'use');\n const path = `${iconPath}-${type}`;\n\n // Set `href` attributes\n // https://github.com/sampotts/plyr/issues/460\n // https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/xlink:href\n if ('href' in use) {\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'href', path);\n } else {\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path);\n }\n\n // Add <use> to <svg>\n icon.appendChild(use);\n\n return icon;\n },\n\n // Create hidden text label\n createLabel(type, attr) {\n let text = i18n.get(type, this.config);\n const attributes = Object.assign({}, attr);\n\n switch (type) {\n case 'pip':\n text = 'PIP';\n break;\n\n case 'airplay':\n text = 'AirPlay';\n break;\n\n default:\n break;\n }\n\n if ('class' in attributes) {\n attributes.class += ` ${this.config.classNames.hidden}`;\n } else {\n attributes.class = this.config.classNames.hidden;\n }\n\n return utils.createElement('span', attributes, text);\n },\n\n // Create a badge\n createBadge(text) {\n if (utils.is.empty(text)) {\n return null;\n }\n\n const badge = utils.createElement('span', {\n class: this.config.classNames.menu.value,\n });\n\n badge.appendChild(\n utils.createElement(\n 'span',\n {\n class: this.config.classNames.menu.badge,\n },\n text,\n ),\n );\n\n return badge;\n },\n\n // Create a <button>\n createButton(buttonType, attr) {\n const button = utils.createElement('button');\n const attributes = Object.assign({}, attr);\n let type = utils.toCamelCase(buttonType);\n\n let toggle = false;\n let label;\n let icon;\n let labelPressed;\n let iconPressed;\n\n if (!('type' in attributes)) {\n attributes.type = 'button';\n }\n\n if ('class' in attributes) {\n if (attributes.class.includes(this.config.classNames.control)) {\n attributes.class += ` ${this.config.classNames.control}`;\n }\n } else {\n attributes.class = this.config.classNames.control;\n }\n\n // Large play button\n switch (buttonType) {\n case 'play':\n toggle = true;\n label = 'play';\n labelPressed = 'pause';\n icon = 'play';\n iconPressed = 'pause';\n break;\n\n case 'mute':\n toggle = true;\n label = 'mute';\n labelPressed = 'unmute';\n icon = 'volume';\n iconPressed = 'muted';\n break;\n\n case 'captions':\n toggle = true;\n label = 'enableCaptions';\n labelPressed = 'disableCaptions';\n icon = 'captions-off';\n iconPressed = 'captions-on';\n break;\n\n case 'fullscreen':\n toggle = true;\n label = 'enterFullscreen';\n labelPressed = 'exitFullscreen';\n icon = 'enter-fullscreen';\n iconPressed = 'exit-fullscreen';\n break;\n\n case 'play-large':\n attributes.class += ` ${this.config.classNames.control}--overlaid`;\n type = 'play';\n label = 'play';\n icon = 'play';\n break;\n\n default:\n label = type;\n icon = buttonType;\n }\n\n // Setup toggle icon and labels\n if (toggle) {\n // Icon\n button.appendChild(controls.createIcon.call(this, iconPressed, { class: 'icon--pressed' }));\n button.appendChild(controls.createIcon.call(this, icon, { class: 'icon--not-pressed' }));\n\n // Label/Tooltip\n button.appendChild(controls.createLabel.call(this, labelPressed, { class: 'label--pressed' }));\n button.appendChild(controls.createLabel.call(this, label, { class: 'label--not-pressed' }));\n } else {\n button.appendChild(controls.createIcon.call(this, icon));\n button.appendChild(controls.createLabel.call(this, label));\n }\n\n // Merge attributes\n utils.extend(attributes, utils.getAttributesFromSelector(this.config.selectors.buttons[type], attributes));\n\n utils.setAttributes(button, attributes);\n\n // We have multiple play buttons\n if (type === 'play') {\n if (!utils.is.array(this.elements.buttons[type])) {\n this.elements.buttons[type] = [];\n }\n\n this.elements.buttons[type].push(button);\n } else {\n this.elements.buttons[type] = button;\n }\n\n // Toggle classname when pressed property is set\n const className = this.config.classNames.controlPressed;\n Object.defineProperty(button, 'pressed', {\n enumerable: true,\n get() {\n return utils.hasClass(button, className);\n },\n set(pressed = false) {\n utils.toggleClass(button, className, pressed);\n },\n });\n\n return button;\n },\n\n // Create an <input type='range'>\n createRange(type, attributes) {\n // Seek input\n const input = utils.createElement(\n 'input',\n utils.extend(\n utils.getAttributesFromSelector(this.config.selectors.inputs[type]),\n {\n type: 'range',\n min: 0,\n max: 100,\n step: 0.01,\n value: 0,\n autocomplete: 'off',\n // A11y fixes for https://github.com/sampotts/plyr/issues/905\n role: 'slider',\n 'aria-label': i18n.get(type, this.config),\n 'aria-valuemin': 0,\n 'aria-valuemax': 100,\n 'aria-valuenow': 0,\n },\n attributes,\n ),\n );\n\n this.elements.inputs[type] = input;\n\n // Set the fill for webkit now\n controls.updateRangeFill.call(this, input);\n\n return input;\n },\n\n // Create a <progress>\n createProgress(type, attributes) {\n const progress = utils.createElement(\n 'progress',\n utils.extend(\n utils.getAttributesFromSelector(this.config.selectors.display[type]),\n {\n min: 0,\n max: 100,\n value: 0,\n role: 'presentation',\n 'aria-hidden': true,\n },\n attributes,\n ),\n );\n\n // Create the label inside\n if (type !== 'volume') {\n progress.appendChild(utils.createElement('span', null, '0'));\n\n let suffix = '';\n switch (type) {\n case 'played':\n suffix = i18n.get('played', this.config);\n break;\n\n case 'buffer':\n suffix = i18n.get('buffered', this.config);\n break;\n\n default:\n break;\n }\n\n progress.innerText = `% ${suffix.toLowerCase()}`;\n }\n\n this.elements.display[type] = progress;\n\n return progress;\n },\n\n // Create time display\n createTime(type) {\n const attributes = utils.getAttributesFromSelector(this.config.selectors.display[type]);\n\n const container = utils.createElement(\n 'div',\n utils.extend(attributes, {\n class: `plyr__time ${attributes.class}`,\n 'aria-label': i18n.get(type, this.config),\n }),\n '00:00',\n );\n\n // Reference for updates\n this.elements.display[type] = container;\n\n return container;\n },\n\n // Create a settings menu item\n createMenuItem({value, list, type, title, badge = null, checked = false}) {\n const item = utils.createElement('li');\n\n const label = utils.createElement('label', {\n class: this.config.classNames.control,\n });\n\n const radio = utils.createElement(\n 'input',\n utils.extend(utils.getAttributesFromSelector(this.config.selectors.inputs[type]), {\n type: 'radio',\n name: `plyr-${type}`,\n value,\n checked,\n class: 'plyr__sr-only',\n }),\n );\n\n const faux = utils.createElement('span', { hidden: '' });\n\n label.appendChild(radio);\n label.appendChild(faux);\n label.insertAdjacentHTML('beforeend', title);\n\n if (utils.is.element(badge)) {\n label.appendChild(badge);\n }\n\n item.appendChild(label);\n list.appendChild(item);\n },\n\n // Format a time for display\n formatTime(time = 0, inverted = false) {\n // Bail if the value isn't a number\n if (!utils.is.number(time)) {\n return time;\n }\n\n // Always display hours if duration is over an hour\n const forceHours = utils.getHours(this.duration) > 0;\n\n return utils.formatTime(time, forceHours, inverted);\n },\n\n // Update the displayed time\n updateTimeDisplay(target = null, time = 0, inverted = false) {\n // Bail if there's no element to display or the value isn't a number\n if (!utils.is.element(target) || !utils.is.number(time)) {\n return;\n }\n\n // eslint-disable-next-line no-param-reassign\n target.innerText = controls.formatTime(time, inverted);\n },\n\n // Update volume UI and storage\n updateVolume() {\n if (!this.supported.ui) {\n return;\n }\n\n // Update range\n if (utils.is.element(this.elements.inputs.volume)) {\n controls.setRange.call(this, this.elements.inputs.volume, this.muted ? 0 : this.volume);\n }\n\n // Update mute state\n if (utils.is.element(this.elements.buttons.mute)) {\n this.elements.buttons.mute.pressed = this.muted || this.volume === 0;\n }\n },\n\n // Update seek value and lower fill\n setRange(target, value = 0) {\n if (!utils.is.element(target)) {\n return;\n }\n\n // eslint-disable-next-line\n target.value = value;\n\n // Webkit range fill\n controls.updateRangeFill.call(this, target);\n },\n\n // Update <progress> elements\n updateProgress(event) {\n if (!this.supported.ui || !utils.is.event(event)) {\n return;\n }\n\n let value = 0;\n\n const setProgress = (target, input) => {\n const value = utils.is.number(input) ? input : 0;\n const progress = utils.is.element(target) ? target : this.elements.display.buffer;\n\n // Update value and label\n if (utils.is.element(progress)) {\n progress.value = value;\n\n // Update text label inside\n const label = progress.getElementsByTagName('span')[0];\n if (utils.is.element(label)) {\n label.childNodes[0].nodeValue = value;\n }\n }\n };\n\n if (event) {\n switch (event.type) {\n // Video playing\n case 'timeupdate':\n case 'seeking':\n case 'seeked':\n value = utils.getPercentage(this.currentTime, this.duration);\n\n // Set seek range value only if it's a 'natural' time event\n if (event.type === 'timeupdate') {\n controls.setRange.call(this, this.elements.inputs.seek, value);\n }\n\n break;\n\n // Check buffer status\n case 'playing':\n case 'progress':\n setProgress(this.elements.display.buffer, this.buffered * 100);\n\n break;\n\n default:\n break;\n }\n }\n },\n\n // Webkit polyfill for lower fill range\n updateRangeFill(target) {\n // Get range from event if event passed\n const range = utils.is.event(target) ? target.target : target;\n\n // Needs to be a valid <input type='range'>\n if (!utils.is.element(range) || range.getAttribute('type') !== 'range') {\n return;\n }\n\n // Set aria values for https://github.com/sampotts/plyr/issues/905\n if (utils.matches(range, this.config.selectors.inputs.seek)) {\n range.setAttribute('aria-valuenow', this.currentTime);\n const currentTime = controls.formatTime(this.currentTime);\n const duration = controls.formatTime(this.duration);\n const format = i18n.get('seekLabel', this.config);\n range.setAttribute('aria-valuetext', format.replace('{currentTime}', currentTime).replace('{duration}', duration));\n } else if (utils.matches(range, this.config.selectors.inputs.volume)) {\n const percent = range.value * 100;\n range.setAttribute('aria-valuenow', percent);\n range.setAttribute('aria-valuetext', `${percent}%`);\n } else {\n range.setAttribute('aria-valuenow', range.value);\n }\n\n // WebKit only\n if (!browser.isWebkit) {\n return;\n }\n\n // Set CSS custom property\n range.style.setProperty('--value', `${range.value / range.max * 100}%`);\n },\n\n // Update hover tooltip for seeking\n updateSeekTooltip(event) {\n // Bail if setting not true\n if (\n !this.config.tooltips.seek ||\n !utils.is.element(this.elements.inputs.seek) ||\n !utils.is.element(this.elements.display.seekTooltip) ||\n this.duration === 0\n ) {\n return;\n }\n\n // Calculate percentage\n let percent = 0;\n const clientRect = this.elements.progress.getBoundingClientRect();\n const visible = `${this.config.classNames.tooltip}--visible`;\n\n const toggle = toggle => {\n utils.toggleClass(this.elements.display.seekTooltip, visible, toggle);\n };\n\n // Hide on touch\n if (this.touch) {\n toggle(false);\n return;\n }\n\n // Determine percentage, if already visible\n if (utils.is.event(event)) {\n percent = 100 / clientRect.width * (event.pageX - clientRect.left);\n } else if (utils.hasClass(this.elements.display.seekTooltip, visible)) {\n percent = parseFloat(this.elements.display.seekTooltip.style.left, 10);\n } else {\n return;\n }\n\n // Set bounds\n if (percent < 0) {\n percent = 0;\n } else if (percent > 100) {\n percent = 100;\n }\n\n // Display the time a click would seek to\n controls.updateTimeDisplay.call(this, this.elements.display.seekTooltip, this.duration / 100 * percent);\n\n // Set position\n this.elements.display.seekTooltip.style.left = `${percent}%`;\n\n // Show/hide the tooltip\n // If the event is a moues in/out and percentage is inside bounds\n if (utils.is.event(event) && [\n 'mouseenter',\n 'mouseleave',\n ].includes(event.type)) {\n toggle(event.type === 'mouseenter');\n }\n },\n\n // Handle time change event\n timeUpdate(event) {\n // Only invert if only one time element is displayed and used for both duration and currentTime\n const invert = !utils.is.element(this.elements.display.duration) && this.config.invertTime;\n\n // Duration\n controls.updateTimeDisplay.call(this, this.elements.display.currentTime, invert ? this.duration - this.currentTime : this.currentTime, invert);\n\n // Ignore updates while seeking\n if (event && event.type === 'timeupdate' && this.media.seeking) {\n return;\n }\n\n // Playing progress\n controls.updateProgress.call(this, event);\n },\n\n // Show the duration on metadataloaded or durationchange events\n durationUpdate() {\n // Bail if no UI or durationchange event triggered after playing/seek when invertTime is false\n if (!this.supported.ui || (!this.config.invertTime && this.currentTime)) {\n return;\n }\n\n // Update ARIA values\n if (utils.is.element(this.elements.inputs.seek)) {\n this.elements.inputs.seek.setAttribute('aria-valuemax', this.duration);\n }\n\n // If there's a spot to display duration\n const hasDuration = utils.is.element(this.elements.display.duration);\n\n // If there's only one time display, display duration there\n if (!hasDuration && this.config.displayDuration && this.paused) {\n controls.updateTimeDisplay.call(this, this.elements.display.currentTime, this.duration);\n }\n\n // If there's a duration element, update content\n if (hasDuration) {\n controls.updateTimeDisplay.call(this, this.elements.display.duration, this.duration);\n }\n\n // Update the tooltip (if visible)\n controls.updateSeekTooltip.call(this);\n },\n\n // Hide/show a tab\n toggleTab(setting, toggle) {\n utils.toggleHidden(this.elements.settings.tabs[setting], !toggle);\n },\n\n // Set the quality menu\n // TODO: Vimeo support\n setQualityMenu(options) {\n // Menu required\n if (!utils.is.element(this.elements.settings.panes.quality)) {\n return;\n }\n\n const type = 'quality';\n const list = this.elements.settings.panes.quality.querySelector('ul');\n\n // Set options if passed and filter based on config\n if (utils.is.array(options)) {\n this.options.quality = options.filter(quality => this.config.quality.options.includes(quality));\n }\n\n // Toggle the pane and tab\n const toggle = !utils.is.empty(this.options.quality) && this.options.quality.length > 1;\n controls.toggleTab.call(this, type, toggle);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If we're hiding, nothing more to do\n if (!toggle) {\n return;\n }\n\n // Empty the menu\n utils.emptyElement(list);\n\n // Get the badge HTML for HD, 4K etc\n const getBadge = quality => {\n const label = i18n.get(`qualityBadge.${quality}`, this.config);\n\n if (!label.length) {\n return null;\n }\n\n return controls.createBadge.call(this, label);\n };\n\n // Sort options by the config and then render options\n this.options.quality\n .sort((a, b) => {\n const sorting = this.config.quality.options;\n return sorting.indexOf(a) > sorting.indexOf(b) ? 1 : -1;\n })\n .forEach(quality => {\n controls.createMenuItem.call(this, {\n value: quality,\n list,\n type,\n title: controls.getLabel.call(this, 'quality', quality),\n badge: getBadge(quality),\n });\n });\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Translate a value into a nice label\n getLabel(setting, value) {\n switch (setting) {\n case 'speed':\n return value === 1 ? i18n.get('normal', this.config) : `${value}&times;`;\n\n case 'quality':\n if (utils.is.number(value)) {\n const label = i18n.get(`qualityLabel.${value}`, this.config);\n\n if (!label.length) {\n return `${value}p`;\n }\n\n return label;\n }\n\n return utils.toTitleCase(value);\n\n case 'captions':\n return captions.getLabel.call(this);\n\n default:\n return null;\n }\n },\n\n // Update the selected setting\n updateSetting(setting, container, input) {\n const pane = this.elements.settings.panes[setting];\n let value = null;\n let list = container;\n\n switch (setting) {\n case 'captions':\n value = this.currentTrack;\n break;\n\n default:\n value = !utils.is.empty(input) ? input : this[setting];\n\n // Get default\n if (utils.is.empty(value)) {\n value = this.config[setting].default;\n }\n\n // Unsupported value\n if (!utils.is.empty(this.options[setting]) && !this.options[setting].includes(value)) {\n this.debug.warn(`Unsupported value of '${value}' for ${setting}`);\n return;\n }\n\n // Disabled value\n if (!this.config[setting].options.includes(value)) {\n this.debug.warn(`Disabled value of '${value}' for ${setting}`);\n return;\n }\n\n break;\n }\n\n // Get the list if we need to\n if (!utils.is.element(list)) {\n list = pane && pane.querySelector('ul');\n }\n\n // If there's no list it means it's not been rendered...\n if (!utils.is.element(list)) {\n return;\n }\n\n // Update the label\n const label = this.elements.settings.tabs[setting].querySelector(`.${this.config.classNames.menu.value}`);\n label.innerHTML = controls.getLabel.call(this, setting, value);\n\n // Find the radio option and check it\n const target = list && list.querySelector(`input[value=\"${value}\"]`);\n\n if (utils.is.element(target)) {\n target.checked = true;\n }\n },\n\n // Set the looping options\n /* setLoopMenu() {\n // Menu required\n if (!utils.is.element(this.elements.settings.panes.loop)) {\n return;\n }\n\n const options = ['start', 'end', 'all', 'reset'];\n const list = this.elements.settings.panes.loop.querySelector('ul');\n\n // Show the pane and tab\n utils.toggleHidden(this.elements.settings.tabs.loop, false);\n utils.toggleHidden(this.elements.settings.panes.loop, false);\n\n // Toggle the pane and tab\n const toggle = !utils.is.empty(this.loop.options);\n controls.toggleTab.call(this, 'loop', toggle);\n\n // Empty the menu\n utils.emptyElement(list);\n\n options.forEach(option => {\n const item = utils.createElement('li');\n\n const button = utils.createElement(\n 'button',\n utils.extend(utils.getAttributesFromSelector(this.config.selectors.buttons.loop), {\n type: 'button',\n class: this.config.classNames.control,\n 'data-plyr-loop-action': option,\n }),\n i18n.get(option, this.config)\n );\n\n if (['start', 'end'].includes(option)) {\n const badge = controls.createBadge.call(this, '00:00');\n button.appendChild(badge);\n }\n\n item.appendChild(button);\n list.appendChild(item);\n });\n }, */\n\n // Get current selected caption language\n // TODO: rework this to user the getter in the API?\n\n // Set a list of available captions languages\n setCaptionsMenu() {\n // TODO: Captions or language? Currently it's mixed\n const type = 'captions';\n const list = this.elements.settings.panes.captions.querySelector('ul');\n const tracks = captions.getTracks.call(this);\n\n // Toggle the pane and tab\n controls.toggleTab.call(this, type, tracks.length);\n\n // Empty the menu\n utils.emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If there's no captions, bail\n if (!tracks.length) {\n return;\n }\n\n // Generate options data\n const options = tracks.map((track, value) => ({\n value,\n checked: this.captions.active && this.currentTrack === value,\n title: captions.getLabel.call(this, track),\n badge: track.language && controls.createBadge.call(this, track.language.toUpperCase()),\n list,\n type: 'language',\n }));\n\n // Add the \"Disabled\" option to turn off captions\n options.unshift({\n value: -1,\n checked: !this.captions.active,\n title: i18n.get('disabled', this.config),\n list,\n type: 'language',\n });\n\n // Generate options\n options.forEach(controls.createMenuItem.bind(this));\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Set a list of available captions languages\n setSpeedMenu(options) {\n // Do nothing if not selected\n if (!this.config.controls.includes('settings') || !this.config.settings.includes('speed')) {\n return;\n }\n\n // Menu required\n if (!utils.is.element(this.elements.settings.panes.speed)) {\n return;\n }\n\n const type = 'speed';\n\n // Set the speed options\n if (utils.is.array(options)) {\n this.options.speed = options;\n } else if (this.isHTML5 || this.isVimeo) {\n this.options.speed = [\n 0.5,\n 0.75,\n 1,\n 1.25,\n 1.5,\n 1.75,\n 2,\n ];\n }\n\n // Set options if passed and filter based on config\n this.options.speed = this.options.speed.filter(speed => this.config.speed.options.includes(speed));\n\n // Toggle the pane and tab\n const toggle = !utils.is.empty(this.options.speed) && this.options.speed.length > 1;\n controls.toggleTab.call(this, type, toggle);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If we're hiding, nothing more to do\n if (!toggle) {\n return;\n }\n\n // Get the list to populate\n const list = this.elements.settings.panes.speed.querySelector('ul');\n\n // Empty the menu\n utils.emptyElement(list);\n\n // Create items\n this.options.speed.forEach(speed => {\n controls.createMenuItem.call(this, {\n value: speed,\n list,\n type,\n title: controls.getLabel.call(this, 'speed', speed),\n });\n });\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Check if we need to hide/show the settings menu\n checkMenu() {\n const { tabs } = this.elements.settings;\n const visible = !utils.is.empty(tabs) && Object.values(tabs).some(tab => !tab.hidden);\n\n utils.toggleHidden(this.elements.settings.menu, !visible);\n },\n\n // Show/hide menu\n toggleMenu(event) {\n const { form } = this.elements.settings;\n const button = this.elements.buttons.settings;\n\n // Menu and button are required\n if (!utils.is.element(form) || !utils.is.element(button)) {\n return;\n }\n\n const show = utils.is.boolean(event) ? event : utils.is.element(form) && form.hasAttribute('hidden');\n\n if (utils.is.event(event)) {\n const isMenuItem = utils.is.element(form) && form.contains(event.target);\n const isButton = event.target === this.elements.buttons.settings;\n\n // If the click was inside the form or if the click\n // wasn't the button or menu item and we're trying to\n // show the menu (a doc click shouldn't show the menu)\n if (isMenuItem || (!isMenuItem && !isButton && show)) {\n return;\n }\n\n // Prevent the toggle being caught by the doc listener\n if (isButton) {\n event.stopPropagation();\n }\n }\n\n // Set form and button attributes\n if (utils.is.element(button)) {\n button.setAttribute('aria-expanded', show);\n }\n\n if (utils.is.element(form)) {\n utils.toggleHidden(form, !show);\n utils.toggleClass(this.elements.container, this.config.classNames.menu.open, show);\n\n if (show) {\n form.removeAttribute('tabindex');\n } else {\n form.setAttribute('tabindex', -1);\n }\n }\n },\n\n // Get the natural size of a tab\n getTabSize(tab) {\n const clone = tab.cloneNode(true);\n clone.style.position = 'absolute';\n clone.style.opacity = 0;\n clone.removeAttribute('hidden');\n\n // Prevent input's being unchecked due to the name being identical\n Array.from(clone.querySelectorAll('input[name]')).forEach(input => {\n const name = input.getAttribute('name');\n input.setAttribute('name', `${name}-clone`);\n });\n\n // Append to parent so we get the \"real\" size\n tab.parentNode.appendChild(clone);\n\n // Get the sizes before we remove\n const width = clone.scrollWidth;\n const height = clone.scrollHeight;\n\n // Remove from the DOM\n utils.removeElement(clone);\n\n return {\n width,\n height,\n };\n },\n\n // Toggle Menu\n showTab(target = '') {\n const { menu } = this.elements.settings;\n const pane = document.getElementById(target);\n\n // Nothing to show, bail\n if (!utils.is.element(pane)) {\n return;\n }\n\n // Are we targetting a tab? If not, bail\n const isTab = pane.getAttribute('role') === 'tabpanel';\n if (!isTab) {\n return;\n }\n\n // Hide all other tabs\n // Get other tabs\n const current = menu.querySelector('[role=\"tabpanel\"]:not([hidden])');\n const container = current.parentNode;\n\n // Set other toggles to be expanded false\n Array.from(menu.querySelectorAll(`[aria-controls=\"${current.getAttribute('id')}\"]`)).forEach(toggle => {\n toggle.setAttribute('aria-expanded', false);\n });\n\n // If we can do fancy animations, we'll animate the height/width\n if (support.transitions && !support.reducedMotion) {\n // Set the current width as a base\n container.style.width = `${current.scrollWidth}px`;\n container.style.height = `${current.scrollHeight}px`;\n\n // Get potential sizes\n const size = controls.getTabSize.call(this, pane);\n\n // Restore auto height/width\n const restore = e => {\n // We're only bothered about height and width on the container\n if (e.target !== container || ![\n 'width',\n 'height',\n ].includes(e.propertyName)) {\n return;\n }\n\n // Revert back to auto\n container.style.width = '';\n container.style.height = '';\n\n // Only listen once\n utils.off(container, utils.transitionEndEvent, restore);\n };\n\n // Listen for the transition finishing and restore auto height/width\n utils.on(container, utils.transitionEndEvent, restore);\n\n // Set dimensions to target\n container.style.width = `${size.width}px`;\n container.style.height = `${size.height}px`;\n }\n\n // Set attributes on current tab\n utils.toggleHidden(current, true);\n current.setAttribute('tabindex', -1);\n\n // Set attributes on target\n utils.toggleHidden(pane, false);\n\n const tabs = utils.getElements.call(this, `[aria-controls=\"${target}\"]`);\n Array.from(tabs).forEach(tab => {\n tab.setAttribute('aria-expanded', true);\n });\n pane.removeAttribute('tabindex');\n\n // Focus the first item\n pane.querySelectorAll('button:not(:disabled), input:not(:disabled), [tabindex]')[0].focus();\n },\n\n // Build the default HTML\n // TODO: Set order based on order in the config.controls array?\n create(data) {\n // Do nothing if we want no controls\n if (utils.is.empty(this.config.controls)) {\n return null;\n }\n\n // Create the container\n const container = utils.createElement('div', utils.getAttributesFromSelector(this.config.selectors.controls.wrapper));\n\n // Restart button\n if (this.config.controls.includes('restart')) {\n container.appendChild(controls.createButton.call(this, 'restart'));\n }\n\n // Rewind button\n if (this.config.controls.includes('rewind')) {\n container.appendChild(controls.createButton.call(this, 'rewind'));\n }\n\n // Play/Pause button\n if (this.config.controls.includes('play')) {\n container.appendChild(controls.createButton.call(this, 'play'));\n }\n\n // Fast forward button\n if (this.config.controls.includes('fast-forward')) {\n container.appendChild(controls.createButton.call(this, 'fast-forward'));\n }\n\n // Progress\n if (this.config.controls.includes('progress')) {\n const progress = utils.createElement('div', utils.getAttributesFromSelector(this.config.selectors.progress));\n\n // Seek range slider\n progress.appendChild(\n controls.createRange.call(this, 'seek', {\n id: `plyr-seek-${data.id}`,\n }),\n );\n\n // Buffer progress\n progress.appendChild(controls.createProgress.call(this, 'buffer'));\n\n // TODO: Add loop display indicator\n\n // Seek tooltip\n if (this.config.tooltips.seek) {\n const tooltip = utils.createElement(\n 'span',\n {\n class: this.config.classNames.tooltip,\n },\n '00:00',\n );\n\n progress.appendChild(tooltip);\n this.elements.display.seekTooltip = tooltip;\n }\n\n this.elements.progress = progress;\n container.appendChild(this.elements.progress);\n }\n\n // Media current time display\n if (this.config.controls.includes('current-time')) {\n container.appendChild(controls.createTime.call(this, 'currentTime'));\n }\n\n // Media duration display\n if (this.config.controls.includes('duration')) {\n container.appendChild(controls.createTime.call(this, 'duration'));\n }\n\n // Toggle mute button\n if (this.config.controls.includes('mute')) {\n container.appendChild(controls.createButton.call(this, 'mute'));\n }\n\n // Volume range control\n if (this.config.controls.includes('volume')) {\n const volume = utils.createElement('div', {\n class: 'plyr__volume',\n });\n\n // Set the attributes\n const attributes = {\n max: 1,\n step: 0.05,\n value: this.config.volume,\n };\n\n // Create the volume range slider\n volume.appendChild(\n controls.createRange.call(\n this,\n 'volume',\n utils.extend(attributes, {\n id: `plyr-volume-${data.id}`,\n }),\n ),\n );\n\n this.elements.volume = volume;\n\n container.appendChild(volume);\n }\n\n // Toggle captions button\n if (this.config.controls.includes('captions')) {\n container.appendChild(controls.createButton.call(this, 'captions'));\n }\n\n // Settings button / menu\n if (this.config.controls.includes('settings') && !utils.is.empty(this.config.settings)) {\n const menu = utils.createElement('div', {\n class: 'plyr__menu',\n hidden: '',\n });\n\n menu.appendChild(\n controls.createButton.call(this, 'settings', {\n id: `plyr-settings-toggle-${data.id}`,\n 'aria-haspopup': true,\n 'aria-controls': `plyr-settings-${data.id}`,\n 'aria-expanded': false,\n }),\n );\n\n const form = utils.createElement('form', {\n class: 'plyr__menu__container',\n id: `plyr-settings-${data.id}`,\n hidden: '',\n 'aria-labelled-by': `plyr-settings-toggle-${data.id}`,\n role: 'tablist',\n tabindex: -1,\n });\n\n const inner = utils.createElement('div');\n\n const home = utils.createElement('div', {\n id: `plyr-settings-${data.id}-home`,\n 'aria-labelled-by': `plyr-settings-toggle-${data.id}`,\n role: 'tabpanel',\n });\n\n // Create the tab list\n const tabs = utils.createElement('ul', {\n role: 'tablist',\n });\n\n // Build the tabs\n this.config.settings.forEach(type => {\n const tab = utils.createElement('li', {\n role: 'tab',\n hidden: '',\n });\n\n const button = utils.createElement(\n 'button',\n utils.extend(utils.getAttributesFromSelector(this.config.selectors.buttons.settings), {\n type: 'button',\n class: `${this.config.classNames.control} ${this.config.classNames.control}--forward`,\n id: `plyr-settings-${data.id}-${type}-tab`,\n 'aria-haspopup': true,\n 'aria-controls': `plyr-settings-${data.id}-${type}`,\n 'aria-expanded': false,\n }),\n i18n.get(type, this.config),\n );\n\n const value = utils.createElement('span', {\n class: this.config.classNames.menu.value,\n });\n\n // Speed contains HTML entities\n value.innerHTML = data[type];\n\n button.appendChild(value);\n tab.appendChild(button);\n tabs.appendChild(tab);\n\n this.elements.settings.tabs[type] = tab;\n });\n\n home.appendChild(tabs);\n inner.appendChild(home);\n\n // Build the panes\n this.config.settings.forEach(type => {\n const pane = utils.createElement('div', {\n id: `plyr-settings-${data.id}-${type}`,\n hidden: '',\n 'aria-labelled-by': `plyr-settings-${data.id}-${type}-tab`,\n role: 'tabpanel',\n tabindex: -1,\n });\n\n const back = utils.createElement(\n 'button',\n {\n type: 'button',\n class: `${this.config.classNames.control} ${this.config.classNames.control}--back`,\n 'aria-haspopup': true,\n 'aria-controls': `plyr-settings-${data.id}-home`,\n 'aria-expanded': false,\n },\n i18n.get(type, this.config),\n );\n\n pane.appendChild(back);\n\n const options = utils.createElement('ul');\n\n pane.appendChild(options);\n inner.appendChild(pane);\n\n this.elements.settings.panes[type] = pane;\n });\n\n form.appendChild(inner);\n menu.appendChild(form);\n container.appendChild(menu);\n\n this.elements.settings.form = form;\n this.elements.settings.menu = menu;\n }\n\n // Picture in picture button\n if (this.config.controls.includes('pip') && support.pip) {\n container.appendChild(controls.createButton.call(this, 'pip'));\n }\n\n // Airplay button\n if (this.config.controls.includes('airplay') && support.airplay) {\n container.appendChild(controls.createButton.call(this, 'airplay'));\n }\n\n // Toggle fullscreen button\n if (this.config.controls.includes('fullscreen')) {\n container.appendChild(controls.createButton.call(this, 'fullscreen'));\n }\n\n // Larger overlaid play button\n if (this.config.controls.includes('play-large')) {\n this.elements.container.appendChild(controls.createButton.call(this, 'play-large'));\n }\n\n this.elements.controls = container;\n\n if (this.isHTML5) {\n controls.setQualityMenu.call(this, html5.getQualityOptions.call(this));\n }\n\n controls.setSpeedMenu.call(this);\n\n return container;\n },\n\n // Insert controls\n inject() {\n // Sprite\n if (this.config.loadSprite) {\n const icon = controls.getIconUrl.call(this);\n\n // Only load external sprite using AJAX\n if (icon.cors) {\n utils.loadSprite(icon.url, 'sprite-plyr');\n }\n }\n\n // Create a unique ID\n this.id = Math.floor(Math.random() * 10000);\n\n // Null by default\n let container = null;\n this.elements.controls = null;\n\n // Set template properties\n const props = {\n id: this.id,\n seektime: this.config.seekTime,\n title: this.config.title,\n };\n let update = true;\n\n if (utils.is.string(this.config.controls) || utils.is.element(this.config.controls)) {\n // String or HTMLElement passed as the option\n container = this.config.controls;\n } else if (utils.is.function(this.config.controls)) {\n // A custom function to build controls\n // The function can return a HTMLElement or String\n container = this.config.controls.call(this, props);\n } else {\n // Create controls\n container = controls.create.call(this, {\n id: this.id,\n seektime: this.config.seekTime,\n speed: this.speed,\n quality: this.quality,\n captions: captions.getLabel.call(this),\n // TODO: Looping\n // loop: 'None',\n });\n update = false;\n }\n\n // Replace props with their value\n const replace = input => {\n let result = input;\n\n Object.entries(props).forEach(([\n key,\n value,\n ]) => {\n result = utils.replaceAll(result, `{${key}}`, value);\n });\n\n return result;\n };\n\n // Update markup\n if (update) {\n if (utils.is.string(this.config.controls)) {\n container = replace(container);\n } else if (utils.is.element(container)) {\n container.innerHTML = replace(container.innerHTML);\n }\n }\n\n // Controls container\n let target;\n\n // Inject to custom location\n if (utils.is.string(this.config.selectors.controls.container)) {\n target = document.querySelector(this.config.selectors.controls.container);\n }\n\n // Inject into the container by default\n if (!utils.is.element(target)) {\n target = this.elements.container;\n }\n\n // Inject controls HTML\n if (utils.is.element(container)) {\n target.appendChild(container);\n } else if (container) {\n target.insertAdjacentHTML('beforeend', container);\n }\n\n // Find the elements if need be\n if (!utils.is.element(this.elements.controls)) {\n controls.findElements.call(this);\n }\n\n // Edge sometimes doesn't finish the paint so force a redraw\n if (window.navigator.userAgent.includes('Edge')) {\n utils.repaint(target);\n }\n\n // Setup tooltips\n if (this.config.tooltips.controls) {\n const labels = utils.getElements.call(\n this,\n [\n this.config.selectors.controls.wrapper,\n ' ',\n this.config.selectors.labels,\n ' .',\n this.config.classNames.hidden,\n ].join(''),\n );\n\n Array.from(labels).forEach(label => {\n utils.toggleClass(label, this.config.classNames.hidden, false);\n utils.toggleClass(label, this.config.classNames.tooltip, true);\n });\n }\n },\n};\n\nexport default controls;\n","// ==========================================================================\n// Plyr Captions\n// TODO: Create as class\n// ==========================================================================\n\nimport controls from './controls';\nimport i18n from './i18n';\nimport support from './support';\nimport utils from './utils';\n\nconst captions = {\n // Setup captions\n setup() {\n // Requires UI support\n if (!this.supported.ui) {\n return;\n }\n\n // Only Vimeo and HTML5 video supported at this point\n if (!this.isVideo || this.isYouTube || (this.isHTML5 && !support.textTracks)) {\n // Clear menu and hide\n if (utils.is.array(this.config.controls) && this.config.controls.includes('settings') && this.config.settings.includes('captions')) {\n controls.setCaptionsMenu.call(this);\n }\n\n return;\n }\n\n // Inject the container\n if (!utils.is.element(this.elements.captions)) {\n this.elements.captions = utils.createElement('div', utils.getAttributesFromSelector(this.config.selectors.captions));\n\n utils.insertAfter(this.elements.captions, this.elements.wrapper);\n }\n\n // Get browser info\n const browser = utils.getBrowser();\n\n // Fix IE captions if CORS is used\n // Fetch captions and inject as blobs instead (data URIs not supported!)\n if (browser.isIE && window.URL) {\n const elements = this.media.querySelectorAll('track');\n\n Array.from(elements).forEach(track => {\n const src = track.getAttribute('src');\n const href = utils.parseUrl(src);\n\n if (href.hostname !== window.location.href.hostname && [\n 'http:',\n 'https:',\n ].includes(href.protocol)) {\n utils\n .fetch(src, 'blob')\n .then(blob => {\n track.setAttribute('src', window.URL.createObjectURL(blob));\n })\n .catch(() => {\n utils.removeElement(track);\n });\n }\n });\n }\n\n // Try to load the value from storage\n let active = this.storage.get('captions');\n\n // Otherwise fall back to the default config\n if (!utils.is.boolean(active)) {\n ({ active } = this.config.captions);\n }\n\n // Get language from storage, fallback to config\n let language = this.storage.get('language') || this.config.captions.language;\n if (language === 'auto') {\n [ language ] = (navigator.language || navigator.userLanguage).split('-');\n }\n // Set language and show if active\n captions.setLanguage.call(this, language, active);\n\n // Watch changes to textTracks and update captions menu\n if (this.isHTML5) {\n const trackEvents = this.config.captions.update ? 'addtrack removetrack' : 'removetrack';\n utils.on(this.media.textTracks, trackEvents, captions.update.bind(this));\n }\n\n // Update available languages in list next tick (the event must not be triggered before the listeners)\n setTimeout(captions.update.bind(this), 0);\n },\n\n update() {\n const tracks = captions.getTracks.call(this, true);\n // Get the wanted language\n const { language, meta } = this.captions;\n\n // Handle tracks (add event listener and \"pseudo\"-default)\n if (this.isHTML5 && this.isVideo) {\n tracks\n .filter(track => !meta.get(track))\n .forEach(track => {\n this.debug.log('Track added', track);\n // Attempt to store if the original dom element was \"default\"\n meta.set(track, {\n default: track.mode === 'showing',\n });\n\n // Turn off native caption rendering to avoid double captions\n track.mode = 'hidden';\n\n // Add event listener for cue changes\n utils.on(track, 'cuechange', () => captions.updateCues.call(this));\n });\n }\n\n const trackRemoved = !tracks.find(track => track === this.captions.currentTrackNode);\n const firstMatch = this.language !== language && tracks.find(track => track.language === language);\n\n // Update language if removed or first matching track added\n if (trackRemoved || firstMatch) {\n captions.setLanguage.call(this, language, this.config.captions.active);\n }\n\n // Enable or disable captions based on track length\n utils.toggleClass(this.elements.container, this.config.classNames.captions.enabled, !utils.is.empty(tracks));\n\n // Update available languages in list\n if ((this.config.controls || []).includes('settings') && this.config.settings.includes('captions')) {\n controls.setCaptionsMenu.call(this);\n }\n },\n\n set(index, setLanguage = true, show = true) {\n const tracks = captions.getTracks.call(this);\n\n // Disable captions if setting to -1\n if (index === -1) {\n this.toggleCaptions(false);\n return;\n }\n\n if (!utils.is.number(index)) {\n this.debug.warn('Invalid caption argument', index);\n return;\n }\n\n if (!(index in tracks)) {\n this.debug.warn('Track not found', index);\n return;\n }\n\n if (this.captions.currentTrack !== index) {\n this.captions.currentTrack = index;\n const track = captions.getCurrentTrack.call(this);\n const { language } = track || {};\n\n // Store reference to node for invalidation on remove\n this.captions.currentTrackNode = track;\n\n // Prevent setting language in some cases, since it can violate user's intentions\n if (setLanguage) {\n this.captions.language = language;\n }\n\n // Handle Vimeo captions\n if (this.isVimeo) {\n this.embed.enableTextTrack(language);\n }\n\n // Trigger event\n utils.dispatchEvent.call(this, this.media, 'languagechange');\n }\n\n if (this.isHTML5 && this.isVideo) {\n // If we change the active track while a cue is already displayed we need to update it\n captions.updateCues.call(this);\n }\n\n // Show captions\n if (show) {\n this.toggleCaptions(true);\n }\n },\n\n setLanguage(language, show = true) {\n if (!utils.is.string(language)) {\n this.debug.warn('Invalid language argument', language);\n return;\n }\n // Normalize\n this.captions.language = language.toLowerCase();\n\n // Set currentTrack\n const tracks = captions.getTracks.call(this);\n const track = captions.getCurrentTrack.call(this, true);\n captions.set.call(this, tracks.indexOf(track), false, show);\n },\n\n // Get current valid caption tracks\n // If update is false it will also ignore tracks without metadata\n // This is used to \"freeze\" the language options when captions.update is false\n getTracks(update = false) {\n // Handle media or textTracks missing or null\n const tracks = Array.from((this.media || {}).textTracks || []);\n // For HTML5, use cache instead of current tracks when it exists (if captions.update is false)\n // Filter out removed tracks and tracks that aren't captions/subtitles (for example metadata)\n return tracks\n .filter(track => !this.isHTML5 || update || this.captions.meta.has(track))\n .filter(track => [\n 'captions',\n 'subtitles',\n ].includes(track.kind));\n },\n\n // Get the current track for the current language\n getCurrentTrack(fromLanguage = false) {\n const tracks = captions.getTracks.call(this);\n const sortIsDefault = track => Number((this.captions.meta.get(track) || {}).default);\n const sorted = Array.from(tracks).sort((a, b) => sortIsDefault(b) - sortIsDefault(a));\n return (!fromLanguage && tracks[this.currentTrack]) || sorted.find(track => track.language === this.captions.language) || sorted[0];\n },\n\n // Get UI label for track\n getLabel(track) {\n let currentTrack = track;\n\n if (!utils.is.track(currentTrack) && support.textTracks && this.captions.active) {\n currentTrack = captions.getCurrentTrack.call(this);\n }\n\n if (utils.is.track(currentTrack)) {\n if (!utils.is.empty(currentTrack.label)) {\n return currentTrack.label;\n }\n\n if (!utils.is.empty(currentTrack.language)) {\n return track.language.toUpperCase();\n }\n\n return i18n.get('enabled', this.config);\n }\n\n return i18n.get('disabled', this.config);\n },\n\n // Update captions using current track's active cues\n // Also optional array argument in case there isn't any track (ex: vimeo)\n updateCues(input) {\n // Requires UI\n if (!this.supported.ui) {\n return;\n }\n\n if (!utils.is.element(this.elements.captions)) {\n this.debug.warn('No captions element to render to');\n return;\n }\n\n // Only accept array or empty input\n if (!utils.is.nullOrUndefined(input) && !Array.isArray(input)) {\n this.debug.warn('updateCues: Invalid input', input);\n return;\n }\n\n let cues = input;\n\n // Get cues from track\n if (!cues) {\n const track = captions.getCurrentTrack.call(this);\n cues = Array.from((track || {}).activeCues || [])\n .map(cue => cue.getCueAsHTML())\n .map(utils.getHTML);\n }\n\n // Set new caption text\n const content = cues.map(cueText => cueText.trim()).join('\\n');\n const changed = content !== this.elements.captions.innerHTML;\n\n if (changed) {\n // Empty the container and create a new child element\n utils.emptyElement(this.elements.captions);\n const caption = utils.createElement('span', utils.getAttributesFromSelector(this.config.selectors.caption));\n caption.innerHTML = content;\n this.elements.captions.appendChild(caption);\n\n // Trigger event\n utils.dispatchEvent.call(this, this.media, 'cuechange');\n }\n },\n};\n\nexport default captions;\n","// ==========================================================================\n// Console wrapper\n// ==========================================================================\n\nconst noop = () => {};\n\nexport default class Console {\n constructor(enabled = false) {\n this.enabled = window.console && enabled;\n\n if (this.enabled) {\n this.log('Debugging enabled');\n }\n }\n\n get log() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.log, console) : noop;\n }\n get warn() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.warn, console) : noop;\n }\n get error() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.error, console) : noop;\n }\n}\n","// ==========================================================================\n// Plyr default config\n// ==========================================================================\n\nconst defaults = {\n // Disable\n enabled: true,\n\n // Custom media title\n title: '',\n\n // Logging to console\n debug: false,\n\n // Auto play (if supported)\n autoplay: false,\n\n // Only allow one media playing at once (vimeo only)\n autopause: true,\n\n // Allow inline playback on iOS (this effects YouTube/Vimeo - HTML5 requires the attribute present)\n // TODO: Remove iosNative fullscreen option in favour of this (logic needs work)\n playsinline: true,\n\n // Default time to skip when rewind/fast forward\n seekTime: 10,\n\n // Default volume\n volume: 1,\n muted: false,\n\n // Pass a custom duration\n duration: null,\n\n // Display the media duration on load in the current time position\n // If you have opted to display both duration and currentTime, this is ignored\n displayDuration: true,\n\n // Invert the current time to be a countdown\n invertTime: true,\n\n // Clicking the currentTime inverts it's value to show time left rather than elapsed\n toggleInvert: true,\n\n // Aspect ratio (for embeds)\n ratio: '16:9',\n\n // Click video container to play/pause\n clickToPlay: true,\n\n // Auto hide the controls\n hideControls: true,\n\n // Reset to start when playback ended\n resetOnEnd: false,\n\n // Disable the standard context menu\n disableContextMenu: true,\n\n // Sprite (for icons)\n loadSprite: true,\n iconPrefix: 'plyr',\n iconUrl: 'https://cdn.plyr.io/3.3.12/plyr.svg',\n\n // Blank video (used to prevent errors on source change)\n blankVideo: 'https://cdn.plyr.io/static/blank.mp4',\n\n // Quality default\n quality: {\n default: 576,\n options: [\n 4320,\n 2880,\n 2160,\n 1440,\n 1080,\n 720,\n 576,\n 480,\n 360,\n 240,\n 'default', // YouTube's \"auto\"\n ],\n },\n\n // Set loops\n loop: {\n active: false,\n // start: null,\n // end: null,\n },\n\n // Speed default and options to display\n speed: {\n selected: 1,\n options: [\n 0.5,\n 0.75,\n 1,\n 1.25,\n 1.5,\n 1.75,\n 2,\n ],\n },\n\n // Keyboard shortcut settings\n keyboard: {\n focused: true,\n global: false,\n },\n\n // Display tooltips\n tooltips: {\n controls: false,\n seek: true,\n },\n\n // Captions settings\n captions: {\n active: false,\n language: 'auto',\n // Listen to new tracks added after Plyr is initialized.\n // This is needed for streaming captions, but may result in unselectable options\n update: false,\n },\n\n // Fullscreen settings\n fullscreen: {\n enabled: true, // Allow fullscreen?\n fallback: true, // Fallback for vintage browsers\n iosNative: false, // Use the native fullscreen in iOS (disables custom controls)\n },\n\n // Local storage\n storage: {\n enabled: true,\n key: 'plyr',\n },\n\n // Default controls\n controls: [\n 'play-large',\n // 'restart',\n // 'rewind',\n 'play',\n // 'fast-forward',\n 'progress',\n 'current-time',\n 'mute',\n 'volume',\n 'captions',\n 'settings',\n 'pip',\n 'airplay',\n 'fullscreen',\n ],\n settings: [\n 'captions',\n 'quality',\n 'speed',\n ],\n\n // Localisation\n i18n: {\n restart: 'Restart',\n rewind: 'Rewind {seektime}s',\n play: 'Play',\n pause: 'Pause',\n fastForward: 'Forward {seektime}s',\n seek: 'Seek',\n seekLabel: '{currentTime} of {duration}',\n played: 'Played',\n buffered: 'Buffered',\n currentTime: 'Current time',\n duration: 'Duration',\n volume: 'Volume',\n mute: 'Mute',\n unmute: 'Unmute',\n enableCaptions: 'Enable captions',\n disableCaptions: 'Disable captions',\n enterFullscreen: 'Enter fullscreen',\n exitFullscreen: 'Exit fullscreen',\n frameTitle: 'Player for {title}',\n captions: 'Captions',\n settings: 'Settings',\n menuBack: 'Go back to previous menu',\n speed: 'Speed',\n normal: 'Normal',\n quality: 'Quality',\n loop: 'Loop',\n start: 'Start',\n end: 'End',\n all: 'All',\n reset: 'Reset',\n disabled: 'Disabled',\n enabled: 'Enabled',\n advertisement: 'Ad',\n qualityBadge: {\n 2160: '4K',\n 1440: 'HD',\n 1080: 'HD',\n 720: 'HD',\n 576: 'SD',\n 480: 'SD',\n },\n },\n\n // URLs\n urls: {\n vimeo: {\n sdk: 'https://player.vimeo.com/api/player.js',\n iframe: 'https://player.vimeo.com/video/{0}?{1}',\n api: 'https://vimeo.com/api/v2/video/{0}.json',\n },\n youtube: {\n sdk: 'https://www.youtube.com/iframe_api',\n api: 'https://www.googleapis.com/youtube/v3/videos?id={0}&key={1}&fields=items(snippet(title))&part=snippet',\n },\n googleIMA: {\n sdk: 'https://imasdk.googleapis.com/js/sdkloader/ima3.js',\n },\n },\n\n // Custom control listeners\n listeners: {\n seek: null,\n play: null,\n pause: null,\n restart: null,\n rewind: null,\n fastForward: null,\n mute: null,\n volume: null,\n captions: null,\n fullscreen: null,\n pip: null,\n airplay: null,\n speed: null,\n quality: null,\n loop: null,\n language: null,\n },\n\n // Events to watch and bubble\n events: [\n // Events to watch on HTML5 media elements and bubble\n // https://developer.mozilla.org/en/docs/Web/Guide/Events/Media_events\n 'ended',\n 'progress',\n 'stalled',\n 'playing',\n 'waiting',\n 'canplay',\n 'canplaythrough',\n 'loadstart',\n 'loadeddata',\n 'loadedmetadata',\n 'timeupdate',\n 'volumechange',\n 'play',\n 'pause',\n 'error',\n 'seeking',\n 'seeked',\n 'emptied',\n 'ratechange',\n 'cuechange',\n\n // Custom events\n 'enterfullscreen',\n 'exitfullscreen',\n 'captionsenabled',\n 'captionsdisabled',\n 'languagechange',\n 'controlshidden',\n 'controlsshown',\n 'ready',\n\n // YouTube\n 'statechange',\n 'qualitychange',\n 'qualityrequested',\n\n // Ads\n 'adsloaded',\n 'adscontentpause',\n 'adscontentresume',\n 'adstarted',\n 'adsmidpoint',\n 'adscomplete',\n 'adsallcomplete',\n 'adsimpression',\n 'adsclick',\n ],\n\n // Selectors\n // Change these to match your template if using custom HTML\n selectors: {\n editable: 'input, textarea, select, [contenteditable]',\n container: '.plyr',\n controls: {\n container: null,\n wrapper: '.plyr__controls',\n },\n labels: '[data-plyr]',\n buttons: {\n play: '[data-plyr=\"play\"]',\n pause: '[data-plyr=\"pause\"]',\n restart: '[data-plyr=\"restart\"]',\n rewind: '[data-plyr=\"rewind\"]',\n fastForward: '[data-plyr=\"fast-forward\"]',\n mute: '[data-plyr=\"mute\"]',\n captions: '[data-plyr=\"captions\"]',\n fullscreen: '[data-plyr=\"fullscreen\"]',\n pip: '[data-plyr=\"pip\"]',\n airplay: '[data-plyr=\"airplay\"]',\n settings: '[data-plyr=\"settings\"]',\n loop: '[data-plyr=\"loop\"]',\n },\n inputs: {\n seek: '[data-plyr=\"seek\"]',\n volume: '[data-plyr=\"volume\"]',\n speed: '[data-plyr=\"speed\"]',\n language: '[data-plyr=\"language\"]',\n quality: '[data-plyr=\"quality\"]',\n },\n display: {\n currentTime: '.plyr__time--current',\n duration: '.plyr__time--duration',\n buffer: '.plyr__progress__buffer',\n loop: '.plyr__progress__loop', // Used later\n volume: '.plyr__volume--display',\n },\n progress: '.plyr__progress',\n captions: '.plyr__captions',\n caption: '.plyr__caption',\n menu: {\n quality: '.js-plyr__menu__list--quality',\n },\n },\n\n // Class hooks added to the player in different states\n classNames: {\n type: 'plyr--{0}',\n provider: 'plyr--{0}',\n video: 'plyr__video-wrapper',\n embed: 'plyr__video-embed',\n embedContainer: 'plyr__video-embed__container',\n poster: 'plyr__poster',\n posterEnabled: 'plyr__poster-enabled',\n ads: 'plyr__ads',\n control: 'plyr__control',\n controlPressed: 'plyr__control--pressed',\n playing: 'plyr--playing',\n paused: 'plyr--paused',\n stopped: 'plyr--stopped',\n loading: 'plyr--loading',\n hover: 'plyr--hover',\n tooltip: 'plyr__tooltip',\n cues: 'plyr__cues',\n hidden: 'plyr__sr-only',\n hideControls: 'plyr--hide-controls',\n isIos: 'plyr--is-ios',\n isTouch: 'plyr--is-touch',\n uiSupported: 'plyr--full-ui',\n noTransition: 'plyr--no-transition',\n menu: {\n value: 'plyr__menu__value',\n badge: 'plyr__badge',\n open: 'plyr--menu-open',\n },\n captions: {\n enabled: 'plyr--captions-enabled',\n active: 'plyr--captions-active',\n },\n fullscreen: {\n enabled: 'plyr--fullscreen-enabled',\n fallback: 'plyr--fullscreen-fallback',\n },\n pip: {\n supported: 'plyr--pip-supported',\n active: 'plyr--pip-active',\n },\n airplay: {\n supported: 'plyr--airplay-supported',\n active: 'plyr--airplay-active',\n },\n tabFocus: 'plyr__tab-focus',\n },\n\n // Embed attributes\n attributes: {\n embed: {\n provider: 'data-plyr-provider',\n id: 'data-plyr-embed-id',\n },\n },\n\n // API keys\n keys: {\n google: null,\n },\n\n // Advertisements plugin\n // Register for an account here: http://vi.ai/publisher-video-monetization/?aid=plyrio\n ads: {\n enabled: false,\n publisherId: '',\n },\n};\n\nexport default defaults;\n","// ==========================================================================\n// Fullscreen wrapper\n// https://developer.mozilla.org/en-US/docs/Web/API/Fullscreen_API#prefixing\n// ==========================================================================\n\nimport utils from './utils';\n\nconst browser = utils.getBrowser();\n\nfunction onChange() {\n if (!this.enabled) {\n return;\n }\n\n // Update toggle button\n const button = this.player.elements.buttons.fullscreen;\n if (utils.is.element(button)) {\n button.pressed = this.active;\n }\n\n // Trigger an event\n utils.dispatchEvent.call(this.player, this.target, this.active ? 'enterfullscreen' : 'exitfullscreen', true);\n\n // Trap focus in container\n if (!browser.isIos) {\n utils.trapFocus.call(this.player, this.target, this.active);\n }\n}\n\nfunction toggleFallback(toggle = false) {\n // Store or restore scroll position\n if (toggle) {\n this.scrollPosition = {\n x: window.scrollX || 0,\n y: window.scrollY || 0,\n };\n } else {\n window.scrollTo(this.scrollPosition.x, this.scrollPosition.y);\n }\n\n // Toggle scroll\n document.body.style.overflow = toggle ? 'hidden' : '';\n\n // Toggle class hook\n utils.toggleClass(this.target, this.player.config.classNames.fullscreen.fallback, toggle);\n\n // Toggle button and fire events\n onChange.call(this);\n}\n\nclass Fullscreen {\n constructor(player) {\n // Keep reference to parent\n this.player = player;\n\n // Get prefix\n this.prefix = Fullscreen.prefix;\n this.property = Fullscreen.property;\n\n // Scroll position\n this.scrollPosition = { x: 0, y: 0 };\n\n // Register event listeners\n // Handle event (incase user presses escape etc)\n utils.on(document, this.prefix === 'ms' ? 'MSFullscreenChange' : `${this.prefix}fullscreenchange`, () => {\n // TODO: Filter for target??\n onChange.call(this);\n });\n\n // Fullscreen toggle on double click\n utils.on(this.player.elements.container, 'dblclick', event => {\n // Ignore double click in controls\n if (utils.is.element(this.player.elements.controls) && this.player.elements.controls.contains(event.target)) {\n return;\n }\n\n this.toggle();\n });\n\n // Update the UI\n this.update();\n }\n\n // Determine if native supported\n static get native() {\n return !!(document.fullscreenEnabled || document.webkitFullscreenEnabled || document.mozFullScreenEnabled || document.msFullscreenEnabled);\n }\n\n // Get the prefix for handlers\n static get prefix() {\n // No prefix\n if (utils.is.function(document.exitFullscreen)) {\n return '';\n }\n\n // Check for fullscreen support by vendor prefix\n let value = '';\n const prefixes = [\n 'webkit',\n 'moz',\n 'ms',\n ];\n\n prefixes.some(pre => {\n if (utils.is.function(document[`${pre}ExitFullscreen`]) || utils.is.function(document[`${pre}CancelFullScreen`])) {\n value = pre;\n return true;\n }\n\n return false;\n });\n\n return value;\n }\n\n static get property() {\n return this.prefix === 'moz' ? 'FullScreen' : 'Fullscreen';\n }\n\n // Determine if fullscreen is enabled\n get enabled() {\n return (\n (Fullscreen.native || this.player.config.fullscreen.fallback) &&\n this.player.config.fullscreen.enabled &&\n this.player.supported.ui &&\n this.player.isVideo\n );\n }\n\n // Get active state\n get active() {\n if (!this.enabled) {\n return false;\n }\n\n // Fallback using classname\n if (!Fullscreen.native) {\n return utils.hasClass(this.target, this.player.config.classNames.fullscreen.fallback);\n }\n\n const element = !this.prefix ? document.fullscreenElement : document[`${this.prefix}${this.property}Element`];\n\n return element === this.target;\n }\n\n // Get target element\n get target() {\n return browser.isIos && this.player.config.fullscreen.iosNative ? this.player.media : this.player.elements.container;\n }\n\n // Update UI\n update() {\n if (this.enabled) {\n this.player.debug.log(`${Fullscreen.native ? 'Native' : 'Fallback'} fullscreen enabled`);\n } else {\n this.player.debug.log('Fullscreen not supported and fallback disabled');\n }\n\n // Add styling hook to show button\n utils.toggleClass(this.player.elements.container, this.player.config.classNames.fullscreen.enabled, this.enabled);\n }\n\n // Make an element fullscreen\n enter() {\n if (!this.enabled) {\n return;\n }\n\n // iOS native fullscreen doesn't need the request step\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n if (this.player.playing) {\n this.target.webkitEnterFullscreen();\n }\n } else if (!Fullscreen.native) {\n toggleFallback.call(this, true);\n } else if (!this.prefix) {\n this.target.requestFullscreen();\n } else if (!utils.is.empty(this.prefix)) {\n this.target[`${this.prefix}Request${this.property}`]();\n }\n }\n\n // Bail from fullscreen\n exit() {\n if (!this.enabled) {\n return;\n }\n\n // iOS native fullscreen\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n this.target.webkitExitFullscreen();\n this.player.play();\n } else if (!Fullscreen.native) {\n toggleFallback.call(this, false);\n } else if (!this.prefix) {\n (document.cancelFullScreen || document.exitFullscreen).call(document);\n } else if (!utils.is.empty(this.prefix)) {\n const action = this.prefix === 'moz' ? 'Cancel' : 'Exit';\n document[`${this.prefix}${action}${this.property}`]();\n }\n }\n\n // Toggle state\n toggle() {\n if (!this.active) {\n this.enter();\n } else {\n this.exit();\n }\n }\n}\n\nexport default Fullscreen;\n","// ==========================================================================\n// Plyr UI\n// ==========================================================================\n\nimport captions from './captions';\nimport controls from './controls';\nimport i18n from './i18n';\nimport support from './support';\nimport utils from './utils';\n\n// Sniff out the browser\nconst browser = utils.getBrowser();\n\nconst ui = {\n addStyleHook() {\n utils.toggleClass(this.elements.container, this.config.selectors.container.replace('.', ''), true);\n utils.toggleClass(this.elements.container, this.config.classNames.uiSupported, this.supported.ui);\n },\n\n // Toggle native HTML5 media controls\n toggleNativeControls(toggle = false) {\n if (toggle && this.isHTML5) {\n this.media.setAttribute('controls', '');\n } else {\n this.media.removeAttribute('controls');\n }\n },\n\n // Setup the UI\n build() {\n // Re-attach media element listeners\n // TODO: Use event bubbling?\n this.listeners.media();\n\n // Don't setup interface if no support\n if (!this.supported.ui) {\n this.debug.warn(`Basic support only for ${this.provider} ${this.type}`);\n\n // Restore native controls\n ui.toggleNativeControls.call(this, true);\n\n // Bail\n return;\n }\n\n // Inject custom controls if not present\n if (!utils.is.element(this.elements.controls)) {\n // Inject custom controls\n controls.inject.call(this);\n\n // Re-attach control listeners\n this.listeners.controls();\n }\n\n // Remove native controls\n ui.toggleNativeControls.call(this);\n\n // Setup captions for HTML5\n if (this.isHTML5) {\n captions.setup.call(this);\n }\n\n // Reset volume\n this.volume = null;\n\n // Reset mute state\n this.muted = null;\n\n // Reset speed\n this.speed = null;\n\n // Reset loop state\n this.loop = null;\n\n // Reset quality setting\n this.quality = null;\n\n // Reset volume display\n controls.updateVolume.call(this);\n\n // Reset time display\n controls.timeUpdate.call(this);\n\n // Update the UI\n ui.checkPlaying.call(this);\n\n // Check for picture-in-picture support\n utils.toggleClass(this.elements.container, this.config.classNames.pip.supported, support.pip && this.isHTML5 && this.isVideo);\n\n // Check for airplay support\n utils.toggleClass(this.elements.container, this.config.classNames.airplay.supported, support.airplay && this.isHTML5);\n\n // Add iOS class\n utils.toggleClass(this.elements.container, this.config.classNames.isIos, browser.isIos);\n\n // Add touch class\n utils.toggleClass(this.elements.container, this.config.classNames.isTouch, this.touch);\n\n // Ready for API calls\n this.ready = true;\n\n // Ready event at end of execution stack\n setTimeout(() => {\n utils.dispatchEvent.call(this, this.media, 'ready');\n }, 0);\n\n // Set the title\n ui.setTitle.call(this);\n\n // Assure the poster image is set, if the property was added before the element was created\n if (this.poster && this.elements.poster && !this.elements.poster.style.backgroundImage) {\n ui.setPoster.call(this, this.poster);\n }\n\n // Manually set the duration if user has overridden it.\n // The event listeners for it doesn't get called if preload is disabled (#701)\n if (this.config.duration) {\n controls.durationUpdate.call(this);\n }\n },\n\n // Setup aria attribute for play and iframe title\n setTitle() {\n // Find the current text\n let label = i18n.get('play', this.config);\n\n // If there's a media title set, use that for the label\n if (utils.is.string(this.config.title) && !utils.is.empty(this.config.title)) {\n label += `, ${this.config.title}`;\n }\n\n // If there's a play button, set label\n if (utils.is.nodeList(this.elements.buttons.play)) {\n Array.from(this.elements.buttons.play).forEach(button => {\n button.setAttribute('aria-label', label);\n });\n }\n\n // Set iframe title\n // https://github.com/sampotts/plyr/issues/124\n if (this.isEmbed) {\n const iframe = utils.getElement.call(this, 'iframe');\n\n if (!utils.is.element(iframe)) {\n return;\n }\n\n // Default to media type\n const title = !utils.is.empty(this.config.title) ? this.config.title : 'video';\n const format = i18n.get('frameTitle', this.config);\n\n iframe.setAttribute('title', format.replace('{title}', title));\n }\n },\n\n // Toggle poster\n togglePoster(enable) {\n utils.toggleClass(this.elements.container, this.config.classNames.posterEnabled, enable);\n },\n\n // Set the poster image (async)\n setPoster(poster) {\n // Set property regardless of validity\n this.media.setAttribute('poster', poster);\n\n // Bail if element is missing\n if (!utils.is.element(this.elements.poster)) {\n return Promise.reject();\n }\n\n // Load the image, and set poster if successful\n const loadPromise = utils.loadImage(poster).then(() => {\n this.elements.poster.style.backgroundImage = `url('${poster}')`;\n Object.assign(this.elements.poster.style, {\n backgroundImage: `url('${poster}')`,\n // Reset backgroundSize as well (since it can be set to \"cover\" for padded thumbnails for youtube)\n backgroundSize: '',\n });\n ui.togglePoster.call(this, true);\n return poster;\n });\n\n // Hide the element if the poster can't be loaded (otherwise it will just be a black element covering the video)\n loadPromise.catch(() => ui.togglePoster.call(this, false));\n\n // Return the promise so the caller can use it as well\n return loadPromise;\n },\n\n // Check playing state\n checkPlaying(event) {\n // Class hooks\n utils.toggleClass(this.elements.container, this.config.classNames.playing, this.playing);\n utils.toggleClass(this.elements.container, this.config.classNames.paused, this.paused);\n utils.toggleClass(this.elements.container, this.config.classNames.stopped, this.stopped);\n\n // Set state\n Array.from(this.elements.buttons.play).forEach(target => {\n target.pressed = this.playing;\n });\n\n // Only update controls on non timeupdate events\n if (utils.is.event(event) && event.type === 'timeupdate') {\n return;\n }\n\n // Toggle controls\n ui.toggleControls.call(this);\n },\n\n // Check if media is loading\n checkLoading(event) {\n this.loading = [\n 'stalled',\n 'waiting',\n ].includes(event.type);\n\n // Clear timer\n clearTimeout(this.timers.loading);\n\n // Timer to prevent flicker when seeking\n this.timers.loading = setTimeout(() => {\n // Update progress bar loading class state\n utils.toggleClass(this.elements.container, this.config.classNames.loading, this.loading);\n\n // Update controls visibility\n ui.toggleControls.call(this);\n }, this.loading ? 250 : 0);\n },\n\n // Toggle controls based on state and `force` argument\n toggleControls(force) {\n const { controls } = this.elements;\n\n if (controls && this.config.hideControls) {\n // Show controls if force, loading, paused, or button interaction, otherwise hide\n this.toggleControls(Boolean(force || this.loading || this.paused || controls.pressed || controls.hover));\n }\n },\n};\n\nexport default ui;\n","// ==========================================================================\n// Plyr Event Listeners\n// ==========================================================================\n\nimport controls from './controls';\nimport ui from './ui';\nimport utils from './utils';\n\n// Sniff out the browser\nconst browser = utils.getBrowser();\n\nclass Listeners {\n constructor(player) {\n this.player = player;\n this.lastKey = null;\n\n this.handleKey = this.handleKey.bind(this);\n this.toggleMenu = this.toggleMenu.bind(this);\n this.firstTouch = this.firstTouch.bind(this);\n }\n\n // Handle key presses\n handleKey(event) {\n const code = event.keyCode ? event.keyCode : event.which;\n const pressed = event.type === 'keydown';\n const repeat = pressed && code === this.lastKey;\n\n // Bail if a modifier key is set\n if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) {\n return;\n }\n\n // If the event is bubbled from the media element\n // Firefox doesn't get the keycode for whatever reason\n if (!utils.is.number(code)) {\n return;\n }\n\n // Seek by the number keys\n const seekByKey = () => {\n // Divide the max duration into 10th's and times by the number value\n this.player.currentTime = this.player.duration / 10 * (code - 48);\n };\n\n // Handle the key on keydown\n // Reset on keyup\n if (pressed) {\n // Which keycodes should we prevent default\n const preventDefault = [\n 48,\n 49,\n 50,\n 51,\n 52,\n 53,\n 54,\n 56,\n 57,\n 32,\n 75,\n 38,\n 40,\n 77,\n 39,\n 37,\n 70,\n 67,\n 73,\n 76,\n 79,\n ];\n\n // Check focused element\n // and if the focused element is not editable (e.g. text input)\n // and any that accept key input http://webaim.org/techniques/keyboard/\n const focused = utils.getFocusElement();\n if (utils.is.element(focused) && (\n focused !== this.player.elements.inputs.seek &&\n utils.matches(focused, this.player.config.selectors.editable))\n ) {\n return;\n }\n\n // If the code is found prevent default (e.g. prevent scrolling for arrows)\n if (preventDefault.includes(code)) {\n event.preventDefault();\n event.stopPropagation();\n }\n\n switch (code) {\n case 48:\n case 49:\n case 50:\n case 51:\n case 52:\n case 53:\n case 54:\n case 55:\n case 56:\n case 57:\n // 0-9\n if (!repeat) {\n seekByKey();\n }\n break;\n\n case 32:\n case 75:\n // Space and K key\n if (!repeat) {\n this.player.togglePlay();\n }\n break;\n\n case 38:\n // Arrow up\n this.player.increaseVolume(0.1);\n break;\n\n case 40:\n // Arrow down\n this.player.decreaseVolume(0.1);\n break;\n\n case 77:\n // M key\n if (!repeat) {\n this.player.muted = !this.player.muted;\n }\n break;\n\n case 39:\n // Arrow forward\n this.player.forward();\n break;\n\n case 37:\n // Arrow back\n this.player.rewind();\n break;\n\n case 70:\n // F key\n this.player.fullscreen.toggle();\n break;\n\n case 67:\n // C key\n if (!repeat) {\n this.player.toggleCaptions();\n }\n break;\n\n case 76:\n // L key\n this.player.loop = !this.player.loop;\n break;\n\n /* case 73:\n this.setLoop('start');\n break;\n\n case 76:\n this.setLoop();\n break;\n\n case 79:\n this.setLoop('end');\n break; */\n\n default:\n break;\n }\n\n // Escape is handle natively when in full screen\n // So we only need to worry about non native\n if (!this.player.fullscreen.enabled && this.player.fullscreen.active && code === 27) {\n this.player.fullscreen.toggle();\n }\n\n // Store last code for next cycle\n this.lastKey = code;\n } else {\n this.lastKey = null;\n }\n }\n\n // Toggle menu\n toggleMenu(event) {\n controls.toggleMenu.call(this.player, event);\n }\n\n // Device is touch enabled\n firstTouch() {\n this.player.touch = true;\n\n // Add touch class\n utils.toggleClass(this.player.elements.container, this.player.config.classNames.isTouch, true);\n\n // Clean up\n utils.off(document.body, 'touchstart', this.firstTouch);\n }\n\n // Global window & document listeners\n global(toggle = true) {\n // Keyboard shortcuts\n if (this.player.config.keyboard.global) {\n utils.toggleListener(window, 'keydown keyup', this.handleKey, toggle, false);\n }\n\n // Click anywhere closes menu\n utils.toggleListener(document.body, 'click', this.toggleMenu, toggle);\n\n // Detect touch by events\n utils.on(document.body, 'touchstart', this.firstTouch);\n }\n\n // Container listeners\n container() {\n // Keyboard shortcuts\n if (!this.player.config.keyboard.global && this.player.config.keyboard.focused) {\n utils.on(this.player.elements.container, 'keydown keyup', this.handleKey, false);\n }\n\n // Detect tab focus\n // Remove class on blur/focusout\n utils.on(this.player.elements.container, 'focusout', event => {\n utils.toggleClass(event.target, this.player.config.classNames.tabFocus, false);\n });\n\n // Add classname to tabbed elements\n utils.on(this.player.elements.container, 'keydown', event => {\n if (event.keyCode !== 9) {\n return;\n }\n\n // Delay the adding of classname until the focus has changed\n // This event fires before the focusin event\n setTimeout(() => {\n utils.toggleClass(utils.getFocusElement(), this.player.config.classNames.tabFocus, true);\n }, 0);\n });\n\n // Toggle controls on mouse events and entering fullscreen\n utils.on(this.player.elements.container, 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen', event => {\n const { controls } = this.player.elements;\n\n // Remove button states for fullscreen\n if (event.type === 'enterfullscreen') {\n controls.pressed = false;\n controls.hover = false;\n }\n\n // Show, then hide after a timeout unless another control event occurs\n const show = [\n 'touchstart',\n 'touchmove',\n 'mousemove',\n ].includes(event.type);\n\n let delay = 0;\n\n if (show) {\n ui.toggleControls.call(this.player, true);\n // Use longer timeout for touch devices\n delay = this.player.touch ? 3000 : 2000;\n }\n\n // Clear timer\n clearTimeout(this.player.timers.controls);\n // Timer to prevent flicker when seeking\n this.player.timers.controls = setTimeout(() => ui.toggleControls.call(this.player, false), delay);\n });\n }\n\n // Listen for media events\n media() {\n // Time change on media\n utils.on(this.player.media, 'timeupdate seeking seeked', event => controls.timeUpdate.call(this.player, event));\n\n // Display duration\n utils.on(this.player.media, 'durationchange loadeddata loadedmetadata', event => controls.durationUpdate.call(this.player, event));\n\n // Check for audio tracks on load\n // We can't use `loadedmetadata` as it doesn't seem to have audio tracks at that point\n utils.on(this.player.media, 'loadeddata', () => {\n utils.toggleHidden(this.player.elements.volume, !this.player.hasAudio);\n utils.toggleHidden(this.player.elements.buttons.mute, !this.player.hasAudio);\n });\n\n // Handle the media finishing\n utils.on(this.player.media, 'ended', () => {\n // Show poster on end\n if (this.player.isHTML5 && this.player.isVideo && this.player.config.resetOnEnd) {\n // Restart\n this.player.restart();\n }\n });\n\n // Check for buffer progress\n utils.on(this.player.media, 'progress playing seeking seeked', event => controls.updateProgress.call(this.player, event));\n\n // Handle volume changes\n utils.on(this.player.media, 'volumechange', event => controls.updateVolume.call(this.player, event));\n\n // Handle play/pause\n utils.on(this.player.media, 'playing play pause ended emptied timeupdate', event => ui.checkPlaying.call(this.player, event));\n\n // Loading state\n utils.on(this.player.media, 'waiting canplay seeked playing', event => ui.checkLoading.call(this.player, event));\n\n // If autoplay, then load advertisement if required\n // TODO: Show some sort of loading state while the ad manager loads else there's a delay before ad shows\n utils.on(this.player.media, 'playing', () => {\n if (!this.player.ads) {\n return;\n }\n\n // If ads are enabled, wait for them first\n if (this.player.ads.enabled && !this.player.ads.initialized) {\n // Wait for manager response\n this.player.ads.managerPromise.then(() => this.player.ads.play()).catch(() => this.player.play());\n }\n });\n\n // Click video\n if (this.player.supported.ui && this.player.config.clickToPlay && !this.player.isAudio) {\n // Re-fetch the wrapper\n const wrapper = utils.getElement.call(this.player, `.${this.player.config.classNames.video}`);\n\n // Bail if there's no wrapper (this should never happen)\n if (!utils.is.element(wrapper)) {\n return;\n }\n\n // On click play, pause ore restart\n utils.on(wrapper, 'click', () => {\n // Touch devices will just show controls (if we're hiding controls)\n if (this.player.config.hideControls && this.player.touch && !this.player.paused) {\n return;\n }\n\n if (this.player.paused) {\n this.player.play();\n } else if (this.player.ended) {\n this.player.restart();\n this.player.play();\n } else {\n this.player.pause();\n }\n });\n }\n\n // Disable right click\n if (this.player.supported.ui && this.player.config.disableContextMenu) {\n utils.on(\n this.player.elements.wrapper,\n 'contextmenu',\n event => {\n event.preventDefault();\n },\n false,\n );\n }\n\n // Volume change\n utils.on(this.player.media, 'volumechange', () => {\n // Save to storage\n this.player.storage.set({ volume: this.player.volume, muted: this.player.muted });\n });\n\n // Speed change\n utils.on(this.player.media, 'ratechange', () => {\n // Update UI\n controls.updateSetting.call(this.player, 'speed');\n\n // Save to storage\n this.player.storage.set({ speed: this.player.speed });\n });\n\n // Quality request\n utils.on(this.player.media, 'qualityrequested', event => {\n // Save to storage\n this.player.storage.set({ quality: event.detail.quality });\n });\n\n // Quality change\n utils.on(this.player.media, 'qualitychange', event => {\n // Update UI\n controls.updateSetting.call(this.player, 'quality', null, event.detail.quality);\n });\n\n // Caption language change\n utils.on(this.player.media, 'languagechange', () => {\n // Update UI\n controls.updateSetting.call(this.player, 'captions');\n\n // Save to storage\n this.player.storage.set({ language: this.player.language });\n });\n\n // Captions toggle\n utils.on(this.player.media, 'captionsenabled captionsdisabled', () => {\n // Update UI\n controls.updateSetting.call(this.player, 'captions');\n\n // Save to storage\n this.player.storage.set({ captions: this.player.captions.active });\n });\n\n // Proxy events to container\n // Bubble up key events for Edge\n utils.on(this.player.media, this.player.config.events.concat([\n 'keyup',\n 'keydown',\n ]).join(' '), event => {\n let {detail = {}} = event;\n\n // Get error details from media\n if (event.type === 'error') {\n detail = this.player.media.error;\n }\n\n utils.dispatchEvent.call(this.player, this.player.elements.container, event.type, true, detail);\n });\n }\n\n // Listen for control events\n controls() {\n // IE doesn't support input event, so we fallback to change\n const inputEvent = browser.isIE ? 'change' : 'input';\n\n // Run default and custom handlers\n const proxy = (event, defaultHandler, customHandlerKey) => {\n const customHandler = this.player.config.listeners[customHandlerKey];\n const hasCustomHandler = utils.is.function(customHandler);\n let returned = true;\n\n // Execute custom handler\n if (hasCustomHandler) {\n returned = customHandler.call(this.player, event);\n }\n\n // Only call default handler if not prevented in custom handler\n if (returned && utils.is.function(defaultHandler)) {\n defaultHandler.call(this.player, event);\n }\n };\n\n // Trigger custom and default handlers\n const on = (element, type, defaultHandler, customHandlerKey, passive = true) => {\n const customHandler = this.player.config.listeners[customHandlerKey];\n const hasCustomHandler = utils.is.function(customHandler);\n\n utils.on(element, type, event => proxy(event, defaultHandler, customHandlerKey), passive && !hasCustomHandler);\n };\n\n // Play/pause toggle\n on(this.player.elements.buttons.play, 'click', this.player.togglePlay, 'play');\n\n // Pause\n on(this.player.elements.buttons.restart, 'click', this.player.restart, 'restart');\n\n // Rewind\n on(this.player.elements.buttons.rewind, 'click', this.player.rewind, 'rewind');\n\n // Rewind\n on(this.player.elements.buttons.fastForward, 'click', this.player.forward, 'fastForward');\n\n // Mute toggle\n on(\n this.player.elements.buttons.mute,\n 'click',\n () => {\n this.player.muted = !this.player.muted;\n },\n 'mute',\n );\n\n // Captions toggle\n on(this.player.elements.buttons.captions, 'click', this.player.toggleCaptions);\n\n // Fullscreen toggle\n on(\n this.player.elements.buttons.fullscreen,\n 'click',\n () => {\n this.player.fullscreen.toggle();\n },\n 'fullscreen',\n );\n\n // Picture-in-Picture\n on(\n this.player.elements.buttons.pip,\n 'click',\n () => {\n this.player.pip = 'toggle';\n },\n 'pip',\n );\n\n // Airplay\n on(this.player.elements.buttons.airplay, 'click', this.player.airplay, 'airplay');\n\n // Settings menu\n on(this.player.elements.buttons.settings, 'click', event => {\n controls.toggleMenu.call(this.player, event);\n });\n\n // Settings menu\n on(this.player.elements.settings.form, 'click', event => {\n event.stopPropagation();\n\n // Go back to home tab on click\n const showHomeTab = () => {\n const id = `plyr-settings-${this.player.id}-home`;\n controls.showTab.call(this.player, id);\n };\n\n // Settings menu items - use event delegation as items are added/removed\n if (utils.matches(event.target, this.player.config.selectors.inputs.language)) {\n proxy(\n event,\n () => {\n this.player.currentTrack = Number(event.target.value);\n showHomeTab();\n },\n 'language',\n );\n } else if (utils.matches(event.target, this.player.config.selectors.inputs.quality)) {\n proxy(\n event,\n () => {\n this.player.quality = event.target.value;\n showHomeTab();\n },\n 'quality',\n );\n } else if (utils.matches(event.target, this.player.config.selectors.inputs.speed)) {\n proxy(\n event,\n () => {\n this.player.speed = parseFloat(event.target.value);\n showHomeTab();\n },\n 'speed',\n );\n } else {\n const tab = event.target;\n controls.showTab.call(this.player, tab.getAttribute('aria-controls'));\n }\n });\n\n // Set range input alternative \"value\", which matches the tooltip time (#954)\n on(this.player.elements.inputs.seek, 'mousedown mousemove', event => {\n const clientRect = this.player.elements.progress.getBoundingClientRect();\n const percent = 100 / clientRect.width * (event.pageX - clientRect.left);\n event.currentTarget.setAttribute('seek-value', percent);\n });\n\n // Pause while seeking\n on(this.player.elements.inputs.seek, 'mousedown mouseup keydown keyup touchstart touchend', event => {\n const seek = event.currentTarget;\n\n const code = event.keyCode ? event.keyCode : event.which;\n const eventType = event.type;\n\n if ((eventType === 'keydown' || eventType === 'keyup') && (code !== 39 && code !== 37)) {\n return;\n }\n // Was playing before?\n const play = seek.hasAttribute('play-on-seeked');\n\n // Done seeking\n const done = [\n 'mouseup',\n 'touchend',\n 'keyup',\n ].includes(event.type);\n\n // If we're done seeking and it was playing, resume playback\n if (play && done) {\n seek.removeAttribute('play-on-seeked');\n this.player.play();\n } else if (!done && this.player.playing) {\n seek.setAttribute('play-on-seeked', '');\n this.player.pause();\n }\n });\n\n // Seek\n on(\n this.player.elements.inputs.seek,\n inputEvent,\n event => {\n const seek = event.currentTarget;\n\n // If it exists, use seek-value instead of \"value\" for consistency with tooltip time (#954)\n let seekTo = seek.getAttribute('seek-value');\n\n if (utils.is.empty(seekTo)) {\n seekTo = seek.value;\n }\n\n seek.removeAttribute('seek-value');\n\n this.player.currentTime = seekTo / seek.max * this.player.duration;\n },\n 'seek',\n );\n\n // Current time invert\n // Only if one time element is used for both currentTime and duration\n if (this.player.config.toggleInvert && !utils.is.element(this.player.elements.display.duration)) {\n on(this.player.elements.display.currentTime, 'click', () => {\n // Do nothing if we're at the start\n if (this.player.currentTime === 0) {\n return;\n }\n\n this.player.config.invertTime = !this.player.config.invertTime;\n\n controls.timeUpdate.call(this.player);\n });\n }\n\n // Volume\n on(\n this.player.elements.inputs.volume,\n inputEvent,\n event => {\n this.player.volume = event.target.value;\n },\n 'volume',\n );\n\n // Polyfill for lower fill in <input type=\"range\"> for webkit\n if (browser.isWebkit) {\n on(utils.getElements.call(this.player, 'input[type=\"range\"]'), 'input', event => {\n controls.updateRangeFill.call(this.player, event.target);\n });\n }\n\n // Seek tooltip\n on(this.player.elements.progress, 'mouseenter mouseleave mousemove', event => controls.updateSeekTooltip.call(this.player, event));\n\n // Update controls.hover state (used for ui.toggleControls to avoid hiding when interacting)\n on(this.player.elements.controls, 'mouseenter mouseleave', event => {\n this.player.elements.controls.hover = !this.player.touch && event.type === 'mouseenter';\n });\n\n // Update controls.pressed state (used for ui.toggleControls to avoid hiding when interacting)\n on(this.player.elements.controls, 'mousedown mouseup touchstart touchend touchcancel', event => {\n this.player.elements.controls.pressed = [\n 'mousedown',\n 'touchstart',\n ].includes(event.type);\n });\n\n // Focus in/out on controls\n on(this.player.elements.controls, 'focusin focusout', event => {\n const { config, elements, timers } = this.player;\n\n // Skip transition to prevent focus from scrolling the parent element\n utils.toggleClass(elements.controls, config.classNames.noTransition, event.type === 'focusin');\n\n // Toggle\n ui.toggleControls.call(this.player, event.type === 'focusin');\n\n // If focusin, hide again after delay\n if (event.type === 'focusin') {\n // Restore transition\n setTimeout(() => {\n utils.toggleClass(elements.controls, config.classNames.noTransition, false);\n }, 0);\n\n // Delay a little more for keyboard users\n const delay = this.touch ? 3000 : 4000;\n\n // Clear timer\n clearTimeout(timers.controls);\n // Hide\n timers.controls = setTimeout(() => ui.toggleControls.call(this.player, false), delay);\n }\n });\n\n // Mouse wheel for volume\n on(\n this.player.elements.inputs.volume,\n 'wheel',\n event => {\n // Detect \"natural\" scroll - suppored on OS X Safari only\n // Other browsers on OS X will be inverted until support improves\n const inverted = event.webkitDirectionInvertedFromDevice;\n const step = 1 / 50;\n let direction = 0;\n\n // Scroll down (or up on natural) to decrease\n if (event.deltaY < 0 || event.deltaX > 0) {\n if (inverted) {\n this.player.decreaseVolume(step);\n direction = -1;\n } else {\n this.player.increaseVolume(step);\n direction = 1;\n }\n }\n\n // Scroll up (or down on natural) to increase\n if (event.deltaY > 0 || event.deltaX < 0) {\n if (inverted) {\n this.player.increaseVolume(step);\n direction = 1;\n } else {\n this.player.decreaseVolume(step);\n direction = -1;\n }\n }\n\n // Don't break page scrolling at max and min\n if ((direction === 1 && this.player.media.volume < 1) || (direction === -1 && this.player.media.volume > 0)) {\n event.preventDefault();\n }\n },\n 'volume',\n false,\n );\n }\n\n // Reset on destroy\n clear() {\n this.global(false);\n }\n}\n\nexport default Listeners;\n","// ==========================================================================\n// Vimeo plugin\n// ==========================================================================\n\nimport captions from './../captions';\nimport controls from './../controls';\nimport ui from './../ui';\nimport utils from './../utils';\n\n// Set playback state and trigger change (only on actual change)\nfunction assurePlaybackState(play) {\n if (play && !this.embed.hasPlayed) {\n this.embed.hasPlayed = true;\n }\n if (this.media.paused === play) {\n this.media.paused = !play;\n utils.dispatchEvent.call(this, this.media, play ? 'play' : 'pause');\n }\n}\n\nconst vimeo = {\n setup() {\n // Add embed class for responsive\n utils.toggleClass(this.elements.wrapper, this.config.classNames.embed, true);\n\n // Set intial ratio\n vimeo.setAspectRatio.call(this);\n\n // Load the API if not already\n if (!utils.is.object(window.Vimeo)) {\n utils\n .loadScript(this.config.urls.vimeo.sdk)\n .then(() => {\n vimeo.ready.call(this);\n })\n .catch(error => {\n this.debug.warn('Vimeo API failed to load', error);\n });\n } else {\n vimeo.ready.call(this);\n }\n },\n\n // Set aspect ratio\n // For Vimeo we have an extra 300% height <div> to hide the standard controls and UI\n setAspectRatio(input) {\n const ratio = utils.is.string(input) ? input.split(':') : this.config.ratio.split(':');\n const padding = 100 / ratio[0] * ratio[1];\n this.elements.wrapper.style.paddingBottom = `${padding}%`;\n\n if (this.supported.ui) {\n const height = 240;\n const offset = (height - padding) / (height / 50);\n\n this.media.style.transform = `translateY(-${offset}%)`;\n }\n },\n\n // API Ready\n ready() {\n const player = this;\n\n // Get Vimeo params for the iframe\n const options = {\n loop: player.config.loop.active,\n autoplay: player.autoplay,\n // muted: player.muted,\n byline: false,\n portrait: false,\n title: false,\n speed: true,\n transparent: 0,\n gesture: 'media',\n playsinline: !this.config.fullscreen.iosNative,\n };\n const params = utils.buildUrlParams(options);\n\n // Get the source URL or ID\n let source = player.media.getAttribute('src');\n\n // Get from <div> if needed\n if (utils.is.empty(source)) {\n source = player.media.getAttribute(player.config.attributes.embed.id);\n }\n\n const id = utils.parseVimeoId(source);\n\n // Build an iframe\n const iframe = utils.createElement('iframe');\n const src = utils.format(player.config.urls.vimeo.iframe, id, params);\n iframe.setAttribute('src', src);\n iframe.setAttribute('allowfullscreen', '');\n iframe.setAttribute('allowtransparency', '');\n iframe.setAttribute('allow', 'autoplay');\n\n // Inject the package\n const wrapper = utils.createElement('div', { class: player.config.classNames.embedContainer });\n wrapper.appendChild(iframe);\n player.media = utils.replaceElement(wrapper, player.media);\n\n // Get poster image\n utils.fetch(utils.format(player.config.urls.vimeo.api, id), 'json').then(response => {\n if (utils.is.empty(response)) {\n return;\n }\n\n // Get the URL for thumbnail\n const url = new URL(response[0].thumbnail_large);\n\n // Get original image\n url.pathname = `${url.pathname.split('_')[0]}.jpg`;\n\n // Set and show poster\n ui.setPoster.call(player, url.href);\n });\n\n // Setup instance\n // https://github.com/vimeo/player.js\n player.embed = new window.Vimeo.Player(iframe, {\n autopause: player.config.autopause,\n muted: player.muted,\n });\n\n player.media.paused = true;\n player.media.currentTime = 0;\n\n // Disable native text track rendering\n if (player.supported.ui) {\n player.embed.disableTextTrack();\n }\n\n // Create a faux HTML5 API using the Vimeo API\n player.media.play = () => {\n assurePlaybackState.call(player, true);\n return player.embed.play();\n };\n\n player.media.pause = () => {\n assurePlaybackState.call(player, false);\n return player.embed.pause();\n };\n\n player.media.stop = () => {\n player.pause();\n player.currentTime = 0;\n };\n\n // Seeking\n let { currentTime } = player.media;\n Object.defineProperty(player.media, 'currentTime', {\n get() {\n return currentTime;\n },\n set(time) {\n // Vimeo will automatically play on seek if the video hasn't been played before\n\n // Get current paused state and volume etc\n const { embed, media, paused, volume } = player;\n const restorePause = paused && !embed.hasPlayed;\n\n // Set seeking state and trigger event\n media.seeking = true;\n utils.dispatchEvent.call(player, media, 'seeking');\n\n // If paused, mute until seek is complete\n Promise.resolve(restorePause && embed.setVolume(0))\n // Seek\n .then(() => embed.setCurrentTime(time))\n // Restore paused\n .then(() => restorePause && embed.pause())\n // Restore volume\n .then(() => restorePause && embed.setVolume(volume))\n .catch(() => {\n // Do nothing\n });\n },\n });\n\n // Playback speed\n let speed = player.config.speed.selected;\n Object.defineProperty(player.media, 'playbackRate', {\n get() {\n return speed;\n },\n set(input) {\n player.embed\n .setPlaybackRate(input)\n .then(() => {\n speed = input;\n utils.dispatchEvent.call(player, player.media, 'ratechange');\n })\n .catch(error => {\n // Hide menu item (and menu if empty)\n if (error.name === 'Error') {\n controls.setSpeedMenu.call(player, []);\n }\n });\n },\n });\n\n // Volume\n let { volume } = player.config;\n Object.defineProperty(player.media, 'volume', {\n get() {\n return volume;\n },\n set(input) {\n player.embed.setVolume(input).then(() => {\n volume = input;\n utils.dispatchEvent.call(player, player.media, 'volumechange');\n });\n },\n });\n\n // Muted\n let { muted } = player.config;\n Object.defineProperty(player.media, 'muted', {\n get() {\n return muted;\n },\n set(input) {\n const toggle = utils.is.boolean(input) ? input : false;\n\n player.embed.setVolume(toggle ? 0 : player.config.volume).then(() => {\n muted = toggle;\n utils.dispatchEvent.call(player, player.media, 'volumechange');\n });\n },\n });\n\n // Loop\n let { loop } = player.config;\n Object.defineProperty(player.media, 'loop', {\n get() {\n return loop;\n },\n set(input) {\n const toggle = utils.is.boolean(input) ? input : player.config.loop.active;\n\n player.embed.setLoop(toggle).then(() => {\n loop = toggle;\n });\n },\n });\n\n // Source\n let currentSrc;\n player.embed\n .getVideoUrl()\n .then(value => {\n currentSrc = value;\n })\n .catch(error => {\n this.debug.warn(error);\n });\n\n Object.defineProperty(player.media, 'currentSrc', {\n get() {\n return currentSrc;\n },\n });\n\n // Ended\n Object.defineProperty(player.media, 'ended', {\n get() {\n return player.currentTime === player.duration;\n },\n });\n\n // Set aspect ratio based on video size\n Promise.all([\n player.embed.getVideoWidth(),\n player.embed.getVideoHeight(),\n ]).then(dimensions => {\n const ratio = utils.getAspectRatio(dimensions[0], dimensions[1]);\n vimeo.setAspectRatio.call(this, ratio);\n });\n\n // Set autopause\n player.embed.setAutopause(player.config.autopause).then(state => {\n player.config.autopause = state;\n });\n\n // Get title\n player.embed.getVideoTitle().then(title => {\n player.config.title = title;\n ui.setTitle.call(this);\n });\n\n // Get current time\n player.embed.getCurrentTime().then(value => {\n currentTime = value;\n utils.dispatchEvent.call(player, player.media, 'timeupdate');\n });\n\n // Get duration\n player.embed.getDuration().then(value => {\n player.media.duration = value;\n utils.dispatchEvent.call(player, player.media, 'durationchange');\n });\n\n // Get captions\n player.embed.getTextTracks().then(tracks => {\n player.media.textTracks = tracks;\n captions.setup.call(player);\n });\n\n player.embed.on('cuechange', ({ cues = [] }) => {\n const strippedCues = cues.map(cue => utils.stripHTML(cue.text));\n captions.updateCues.call(player, strippedCues);\n });\n\n player.embed.on('loaded', () => {\n // Assure state and events are updated on autoplay\n player.embed.getPaused().then(paused => {\n assurePlaybackState.call(player, !paused);\n if (!paused) {\n utils.dispatchEvent.call(player, player.media, 'playing');\n }\n });\n\n if (utils.is.element(player.embed.element) && player.supported.ui) {\n const frame = player.embed.element;\n\n // Fix keyboard focus issues\n // https://github.com/sampotts/plyr/issues/317\n frame.setAttribute('tabindex', -1);\n }\n });\n\n player.embed.on('play', () => {\n assurePlaybackState.call(player, true);\n utils.dispatchEvent.call(player, player.media, 'playing');\n });\n\n player.embed.on('pause', () => {\n assurePlaybackState.call(player, false);\n });\n\n player.embed.on('timeupdate', data => {\n player.media.seeking = false;\n currentTime = data.seconds;\n utils.dispatchEvent.call(player, player.media, 'timeupdate');\n });\n\n player.embed.on('progress', data => {\n player.media.buffered = data.percent;\n utils.dispatchEvent.call(player, player.media, 'progress');\n\n // Check all loaded\n if (parseInt(data.percent, 10) === 1) {\n utils.dispatchEvent.call(player, player.media, 'canplaythrough');\n }\n\n // Get duration as if we do it before load, it gives an incorrect value\n // https://github.com/sampotts/plyr/issues/891\n player.embed.getDuration().then(value => {\n if (value !== player.media.duration) {\n player.media.duration = value;\n utils.dispatchEvent.call(player, player.media, 'durationchange');\n }\n });\n });\n\n player.embed.on('seeked', () => {\n player.media.seeking = false;\n utils.dispatchEvent.call(player, player.media, 'seeked');\n });\n\n player.embed.on('ended', () => {\n player.media.paused = true;\n utils.dispatchEvent.call(player, player.media, 'ended');\n });\n\n player.embed.on('error', detail => {\n player.media.error = detail;\n utils.dispatchEvent.call(player, player.media, 'error');\n });\n\n // Rebuild UI\n setTimeout(() => ui.build.call(player), 0);\n },\n};\n\nexport default vimeo;\n","// ==========================================================================\n// YouTube plugin\n// ==========================================================================\n\nimport controls from './../controls';\nimport ui from './../ui';\nimport utils from './../utils';\n\n// Standardise YouTube quality unit\nfunction mapQualityUnit(input) {\n switch (input) {\n case 'hd2160':\n return 2160;\n\n case 2160:\n return 'hd2160';\n\n case 'hd1440':\n return 1440;\n\n case 1440:\n return 'hd1440';\n\n case 'hd1080':\n return 1080;\n\n case 1080:\n return 'hd1080';\n\n case 'hd720':\n return 720;\n\n case 720:\n return 'hd720';\n\n case 'large':\n return 480;\n\n case 480:\n return 'large';\n\n case 'medium':\n return 360;\n\n case 360:\n return 'medium';\n\n case 'small':\n return 240;\n\n case 240:\n return 'small';\n\n default:\n return 'default';\n }\n}\n\nfunction mapQualityUnits(levels) {\n if (utils.is.empty(levels)) {\n return levels;\n }\n\n return utils.dedupe(levels.map(level => mapQualityUnit(level)));\n}\n\n// Set playback state and trigger change (only on actual change)\nfunction assurePlaybackState(play) {\n if (play && !this.embed.hasPlayed) {\n this.embed.hasPlayed = true;\n }\n if (this.media.paused === play) {\n this.media.paused = !play;\n utils.dispatchEvent.call(this, this.media, play ? 'play' : 'pause');\n }\n}\n\nconst youtube = {\n setup() {\n // Add embed class for responsive\n utils.toggleClass(this.elements.wrapper, this.config.classNames.embed, true);\n\n // Set aspect ratio\n youtube.setAspectRatio.call(this);\n\n // Setup API\n if (utils.is.object(window.YT) && utils.is.function(window.YT.Player)) {\n youtube.ready.call(this);\n } else {\n // Load the API\n utils.loadScript(this.config.urls.youtube.sdk).catch(error => {\n this.debug.warn('YouTube API failed to load', error);\n });\n\n // Setup callback for the API\n // YouTube has it's own system of course...\n window.onYouTubeReadyCallbacks = window.onYouTubeReadyCallbacks || [];\n\n // Add to queue\n window.onYouTubeReadyCallbacks.push(() => {\n youtube.ready.call(this);\n });\n\n // Set callback to process queue\n window.onYouTubeIframeAPIReady = () => {\n window.onYouTubeReadyCallbacks.forEach(callback => {\n callback();\n });\n };\n }\n },\n\n // Get the media title\n getTitle(videoId) {\n // Try via undocumented API method first\n // This method disappears now and then though...\n // https://github.com/sampotts/plyr/issues/709\n if (utils.is.function(this.embed.getVideoData)) {\n const { title } = this.embed.getVideoData();\n\n if (utils.is.empty(title)) {\n this.config.title = title;\n ui.setTitle.call(this);\n return;\n }\n }\n\n // Or via Google API\n const key = this.config.keys.google;\n if (utils.is.string(key) && !utils.is.empty(key)) {\n const url = utils.format(this.config.urls.youtube.api, videoId, key);\n\n utils\n .fetch(url)\n .then(result => {\n if (utils.is.object(result)) {\n this.config.title = result.items[0].snippet.title;\n ui.setTitle.call(this);\n }\n })\n .catch(() => {});\n }\n },\n\n // Set aspect ratio\n setAspectRatio() {\n const ratio = this.config.ratio.split(':');\n this.elements.wrapper.style.paddingBottom = `${100 / ratio[0] * ratio[1]}%`;\n },\n\n // API ready\n ready() {\n const player = this;\n\n // Ignore already setup (race condition)\n const currentId = player.media.getAttribute('id');\n if (!utils.is.empty(currentId) && currentId.startsWith('youtube-')) {\n return;\n }\n\n // Get the source URL or ID\n let source = player.media.getAttribute('src');\n\n // Get from <div> if needed\n if (utils.is.empty(source)) {\n source = player.media.getAttribute(this.config.attributes.embed.id);\n }\n\n // Replace the <iframe> with a <div> due to YouTube API issues\n const videoId = utils.parseYouTubeId(source);\n const id = utils.generateId(player.provider);\n const container = utils.createElement('div', { id });\n player.media = utils.replaceElement(container, player.media);\n\n // Set poster image\n const posterSrc = format => `https://img.youtube.com/vi/${videoId}/${format}default.jpg`;\n\n // Check thumbnail images in order of quality, but reject fallback thumbnails (120px wide)\n utils.loadImage(posterSrc('maxres'), 121) // Higest quality and unpadded\n .catch(() => utils.loadImage(posterSrc('sd'), 121)) // 480p padded 4:3\n .catch(() => utils.loadImage(posterSrc('hq'))) // 360p padded 4:3. Always exists\n .then(image => ui.setPoster.call(player, image.src))\n .then(posterSrc => {\n // If the image is padded, use background-size \"cover\" instead (like youtube does too with their posters)\n if (!posterSrc.includes('maxres')) {\n player.elements.poster.style.backgroundSize = 'cover';\n }\n });\n\n // Setup instance\n // https://developers.google.com/youtube/iframe_api_reference\n player.embed = new window.YT.Player(id, {\n videoId,\n playerVars: {\n autoplay: player.config.autoplay ? 1 : 0, // Autoplay\n controls: player.supported.ui ? 0 : 1, // Only show controls if not fully supported\n rel: 0, // No related vids\n showinfo: 0, // Hide info\n iv_load_policy: 3, // Hide annotations\n modestbranding: 1, // Hide logos as much as possible (they still show one in the corner when paused)\n disablekb: 1, // Disable keyboard as we handle it\n playsinline: 1, // Allow iOS inline playback\n\n // Tracking for stats\n // origin: window ? `${window.location.protocol}//${window.location.host}` : null,\n widget_referrer: window ? window.location.href : null,\n\n // Captions are flaky on YouTube\n cc_load_policy: player.captions.active ? 1 : 0,\n cc_lang_pref: player.config.captions.language,\n },\n events: {\n onError(event) {\n // If we've already fired an error, don't do it again\n // YouTube fires onError twice\n if (utils.is.object(player.media.error)) {\n return;\n }\n\n const detail = {\n code: event.data,\n };\n\n // Messages copied from https://developers.google.com/youtube/iframe_api_reference#onError\n switch (event.data) {\n case 2:\n detail.message =\n 'The request contains an invalid parameter value. For example, this error occurs if you specify a video ID that does not have 11 characters, or if the video ID contains invalid characters, such as exclamation points or asterisks.';\n break;\n\n case 5:\n detail.message =\n 'The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.';\n break;\n\n case 100:\n detail.message =\n 'The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.';\n break;\n\n case 101:\n case 150:\n detail.message = 'The owner of the requested video does not allow it to be played in embedded players.';\n break;\n\n default:\n detail.message = 'An unknown error occured';\n break;\n }\n\n player.media.error = detail;\n\n utils.dispatchEvent.call(player, player.media, 'error');\n },\n onPlaybackQualityChange() {\n utils.dispatchEvent.call(player, player.media, 'qualitychange', false, {\n quality: player.media.quality,\n });\n },\n onPlaybackRateChange(event) {\n // Get the instance\n const instance = event.target;\n\n // Get current speed\n player.media.playbackRate = instance.getPlaybackRate();\n\n utils.dispatchEvent.call(player, player.media, 'ratechange');\n },\n onReady(event) {\n // Get the instance\n const instance = event.target;\n\n // Get the title\n youtube.getTitle.call(player, videoId);\n\n // Create a faux HTML5 API using the YouTube API\n player.media.play = () => {\n assurePlaybackState.call(player, true);\n instance.playVideo();\n };\n\n player.media.pause = () => {\n assurePlaybackState.call(player, false);\n instance.pauseVideo();\n };\n\n player.media.stop = () => {\n instance.stopVideo();\n };\n\n player.media.duration = instance.getDuration();\n player.media.paused = true;\n\n // Seeking\n player.media.currentTime = 0;\n Object.defineProperty(player.media, 'currentTime', {\n get() {\n return Number(instance.getCurrentTime());\n },\n set(time) {\n // If paused, mute audio preventively (YouTube starts playing on seek if the video hasn't been played yet).\n if (player.paused) {\n player.embed.mute();\n }\n\n // Set seeking state and trigger event\n player.media.seeking = true;\n utils.dispatchEvent.call(player, player.media, 'seeking');\n\n // Seek after events sent\n instance.seekTo(time);\n },\n });\n\n // Playback speed\n Object.defineProperty(player.media, 'playbackRate', {\n get() {\n return instance.getPlaybackRate();\n },\n set(input) {\n instance.setPlaybackRate(input);\n },\n });\n\n // Quality\n Object.defineProperty(player.media, 'quality', {\n get() {\n return mapQualityUnit(instance.getPlaybackQuality());\n },\n set(input) {\n const quality = input;\n\n // Set via API\n instance.setPlaybackQuality(mapQualityUnit(quality));\n\n // Trigger request event\n utils.dispatchEvent.call(player, player.media, 'qualityrequested', false, {\n quality,\n });\n },\n });\n\n // Volume\n let { volume } = player.config;\n Object.defineProperty(player.media, 'volume', {\n get() {\n return volume;\n },\n set(input) {\n volume = input;\n instance.setVolume(volume * 100);\n utils.dispatchEvent.call(player, player.media, 'volumechange');\n },\n });\n\n // Muted\n let { muted } = player.config;\n Object.defineProperty(player.media, 'muted', {\n get() {\n return muted;\n },\n set(input) {\n const toggle = utils.is.boolean(input) ? input : muted;\n muted = toggle;\n instance[toggle ? 'mute' : 'unMute']();\n utils.dispatchEvent.call(player, player.media, 'volumechange');\n },\n });\n\n // Source\n Object.defineProperty(player.media, 'currentSrc', {\n get() {\n return instance.getVideoUrl();\n },\n });\n\n // Ended\n Object.defineProperty(player.media, 'ended', {\n get() {\n return player.currentTime === player.duration;\n },\n });\n\n // Get available speeds\n player.options.speed = instance.getAvailablePlaybackRates();\n\n // Set the tabindex to avoid focus entering iframe\n if (player.supported.ui) {\n player.media.setAttribute('tabindex', -1);\n }\n\n utils.dispatchEvent.call(player, player.media, 'timeupdate');\n utils.dispatchEvent.call(player, player.media, 'durationchange');\n\n // Reset timer\n clearInterval(player.timers.buffering);\n\n // Setup buffering\n player.timers.buffering = setInterval(() => {\n // Get loaded % from YouTube\n player.media.buffered = instance.getVideoLoadedFraction();\n\n // Trigger progress only when we actually buffer something\n if (player.media.lastBuffered === null || player.media.lastBuffered < player.media.buffered) {\n utils.dispatchEvent.call(player, player.media, 'progress');\n }\n\n // Set last buffer point\n player.media.lastBuffered = player.media.buffered;\n\n // Bail if we're at 100%\n if (player.media.buffered === 1) {\n clearInterval(player.timers.buffering);\n\n // Trigger event\n utils.dispatchEvent.call(player, player.media, 'canplaythrough');\n }\n }, 200);\n\n // Rebuild UI\n setTimeout(() => ui.build.call(player), 50);\n },\n onStateChange(event) {\n // Get the instance\n const instance = event.target;\n\n // Reset timer\n clearInterval(player.timers.playing);\n\n const seeked = player.media.seeking && [\n 1,\n 2,\n ].includes(event.data);\n\n if (seeked) {\n // Unset seeking and fire seeked event\n player.media.seeking = false;\n utils.dispatchEvent.call(player, player.media, 'seeked');\n }\n\n // Handle events\n // -1 Unstarted\n // 0 Ended\n // 1 Playing\n // 2 Paused\n // 3 Buffering\n // 5 Video cued\n switch (event.data) {\n case -1:\n // Update scrubber\n utils.dispatchEvent.call(player, player.media, 'timeupdate');\n\n // Get loaded % from YouTube\n player.media.buffered = instance.getVideoLoadedFraction();\n utils.dispatchEvent.call(player, player.media, 'progress');\n\n break;\n\n case 0:\n assurePlaybackState.call(player, false);\n\n // YouTube doesn't support loop for a single video, so mimick it.\n if (player.media.loop) {\n // YouTube needs a call to `stopVideo` before playing again\n instance.stopVideo();\n instance.playVideo();\n } else {\n utils.dispatchEvent.call(player, player.media, 'ended');\n }\n\n break;\n\n case 1:\n // Restore paused state (YouTube starts playing on seek if the video hasn't been played yet)\n if (player.media.paused && !player.embed.hasPlayed) {\n player.media.pause();\n } else {\n assurePlaybackState.call(player, true);\n\n utils.dispatchEvent.call(player, player.media, 'playing');\n\n // Poll to get playback progress\n player.timers.playing = setInterval(() => {\n utils.dispatchEvent.call(player, player.media, 'timeupdate');\n }, 50);\n\n // Check duration again due to YouTube bug\n // https://github.com/sampotts/plyr/issues/374\n // https://code.google.com/p/gdata-issues/issues/detail?id=8690\n if (player.media.duration !== instance.getDuration()) {\n player.media.duration = instance.getDuration();\n utils.dispatchEvent.call(player, player.media, 'durationchange');\n }\n\n // Get quality\n controls.setQualityMenu.call(player, mapQualityUnits(instance.getAvailableQualityLevels()));\n }\n\n break;\n\n case 2:\n // Restore audio (YouTube starts playing on seek if the video hasn't been played yet)\n if (!player.muted) {\n player.embed.unMute();\n }\n assurePlaybackState.call(player, false);\n\n break;\n\n default:\n break;\n }\n\n utils.dispatchEvent.call(player, player.elements.container, 'statechange', false, {\n code: event.data,\n });\n },\n },\n });\n },\n};\n\nexport default youtube;\n","// ==========================================================================\n// Plyr Media\n// ==========================================================================\n\nimport html5 from './html5';\nimport vimeo from './plugins/vimeo';\nimport youtube from './plugins/youtube';\nimport utils from './utils';\n\nconst media = {\n // Setup media\n setup() {\n // If there's no media, bail\n if (!this.media) {\n this.debug.warn('No media element found!');\n return;\n }\n\n // Add type class\n utils.toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', this.type), true);\n\n // Add provider class\n utils.toggleClass(this.elements.container, this.config.classNames.provider.replace('{0}', this.provider), true);\n\n // Add video class for embeds\n // This will require changes if audio embeds are added\n if (this.isEmbed) {\n utils.toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', 'video'), true);\n }\n\n // Inject the player wrapper\n if (this.isVideo) {\n // Create the wrapper div\n this.elements.wrapper = utils.createElement('div', {\n class: this.config.classNames.video,\n });\n\n // Wrap the video in a container\n utils.wrap(this.media, this.elements.wrapper);\n\n // Faux poster container\n this.elements.poster = utils.createElement('div', {\n class: this.config.classNames.poster,\n });\n\n this.elements.wrapper.appendChild(this.elements.poster);\n }\n\n if (this.isEmbed) {\n switch (this.provider) {\n case 'youtube':\n youtube.setup.call(this);\n break;\n\n case 'vimeo':\n vimeo.setup.call(this);\n break;\n\n default:\n break;\n }\n } else if (this.isHTML5) {\n html5.extend.call(this);\n }\n },\n};\n\nexport default media;\n","// ==========================================================================\n// Advertisement plugin using Google IMA HTML5 SDK\n// Create an account with our ad partner, vi here:\n// https://www.vi.ai/publisher-video-monetization/\n// ==========================================================================\n\n/* global google */\n\nimport i18n from '../i18n';\nimport utils from '../utils';\n\nclass Ads {\n /**\n * Ads constructor.\n * @param {object} player\n * @return {Ads}\n */\n constructor(player) {\n this.player = player;\n this.publisherId = player.config.ads.publisherId;\n this.playing = false;\n this.initialized = false;\n this.elements = {\n container: null,\n displayContainer: null,\n };\n this.manager = null;\n this.loader = null;\n this.cuePoints = null;\n this.events = {};\n this.safetyTimer = null;\n this.countdownTimer = null;\n\n // Setup a promise to resolve when the IMA manager is ready\n this.managerPromise = new Promise((resolve, reject) => {\n // The ad is loaded and ready\n this.on('loaded', resolve);\n\n // Ads failed\n this.on('error', reject);\n });\n\n this.load();\n }\n\n get enabled() {\n return this.player.isVideo && this.player.config.ads.enabled && !utils.is.empty(this.publisherId);\n }\n\n /**\n * Load the IMA SDK\n */\n load() {\n if (this.enabled) {\n // Check if the Google IMA3 SDK is loaded or load it ourselves\n if (!utils.is.object(window.google) || !utils.is.object(window.google.ima)) {\n utils\n .loadScript(this.player.config.urls.googleIMA.sdk)\n .then(() => {\n this.ready();\n })\n .catch(() => {\n // Script failed to load or is blocked\n this.trigger('error', new Error('Google IMA SDK failed to load'));\n });\n } else {\n this.ready();\n }\n }\n }\n\n /**\n * Get the ads instance ready\n */\n ready() {\n // Start ticking our safety timer. If the whole advertisement\n // thing doesn't resolve within our set time; we bail\n this.startSafetyTimer(12000, 'ready()');\n\n // Clear the safety timer\n this.managerPromise.then(() => {\n this.clearSafetyTimer('onAdsManagerLoaded()');\n });\n\n // Set listeners on the Plyr instance\n this.listeners();\n\n // Setup the IMA SDK\n this.setupIMA();\n }\n\n // Build the default tag URL\n get tagUrl() {\n const params = {\n AV_PUBLISHERID: '58c25bb0073ef448b1087ad6',\n AV_CHANNELID: '5a0458dc28a06145e4519d21',\n AV_URL: location.hostname,\n cb: Date.now(),\n AV_WIDTH: 640,\n AV_HEIGHT: 480,\n AV_CDIM2: this.publisherId,\n };\n\n const base = 'https://go.aniview.com/api/adserver6/vast/';\n\n return `${base}?${utils.buildUrlParams(params)}`;\n }\n\n /**\n * In order for the SDK to display ads for our video, we need to tell it where to put them,\n * so here we define our ad container. This div is set up to render on top of the video player.\n * Using the code below, we tell the SDK to render ads within that div. We also provide a\n * handle to the content video player - the SDK will poll the current time of our player to\n * properly place mid-rolls. After we create the ad display container, we initialize it. On\n * mobile devices, this initialization is done as the result of a user action.\n */\n setupIMA() {\n // Create the container for our advertisements\n this.elements.container = utils.createElement('div', {\n class: this.player.config.classNames.ads,\n });\n this.player.elements.container.appendChild(this.elements.container);\n\n // So we can run VPAID2\n google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED);\n\n // Set language\n google.ima.settings.setLocale(this.player.config.ads.language);\n\n // We assume the adContainer is the video container of the plyr element\n // that will house the ads\n this.elements.displayContainer = new google.ima.AdDisplayContainer(this.elements.container);\n\n // Request video ads to be pre-loaded\n this.requestAds();\n }\n\n /**\n * Request advertisements\n */\n requestAds() {\n const { container } = this.player.elements;\n\n try {\n // Create ads loader\n this.loader = new google.ima.AdsLoader(this.elements.displayContainer);\n\n // Listen and respond to ads loaded and error events\n this.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, event => this.onAdsManagerLoaded(event), false);\n this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, error => this.onAdError(error), false);\n\n // Request video ads\n const request = new google.ima.AdsRequest();\n request.adTagUrl = this.tagUrl;\n\n // Specify the linear and nonlinear slot sizes. This helps the SDK\n // to select the correct creative if multiple are returned\n request.linearAdSlotWidth = container.offsetWidth;\n request.linearAdSlotHeight = container.offsetHeight;\n request.nonLinearAdSlotWidth = container.offsetWidth;\n request.nonLinearAdSlotHeight = container.offsetHeight;\n\n // We only overlay ads as we only support video.\n request.forceNonLinearFullSlot = false;\n\n // Mute based on current state\n request.setAdWillPlayMuted(!this.player.muted);\n\n this.loader.requestAds(request);\n } catch (e) {\n this.onAdError(e);\n }\n }\n\n /**\n * Update the ad countdown\n * @param {boolean} start\n */\n pollCountdown(start = false) {\n if (!start) {\n clearInterval(this.countdownTimer);\n this.elements.container.removeAttribute('data-badge-text');\n return;\n }\n\n const update = () => {\n const time = utils.formatTime(Math.max(this.manager.getRemainingTime(), 0));\n const label = `${i18n.get('advertisement', this.player.config)} - ${time}`;\n this.elements.container.setAttribute('data-badge-text', label);\n };\n\n this.countdownTimer = setInterval(update, 100);\n }\n\n /**\n * This method is called whenever the ads are ready inside the AdDisplayContainer\n * @param {Event} adsManagerLoadedEvent\n */\n onAdsManagerLoaded(event) {\n // Get the ads manager\n const settings = new google.ima.AdsRenderingSettings();\n\n // Tell the SDK to save and restore content video state on our behalf\n settings.restoreCustomPlaybackStateOnAdBreakComplete = true;\n settings.enablePreloading = true;\n\n // The SDK is polling currentTime on the contentPlayback. And needs a duration\n // so it can determine when to start the mid- and post-roll\n this.manager = event.getAdsManager(this.player, settings);\n\n // Get the cue points for any mid-rolls by filtering out the pre- and post-roll\n this.cuePoints = this.manager.getCuePoints();\n\n // Add advertisement cue's within the time line if available\n if (!utils.is.empty(this.cuePoints)) {\n this.cuePoints.forEach(cuePoint => {\n if (cuePoint !== 0 && cuePoint !== -1 && cuePoint < this.player.duration) {\n const seekElement = this.player.elements.progress;\n\n if (utils.is.element(seekElement)) {\n const cuePercentage = 100 / this.player.duration * cuePoint;\n const cue = utils.createElement('span', {\n class: this.player.config.classNames.cues,\n });\n\n cue.style.left = `${cuePercentage.toString()}%`;\n seekElement.appendChild(cue);\n }\n }\n });\n }\n\n // Get skippable state\n // TODO: Skip button\n // this.player.debug.warn(this.manager.getAdSkippableState());\n\n // Set volume to match player\n this.manager.setVolume(this.player.volume);\n\n // Add listeners to the required events\n // Advertisement error events\n this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, error => this.onAdError(error));\n\n // Advertisement regular events\n Object.keys(google.ima.AdEvent.Type).forEach(type => {\n this.manager.addEventListener(google.ima.AdEvent.Type[type], event => this.onAdEvent(event));\n });\n\n // Resolve our adsManager\n this.trigger('loaded');\n }\n\n /**\n * This is where all the event handling takes place. Retrieve the ad from the event. Some\n * events (e.g. ALL_ADS_COMPLETED) don't have the ad object associated\n * https://developers.google.com/interactive-media-ads/docs/sdks/html5/v3/apis#ima.AdEvent.Type\n * @param {Event} event\n */\n onAdEvent(event) {\n const { container } = this.player.elements;\n\n // Retrieve the ad from the event. Some events (e.g. ALL_ADS_COMPLETED)\n // don't have ad object associated\n const ad = event.getAd();\n\n // Proxy event\n const dispatchEvent = type => {\n const event = `ads${type.replace(/_/g, '').toLowerCase()}`;\n utils.dispatchEvent.call(this.player, this.player.media, event);\n };\n\n switch (event.type) {\n case google.ima.AdEvent.Type.LOADED:\n // This is the first event sent for an ad - it is possible to determine whether the\n // ad is a video ad or an overlay\n this.trigger('loaded');\n\n // Bubble event\n dispatchEvent(event.type);\n\n // Start countdown\n this.pollCountdown(true);\n\n if (!ad.isLinear()) {\n // Position AdDisplayContainer correctly for overlay\n ad.width = container.offsetWidth;\n ad.height = container.offsetHeight;\n }\n\n // console.info('Ad type: ' + event.getAd().getAdPodInfo().getPodIndex());\n // console.info('Ad time: ' + event.getAd().getAdPodInfo().getTimeOffset());\n break;\n\n case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:\n // All ads for the current videos are done. We can now request new advertisements\n // in case the video is re-played\n\n // Fire event\n dispatchEvent(event.type);\n\n // TODO: Example for what happens when a next video in a playlist would be loaded.\n // So here we load a new video when all ads are done.\n // Then we load new ads within a new adsManager. When the video\n // Is started - after - the ads are loaded, then we get ads.\n // You can also easily test cancelling and reloading by running\n // player.ads.cancel() and player.ads.play from the console I guess.\n // this.player.source = {\n // type: 'video',\n // title: 'View From A Blue Moon',\n // sources: [{\n // src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.mp4', type:\n // 'video/mp4', }], poster:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg', tracks:\n // [ { kind: 'captions', label: 'English', srclang: 'en', src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt',\n // default: true, }, { kind: 'captions', label: 'French', srclang: 'fr', src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt', }, ],\n // };\n\n // TODO: So there is still this thing where a video should only be allowed to start\n // playing when the IMA SDK is ready or has failed\n\n this.loadAds();\n break;\n\n case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:\n // This event indicates the ad has started - the video player can adjust the UI,\n // for example display a pause button and remaining time. Fired when content should\n // be paused. This usually happens right before an ad is about to cover the content\n\n dispatchEvent(event.type);\n\n this.pauseContent();\n\n break;\n\n case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:\n // This event indicates the ad has finished - the video player can perform\n // appropriate UI actions, such as removing the timer for remaining time detection.\n // Fired when content should be resumed. This usually happens when an ad finishes\n // or collapses\n\n dispatchEvent(event.type);\n\n this.pollCountdown();\n\n this.resumeContent();\n\n break;\n\n case google.ima.AdEvent.Type.STARTED:\n case google.ima.AdEvent.Type.MIDPOINT:\n case google.ima.AdEvent.Type.COMPLETE:\n case google.ima.AdEvent.Type.IMPRESSION:\n case google.ima.AdEvent.Type.CLICK:\n dispatchEvent(event.type);\n break;\n\n default:\n break;\n }\n }\n\n /**\n * Any ad error handling comes through here\n * @param {Event} event\n */\n onAdError(event) {\n this.cancel();\n this.player.debug.warn('Ads error', event);\n }\n\n /**\n * Setup hooks for Plyr and window events. This ensures\n * the mid- and post-roll launch at the correct time. And\n * resize the advertisement when the player resizes\n */\n listeners() {\n const { container } = this.player.elements;\n let time;\n\n // Add listeners to the required events\n this.player.on('ended', () => {\n this.loader.contentComplete();\n });\n\n this.player.on('seeking', () => {\n time = this.player.currentTime;\n return time;\n });\n\n this.player.on('seeked', () => {\n const seekedTime = this.player.currentTime;\n\n if (utils.is.empty(this.cuePoints)) {\n return;\n }\n\n this.cuePoints.forEach((cuePoint, index) => {\n if (time < cuePoint && cuePoint < seekedTime) {\n this.manager.discardAdBreak();\n this.cuePoints.splice(index, 1);\n }\n });\n });\n\n // Listen to the resizing of the window. And resize ad accordingly\n // TODO: eventually implement ResizeObserver\n window.addEventListener('resize', () => {\n if (this.manager) {\n this.manager.resize(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);\n }\n });\n }\n\n /**\n * Initialize the adsManager and start playing advertisements\n */\n play() {\n const { container } = this.player.elements;\n\n if (!this.managerPromise) {\n this.resumeContent();\n }\n\n // Play the requested advertisement whenever the adsManager is ready\n this.managerPromise\n .then(() => {\n // Initialize the container. Must be done via a user action on mobile devices\n this.elements.displayContainer.initialize();\n\n try {\n if (!this.initialized) {\n // Initialize the ads manager. Ad rules playlist will start at this time\n this.manager.init(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);\n\n // Call play to start showing the ad. Single video and overlay ads will\n // start at this time; the call will be ignored for ad rules\n this.manager.start();\n }\n\n this.initialized = true;\n } catch (adError) {\n // An error may be thrown if there was a problem with the\n // VAST response\n this.onAdError(adError);\n }\n })\n .catch(() => {});\n }\n\n /**\n * Resume our video\n */\n resumeContent() {\n // Hide the advertisement container\n this.elements.container.style.zIndex = '';\n\n // Ad is stopped\n this.playing = false;\n\n // Play our video\n if (this.player.currentTime < this.player.duration) {\n this.player.play();\n }\n }\n\n /**\n * Pause our video\n */\n pauseContent() {\n // Show the advertisement container\n this.elements.container.style.zIndex = 3;\n\n // Ad is playing.\n this.playing = true;\n\n // Pause our video.\n this.player.pause();\n }\n\n /**\n * Destroy the adsManager so we can grab new ads after this. If we don't then we're not\n * allowed to call new ads based on google policies, as they interpret this as an accidental\n * video requests. https://developers.google.com/interactive-\n * media-ads/docs/sdks/android/faq#8\n */\n cancel() {\n // Pause our video\n if (this.initialized) {\n this.resumeContent();\n }\n\n // Tell our instance that we're done for now\n this.trigger('error');\n\n // Re-create our adsManager\n this.loadAds();\n }\n\n /**\n * Re-create our adsManager\n */\n loadAds() {\n // Tell our adsManager to go bye bye\n this.managerPromise\n .then(() => {\n // Destroy our adsManager\n if (this.manager) {\n this.manager.destroy();\n }\n\n // Re-set our adsManager promises\n this.managerPromise = new Promise(resolve => {\n this.on('loaded', resolve);\n this.player.debug.log(this.manager);\n });\n\n // Now request some new advertisements\n this.requestAds();\n })\n .catch(() => {});\n }\n\n /**\n * Handles callbacks after an ad event was invoked\n * @param {string} event - Event type\n */\n trigger(event, ...args) {\n const handlers = this.events[event];\n\n if (utils.is.array(handlers)) {\n handlers.forEach(handler => {\n if (utils.is.function(handler)) {\n handler.apply(this, args);\n }\n });\n }\n }\n\n /**\n * Add event listeners\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n * @return {Ads}\n */\n on(event, callback) {\n if (!utils.is.array(this.events[event])) {\n this.events[event] = [];\n }\n\n this.events[event].push(callback);\n\n return this;\n }\n\n /**\n * Setup a safety timer for when the ad network doesn't respond for whatever reason.\n * The advertisement has 12 seconds to get its things together. We stop this timer when the\n * advertisement is playing, or when a user action is required to start, then we clear the\n * timer on ad ready\n * @param {number} time\n * @param {string} from\n */\n startSafetyTimer(time, from) {\n this.player.debug.log(`Safety timer invoked from: ${from}`);\n\n this.safetyTimer = setTimeout(() => {\n this.cancel();\n this.clearSafetyTimer('startSafetyTimer()');\n }, time);\n }\n\n /**\n * Clear our safety timer(s)\n * @param {string} from\n */\n clearSafetyTimer(from) {\n if (!utils.is.nullOrUndefined(this.safetyTimer)) {\n this.player.debug.log(`Safety timer cleared from: ${from}`);\n\n clearTimeout(this.safetyTimer);\n this.safetyTimer = null;\n }\n }\n}\n\nexport default Ads;\n","// ==========================================================================\n// Plyr source update\n// ==========================================================================\n\nimport html5 from './html5';\nimport media from './media';\nimport support from './support';\nimport { providers } from './types';\nimport ui from './ui';\nimport utils from './utils';\n\nconst source = {\n // Add elements to HTML5 media (source, tracks, etc)\n insertElements(type, attributes) {\n if (utils.is.string(attributes)) {\n utils.insertElement(type, this.media, {\n src: attributes,\n });\n } else if (utils.is.array(attributes)) {\n attributes.forEach(attribute => {\n utils.insertElement(type, this.media, attribute);\n });\n }\n },\n\n // Update source\n // Sources are not checked for support so be careful\n change(input) {\n if (!utils.is.object(input) || !('sources' in input) || !input.sources.length) {\n this.debug.warn('Invalid source format');\n return;\n }\n\n // Cancel current network requests\n html5.cancelRequests.call(this);\n\n // Destroy instance and re-setup\n this.destroy.call(\n this,\n () => {\n // Reset quality options\n this.options.quality = [];\n\n // Remove elements\n utils.removeElement(this.media);\n this.media = null;\n\n // Reset class name\n if (utils.is.element(this.elements.container)) {\n this.elements.container.removeAttribute('class');\n }\n\n // Set the type and provider\n this.type = input.type;\n this.provider = !utils.is.empty(input.sources[0].provider) ? input.sources[0].provider : providers.html5;\n\n // Check for support\n this.supported = support.check(this.type, this.provider, this.config.playsinline);\n\n // Create new markup\n switch (`${this.provider}:${this.type}`) {\n case 'html5:video':\n this.media = utils.createElement('video');\n break;\n\n case 'html5:audio':\n this.media = utils.createElement('audio');\n break;\n\n case 'youtube:video':\n case 'vimeo:video':\n this.media = utils.createElement('div', {\n src: input.sources[0].src,\n });\n break;\n\n default:\n break;\n }\n\n // Inject the new element\n this.elements.container.appendChild(this.media);\n\n // Autoplay the new source?\n if (utils.is.boolean(input.autoplay)) {\n this.config.autoplay = input.autoplay;\n }\n\n // Set attributes for audio and video\n if (this.isHTML5) {\n if (this.config.crossorigin) {\n this.media.setAttribute('crossorigin', '');\n }\n if (this.config.autoplay) {\n this.media.setAttribute('autoplay', '');\n }\n if (!utils.is.empty(input.poster)) {\n this.poster = input.poster;\n }\n if (this.config.loop.active) {\n this.media.setAttribute('loop', '');\n }\n if (this.config.muted) {\n this.media.setAttribute('muted', '');\n }\n if (this.config.playsinline) {\n this.media.setAttribute('playsinline', '');\n }\n }\n\n // Restore class hook\n ui.addStyleHook.call(this);\n\n // Set new sources for html5\n if (this.isHTML5) {\n source.insertElements.call(this, 'source', input.sources);\n }\n\n // Set video title\n this.config.title = input.title;\n\n // Set up from scratch\n media.setup.call(this);\n\n // HTML5 stuff\n if (this.isHTML5) {\n // Setup captions\n if ('tracks' in input) {\n source.insertElements.call(this, 'track', input.tracks);\n }\n\n // Load HTML5 sources\n this.media.load();\n }\n\n // If HTML5 or embed but not fully supported, setupInterface and call ready now\n if (this.isHTML5 || (this.isEmbed && !this.supported.ui)) {\n // Setup interface\n ui.build.call(this);\n }\n\n // Update the fullscreen support\n this.fullscreen.update();\n },\n true,\n );\n },\n};\n\nexport default source;\n","// ==========================================================================\n// Plyr\n// plyr.js v3.3.12\n// https://github.com/sampotts/plyr\n// License: The MIT License (MIT)\n// ==========================================================================\n\nimport captions from './captions';\nimport Console from './console';\nimport controls from './controls';\nimport defaults from './defaults';\nimport Fullscreen from './fullscreen';\nimport Listeners from './listeners';\nimport media from './media';\nimport Ads from './plugins/ads';\nimport source from './source';\nimport Storage from './storage';\nimport support from './support';\nimport { providers, types } from './types';\nimport ui from './ui';\nimport utils from './utils';\n\n// Private properties\n// TODO: Use a WeakMap for private globals\n// const globals = new WeakMap();\n\n// Plyr instance\nclass Plyr {\n constructor(target, options) {\n this.timers = {};\n\n // State\n this.ready = false;\n this.loading = false;\n this.failed = false;\n\n // Touch device\n this.touch = support.touch;\n\n // Set the media element\n this.media = target;\n\n // String selector passed\n if (utils.is.string(this.media)) {\n this.media = document.querySelectorAll(this.media);\n }\n\n // jQuery, NodeList or Array passed, use first element\n if ((window.jQuery && this.media instanceof jQuery) || utils.is.nodeList(this.media) || utils.is.array(this.media)) {\n // eslint-disable-next-line\n this.media = this.media[0];\n }\n\n // Set config\n this.config = utils.extend(\n {},\n defaults,\n Plyr.defaults,\n options || {},\n (() => {\n try {\n return JSON.parse(this.media.getAttribute('data-plyr-config'));\n } catch (e) {\n return {};\n }\n })(),\n );\n\n // Elements cache\n this.elements = {\n container: null,\n buttons: {},\n display: {},\n progress: {},\n inputs: {},\n settings: {\n menu: null,\n panes: {},\n tabs: {},\n },\n captions: null,\n };\n\n // Captions\n this.captions = {\n active: null,\n currentTrack: -1,\n meta: new WeakMap(),\n };\n\n // Fullscreen\n this.fullscreen = {\n active: false,\n };\n\n // Options\n this.options = {\n speed: [],\n quality: [],\n };\n\n // Debugging\n // TODO: move to globals\n this.debug = new Console(this.config.debug);\n\n // Log config options and support\n this.debug.log('Config', this.config);\n this.debug.log('Support', support);\n\n // We need an element to setup\n if (utils.is.nullOrUndefined(this.media) || !utils.is.element(this.media)) {\n this.debug.error('Setup failed: no suitable element passed');\n return;\n }\n\n // Bail if the element is initialized\n if (this.media.plyr) {\n this.debug.warn('Target already setup');\n return;\n }\n\n // Bail if not enabled\n if (!this.config.enabled) {\n this.debug.error('Setup failed: disabled by config');\n return;\n }\n\n // Bail if disabled or no basic support\n // You may want to disable certain UAs etc\n if (!support.check().api) {\n this.debug.error('Setup failed: no support');\n return;\n }\n\n // Cache original element state for .destroy()\n const clone = this.media.cloneNode(true);\n clone.autoplay = false;\n this.elements.original = clone;\n\n // Set media type based on tag or data attribute\n // Supported: video, audio, vimeo, youtube\n const type = this.media.tagName.toLowerCase();\n\n // Embed properties\n let iframe = null;\n let url = null;\n let params = null;\n\n // Different setup based on type\n switch (type) {\n case 'div':\n // Find the frame\n iframe = this.media.querySelector('iframe');\n\n // <iframe> type\n if (utils.is.element(iframe)) {\n // Detect provider\n url = iframe.getAttribute('src');\n this.provider = utils.getProviderByUrl(url);\n\n // Rework elements\n this.elements.container = this.media;\n this.media = iframe;\n\n // Reset classname\n this.elements.container.className = '';\n\n // Get attributes from URL and set config\n params = utils.getUrlParams(url);\n if (!utils.is.empty(params)) {\n const truthy = [\n '1',\n 'true',\n ];\n\n if (truthy.includes(params.autoplay)) {\n this.config.autoplay = true;\n }\n if (truthy.includes(params.loop)) {\n this.config.loop.active = true;\n }\n\n // TODO: replace fullscreen.iosNative with this playsinline config option\n // YouTube requires the playsinline in the URL\n if (this.isYouTube) {\n this.config.playsinline = truthy.includes(params.playsinline);\n } else {\n this.config.playsinline = true;\n }\n }\n } else {\n // <div> with attributes\n this.provider = this.media.getAttribute(this.config.attributes.embed.provider);\n\n // Remove attribute\n this.media.removeAttribute(this.config.attributes.embed.provider);\n }\n\n // Unsupported or missing provider\n if (utils.is.empty(this.provider) || !Object.keys(providers).includes(this.provider)) {\n this.debug.error('Setup failed: Invalid provider');\n return;\n }\n\n // Audio will come later for external providers\n this.type = types.video;\n\n break;\n\n case 'video':\n case 'audio':\n this.type = type;\n this.provider = providers.html5;\n\n // Get config from attributes\n if (this.media.hasAttribute('crossorigin')) {\n this.config.crossorigin = true;\n }\n if (this.media.hasAttribute('autoplay')) {\n this.config.autoplay = true;\n }\n if (this.media.hasAttribute('playsinline')) {\n this.config.playsinline = true;\n }\n if (this.media.hasAttribute('muted')) {\n this.config.muted = true;\n }\n if (this.media.hasAttribute('loop')) {\n this.config.loop.active = true;\n }\n\n break;\n\n default:\n this.debug.error('Setup failed: unsupported type');\n return;\n }\n\n // Check for support again but with type\n this.supported = support.check(this.type, this.provider, this.config.playsinline);\n\n // If no support for even API, bail\n if (!this.supported.api) {\n this.debug.error('Setup failed: no support');\n return;\n }\n\n // Create listeners\n this.listeners = new Listeners(this);\n\n // Setup local storage for user settings\n this.storage = new Storage(this);\n\n // Store reference\n this.media.plyr = this;\n\n // Wrap media\n if (!utils.is.element(this.elements.container)) {\n this.elements.container = utils.createElement('div');\n utils.wrap(this.media, this.elements.container);\n }\n\n // Add style hook\n ui.addStyleHook.call(this);\n\n // Setup media\n media.setup.call(this);\n\n // Listen for events if debugging\n if (this.config.debug) {\n utils.on(this.elements.container, this.config.events.join(' '), event => {\n this.debug.log(`event: ${event.type}`);\n });\n }\n\n // Setup interface\n // If embed but not fully supported, build interface now to avoid flash of controls\n if (this.isHTML5 || (this.isEmbed && !this.supported.ui)) {\n ui.build.call(this);\n }\n\n // Container listeners\n this.listeners.container();\n\n // Global listeners\n this.listeners.global();\n\n // Setup fullscreen\n this.fullscreen = new Fullscreen(this);\n\n // Setup ads if provided\n this.ads = new Ads(this);\n\n // Autoplay if required\n if (this.config.autoplay) {\n this.play();\n }\n }\n\n // ---------------------------------------\n // API\n // ---------------------------------------\n\n /**\n * Types and provider helpers\n */\n get isHTML5() {\n return Boolean(this.provider === providers.html5);\n }\n get isEmbed() {\n return Boolean(this.isYouTube || this.isVimeo);\n }\n get isYouTube() {\n return Boolean(this.provider === providers.youtube);\n }\n get isVimeo() {\n return Boolean(this.provider === providers.vimeo);\n }\n get isVideo() {\n return Boolean(this.type === types.video);\n }\n get isAudio() {\n return Boolean(this.type === types.audio);\n }\n\n /**\n * Play the media, or play the advertisement (if they are not blocked)\n */\n play() {\n if (!utils.is.function(this.media.play)) {\n return null;\n }\n\n // Return the promise (for HTML5)\n return this.media.play();\n }\n\n /**\n * Pause the media\n */\n pause() {\n if (!this.playing || !utils.is.function(this.media.pause)) {\n return;\n }\n\n this.media.pause();\n }\n\n /**\n * Get playing state\n */\n get playing() {\n return Boolean(this.ready && !this.paused && !this.ended);\n }\n\n /**\n * Get paused state\n */\n get paused() {\n return Boolean(this.media.paused);\n }\n\n /**\n * Get stopped state\n */\n get stopped() {\n return Boolean(this.paused && this.currentTime === 0);\n }\n\n /**\n * Get ended state\n */\n get ended() {\n return Boolean(this.media.ended);\n }\n\n /**\n * Toggle playback based on current status\n * @param {boolean} input\n */\n togglePlay(input) {\n // Toggle based on current state if nothing passed\n const toggle = utils.is.boolean(input) ? input : !this.playing;\n\n if (toggle) {\n this.play();\n } else {\n this.pause();\n }\n }\n\n /**\n * Stop playback\n */\n stop() {\n if (this.isHTML5) {\n this.pause();\n this.restart();\n } else if (utils.is.function(this.media.stop)) {\n this.media.stop();\n }\n }\n\n /**\n * Restart playback\n */\n restart() {\n this.currentTime = 0;\n }\n\n /**\n * Rewind\n * @param {number} seekTime - how far to rewind in seconds. Defaults to the config.seekTime\n */\n rewind(seekTime) {\n this.currentTime = this.currentTime - (utils.is.number(seekTime) ? seekTime : this.config.seekTime);\n }\n\n /**\n * Fast forward\n * @param {number} seekTime - how far to fast forward in seconds. Defaults to the config.seekTime\n */\n forward(seekTime) {\n this.currentTime = this.currentTime + (utils.is.number(seekTime) ? seekTime : this.config.seekTime);\n }\n\n /**\n * Seek to a time\n * @param {number} input - where to seek to in seconds. Defaults to 0 (the start)\n */\n set currentTime(input) {\n // Bail if media duration isn't available yet\n if (!this.duration) {\n return;\n }\n\n // Validate input\n const inputIsValid = utils.is.number(input) && input > 0;\n\n // Set\n this.media.currentTime = inputIsValid ? Math.min(input, this.duration) : 0;\n\n // Logging\n this.debug.log(`Seeking to ${this.currentTime} seconds`);\n }\n\n /**\n * Get current time\n */\n get currentTime() {\n return Number(this.media.currentTime);\n }\n\n /**\n * Get buffered\n */\n get buffered() {\n const { buffered } = this.media;\n\n // YouTube / Vimeo return a float between 0-1\n if (utils.is.number(buffered)) {\n return buffered;\n }\n\n // HTML5\n // TODO: Handle buffered chunks of the media\n // (i.e. seek to another section buffers only that section)\n if (buffered && buffered.length && this.duration > 0) {\n return buffered.end(0) / this.duration;\n }\n\n return 0;\n }\n\n /**\n * Get seeking status\n */\n get seeking() {\n return Boolean(this.media.seeking);\n }\n\n /**\n * Get the duration of the current media\n */\n get duration() {\n // Faux duration set via config\n const fauxDuration = parseFloat(this.config.duration);\n\n // Media duration can be NaN before the media has loaded\n const duration = (this.media || {}).duration || 0;\n\n // If config duration is funky, use regular duration\n return fauxDuration || duration;\n }\n\n /**\n * Set the player volume\n * @param {number} value - must be between 0 and 1. Defaults to the value from local storage and config.volume if not set in storage\n */\n set volume(value) {\n let volume = value;\n const max = 1;\n const min = 0;\n\n if (utils.is.string(volume)) {\n volume = Number(volume);\n }\n\n // Load volume from storage if no value specified\n if (!utils.is.number(volume)) {\n volume = this.storage.get('volume');\n }\n\n // Use config if all else fails\n if (!utils.is.number(volume)) {\n ({ volume } = this.config);\n }\n\n // Maximum is volumeMax\n if (volume > max) {\n volume = max;\n }\n // Minimum is volumeMin\n if (volume < min) {\n volume = min;\n }\n\n // Update config\n this.config.volume = volume;\n\n // Set the player volume\n this.media.volume = volume;\n\n // If muted, and we're increasing volume manually, reset muted state\n if (!utils.is.empty(value) && this.muted && volume > 0) {\n this.muted = false;\n }\n }\n\n /**\n * Get the current player volume\n */\n get volume() {\n return Number(this.media.volume);\n }\n\n /**\n * Increase volume\n * @param {boolean} step - How much to decrease by (between 0 and 1)\n */\n increaseVolume(step) {\n const volume = this.media.muted ? 0 : this.volume;\n this.volume = volume + (utils.is.number(step) ? step : 1);\n }\n\n /**\n * Decrease volume\n * @param {boolean} step - How much to decrease by (between 0 and 1)\n */\n decreaseVolume(step) {\n const volume = this.media.muted ? 0 : this.volume;\n this.volume = volume - (utils.is.number(step) ? step : 1);\n }\n\n /**\n * Set muted state\n * @param {boolean} mute\n */\n set muted(mute) {\n let toggle = mute;\n\n // Load muted state from storage\n if (!utils.is.boolean(toggle)) {\n toggle = this.storage.get('muted');\n }\n\n // Use config if all else fails\n if (!utils.is.boolean(toggle)) {\n toggle = this.config.muted;\n }\n\n // Update config\n this.config.muted = toggle;\n\n // Set mute on the player\n this.media.muted = toggle;\n }\n\n /**\n * Get current muted state\n */\n get muted() {\n return Boolean(this.media.muted);\n }\n\n /**\n * Check if the media has audio\n */\n get hasAudio() {\n // Assume yes for all non HTML5 (as we can't tell...)\n if (!this.isHTML5) {\n return true;\n }\n\n if (this.isAudio) {\n return true;\n }\n\n // Get audio tracks\n return (\n Boolean(this.media.mozHasAudio) ||\n Boolean(this.media.webkitAudioDecodedByteCount) ||\n Boolean(this.media.audioTracks && this.media.audioTracks.length)\n );\n }\n\n /**\n * Set playback speed\n * @param {number} speed - the speed of playback (0.5-2.0)\n */\n set speed(input) {\n let speed = null;\n\n if (utils.is.number(input)) {\n speed = input;\n }\n\n if (!utils.is.number(speed)) {\n speed = this.storage.get('speed');\n }\n\n if (!utils.is.number(speed)) {\n speed = this.config.speed.selected;\n }\n\n // Set min/max\n if (speed < 0.1) {\n speed = 0.1;\n }\n if (speed > 2.0) {\n speed = 2.0;\n }\n\n if (!this.config.speed.options.includes(speed)) {\n this.debug.warn(`Unsupported speed (${speed})`);\n return;\n }\n\n // Update config\n this.config.speed.selected = speed;\n\n // Set media speed\n this.media.playbackRate = speed;\n }\n\n /**\n * Get current playback speed\n */\n get speed() {\n return Number(this.media.playbackRate);\n }\n\n /**\n * Set playback quality\n * Currently HTML5 & YouTube only\n * @param {number} input - Quality level\n */\n set quality(input) {\n let quality = null;\n\n if (!utils.is.empty(input)) {\n quality = Number(input);\n }\n\n if (!utils.is.number(quality)) {\n quality = this.storage.get('quality');\n }\n\n if (!utils.is.number(quality)) {\n quality = this.config.quality.selected;\n }\n\n if (!utils.is.number(quality)) {\n quality = this.config.quality.default;\n }\n\n if (!this.options.quality.length) {\n return;\n }\n\n if (!this.options.quality.includes(quality)) {\n const closest = utils.closest(this.options.quality, quality);\n this.debug.warn(`Unsupported quality option: ${quality}, using ${closest} instead`);\n quality = closest;\n }\n\n // Update config\n this.config.quality.selected = quality;\n\n // Set quality\n this.media.quality = quality;\n }\n\n /**\n * Get current quality level\n */\n get quality() {\n return this.media.quality;\n }\n\n /**\n * Toggle loop\n * TODO: Finish fancy new logic. Set the indicator on load as user may pass loop as config\n * @param {boolean} input - Whether to loop or not\n */\n set loop(input) {\n const toggle = utils.is.boolean(input) ? input : this.config.loop.active;\n this.config.loop.active = toggle;\n this.media.loop = toggle;\n\n // Set default to be a true toggle\n /* const type = ['start', 'end', 'all', 'none', 'toggle'].includes(input) ? input : 'toggle';\n\n switch (type) {\n case 'start':\n if (this.config.loop.end && this.config.loop.end <= this.currentTime) {\n this.config.loop.end = null;\n }\n this.config.loop.start = this.currentTime;\n // this.config.loop.indicator.start = this.elements.display.played.value;\n break;\n\n case 'end':\n if (this.config.loop.start >= this.currentTime) {\n return this;\n }\n this.config.loop.end = this.currentTime;\n // this.config.loop.indicator.end = this.elements.display.played.value;\n break;\n\n case 'all':\n this.config.loop.start = 0;\n this.config.loop.end = this.duration - 2;\n this.config.loop.indicator.start = 0;\n this.config.loop.indicator.end = 100;\n break;\n\n case 'toggle':\n if (this.config.loop.active) {\n this.config.loop.start = 0;\n this.config.loop.end = null;\n } else {\n this.config.loop.start = 0;\n this.config.loop.end = this.duration - 2;\n }\n break;\n\n default:\n this.config.loop.start = 0;\n this.config.loop.end = null;\n break;\n } */\n }\n\n /**\n * Get current loop state\n */\n get loop() {\n return Boolean(this.media.loop);\n }\n\n /**\n * Set new media source\n * @param {object} input - The new source object (see docs)\n */\n set source(input) {\n source.change.call(this, input);\n }\n\n /**\n * Get current source\n */\n get source() {\n return this.media.currentSrc;\n }\n\n /**\n * Set the poster image for a video\n * @param {input} - the URL for the new poster image\n */\n set poster(input) {\n if (!this.isVideo) {\n this.debug.warn('Poster can only be set for video');\n return;\n }\n\n ui.setPoster.call(this, input);\n }\n\n /**\n * Get the current poster image\n */\n get poster() {\n if (!this.isVideo) {\n return null;\n }\n\n return this.media.getAttribute('poster');\n }\n\n /**\n * Set the autoplay state\n * @param {boolean} input - Whether to autoplay or not\n */\n set autoplay(input) {\n const toggle = utils.is.boolean(input) ? input : this.config.autoplay;\n this.config.autoplay = toggle;\n }\n\n /**\n * Get the current autoplay state\n */\n get autoplay() {\n return Boolean(this.config.autoplay);\n }\n\n /**\n * Toggle captions\n * @param {boolean} input - Whether to enable captions\n */\n toggleCaptions(input) {\n // If there's no full support\n if (!this.supported.ui) {\n return;\n }\n\n // If the method is called without parameter, toggle based on current value\n const active = utils.is.boolean(input) ? input : !this.elements.container.classList.contains(this.config.classNames.captions.active);\n\n // Toggle state\n this.elements.buttons.captions.pressed = active;\n\n // Add class hook\n utils.toggleClass(this.elements.container, this.config.classNames.captions.active, active);\n\n // Update state and trigger event\n if (active !== this.captions.active) {\n this.captions.active = active;\n utils.dispatchEvent.call(this, this.media, this.captions.active ? 'captionsenabled' : 'captionsdisabled');\n }\n }\n\n /**\n * Set the caption track by index\n * @param {number} - Caption index\n */\n set currentTrack(input) {\n captions.set.call(this, input);\n }\n\n /**\n * Get the current caption track index (-1 if disabled)\n */\n get currentTrack() {\n const { active, currentTrack } = this.captions;\n return active ? currentTrack : -1;\n }\n\n /**\n * Set the wanted language for captions\n * Since tracks can be added later it won't update the actual caption track until there is a matching track\n * @param {string} - Two character ISO language code (e.g. EN, FR, PT, etc)\n */\n set language(input) {\n captions.setLanguage.call(this, input);\n }\n\n /**\n * Get the current track's language\n */\n get language() {\n return (captions.getCurrentTrack.call(this) || {}).language;\n }\n\n /**\n * Toggle picture-in-picture playback on WebKit/MacOS\n * TODO: update player with state, support, enabled\n * TODO: detect outside changes\n */\n set pip(input) {\n const states = {\n pip: 'picture-in-picture',\n inline: 'inline',\n };\n\n // Bail if no support\n if (!support.pip) {\n return;\n }\n\n // Toggle based on current state if not passed\n const toggle = utils.is.boolean(input) ? input : this.pip === states.inline;\n\n // Toggle based on current state\n this.media.webkitSetPresentationMode(toggle ? states.pip : states.inline);\n }\n\n /**\n * Get the current picture-in-picture state\n */\n get pip() {\n if (!support.pip) {\n return null;\n }\n\n return this.media.webkitPresentationMode;\n }\n\n /**\n * Trigger the airplay dialog\n * TODO: update player with state, support, enabled\n */\n airplay() {\n // Show dialog if supported\n if (support.airplay) {\n this.media.webkitShowPlaybackTargetPicker();\n }\n }\n\n /**\n * Toggle the player controls\n * @param {boolean} [toggle] - Whether to show the controls\n */\n toggleControls(toggle) {\n // Don't toggle if missing UI support or if it's audio\n if (this.supported.ui && !this.isAudio) {\n // Get state before change\n const isHidden = utils.hasClass(this.elements.container, this.config.classNames.hideControls);\n\n // Negate the argument if not undefined since adding the class to hides the controls\n const force = typeof toggle === 'undefined' ? undefined : !toggle;\n\n // Apply and get updated state\n const hiding = utils.toggleClass(this.elements.container, this.config.classNames.hideControls, force);\n\n // Close menu\n if (hiding && this.config.controls.includes('settings') && !utils.is.empty(this.config.settings)) {\n controls.toggleMenu.call(this, false);\n }\n // Trigger event on change\n if (hiding !== isHidden) {\n const eventName = hiding ? 'controlshidden' : 'controlsshown';\n utils.dispatchEvent.call(this, this.media, eventName);\n }\n return !hiding;\n }\n return false;\n }\n\n /**\n * Add event listeners\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n */\n on(event, callback) {\n utils.on(this.elements.container, event, callback);\n }\n\n /**\n * Remove event listeners\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n */\n off(event, callback) {\n utils.off(this.elements.container, event, callback);\n }\n\n /**\n * Destroy an instance\n * Event listeners are removed when elements are removed\n * http://stackoverflow.com/questions/12528049/if-a-dom-element-is-removed-are-its-listeners-also-removed-from-memory\n * @param {function} callback - Callback for when destroy is complete\n * @param {boolean} soft - Whether it's a soft destroy (for source changes etc)\n */\n destroy(callback, soft = false) {\n if (!this.ready) {\n return;\n }\n\n const done = () => {\n // Reset overflow (incase destroyed while in fullscreen)\n document.body.style.overflow = '';\n\n // GC for embed\n this.embed = null;\n\n // If it's a soft destroy, make minimal changes\n if (soft) {\n if (Object.keys(this.elements).length) {\n // Remove elements\n utils.removeElement(this.elements.buttons.play);\n utils.removeElement(this.elements.captions);\n utils.removeElement(this.elements.controls);\n utils.removeElement(this.elements.wrapper);\n\n // Clear for GC\n this.elements.buttons.play = null;\n this.elements.captions = null;\n this.elements.controls = null;\n this.elements.wrapper = null;\n }\n\n // Callback\n if (utils.is.function(callback)) {\n callback();\n }\n } else {\n // Unbind listeners\n this.listeners.clear();\n\n // Replace the container with the original element provided\n utils.replaceElement(this.elements.original, this.elements.container);\n\n // Event\n utils.dispatchEvent.call(this, this.elements.original, 'destroyed', true);\n\n // Callback\n if (utils.is.function(callback)) {\n callback.call(this.elements.original);\n }\n\n // Reset state\n this.ready = false;\n\n // Clear for garbage collection\n setTimeout(() => {\n this.elements = null;\n this.media = null;\n }, 200);\n }\n };\n\n // Stop playback\n this.stop();\n\n // Type specific stuff\n switch (`${this.provider}:${this.type}`) {\n case 'html5:video':\n case 'html5:audio':\n // Clear timeout\n clearTimeout(this.timers.loading);\n\n // Restore native video controls\n ui.toggleNativeControls.call(this, true);\n\n // Clean up\n done();\n\n break;\n\n case 'youtube:video':\n // Clear timers\n clearInterval(this.timers.buffering);\n clearInterval(this.timers.playing);\n\n // Destroy YouTube API\n if (this.embed !== null && utils.is.function(this.embed.destroy)) {\n this.embed.destroy();\n }\n\n // Clean up\n done();\n\n break;\n\n case 'vimeo:video':\n // Destroy Vimeo API\n // then clean up (wait, to prevent postmessage errors)\n if (this.embed !== null) {\n this.embed.unload().then(done);\n }\n\n // Vimeo does not always return\n setTimeout(done, 200);\n\n break;\n\n default:\n break;\n }\n }\n\n /**\n * Check for support for a mime type (HTML5 only)\n * @param {string} type - Mime type\n */\n supports(type) {\n return support.mime.call(this, type);\n }\n\n /**\n * Check for support\n * @param {string} type - Player type (audio/video)\n * @param {string} provider - Provider (html5/youtube/vimeo)\n * @param {bool} inline - Where player has `playsinline` sttribute\n */\n static supported(type, provider, inline) {\n return support.check(type, provider, inline);\n }\n\n /**\n * Load an SVG sprite into the page\n * @param {string} url - URL for the SVG sprite\n * @param {string} [id] - Unique ID\n */\n static loadSprite(url, id) {\n return utils.loadSprite(url, id);\n }\n\n /**\n * Setup multiple instances\n * @param {*} selector\n * @param {object} options\n */\n static setup(selector, options = {}) {\n let targets = null;\n\n if (utils.is.string(selector)) {\n targets = Array.from(document.querySelectorAll(selector));\n } else if (utils.is.nodeList(selector)) {\n targets = Array.from(selector);\n } else if (utils.is.array(selector)) {\n targets = selector.filter(utils.is.element);\n }\n\n if (utils.is.empty(targets)) {\n return null;\n }\n\n return targets.map(t => new Plyr(t, options));\n }\n}\n\nPlyr.defaults = utils.cloneDeep(defaults);\n\nexport default Plyr;\n"]} \ No newline at end of file
+{"version":3,"sources":["node_modules/core-js/modules/_global.js","node_modules/core-js/modules/_core.js","node_modules/core-js/modules/_is-object.js","node_modules/core-js/modules/_an-object.js","node_modules/core-js/modules/_fails.js","node_modules/core-js/modules/_descriptors.js","node_modules/core-js/modules/_dom-create.js","node_modules/core-js/modules/_ie8-dom-define.js","node_modules/core-js/modules/_to-primitive.js","node_modules/core-js/modules/_object-dp.js","node_modules/core-js/modules/_property-desc.js","node_modules/core-js/modules/_hide.js","node_modules/core-js/modules/_has.js","node_modules/core-js/modules/_uid.js","node_modules/core-js/modules/_redefine.js","node_modules/core-js/modules/_a-function.js","node_modules/core-js/modules/_ctx.js","node_modules/core-js/modules/_export.js","node_modules/core-js/modules/_typed.js","node_modules/core-js/modules/_redefine-all.js","node_modules/core-js/modules/_an-instance.js","node_modules/core-js/modules/_to-integer.js","node_modules/core-js/modules/_to-length.js","node_modules/core-js/modules/_to-index.js","node_modules/core-js/modules/_cof.js","node_modules/core-js/modules/_iobject.js","node_modules/core-js/modules/_defined.js","node_modules/core-js/modules/_to-iobject.js","node_modules/core-js/modules/_to-absolute-index.js","node_modules/core-js/modules/_array-includes.js","node_modules/core-js/modules/_shared.js","node_modules/core-js/modules/_shared-key.js","node_modules/core-js/modules/_object-keys-internal.js","node_modules/core-js/modules/_enum-bug-keys.js","node_modules/core-js/modules/_object-gopn.js","node_modules/core-js/modules/_to-object.js","node_modules/core-js/modules/_array-fill.js","node_modules/core-js/modules/_wks.js","node_modules/core-js/modules/_set-to-string-tag.js","node_modules/core-js/modules/_typed-buffer.js","node_modules/core-js/modules/_species-constructor.js","node_modules/core-js/modules/_set-species.js","node_modules/core-js/modules/es6.typed.array-buffer.js","node_modules/core-js/modules/_classof.js","node_modules/core-js/modules/_iterators.js","node_modules/core-js/modules/_is-array-iter.js","node_modules/core-js/modules/_object-keys.js","node_modules/core-js/modules/_object-dps.js","node_modules/core-js/modules/_html.js","node_modules/core-js/modules/_object-create.js","node_modules/core-js/modules/_object-gpo.js","node_modules/core-js/modules/core.get-iterator-method.js","node_modules/core-js/modules/_is-array.js","node_modules/core-js/modules/_array-species-constructor.js","node_modules/core-js/modules/_array-species-create.js","node_modules/core-js/modules/_array-methods.js","node_modules/core-js/modules/_add-to-unscopables.js","node_modules/core-js/modules/_iter-step.js","node_modules/core-js/modules/_iter-create.js","node_modules/core-js/modules/_iter-define.js","node_modules/core-js/modules/es6.array.iterator.js","node_modules/core-js/modules/_iter-detect.js","node_modules/core-js/modules/_array-copy-within.js","node_modules/core-js/modules/_object-pie.js","node_modules/core-js/modules/_object-gopd.js","node_modules/core-js/modules/_typed-array.js","node_modules/core-js/modules/es6.typed.int8-array.js","node_modules/core-js/modules/es6.typed.uint8-array.js","node_modules/core-js/modules/es6.typed.uint8-clamped-array.js","node_modules/core-js/modules/es6.typed.int16-array.js","node_modules/core-js/modules/es6.typed.uint16-array.js","node_modules/core-js/modules/es6.typed.int32-array.js","node_modules/core-js/modules/es6.typed.uint32-array.js","node_modules/core-js/modules/es6.typed.float32-array.js","node_modules/core-js/modules/es6.typed.float64-array.js","node_modules/core-js/modules/_iter-call.js","node_modules/core-js/modules/_for-of.js","node_modules/core-js/modules/_meta.js","node_modules/core-js/modules/_validate-collection.js","node_modules/core-js/modules/_collection-strong.js","node_modules/core-js/modules/_set-proto.js","node_modules/core-js/modules/_inherit-if-required.js","node_modules/core-js/modules/_collection.js","node_modules/core-js/modules/es6.map.js","node_modules/core-js/modules/es6.set.js","node_modules/core-js/modules/_object-gops.js","node_modules/core-js/modules/_object-assign.js","node_modules/core-js/modules/_collection-weak.js","node_modules/core-js/modules/es6.weak-map.js","node_modules/core-js/modules/es6.weak-set.js","node_modules/core-js/modules/es6.reflect.apply.js","node_modules/core-js/modules/_invoke.js","node_modules/core-js/modules/_bind.js","node_modules/core-js/modules/es6.reflect.construct.js","node_modules/core-js/modules/es6.reflect.define-property.js","node_modules/core-js/modules/es6.reflect.delete-property.js","node_modules/core-js/modules/es6.reflect.get.js","node_modules/core-js/modules/es6.reflect.get-own-property-descriptor.js","node_modules/core-js/modules/es6.reflect.get-prototype-of.js","node_modules/core-js/modules/es6.reflect.has.js","node_modules/core-js/modules/es6.reflect.is-extensible.js","node_modules/core-js/modules/_own-keys.js","node_modules/core-js/modules/es6.reflect.own-keys.js","node_modules/core-js/modules/es6.reflect.prevent-extensions.js","node_modules/core-js/modules/es6.reflect.set.js","node_modules/core-js/modules/es6.reflect.set-prototype-of.js","node_modules/core-js/modules/_task.js","node_modules/core-js/modules/_microtask.js","node_modules/core-js/modules/_new-promise-capability.js","node_modules/core-js/modules/es6.promise.js","node_modules/core-js/modules/_perform.js","node_modules/core-js/modules/_promise-resolve.js","node_modules/core-js/modules/_wks-ext.js","node_modules/core-js/modules/_wks-define.js","node_modules/core-js/modules/_object-gopn-ext.js","node_modules/core-js/modules/es6.symbol.js","node_modules/core-js/modules/_enum-keys.js","node_modules/core-js/modules/_object-sap.js","node_modules/core-js/modules/es6.object.freeze.js","node_modules/core-js/modules/es6.object.seal.js","node_modules/core-js/modules/es6.object.prevent-extensions.js","node_modules/core-js/modules/es6.object.is-frozen.js","node_modules/core-js/modules/es6.object.is-sealed.js","node_modules/core-js/modules/es6.object.is-extensible.js","node_modules/core-js/modules/es6.object.get-own-property-descriptor.js","node_modules/core-js/modules/es6.object.get-prototype-of.js","node_modules/core-js/modules/es6.object.keys.js","node_modules/core-js/modules/es6.object.get-own-property-names.js","node_modules/core-js/modules/es6.object.assign.js","node_modules/core-js/modules/_same-value.js","node_modules/core-js/modules/es6.object.is.js","node_modules/core-js/modules/es6.function.name.js","node_modules/core-js/modules/es6.string.raw.js","node_modules/core-js/modules/es6.string.from-code-point.js","node_modules/core-js/modules/_string-at.js","node_modules/core-js/modules/es6.string.code-point-at.js","node_modules/core-js/modules/_string-repeat.js","node_modules/core-js/modules/es6.string.repeat.js","node_modules/core-js/modules/_is-regexp.js","node_modules/core-js/modules/_string-context.js","node_modules/core-js/modules/_fails-is-regexp.js","node_modules/core-js/modules/es6.string.starts-with.js","node_modules/core-js/modules/es6.string.ends-with.js","node_modules/core-js/modules/es6.string.includes.js","node_modules/core-js/modules/es6.regexp.flags.js","node_modules/core-js/modules/_flags.js","node_modules/core-js/modules/_fix-re-wks.js","node_modules/core-js/modules/es6.regexp.match.js","node_modules/core-js/modules/es6.regexp.replace.js","node_modules/core-js/modules/es6.regexp.split.js","node_modules/core-js/modules/es6.regexp.search.js","node_modules/core-js/modules/_create-property.js","node_modules/core-js/modules/es6.array.from.js","node_modules/core-js/modules/es6.array.of.js","node_modules/core-js/modules/es6.array.copy-within.js","node_modules/core-js/modules/es6.array.find.js","node_modules/core-js/modules/es6.array.find-index.js","node_modules/core-js/modules/es6.array.fill.js","node_modules/core-js/modules/es6.number.is-finite.js","node_modules/core-js/modules/_is-integer.js","node_modules/core-js/modules/es6.number.is-integer.js","node_modules/core-js/modules/es6.number.is-safe-integer.js","node_modules/core-js/modules/es6.number.is-nan.js","node_modules/core-js/modules/es6.number.epsilon.js","node_modules/core-js/modules/es6.number.min-safe-integer.js","node_modules/core-js/modules/es6.number.max-safe-integer.js","node_modules/core-js/modules/_math-log1p.js","node_modules/core-js/modules/es6.math.acosh.js","node_modules/core-js/modules/es6.math.asinh.js","node_modules/core-js/modules/es6.math.atanh.js","node_modules/core-js/modules/_math-sign.js","node_modules/core-js/modules/es6.math.cbrt.js","node_modules/core-js/modules/es6.math.clz32.js","node_modules/core-js/modules/es6.math.cosh.js","node_modules/core-js/modules/_math-expm1.js","node_modules/core-js/modules/es6.math.expm1.js","node_modules/core-js/modules/_math-fround.js","node_modules/core-js/modules/es6.math.fround.js","node_modules/core-js/modules/es6.math.hypot.js","node_modules/core-js/modules/es6.math.imul.js","node_modules/core-js/modules/es6.math.log1p.js","node_modules/core-js/modules/es6.math.log10.js","node_modules/core-js/modules/es6.math.log2.js","node_modules/core-js/modules/es6.math.sign.js","node_modules/core-js/modules/es6.math.sinh.js","node_modules/core-js/modules/es6.math.tanh.js","node_modules/core-js/modules/es6.math.trunc.js","node_modules/core-js/modules/es7.array.includes.js","node_modules/core-js/modules/_object-to-array.js","node_modules/core-js/modules/es7.object.values.js","node_modules/core-js/modules/es7.object.entries.js","node_modules/core-js/modules/es7.object.get-own-property-descriptors.js","node_modules/core-js/modules/_string-pad.js","node_modules/core-js/modules/_user-agent.js","node_modules/core-js/modules/es7.string.pad-start.js","node_modules/core-js/modules/es7.string.pad-end.js","node_modules/core-js/modules/web.timers.js","node_modules/core-js/modules/web.immediate.js","node_modules/core-js/modules/web.dom.iterable.js","node_modules/regenerator-runtime/runtime.js","node_modules/custom-event-polyfill/custom-event-polyfill.js","node_modules/url-polyfill/url-polyfill.js","src/js/utils/is.js","src/js/utils/events.js","src/js/utils/elements.js","src/js/utils/animation.js","src/js/utils/browser.js","src/js/support.js","src/js/html5.js","src/js/utils/objects.js","src/js/utils/strings.js","src/js/i18n.js","src/js/utils/arrays.js","src/js/storage.js","src/js/utils/loadSprite.js","src/js/utils/time.js","src/js/controls.js","src/js/utils/fetch.js","src/js/utils/urls.js","src/js/captions.js","src/js/config/defaults.js","src/js/config/types.js","src/js/console.js","src/js/fullscreen.js","src/js/utils/loadImage.js","src/js/ui.js","src/js/listeners.js","node_modules/loadjs/dist/loadjs.umd.js","src/js/utils/loadScript.js","src/js/plugins/vimeo.js","src/js/plugins/youtube.js","src/js/media.js","src/js/plugins/ads.js","src/js/source.js","src/js/plyr.js"],"names":["global","module","exports","window","Math","self","Function","__g","core","version","__e","_isObject","it","_anObject","isObject","TypeError","_fails","exec","e","_descriptors","require$$0","Object","defineProperty","get","a","document","is","createElement","_domCreate","_ie8DomDefine","require$$1","require$$2","_toPrimitive","S","fn","val","toString","call","valueOf","dP","O","P","Attributes","anObject","toPrimitive","IE8_DOM_DEFINE","value","_propertyDesc","bitmap","enumerable","configurable","writable","_hide","object","key","f","createDesc","hasOwnProperty","_has","id","px","random","_uid","concat","undefined","SRC","$toString","TPL","split","inspectSource","safe","isFunction","has","hide","join","String","prototype","this","_aFunction","_ctx","that","length","aFunction","b","c","apply","arguments","$export","type","name","source","own","out","exp","IS_FORCED","F","IS_GLOBAL","G","IS_STATIC","IS_PROTO","IS_BIND","B","target","expProto","ctx","redefine","U","W","R","Typed","_export","TYPED","uid","VIEW","ABV","ArrayBuffer","DataView","CONSTR","i","TypedArrayConstructors","_typed","_redefineAll","src","_anInstance","Constructor","forbiddenField","ceil","floor","_toInteger","isNaN","min","_toLength","toInteger","_toIndex","number","toLength","RangeError","_cof","slice","_iobject","propertyIsEnumerable","cof","_defined","_toIobject","IObject","defined","max","_toAbsoluteIndex","index","_arrayIncludes","IS_INCLUDES","$this","el","fromIndex","toIObject","toAbsoluteIndex","store","_shared","shared","_sharedKey","arrayIndexOf","IE_PROTO","_objectKeysInternal","names","result","push","_enumBugKeys","hiddenKeys","getOwnPropertyNames","$keys","_toObject","_arrayFill","toObject","aLen","end","endPos","Symbol","USE_SYMBOL","def","TAG","_setToStringTag","tag","stat","gOPN","PROTOTYPE","WRONG_INDEX","$ArrayBuffer","$DataView","Infinity","BaseBuffer","abs","pow","log","LN2","$BUFFER","DESCRIPTORS","$LENGTH","$OFFSET","packIEEE754","mLen","nBytes","m","buffer","Array","eLen","eMax","eBias","rt","s","unpackIEEE754","nBits","NaN","unpackI32","bytes","packI8","packI16","packI32","packF64","packF32","addGetter","C","internal","view","isLittleEndian","intIndex","toIndex","_b","start","pack","reverse","set","conversion","$typed","fails","ArrayBufferProto","anInstance","keys","j","constructor","$setInt8","setInt8","getInt8","redefineAll","byteOffset","setUint8","byteLength","arrayFill","bufferLength","offset","getUint8","getInt16","getUint16","getInt32","getUint32","getFloat32","getFloat64","setInt16","setUint16","setInt32","setUint32","setFloat32","setFloat64","setToStringTag","SPECIES","_speciesConstructor","D","_setSpecies","KEY","$isView","isView","$slice","len","first","final","speciesConstructor","viewS","viewT","ARG","_classof","T","tryGet","callee","_iterators","ITERATOR","ArrayProto","_isArrayIter","Iterators","_objectKeys","enumBugKeys","_objectDps","defineProperties","Properties","getKeys","_html","documentElement","Empty","createDict","iframeDocument","iframe","style","display","appendChild","contentWindow","open","write","lt","close","_objectCreate","create","dPs","ObjectProto","_objectGpo","getPrototypeOf","core_getIteratorMethod","getIteratorMethod","classof","_isArray","isArray","arg","_arraySpeciesCreate","original","_arrayMethods","TYPE","$create","IS_MAP","IS_FILTER","IS_SOME","IS_EVERY","IS_FIND_INDEX","NO_HOLES","asc","callbackfn","res","UNSCOPABLES","_addToUnscopables","_iterStep","done","IteratorPrototype","_iterCreate","NAME","next","descriptor","BUGGY","returnThis","_iterDefine","Base","DEFAULT","IS_SET","FORCED","$iterCreate","methods","getMethod","kind","proto","DEF_VALUES","VALUES_BUG","$native","$default","$entries","$anyNative","entries","values","es6_array_iterator","iterated","_t","_i","_k","step","Arguments","addToUnscopables","SAFE_CLOSING","_iterDetect","skipClosing","arr","iter","_arrayCopyWithin","copyWithin","to","from","count","inc","gOPD","getOwnPropertyDescriptor","pIE","require$$3","require$$4","require$$5","$buffer","require$$6","require$$7","require$$8","propertyDesc","require$$9","require$$10","require$$11","require$$12","require$$13","require$$14","require$$15","require$$16","require$$17","require$$18","require$$19","require$$20","isArrayIter","require$$21","require$$22","require$$23","require$$24","getIterFn","require$$25","require$$26","wks","require$$27","createArrayMethod","require$$28","createArrayIncludes","require$$29","require$$30","ArrayIterators","require$$31","require$$32","$iterDetect","require$$33","setSpecies","require$$34","require$$35","arrayCopyWithin","require$$36","$DP","require$$37","$GOPD","require$$38","Uint8Array","arrayForEach","arrayFilter","arraySome","arrayEvery","arrayFind","arrayFindIndex","arrayIncludes","arrayValues","arrayKeys","arrayEntries","arrayLastIndexOf","lastIndexOf","arrayReduce","reduce","arrayReduceRight","reduceRight","arrayJoin","arraySort","sort","arraySlice","arrayToString","arrayToLocaleString","toLocaleString","TYPED_CONSTRUCTOR","DEF_CONSTRUCTOR","ALL_CONSTRUCTORS","TYPED_ARRAY","$map","allocate","LITTLE_ENDIAN","Uint16Array","FORCED_SET","toOffset","BYTES","validate","speciesFromList","list","fromList","_d","$from","iterator","mapfn","mapping","iterFn","$of","TO_LOCALE_BUG","$toLocaleString","every","fill","filter","find","predicate","findIndex","forEach","indexOf","searchElement","includes","separator","map","middle","some","comparefn","subarray","begin","$begin","BYTES_PER_ELEMENT","$set","arrayLike","$iterators","isTAIndex","$getDesc","$setDesc","desc","$TypedArrayPrototype$","wrapper","CLAMPED","GETTER","SETTER","TypedArray","TAC","TypedArrayPrototype","addElement","data","v","o","getter","round","setter","$offset","$length","klass","$len","l","$nativeIterator","CORRECT_ITER_NAME","$iterator","of","init","_iterCall","ret","BREAK","RETURN","iterable","META","setDesc","isExtensible","FREEZE","preventExtensions","setMeta","w","meta","NEED","fastKey","getWeak","onFreeze","_validateCollection","SIZE","getEntry","entry","_f","n","k","_collectionStrong","getConstructor","ADDER","_l","forOf","clear","r","p","delete","prev","setStrong","$iterDefine","check","_setProto","setPrototypeOf","test","buggy","__proto__","_collection","common","IS_WEAK","fixMethod","instance","HASNT_CHAINING","THROWS_ON_PRIMITIVES","ACCEPT_ITERABLES","BUGGY_ZERO","$instance","inheritIfRequired","strong","add","getOwnPropertySymbols","$assign","assign","_objectAssign","A","K","getSymbols","gOPS","isEnum","uncaughtFrozenStore","UncaughtFrozenStore","findUncaughtFrozen","splice","_collectionWeak","$has","ufstore","InternalMap","each","weak","tmp","$WeakMap","freeze","method","rApply","Reflect","fApply","thisArgument","argumentsList","L","_invoke","args","un","factories","_bind","bind","partArgs","bound","construct","invoke","rConstruct","NEW_TARGET_BUG","ARGS_BUG","Target","newTarget","$args","propertyKey","attributes","deleteProperty","receiver","getProto","$isExtensible","_ownKeys","ownKeys","$preventExtensions","V","existingDescriptor","ownDesc","setProto","defer","channel","port","process","setTask","setImmediate","clearTask","clearImmediate","MessageChannel","Dispatch","counter","queue","run","listener","event","nextTick","now","port2","port1","onmessage","postMessage","addEventListener","importScripts","cel","html","removeChild","setTimeout","_task","macrotask","Observer","MutationObserver","WebKitMutationObserver","Promise","isNode","PromiseCapability","resolve","reject","promise","$$resolve","$$reject","Internal","newGenericPromiseCapability","OwnPromiseCapability","Wrapper","_perform","task","microtask","head","last","notify","flush","parent","domain","exit","enter","navigator","standalone","then","toggle","node","createTextNode","observe","characterData","$Promise","empty","newPromiseCapability","newPromiseCapabilityModule","USE_NATIVE","FakePromise","PromiseRejectionEvent","isThenable","isReject","_n","chain","_c","_v","ok","_s","reaction","handler","fail","_h","onHandleUnhandled","onUnhandled","console","unhandled","isUnhandled","perform","emit","onunhandledrejection","reason","error","_a","onrejectionhandled","$reject","_w","$resolve","executor","err","onFulfilled","onRejected","catch","capability","x","promiseCapability","promiseResolve","all","remaining","$index","alreadyCalled","race","_wksDefine","$Symbol","_global","charAt","wksExt","windowNames","getWindowNames","gOPNExt","$JSON","JSON","_stringify","stringify","HIDDEN","TO_PRIMITIVE","SymbolRegistry","AllSymbols","OPSymbols","QObject","findChild","setSymbolDesc","$fails","_create","protoDesc","wrap","sym","isSymbol","$defineProperty","$defineProperties","symbols","enumKeys","$propertyIsEnumerable","E","$getOwnPropertyDescriptor","$getOwnPropertyNames","$getOwnPropertySymbols","IS_OP","es6Symbols","wellKnownSymbols","wksDefine","for","keyFor","useSetter","useSimple","replacer","$replacer","_objectSap","$freeze","$seal","$isFrozen","$isSealed","$getPrototypeOf","_sameValue","y","FProto","nameRE","match","raw","callSite","tpl","fromCharCode","$fromCodePoint","fromCodePoint","code","TO_STRING","$at","pos","charCodeAt","codePointAt","_stringRepeat","str","repeat","MATCH","_isRegexp","isRegExp","_stringContext","searchString","_failsIsRegexp","re","$startsWith","startsWith","context","search","$endsWith","endsWith","endPosition","flags","RegExp","ignoreCase","multiline","unicode","sticky","_fixReWks","SYMBOL","fns","strfn","rxfn","string","$match","regexp","REPLACE","$replace","searchValue","replaceValue","SPLIT","$split","_split","$push","NPCG","limit","separator2","lastIndex","lastLength","output","lastLastIndex","splitLimit","separatorCopy","replace","SEARCH","$search","_createProperty","createProperty","$find","forced","_isFinite","isFinite","_isInteger","isInteger","isSafeInteger","EPSILON","MIN_SAFE_INTEGER","MAX_SAFE_INTEGER","_mathLog1p","log1p","sqrt","$acosh","acosh","Number","MAX_VALUE","$asinh","asinh","$atanh","atanh","_mathSign","sign","cbrt","clz32","LOG2E","cosh","$expm1","expm1","_mathExpm1","EPSILON32","MAX32","MIN32","_mathFround","fround","$abs","$sign","hypot","value1","value2","div","sum","larg","$imul","imul","xn","yn","xl","yl","log10","LOG10E","log2","sinh","tanh","trunc","$includes","_objectToArray","isEntries","$values","getOwnPropertyDescriptors","getDesc","_stringPad","maxLength","fillString","left","stringLength","fillStr","intMaxLength","fillLen","stringFiller","_userAgent","userAgent","padStart","$pad","padEnd","MSIE","time","boundArgs","setInterval","$task","TO_STRING_TAG","ArrayValues","DOMIterables","CSSRuleList","CSSStyleDeclaration","CSSValueList","ClientRectList","DOMRectList","DOMStringList","DOMTokenList","DataTransferItemList","FileList","HTMLAllCollection","HTMLCollection","HTMLFormElement","HTMLSelectElement","MediaList","MimeTypeArray","NamedNodeMap","NodeList","PaintRequestList","Plugin","PluginArray","SVGLengthList","SVGNumberList","SVGPathSegList","SVGPointList","SVGStringList","SVGTransformList","SourceBufferList","StyleSheetList","TextTrackCueList","TextTrackList","TouchList","collections","explicit","Collection","Op","hasOwn","iteratorSymbol","asyncIteratorSymbol","asyncIterator","toStringTagSymbol","toStringTag","runtime","regeneratorRuntime","GenStateSuspendedStart","GenStateSuspendedYield","GenStateExecuting","GenStateCompleted","ContinueSentinel","NativeIteratorPrototype","Gp","GeneratorFunctionPrototype","Generator","GeneratorFunction","displayName","isGeneratorFunction","genFun","ctor","mark","awrap","__await","defineIteratorMethods","AsyncIterator","async","innerFn","outerFn","tryLocsList","pop","Context","reset","skipTempReset","sent","_sent","delegate","tryEntries","resetTryEntry","stop","rootRecord","completion","rval","dispatchException","exception","handle","loc","caught","record","tryLoc","hasCatch","hasFinally","catchLoc","finallyLoc","Error","abrupt","finallyEntry","complete","afterLoc","finish","thrown","delegateYield","resultName","nextLoc","protoGenerator","generator","state","doneResult","delegateResult","maybeInvokeDelegate","tryCatch","makeInvokeMethod","obj","unwrapped","previousPromise","callInvokeWithMethodAndArg","return","info","pushTryEntry","locs","iteratorMethod","ce","CustomEvent","preventDefault","defaultPrevented","params","evt","origPrevent","bubbles","cancelable","detail","createEvent","initCustomEvent","Event","iteratorSupported","checkIfIteratorIsSupported","createIterator","items","shift","serializeParam","encodeURIComponent","deserializeParam","decodeURIComponent","URLSearchParams","attribute","append","_this","_entries","getAll","callback","thisArg","polyfillURLSearchParams","u","URL","pathname","href","searchParams","checkIfURLIsSupported","_URL","url","base","doc","implementation","createHTMLDocument","baseElement","anchorElement","body","protocol","attributeName","_anchorElement","linkURLWithAnchorAttribute","origin","expectedPort","http:","https:","ftp:","addPortToOrigin","hostname","password","username","methodName","createObjectURL","blob","revokeObjectURL","polyfillURL","location","getOrigin","input","instanceOf","Boolean","boolean","function","array","nullOrUndefined","weakMap","WeakMap","nodeList","element","Element","textNode","Text","cue","TextTrackCue","VTTCue","track","TextTrack","supportsPassiveListeners","supported","options","removeEventListener","toggleListener","passive","capture","events","eventListeners","on","off","once","onceCallback","_len","_key","triggerEvent","plyr","dispatchEvent","elements","targets","child","cloneNode","parentNode","sibling","nextSibling","insertBefore","setAttributes","_ref","slicedToArray","_ref3","_ref4","setAttribute","text","innerText","insertElement","removeElement","emptyElement","childNodes","lastChild","replaceElement","newChild","oldChild","replaceChild","getAttributesFromSelector","sel","existingAttributes","existing","selector","trim","className","parts","class","toggleHidden","hidden","hasAttribute","removeAttribute","toggleClass","force","classList","contains","hasClass","matches","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","querySelectorAll","getElements","container","getElement","querySelector","getFocusElement","focused","activeElement","transitionEndEvent","WebkitTransition","MozTransition","OTransition","transition","range","browser","isIE","documentMode","isWebkit","isIPhone","platform","isIos","defaultCodecs","audio/ogg","audio/wav","video/webm","video/mp4","video/ogg","support","audio","video","provider","playsinline","canPlayInline","api","ui","rangeInput","pip","webkitSetPresentationMode","airplay","WebKitPlaybackTargetAvailabilityEvent","mime","inputType","_inputType$split","mediaType","isHTML5","media","canPlayType","textTracks","touch","transitions","reducedMotion","matchMedia","html5","getSources","getAttribute","getQualityOptions","extend","player","_sources$filter","currentTime","playing","load","play","quality","cancelRequests","config","blankVideo","debug","getDeep","path","sources","defineProperty$1","format","replaceAll","toTitleCase","toUpperCase","substr","toLowerCase","toCamelCase","toPascalCase","getHTML","innerHTML","i18n","{seektime}","seekTime","{title}","title","_ref2","dedupe","item","Storage","classCallCheck","enabled","storage","localStorage","getItem","json","parse","setItem","removeItem","loadSprite","hasId","exists","getElementById","update","insertAdjacentElement","useStorage","cached","prefix","content","fetch","getHours","parseInt","getMinutes","getSeconds","formatTime","displayHours","inverted","hours","mins","secs","controls","getIconUrl","cors","iconUrl","host","svg4everybody","findElements","selectors","buttons","pause","restart","rewind","fastForward","mute","settings","captions","fullscreen","progress","inputs","seek","volume","duration","seekTooltip","classNames","tooltip","warn","toggleNativeControls","createIcon","iconPath","iconPrefix","icon","createElementNS","role","focusable","use","setAttributeNS","createLabel","attr","createBadge","badge","menu","createButton","buttonType","button","label","labelPressed","iconPressed","control","controlPressed","pressed","createRange","autocomplete","aria-label","aria-valuemin","aria-valuemax","aria-valuenow","updateRangeFill","createProgress","aria-hidden","suffixKey","played","suffix","createTime","createMenuItem","_ref$badge","_ref$checked","checked","radio","faux","insertAdjacentHTML","updateTimeDisplay","updateVolume","setRange","muted","updateProgress","current","toFixed","getElementsByTagName","nodeValue","setProgress","buffered","percent","setProperty","updateSeekTooltip","_this2","tooltips","clientRect","getBoundingClientRect","visible","_toggle","width","pageX","parseFloat","timeUpdate","invert","invertTime","seeking","durationUpdate","hasDuration","displayDuration","paused","toggleTab","setting","tabs","setQualityMenu","_this3","panes","checkMenu","sorting","getLabel","getBadge","updateSetting","pane","currentTrack","default","setCaptionsMenu","_this4","tracks","getTracks","toggled","language","unshift","setSpeedMenu","_this5","speed","isVimeo","tab","toggleMenu","form","show","isMenuItem","isButton","stopPropagation","getTabSize","clone","position","opacity","scrollWidth","height","scrollHeight","showTab","_this6","size","restore","propertyName","focus","_this7","aria-haspopup","aria-controls","aria-expanded","aria-labelled-by","tabindex","inner","home","back","inject","_this8","props","seektime","offsetHeight","_config","labels","responseType","request","XMLHttpRequest","responseText","response","statusText","send","parseUrl","parser","buildUrlParams","setup","isVideo","isYouTube","languages","userLanguage","active","trackEvents","_captions","currentTrackNode","languageExists","mode","updateCues","setLanguage","activeClass","findTrack","toConsumableArray","embed","enableTextTrack","sortIsDefault","sorted","getCurrentTrack","cues","activeCues","getCueAsHTML","cueText","caption","defaults","autoplay","autopause","toggleInvert","ratio","clickToPlay","hideControls","resetOnEnd","disableContextMenu","loop","selected","keyboard","fallback","iosNative","seekLabel","unmute","enableCaptions","disableCaptions","enterFullscreen","exitFullscreen","frameTitle","menuBack","normal","disabled","advertisement","qualityBadge","2160","1440","1080","720","576","480","urls","vimeo","sdk","youtube","googleIMA","listeners","editable","embedContainer","poster","posterEnabled","ads","stopped","loading","hover","isTouch","uiSupported","noTransition","tabFocus","google","publisherId","providers","types","noop","Console","onChange","keyCode","shiftKey","toggleFallback","scrollPosition","scrollX","scrollY","scrollTo","overflow","Fullscreen","property","native","webkitEnterFullscreen","requestFullscreen","webkitExitFullscreen","action","cancelFullScreen","fullscreenElement","fullscreenEnabled","webkitFullscreenEnabled","mozFullScreenEnabled","msFullscreenEnabled","pre","loadImage","minWidth","image","Image","onload","onerror","naturalWidth","addStyleHook","build","checkPlaying","ready","setTitle","setPoster","isEmbed","togglePoster","enable","backgroundImage","backgroundSize","toggleControls","checkLoading","clearTimeout","timers","Listeners","lastKey","handleKey","firstTouch","which","altKey","ctrlKey","metaKey","togglePlay","increaseVolume","decreaseVolume","forward","toggleCaptions","delay","hasAudio","initialized","managerPromise","isAudio","ended","proxyEvents","_event$detail","inputEvent","proxy","defaultHandler","customHandlerKey","customHandler","returned","hasCustomHandler","showHomeTab","currentTarget","eventType","seekTo","_player","webkitDirectionInvertedFromDevice","direction","deltaY","deltaX","factory","devnull","bundleIdCache","bundleResultCache","bundleCallbackQueue","publish","bundleId","pathsNotFound","q","executeCallbacks","depsNotFound","success","loadFile","callbackFn","numTries","isCss","maxTries","numRetries","beforeCallbackFn","before","pathStripped","rel","onbeforeload","ev","sheet","cssText","loadjs","paths","arg1","arg2","numWaiting","loadFiles","deps","bundleIds","subscribe","isDefined","loadScript","assurePlaybackState","hasPlayed","setAspectRatio","Vimeo","_split2","padding","paddingBottom","transform","byline","portrait","transparent","gesture","$2","thumbnail_large","Player","disableTextTrack","restorePause","setVolume","setCurrentTime","setPlaybackRate","setLoop","currentSrc","getVideoUrl","getVideoWidth","getVideoHeight","dimensions","getRatio","h","getAspectRatio","setAutopause","getVideoTitle","getCurrentTime","getDuration","getTextTracks","_ref$cues","strippedCues","fragment","createDocumentFragment","firstChild","getPaused","seconds","mapQualityUnit","hd2160","hd1440","hd1080","hd720","large","medium","small","tiny","YT","onYouTubeReadyCallbacks","onYouTubeIframeAPIReady","getTitle","videoId","getVideoData","snippet","currentId","posterSrc","format$$1","playerVars","showinfo","iv_load_policy","modestbranding","disablekb","widget_referrer","cc_load_policy","cc_lang_pref","onError","message","2","5","100","101","150","onPlaybackQualityChange","onPlaybackRateChange","playbackRate","getPlaybackRate","onReady","playVideo","pauseVideo","stopVideo","getPlaybackQuality","setPlaybackQuality","getAvailablePlaybackRates","clearInterval","buffering","getVideoLoadedFraction","lastBuffered","onStateChange","levels","getAvailableQualityLevels","level","unMute","Ads","displayContainer","manager","loader","cuePoints","safetyTimer","countdownTimer","ima","trigger","startSafetyTimer","clearSafetyTimer","setupIMA","setVpaidMode","ImaSdkSettings","VpaidMode","ENABLED","setLocale","AdDisplayContainer","requestAds","AdsLoader","AdsManagerLoadedEvent","Type","ADS_MANAGER_LOADED","onAdsManagerLoaded","AdErrorEvent","AD_ERROR","onAdError","AdsRequest","adTagUrl","tagUrl","linearAdSlotWidth","offsetWidth","linearAdSlotHeight","nonLinearAdSlotWidth","nonLinearAdSlotHeight","forceNonLinearFullSlot","setAdWillPlayMuted","getRemainingTime","AdsRenderingSettings","restoreCustomPlaybackStateOnAdBreakComplete","enablePreloading","getAdsManager","getCuePoints","cuePoint","seekElement","cuePercentage","AdEvent","onAdEvent","ad","getAd","LOADED","pollCountdown","isLinear","ALL_ADS_COMPLETED","loadAds","CONTENT_PAUSE_REQUESTED","pauseContent","CONTENT_RESUME_REQUESTED","resumeContent","STARTED","MIDPOINT","COMPLETE","IMPRESSION","CLICK","cancel","contentComplete","seekedTime","discardAdBreak","resize","ViewMode","NORMAL","_this9","initialize","adError","zIndex","_this10","destroy","_this11","handlers","_this12","AV_PUBLISHERID","AV_CHANNELID","AV_URL","cb","Date","AV_WIDTH","AV_HEIGHT","AV_CDIM2","insertElements","change","_sources$","_sources$$provider","tagName","crossorigin","Plyr","failed","jQuery","getProviderByUrl","truthy","webkitShowPlaybackTargetPicker","isHidden","hiding","eventName","soft","unload","inputIsValid","fauxDuration","mozHasAudio","webkitAudioDecodedByteCount","audioTracks","curr","closest","states","webkitPresentationMode","inline","t"],"mappings":"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","file":"plyr.polyfilled.min.js","sourcesContent":["// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nvar global = module.exports = typeof window != 'undefined' && window.Math == Math\n ? window : typeof self != 'undefined' && self.Math == Math ? self\n // eslint-disable-next-line no-new-func\n : Function('return this')();\nif (typeof __g == 'number') __g = global; // eslint-disable-line no-undef\n","var core = module.exports = { version: '2.5.3' };\nif (typeof __e == 'number') __e = core; // eslint-disable-line no-undef\n","module.exports = function (it) {\n return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n","var isObject = require('./_is-object');\nmodule.exports = function (it) {\n if (!isObject(it)) throw TypeError(it + ' is not an object!');\n return it;\n};\n","module.exports = function (exec) {\n try {\n return !!exec();\n } catch (e) {\n return true;\n }\n};\n","// Thank's IE8 for his funny defineProperty\nmodule.exports = !require('./_fails')(function () {\n return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;\n});\n","var isObject = require('./_is-object');\nvar document = require('./_global').document;\n// typeof document.createElement is 'object' in old IE\nvar is = isObject(document) && isObject(document.createElement);\nmodule.exports = function (it) {\n return is ? document.createElement(it) : {};\n};\n","module.exports = !require('./_descriptors') && !require('./_fails')(function () {\n return Object.defineProperty(require('./_dom-create')('div'), 'a', { get: function () { return 7; } }).a != 7;\n});\n","// 7.1.1 ToPrimitive(input [, PreferredType])\nvar isObject = require('./_is-object');\n// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n// and the second argument - flag - preferred type is a string\nmodule.exports = function (it, S) {\n if (!isObject(it)) return it;\n var fn, val;\n if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;\n if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n throw TypeError(\"Can't convert object to primitive value\");\n};\n","var anObject = require('./_an-object');\nvar IE8_DOM_DEFINE = require('./_ie8-dom-define');\nvar toPrimitive = require('./_to-primitive');\nvar dP = Object.defineProperty;\n\nexports.f = require('./_descriptors') ? Object.defineProperty : function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPrimitive(P, true);\n anObject(Attributes);\n if (IE8_DOM_DEFINE) try {\n return dP(O, P, Attributes);\n } catch (e) { /* empty */ }\n if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');\n if ('value' in Attributes) O[P] = Attributes.value;\n return O;\n};\n","module.exports = function (bitmap, value) {\n return {\n enumerable: !(bitmap & 1),\n configurable: !(bitmap & 2),\n writable: !(bitmap & 4),\n value: value\n };\n};\n","var dP = require('./_object-dp');\nvar createDesc = require('./_property-desc');\nmodule.exports = require('./_descriptors') ? function (object, key, value) {\n return dP.f(object, key, createDesc(1, value));\n} : function (object, key, value) {\n object[key] = value;\n return object;\n};\n","var hasOwnProperty = {}.hasOwnProperty;\nmodule.exports = function (it, key) {\n return hasOwnProperty.call(it, key);\n};\n","var id = 0;\nvar px = Math.random();\nmodule.exports = function (key) {\n return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));\n};\n","var global = require('./_global');\nvar hide = require('./_hide');\nvar has = require('./_has');\nvar SRC = require('./_uid')('src');\nvar TO_STRING = 'toString';\nvar $toString = Function[TO_STRING];\nvar TPL = ('' + $toString).split(TO_STRING);\n\nrequire('./_core').inspectSource = function (it) {\n return $toString.call(it);\n};\n\n(module.exports = function (O, key, val, safe) {\n var isFunction = typeof val == 'function';\n if (isFunction) has(val, 'name') || hide(val, 'name', key);\n if (O[key] === val) return;\n if (isFunction) has(val, SRC) || hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key)));\n if (O === global) {\n O[key] = val;\n } else if (!safe) {\n delete O[key];\n hide(O, key, val);\n } else if (O[key]) {\n O[key] = val;\n } else {\n hide(O, key, val);\n }\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n})(Function.prototype, TO_STRING, function toString() {\n return typeof this == 'function' && this[SRC] || $toString.call(this);\n});\n","module.exports = function (it) {\n if (typeof it != 'function') throw TypeError(it + ' is not a function!');\n return it;\n};\n","// optional / simple context binding\nvar aFunction = require('./_a-function');\nmodule.exports = function (fn, that, length) {\n aFunction(fn);\n if (that === undefined) return fn;\n switch (length) {\n case 1: return function (a) {\n return fn.call(that, a);\n };\n case 2: return function (a, b) {\n return fn.call(that, a, b);\n };\n case 3: return function (a, b, c) {\n return fn.call(that, a, b, c);\n };\n }\n return function (/* ...args */) {\n return fn.apply(that, arguments);\n };\n};\n","var global = require('./_global');\nvar core = require('./_core');\nvar hide = require('./_hide');\nvar redefine = require('./_redefine');\nvar ctx = require('./_ctx');\nvar PROTOTYPE = 'prototype';\n\nvar $export = function (type, name, source) {\n var IS_FORCED = type & $export.F;\n var IS_GLOBAL = type & $export.G;\n var IS_STATIC = type & $export.S;\n var IS_PROTO = type & $export.P;\n var IS_BIND = type & $export.B;\n var target = IS_GLOBAL ? global : IS_STATIC ? global[name] || (global[name] = {}) : (global[name] || {})[PROTOTYPE];\n var exports = IS_GLOBAL ? core : core[name] || (core[name] = {});\n var expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {});\n var key, own, out, exp;\n if (IS_GLOBAL) source = name;\n for (key in source) {\n // contains in native\n own = !IS_FORCED && target && target[key] !== undefined;\n // export native or passed\n out = (own ? target : source)[key];\n // bind timers to global for call from export context\n exp = IS_BIND && own ? ctx(out, global) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;\n // extend global\n if (target) redefine(target, key, out, type & $export.U);\n // export\n if (exports[key] != out) hide(exports, key, exp);\n if (IS_PROTO && expProto[key] != out) expProto[key] = out;\n }\n};\nglobal.core = core;\n// type bitmap\n$export.F = 1; // forced\n$export.G = 2; // global\n$export.S = 4; // static\n$export.P = 8; // proto\n$export.B = 16; // bind\n$export.W = 32; // wrap\n$export.U = 64; // safe\n$export.R = 128; // real proto method for `library`\nmodule.exports = $export;\n","var global = require('./_global');\nvar hide = require('./_hide');\nvar uid = require('./_uid');\nvar TYPED = uid('typed_array');\nvar VIEW = uid('view');\nvar ABV = !!(global.ArrayBuffer && global.DataView);\nvar CONSTR = ABV;\nvar i = 0;\nvar l = 9;\nvar Typed;\n\nvar TypedArrayConstructors = (\n 'Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array'\n).split(',');\n\nwhile (i < l) {\n if (Typed = global[TypedArrayConstructors[i++]]) {\n hide(Typed.prototype, TYPED, true);\n hide(Typed.prototype, VIEW, true);\n } else CONSTR = false;\n}\n\nmodule.exports = {\n ABV: ABV,\n CONSTR: CONSTR,\n TYPED: TYPED,\n VIEW: VIEW\n};\n","var redefine = require('./_redefine');\nmodule.exports = function (target, src, safe) {\n for (var key in src) redefine(target, key, src[key], safe);\n return target;\n};\n","module.exports = function (it, Constructor, name, forbiddenField) {\n if (!(it instanceof Constructor) || (forbiddenField !== undefined && forbiddenField in it)) {\n throw TypeError(name + ': incorrect invocation!');\n } return it;\n};\n","// 7.1.4 ToInteger\nvar ceil = Math.ceil;\nvar floor = Math.floor;\nmodule.exports = function (it) {\n return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);\n};\n","// 7.1.15 ToLength\nvar toInteger = require('./_to-integer');\nvar min = Math.min;\nmodule.exports = function (it) {\n return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991\n};\n","// https://tc39.github.io/ecma262/#sec-toindex\nvar toInteger = require('./_to-integer');\nvar toLength = require('./_to-length');\nmodule.exports = function (it) {\n if (it === undefined) return 0;\n var number = toInteger(it);\n var length = toLength(number);\n if (number !== length) throw RangeError('Wrong length!');\n return length;\n};\n","var toString = {}.toString;\n\nmodule.exports = function (it) {\n return toString.call(it).slice(8, -1);\n};\n","// fallback for non-array-like ES3 and non-enumerable old V8 strings\nvar cof = require('./_cof');\n// eslint-disable-next-line no-prototype-builtins\nmodule.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) {\n return cof(it) == 'String' ? it.split('') : Object(it);\n};\n","// 7.2.1 RequireObjectCoercible(argument)\nmodule.exports = function (it) {\n if (it == undefined) throw TypeError(\"Can't call method on \" + it);\n return it;\n};\n","// to indexed object, toObject with fallback for non-array-like ES3 strings\nvar IObject = require('./_iobject');\nvar defined = require('./_defined');\nmodule.exports = function (it) {\n return IObject(defined(it));\n};\n","var toInteger = require('./_to-integer');\nvar max = Math.max;\nvar min = Math.min;\nmodule.exports = function (index, length) {\n index = toInteger(index);\n return index < 0 ? max(index + length, 0) : min(index, length);\n};\n","// false -> Array#indexOf\n// true -> Array#includes\nvar toIObject = require('./_to-iobject');\nvar toLength = require('./_to-length');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nmodule.exports = function (IS_INCLUDES) {\n return function ($this, el, fromIndex) {\n var O = toIObject($this);\n var length = toLength(O.length);\n var index = toAbsoluteIndex(fromIndex, length);\n var value;\n // Array#includes uses SameValueZero equality algorithm\n // eslint-disable-next-line no-self-compare\n if (IS_INCLUDES && el != el) while (length > index) {\n value = O[index++];\n // eslint-disable-next-line no-self-compare\n if (value != value) return true;\n // Array#indexOf ignores holes, Array#includes - not\n } else for (;length > index; index++) if (IS_INCLUDES || index in O) {\n if (O[index] === el) return IS_INCLUDES || index || 0;\n } return !IS_INCLUDES && -1;\n };\n};\n","var global = require('./_global');\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || (global[SHARED] = {});\nmodule.exports = function (key) {\n return store[key] || (store[key] = {});\n};\n","var shared = require('./_shared')('keys');\nvar uid = require('./_uid');\nmodule.exports = function (key) {\n return shared[key] || (shared[key] = uid(key));\n};\n","var has = require('./_has');\nvar toIObject = require('./_to-iobject');\nvar arrayIndexOf = require('./_array-includes')(false);\nvar IE_PROTO = require('./_shared-key')('IE_PROTO');\n\nmodule.exports = function (object, names) {\n var O = toIObject(object);\n var i = 0;\n var result = [];\n var key;\n for (key in O) if (key != IE_PROTO) has(O, key) && result.push(key);\n // Don't enum bug & hidden keys\n while (names.length > i) if (has(O, key = names[i++])) {\n ~arrayIndexOf(result, key) || result.push(key);\n }\n return result;\n};\n","// IE 8- don't enum bug keys\nmodule.exports = (\n 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'\n).split(',');\n","// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)\nvar $keys = require('./_object-keys-internal');\nvar hiddenKeys = require('./_enum-bug-keys').concat('length', 'prototype');\n\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n return $keys(O, hiddenKeys);\n};\n","// 7.1.13 ToObject(argument)\nvar defined = require('./_defined');\nmodule.exports = function (it) {\n return Object(defined(it));\n};\n","// 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length)\n'use strict';\nvar toObject = require('./_to-object');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nvar toLength = require('./_to-length');\nmodule.exports = function fill(value /* , start = 0, end = @length */) {\n var O = toObject(this);\n var length = toLength(O.length);\n var aLen = arguments.length;\n var index = toAbsoluteIndex(aLen > 1 ? arguments[1] : undefined, length);\n var end = aLen > 2 ? arguments[2] : undefined;\n var endPos = end === undefined ? length : toAbsoluteIndex(end, length);\n while (endPos > index) O[index++] = value;\n return O;\n};\n","var store = require('./_shared')('wks');\nvar uid = require('./_uid');\nvar Symbol = require('./_global').Symbol;\nvar USE_SYMBOL = typeof Symbol == 'function';\n\nvar $exports = module.exports = function (name) {\n return store[name] || (store[name] =\n USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name));\n};\n\n$exports.store = store;\n","var def = require('./_object-dp').f;\nvar has = require('./_has');\nvar TAG = require('./_wks')('toStringTag');\n\nmodule.exports = function (it, tag, stat) {\n if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag });\n};\n","'use strict';\nvar global = require('./_global');\nvar DESCRIPTORS = require('./_descriptors');\nvar LIBRARY = require('./_library');\nvar $typed = require('./_typed');\nvar hide = require('./_hide');\nvar redefineAll = require('./_redefine-all');\nvar fails = require('./_fails');\nvar anInstance = require('./_an-instance');\nvar toInteger = require('./_to-integer');\nvar toLength = require('./_to-length');\nvar toIndex = require('./_to-index');\nvar gOPN = require('./_object-gopn').f;\nvar dP = require('./_object-dp').f;\nvar arrayFill = require('./_array-fill');\nvar setToStringTag = require('./_set-to-string-tag');\nvar ARRAY_BUFFER = 'ArrayBuffer';\nvar DATA_VIEW = 'DataView';\nvar PROTOTYPE = 'prototype';\nvar WRONG_LENGTH = 'Wrong length!';\nvar WRONG_INDEX = 'Wrong index!';\nvar $ArrayBuffer = global[ARRAY_BUFFER];\nvar $DataView = global[DATA_VIEW];\nvar Math = global.Math;\nvar RangeError = global.RangeError;\n// eslint-disable-next-line no-shadow-restricted-names\nvar Infinity = global.Infinity;\nvar BaseBuffer = $ArrayBuffer;\nvar abs = Math.abs;\nvar pow = Math.pow;\nvar floor = Math.floor;\nvar log = Math.log;\nvar LN2 = Math.LN2;\nvar BUFFER = 'buffer';\nvar BYTE_LENGTH = 'byteLength';\nvar BYTE_OFFSET = 'byteOffset';\nvar $BUFFER = DESCRIPTORS ? '_b' : BUFFER;\nvar $LENGTH = DESCRIPTORS ? '_l' : BYTE_LENGTH;\nvar $OFFSET = DESCRIPTORS ? '_o' : BYTE_OFFSET;\n\n// IEEE754 conversions based on https://github.com/feross/ieee754\nfunction packIEEE754(value, mLen, nBytes) {\n var buffer = new Array(nBytes);\n var eLen = nBytes * 8 - mLen - 1;\n var eMax = (1 << eLen) - 1;\n var eBias = eMax >> 1;\n var rt = mLen === 23 ? pow(2, -24) - pow(2, -77) : 0;\n var i = 0;\n var s = value < 0 || value === 0 && 1 / value < 0 ? 1 : 0;\n var e, m, c;\n value = abs(value);\n // eslint-disable-next-line no-self-compare\n if (value != value || value === Infinity) {\n // eslint-disable-next-line no-self-compare\n m = value != value ? 1 : 0;\n e = eMax;\n } else {\n e = floor(log(value) / LN2);\n if (value * (c = pow(2, -e)) < 1) {\n e--;\n c *= 2;\n }\n if (e + eBias >= 1) {\n value += rt / c;\n } else {\n value += rt * pow(2, 1 - eBias);\n }\n if (value * c >= 2) {\n e++;\n c /= 2;\n }\n if (e + eBias >= eMax) {\n m = 0;\n e = eMax;\n } else if (e + eBias >= 1) {\n m = (value * c - 1) * pow(2, mLen);\n e = e + eBias;\n } else {\n m = value * pow(2, eBias - 1) * pow(2, mLen);\n e = 0;\n }\n }\n for (; mLen >= 8; buffer[i++] = m & 255, m /= 256, mLen -= 8);\n e = e << mLen | m;\n eLen += mLen;\n for (; eLen > 0; buffer[i++] = e & 255, e /= 256, eLen -= 8);\n buffer[--i] |= s * 128;\n return buffer;\n}\nfunction unpackIEEE754(buffer, mLen, nBytes) {\n var eLen = nBytes * 8 - mLen - 1;\n var eMax = (1 << eLen) - 1;\n var eBias = eMax >> 1;\n var nBits = eLen - 7;\n var i = nBytes - 1;\n var s = buffer[i--];\n var e = s & 127;\n var m;\n s >>= 7;\n for (; nBits > 0; e = e * 256 + buffer[i], i--, nBits -= 8);\n m = e & (1 << -nBits) - 1;\n e >>= -nBits;\n nBits += mLen;\n for (; nBits > 0; m = m * 256 + buffer[i], i--, nBits -= 8);\n if (e === 0) {\n e = 1 - eBias;\n } else if (e === eMax) {\n return m ? NaN : s ? -Infinity : Infinity;\n } else {\n m = m + pow(2, mLen);\n e = e - eBias;\n } return (s ? -1 : 1) * m * pow(2, e - mLen);\n}\n\nfunction unpackI32(bytes) {\n return bytes[3] << 24 | bytes[2] << 16 | bytes[1] << 8 | bytes[0];\n}\nfunction packI8(it) {\n return [it & 0xff];\n}\nfunction packI16(it) {\n return [it & 0xff, it >> 8 & 0xff];\n}\nfunction packI32(it) {\n return [it & 0xff, it >> 8 & 0xff, it >> 16 & 0xff, it >> 24 & 0xff];\n}\nfunction packF64(it) {\n return packIEEE754(it, 52, 8);\n}\nfunction packF32(it) {\n return packIEEE754(it, 23, 4);\n}\n\nfunction addGetter(C, key, internal) {\n dP(C[PROTOTYPE], key, { get: function () { return this[internal]; } });\n}\n\nfunction get(view, bytes, index, isLittleEndian) {\n var numIndex = +index;\n var intIndex = toIndex(numIndex);\n if (intIndex + bytes > view[$LENGTH]) throw RangeError(WRONG_INDEX);\n var store = view[$BUFFER]._b;\n var start = intIndex + view[$OFFSET];\n var pack = store.slice(start, start + bytes);\n return isLittleEndian ? pack : pack.reverse();\n}\nfunction set(view, bytes, index, conversion, value, isLittleEndian) {\n var numIndex = +index;\n var intIndex = toIndex(numIndex);\n if (intIndex + bytes > view[$LENGTH]) throw RangeError(WRONG_INDEX);\n var store = view[$BUFFER]._b;\n var start = intIndex + view[$OFFSET];\n var pack = conversion(+value);\n for (var i = 0; i < bytes; i++) store[start + i] = pack[isLittleEndian ? i : bytes - i - 1];\n}\n\nif (!$typed.ABV) {\n $ArrayBuffer = function ArrayBuffer(length) {\n anInstance(this, $ArrayBuffer, ARRAY_BUFFER);\n var byteLength = toIndex(length);\n this._b = arrayFill.call(new Array(byteLength), 0);\n this[$LENGTH] = byteLength;\n };\n\n $DataView = function DataView(buffer, byteOffset, byteLength) {\n anInstance(this, $DataView, DATA_VIEW);\n anInstance(buffer, $ArrayBuffer, DATA_VIEW);\n var bufferLength = buffer[$LENGTH];\n var offset = toInteger(byteOffset);\n if (offset < 0 || offset > bufferLength) throw RangeError('Wrong offset!');\n byteLength = byteLength === undefined ? bufferLength - offset : toLength(byteLength);\n if (offset + byteLength > bufferLength) throw RangeError(WRONG_LENGTH);\n this[$BUFFER] = buffer;\n this[$OFFSET] = offset;\n this[$LENGTH] = byteLength;\n };\n\n if (DESCRIPTORS) {\n addGetter($ArrayBuffer, BYTE_LENGTH, '_l');\n addGetter($DataView, BUFFER, '_b');\n addGetter($DataView, BYTE_LENGTH, '_l');\n addGetter($DataView, BYTE_OFFSET, '_o');\n }\n\n redefineAll($DataView[PROTOTYPE], {\n getInt8: function getInt8(byteOffset) {\n return get(this, 1, byteOffset)[0] << 24 >> 24;\n },\n getUint8: function getUint8(byteOffset) {\n return get(this, 1, byteOffset)[0];\n },\n getInt16: function getInt16(byteOffset /* , littleEndian */) {\n var bytes = get(this, 2, byteOffset, arguments[1]);\n return (bytes[1] << 8 | bytes[0]) << 16 >> 16;\n },\n getUint16: function getUint16(byteOffset /* , littleEndian */) {\n var bytes = get(this, 2, byteOffset, arguments[1]);\n return bytes[1] << 8 | bytes[0];\n },\n getInt32: function getInt32(byteOffset /* , littleEndian */) {\n return unpackI32(get(this, 4, byteOffset, arguments[1]));\n },\n getUint32: function getUint32(byteOffset /* , littleEndian */) {\n return unpackI32(get(this, 4, byteOffset, arguments[1])) >>> 0;\n },\n getFloat32: function getFloat32(byteOffset /* , littleEndian */) {\n return unpackIEEE754(get(this, 4, byteOffset, arguments[1]), 23, 4);\n },\n getFloat64: function getFloat64(byteOffset /* , littleEndian */) {\n return unpackIEEE754(get(this, 8, byteOffset, arguments[1]), 52, 8);\n },\n setInt8: function setInt8(byteOffset, value) {\n set(this, 1, byteOffset, packI8, value);\n },\n setUint8: function setUint8(byteOffset, value) {\n set(this, 1, byteOffset, packI8, value);\n },\n setInt16: function setInt16(byteOffset, value /* , littleEndian */) {\n set(this, 2, byteOffset, packI16, value, arguments[2]);\n },\n setUint16: function setUint16(byteOffset, value /* , littleEndian */) {\n set(this, 2, byteOffset, packI16, value, arguments[2]);\n },\n setInt32: function setInt32(byteOffset, value /* , littleEndian */) {\n set(this, 4, byteOffset, packI32, value, arguments[2]);\n },\n setUint32: function setUint32(byteOffset, value /* , littleEndian */) {\n set(this, 4, byteOffset, packI32, value, arguments[2]);\n },\n setFloat32: function setFloat32(byteOffset, value /* , littleEndian */) {\n set(this, 4, byteOffset, packF32, value, arguments[2]);\n },\n setFloat64: function setFloat64(byteOffset, value /* , littleEndian */) {\n set(this, 8, byteOffset, packF64, value, arguments[2]);\n }\n });\n} else {\n if (!fails(function () {\n $ArrayBuffer(1);\n }) || !fails(function () {\n new $ArrayBuffer(-1); // eslint-disable-line no-new\n }) || fails(function () {\n new $ArrayBuffer(); // eslint-disable-line no-new\n new $ArrayBuffer(1.5); // eslint-disable-line no-new\n new $ArrayBuffer(NaN); // eslint-disable-line no-new\n return $ArrayBuffer.name != ARRAY_BUFFER;\n })) {\n $ArrayBuffer = function ArrayBuffer(length) {\n anInstance(this, $ArrayBuffer);\n return new BaseBuffer(toIndex(length));\n };\n var ArrayBufferProto = $ArrayBuffer[PROTOTYPE] = BaseBuffer[PROTOTYPE];\n for (var keys = gOPN(BaseBuffer), j = 0, key; keys.length > j;) {\n if (!((key = keys[j++]) in $ArrayBuffer)) hide($ArrayBuffer, key, BaseBuffer[key]);\n }\n if (!LIBRARY) ArrayBufferProto.constructor = $ArrayBuffer;\n }\n // iOS Safari 7.x bug\n var view = new $DataView(new $ArrayBuffer(2));\n var $setInt8 = $DataView[PROTOTYPE].setInt8;\n view.setInt8(0, 2147483648);\n view.setInt8(1, 2147483649);\n if (view.getInt8(0) || !view.getInt8(1)) redefineAll($DataView[PROTOTYPE], {\n setInt8: function setInt8(byteOffset, value) {\n $setInt8.call(this, byteOffset, value << 24 >> 24);\n },\n setUint8: function setUint8(byteOffset, value) {\n $setInt8.call(this, byteOffset, value << 24 >> 24);\n }\n }, true);\n}\nsetToStringTag($ArrayBuffer, ARRAY_BUFFER);\nsetToStringTag($DataView, DATA_VIEW);\nhide($DataView[PROTOTYPE], $typed.VIEW, true);\nexports[ARRAY_BUFFER] = $ArrayBuffer;\nexports[DATA_VIEW] = $DataView;\n","// 7.3.20 SpeciesConstructor(O, defaultConstructor)\nvar anObject = require('./_an-object');\nvar aFunction = require('./_a-function');\nvar SPECIES = require('./_wks')('species');\nmodule.exports = function (O, D) {\n var C = anObject(O).constructor;\n var S;\n return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? D : aFunction(S);\n};\n","'use strict';\nvar global = require('./_global');\nvar dP = require('./_object-dp');\nvar DESCRIPTORS = require('./_descriptors');\nvar SPECIES = require('./_wks')('species');\n\nmodule.exports = function (KEY) {\n var C = global[KEY];\n if (DESCRIPTORS && C && !C[SPECIES]) dP.f(C, SPECIES, {\n configurable: true,\n get: function () { return this; }\n });\n};\n","'use strict';\nvar $export = require('./_export');\nvar $typed = require('./_typed');\nvar buffer = require('./_typed-buffer');\nvar anObject = require('./_an-object');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nvar toLength = require('./_to-length');\nvar isObject = require('./_is-object');\nvar ArrayBuffer = require('./_global').ArrayBuffer;\nvar speciesConstructor = require('./_species-constructor');\nvar $ArrayBuffer = buffer.ArrayBuffer;\nvar $DataView = buffer.DataView;\nvar $isView = $typed.ABV && ArrayBuffer.isView;\nvar $slice = $ArrayBuffer.prototype.slice;\nvar VIEW = $typed.VIEW;\nvar ARRAY_BUFFER = 'ArrayBuffer';\n\n$export($export.G + $export.W + $export.F * (ArrayBuffer !== $ArrayBuffer), { ArrayBuffer: $ArrayBuffer });\n\n$export($export.S + $export.F * !$typed.CONSTR, ARRAY_BUFFER, {\n // 24.1.3.1 ArrayBuffer.isView(arg)\n isView: function isView(it) {\n return $isView && $isView(it) || isObject(it) && VIEW in it;\n }\n});\n\n$export($export.P + $export.U + $export.F * require('./_fails')(function () {\n return !new $ArrayBuffer(2).slice(1, undefined).byteLength;\n}), ARRAY_BUFFER, {\n // 24.1.4.3 ArrayBuffer.prototype.slice(start, end)\n slice: function slice(start, end) {\n if ($slice !== undefined && end === undefined) return $slice.call(anObject(this), start); // FF fix\n var len = anObject(this).byteLength;\n var first = toAbsoluteIndex(start, len);\n var final = toAbsoluteIndex(end === undefined ? len : end, len);\n var result = new (speciesConstructor(this, $ArrayBuffer))(toLength(final - first));\n var viewS = new $DataView(this);\n var viewT = new $DataView(result);\n var index = 0;\n while (first < final) {\n viewT.setUint8(index++, viewS.getUint8(first++));\n } return result;\n }\n});\n\nrequire('./_set-species')(ARRAY_BUFFER);\n","// getting tag from 19.1.3.6 Object.prototype.toString()\nvar cof = require('./_cof');\nvar TAG = require('./_wks')('toStringTag');\n// ES3 wrong here\nvar ARG = cof(function () { return arguments; }()) == 'Arguments';\n\n// fallback for IE11 Script Access Denied error\nvar tryGet = function (it, key) {\n try {\n return it[key];\n } catch (e) { /* empty */ }\n};\n\nmodule.exports = function (it) {\n var O, T, B;\n return it === undefined ? 'Undefined' : it === null ? 'Null'\n // @@toStringTag case\n : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T\n // builtinTag case\n : ARG ? cof(O)\n // ES3 arguments fallback\n : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;\n};\n","module.exports = {};\n","// check on default Array iterator\nvar Iterators = require('./_iterators');\nvar ITERATOR = require('./_wks')('iterator');\nvar ArrayProto = Array.prototype;\n\nmodule.exports = function (it) {\n return it !== undefined && (Iterators.Array === it || ArrayProto[ITERATOR] === it);\n};\n","// 19.1.2.14 / 15.2.3.14 Object.keys(O)\nvar $keys = require('./_object-keys-internal');\nvar enumBugKeys = require('./_enum-bug-keys');\n\nmodule.exports = Object.keys || function keys(O) {\n return $keys(O, enumBugKeys);\n};\n","var dP = require('./_object-dp');\nvar anObject = require('./_an-object');\nvar getKeys = require('./_object-keys');\n\nmodule.exports = require('./_descriptors') ? Object.defineProperties : function defineProperties(O, Properties) {\n anObject(O);\n var keys = getKeys(Properties);\n var length = keys.length;\n var i = 0;\n var P;\n while (length > i) dP.f(O, P = keys[i++], Properties[P]);\n return O;\n};\n","var document = require('./_global').document;\nmodule.exports = document && document.documentElement;\n","// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])\nvar anObject = require('./_an-object');\nvar dPs = require('./_object-dps');\nvar enumBugKeys = require('./_enum-bug-keys');\nvar IE_PROTO = require('./_shared-key')('IE_PROTO');\nvar Empty = function () { /* empty */ };\nvar PROTOTYPE = 'prototype';\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar createDict = function () {\n // Thrash, waste and sodomy: IE GC bug\n var iframe = require('./_dom-create')('iframe');\n var i = enumBugKeys.length;\n var lt = '<';\n var gt = '>';\n var iframeDocument;\n iframe.style.display = 'none';\n require('./_html').appendChild(iframe);\n iframe.src = 'javascript:'; // eslint-disable-line no-script-url\n // createDict = iframe.contentWindow.Object;\n // html.removeChild(iframe);\n iframeDocument = iframe.contentWindow.document;\n iframeDocument.open();\n iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);\n iframeDocument.close();\n createDict = iframeDocument.F;\n while (i--) delete createDict[PROTOTYPE][enumBugKeys[i]];\n return createDict();\n};\n\nmodule.exports = Object.create || function create(O, Properties) {\n var result;\n if (O !== null) {\n Empty[PROTOTYPE] = anObject(O);\n result = new Empty();\n Empty[PROTOTYPE] = null;\n // add \"__proto__\" for Object.getPrototypeOf polyfill\n result[IE_PROTO] = O;\n } else result = createDict();\n return Properties === undefined ? result : dPs(result, Properties);\n};\n","// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)\nvar has = require('./_has');\nvar toObject = require('./_to-object');\nvar IE_PROTO = require('./_shared-key')('IE_PROTO');\nvar ObjectProto = Object.prototype;\n\nmodule.exports = Object.getPrototypeOf || function (O) {\n O = toObject(O);\n if (has(O, IE_PROTO)) return O[IE_PROTO];\n if (typeof O.constructor == 'function' && O instanceof O.constructor) {\n return O.constructor.prototype;\n } return O instanceof Object ? ObjectProto : null;\n};\n","var classof = require('./_classof');\nvar ITERATOR = require('./_wks')('iterator');\nvar Iterators = require('./_iterators');\nmodule.exports = require('./_core').getIteratorMethod = function (it) {\n if (it != undefined) return it[ITERATOR]\n || it['@@iterator']\n || Iterators[classof(it)];\n};\n","// 7.2.2 IsArray(argument)\nvar cof = require('./_cof');\nmodule.exports = Array.isArray || function isArray(arg) {\n return cof(arg) == 'Array';\n};\n","var isObject = require('./_is-object');\nvar isArray = require('./_is-array');\nvar SPECIES = require('./_wks')('species');\n\nmodule.exports = function (original) {\n var C;\n if (isArray(original)) {\n C = original.constructor;\n // cross-realm fallback\n if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;\n if (isObject(C)) {\n C = C[SPECIES];\n if (C === null) C = undefined;\n }\n } return C === undefined ? Array : C;\n};\n","// 9.4.2.3 ArraySpeciesCreate(originalArray, length)\nvar speciesConstructor = require('./_array-species-constructor');\n\nmodule.exports = function (original, length) {\n return new (speciesConstructor(original))(length);\n};\n","// 0 -> Array#forEach\n// 1 -> Array#map\n// 2 -> Array#filter\n// 3 -> Array#some\n// 4 -> Array#every\n// 5 -> Array#find\n// 6 -> Array#findIndex\nvar ctx = require('./_ctx');\nvar IObject = require('./_iobject');\nvar toObject = require('./_to-object');\nvar toLength = require('./_to-length');\nvar asc = require('./_array-species-create');\nmodule.exports = function (TYPE, $create) {\n var IS_MAP = TYPE == 1;\n var IS_FILTER = TYPE == 2;\n var IS_SOME = TYPE == 3;\n var IS_EVERY = TYPE == 4;\n var IS_FIND_INDEX = TYPE == 6;\n var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;\n var create = $create || asc;\n return function ($this, callbackfn, that) {\n var O = toObject($this);\n var self = IObject(O);\n var f = ctx(callbackfn, that, 3);\n var length = toLength(self.length);\n var index = 0;\n var result = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined;\n var val, res;\n for (;length > index; index++) if (NO_HOLES || index in self) {\n val = self[index];\n res = f(val, index, O);\n if (TYPE) {\n if (IS_MAP) result[index] = res; // map\n else if (res) switch (TYPE) {\n case 3: return true; // some\n case 5: return val; // find\n case 6: return index; // findIndex\n case 2: result.push(val); // filter\n } else if (IS_EVERY) return false; // every\n }\n }\n return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : result;\n };\n};\n","// 22.1.3.31 Array.prototype[@@unscopables]\nvar UNSCOPABLES = require('./_wks')('unscopables');\nvar ArrayProto = Array.prototype;\nif (ArrayProto[UNSCOPABLES] == undefined) require('./_hide')(ArrayProto, UNSCOPABLES, {});\nmodule.exports = function (key) {\n ArrayProto[UNSCOPABLES][key] = true;\n};\n","module.exports = function (done, value) {\n return { value: value, done: !!done };\n};\n","'use strict';\nvar create = require('./_object-create');\nvar descriptor = require('./_property-desc');\nvar setToStringTag = require('./_set-to-string-tag');\nvar IteratorPrototype = {};\n\n// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\nrequire('./_hide')(IteratorPrototype, require('./_wks')('iterator'), function () { return this; });\n\nmodule.exports = function (Constructor, NAME, next) {\n Constructor.prototype = create(IteratorPrototype, { next: descriptor(1, next) });\n setToStringTag(Constructor, NAME + ' Iterator');\n};\n","'use strict';\nvar LIBRARY = require('./_library');\nvar $export = require('./_export');\nvar redefine = require('./_redefine');\nvar hide = require('./_hide');\nvar has = require('./_has');\nvar Iterators = require('./_iterators');\nvar $iterCreate = require('./_iter-create');\nvar setToStringTag = require('./_set-to-string-tag');\nvar getPrototypeOf = require('./_object-gpo');\nvar ITERATOR = require('./_wks')('iterator');\nvar BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next`\nvar FF_ITERATOR = '@@iterator';\nvar KEYS = 'keys';\nvar VALUES = 'values';\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {\n $iterCreate(Constructor, NAME, next);\n var getMethod = function (kind) {\n if (!BUGGY && kind in proto) return proto[kind];\n switch (kind) {\n case KEYS: return function keys() { return new Constructor(this, kind); };\n case VALUES: return function values() { return new Constructor(this, kind); };\n } return function entries() { return new Constructor(this, kind); };\n };\n var TAG = NAME + ' Iterator';\n var DEF_VALUES = DEFAULT == VALUES;\n var VALUES_BUG = false;\n var proto = Base.prototype;\n var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT];\n var $default = (!BUGGY && $native) || getMethod(DEFAULT);\n var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined;\n var $anyNative = NAME == 'Array' ? proto.entries || $native : $native;\n var methods, key, IteratorPrototype;\n // Fix native\n if ($anyNative) {\n IteratorPrototype = getPrototypeOf($anyNative.call(new Base()));\n if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) {\n // Set @@toStringTag to native iterators\n setToStringTag(IteratorPrototype, TAG, true);\n // fix for some old engines\n if (!LIBRARY && !has(IteratorPrototype, ITERATOR)) hide(IteratorPrototype, ITERATOR, returnThis);\n }\n }\n // fix Array#{values, @@iterator}.name in V8 / FF\n if (DEF_VALUES && $native && $native.name !== VALUES) {\n VALUES_BUG = true;\n $default = function values() { return $native.call(this); };\n }\n // Define iterator\n if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) {\n hide(proto, ITERATOR, $default);\n }\n // Plug for library\n Iterators[NAME] = $default;\n Iterators[TAG] = returnThis;\n if (DEFAULT) {\n methods = {\n values: DEF_VALUES ? $default : getMethod(VALUES),\n keys: IS_SET ? $default : getMethod(KEYS),\n entries: $entries\n };\n if (FORCED) for (key in methods) {\n if (!(key in proto)) redefine(proto, key, methods[key]);\n } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods);\n }\n return methods;\n};\n","'use strict';\nvar addToUnscopables = require('./_add-to-unscopables');\nvar step = require('./_iter-step');\nvar Iterators = require('./_iterators');\nvar toIObject = require('./_to-iobject');\n\n// 22.1.3.4 Array.prototype.entries()\n// 22.1.3.13 Array.prototype.keys()\n// 22.1.3.29 Array.prototype.values()\n// 22.1.3.30 Array.prototype[@@iterator]()\nmodule.exports = require('./_iter-define')(Array, 'Array', function (iterated, kind) {\n this._t = toIObject(iterated); // target\n this._i = 0; // next index\n this._k = kind; // kind\n// 22.1.5.2.1 %ArrayIteratorPrototype%.next()\n}, function () {\n var O = this._t;\n var kind = this._k;\n var index = this._i++;\n if (!O || index >= O.length) {\n this._t = undefined;\n return step(1);\n }\n if (kind == 'keys') return step(0, index);\n if (kind == 'values') return step(0, O[index]);\n return step(0, [index, O[index]]);\n}, 'values');\n\n// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)\nIterators.Arguments = Iterators.Array;\n\naddToUnscopables('keys');\naddToUnscopables('values');\naddToUnscopables('entries');\n","var ITERATOR = require('./_wks')('iterator');\nvar SAFE_CLOSING = false;\n\ntry {\n var riter = [7][ITERATOR]();\n riter['return'] = function () { SAFE_CLOSING = true; };\n // eslint-disable-next-line no-throw-literal\n Array.from(riter, function () { throw 2; });\n} catch (e) { /* empty */ }\n\nmodule.exports = function (exec, skipClosing) {\n if (!skipClosing && !SAFE_CLOSING) return false;\n var safe = false;\n try {\n var arr = [7];\n var iter = arr[ITERATOR]();\n iter.next = function () { return { done: safe = true }; };\n arr[ITERATOR] = function () { return iter; };\n exec(arr);\n } catch (e) { /* empty */ }\n return safe;\n};\n","// 22.1.3.3 Array.prototype.copyWithin(target, start, end = this.length)\n'use strict';\nvar toObject = require('./_to-object');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nvar toLength = require('./_to-length');\n\nmodule.exports = [].copyWithin || function copyWithin(target /* = 0 */, start /* = 0, end = @length */) {\n var O = toObject(this);\n var len = toLength(O.length);\n var to = toAbsoluteIndex(target, len);\n var from = toAbsoluteIndex(start, len);\n var end = arguments.length > 2 ? arguments[2] : undefined;\n var count = Math.min((end === undefined ? len : toAbsoluteIndex(end, len)) - from, len - to);\n var inc = 1;\n if (from < to && to < from + count) {\n inc = -1;\n from += count - 1;\n to += count - 1;\n }\n while (count-- > 0) {\n if (from in O) O[to] = O[from];\n else delete O[to];\n to += inc;\n from += inc;\n } return O;\n};\n","exports.f = {}.propertyIsEnumerable;\n","var pIE = require('./_object-pie');\nvar createDesc = require('./_property-desc');\nvar toIObject = require('./_to-iobject');\nvar toPrimitive = require('./_to-primitive');\nvar has = require('./_has');\nvar IE8_DOM_DEFINE = require('./_ie8-dom-define');\nvar gOPD = Object.getOwnPropertyDescriptor;\n\nexports.f = require('./_descriptors') ? gOPD : function getOwnPropertyDescriptor(O, P) {\n O = toIObject(O);\n P = toPrimitive(P, true);\n if (IE8_DOM_DEFINE) try {\n return gOPD(O, P);\n } catch (e) { /* empty */ }\n if (has(O, P)) return createDesc(!pIE.f.call(O, P), O[P]);\n};\n","'use strict';\nif (require('./_descriptors')) {\n var LIBRARY = require('./_library');\n var global = require('./_global');\n var fails = require('./_fails');\n var $export = require('./_export');\n var $typed = require('./_typed');\n var $buffer = require('./_typed-buffer');\n var ctx = require('./_ctx');\n var anInstance = require('./_an-instance');\n var propertyDesc = require('./_property-desc');\n var hide = require('./_hide');\n var redefineAll = require('./_redefine-all');\n var toInteger = require('./_to-integer');\n var toLength = require('./_to-length');\n var toIndex = require('./_to-index');\n var toAbsoluteIndex = require('./_to-absolute-index');\n var toPrimitive = require('./_to-primitive');\n var has = require('./_has');\n var classof = require('./_classof');\n var isObject = require('./_is-object');\n var toObject = require('./_to-object');\n var isArrayIter = require('./_is-array-iter');\n var create = require('./_object-create');\n var getPrototypeOf = require('./_object-gpo');\n var gOPN = require('./_object-gopn').f;\n var getIterFn = require('./core.get-iterator-method');\n var uid = require('./_uid');\n var wks = require('./_wks');\n var createArrayMethod = require('./_array-methods');\n var createArrayIncludes = require('./_array-includes');\n var speciesConstructor = require('./_species-constructor');\n var ArrayIterators = require('./es6.array.iterator');\n var Iterators = require('./_iterators');\n var $iterDetect = require('./_iter-detect');\n var setSpecies = require('./_set-species');\n var arrayFill = require('./_array-fill');\n var arrayCopyWithin = require('./_array-copy-within');\n var $DP = require('./_object-dp');\n var $GOPD = require('./_object-gopd');\n var dP = $DP.f;\n var gOPD = $GOPD.f;\n var RangeError = global.RangeError;\n var TypeError = global.TypeError;\n var Uint8Array = global.Uint8Array;\n var ARRAY_BUFFER = 'ArrayBuffer';\n var SHARED_BUFFER = 'Shared' + ARRAY_BUFFER;\n var BYTES_PER_ELEMENT = 'BYTES_PER_ELEMENT';\n var PROTOTYPE = 'prototype';\n var ArrayProto = Array[PROTOTYPE];\n var $ArrayBuffer = $buffer.ArrayBuffer;\n var $DataView = $buffer.DataView;\n var arrayForEach = createArrayMethod(0);\n var arrayFilter = createArrayMethod(2);\n var arraySome = createArrayMethod(3);\n var arrayEvery = createArrayMethod(4);\n var arrayFind = createArrayMethod(5);\n var arrayFindIndex = createArrayMethod(6);\n var arrayIncludes = createArrayIncludes(true);\n var arrayIndexOf = createArrayIncludes(false);\n var arrayValues = ArrayIterators.values;\n var arrayKeys = ArrayIterators.keys;\n var arrayEntries = ArrayIterators.entries;\n var arrayLastIndexOf = ArrayProto.lastIndexOf;\n var arrayReduce = ArrayProto.reduce;\n var arrayReduceRight = ArrayProto.reduceRight;\n var arrayJoin = ArrayProto.join;\n var arraySort = ArrayProto.sort;\n var arraySlice = ArrayProto.slice;\n var arrayToString = ArrayProto.toString;\n var arrayToLocaleString = ArrayProto.toLocaleString;\n var ITERATOR = wks('iterator');\n var TAG = wks('toStringTag');\n var TYPED_CONSTRUCTOR = uid('typed_constructor');\n var DEF_CONSTRUCTOR = uid('def_constructor');\n var ALL_CONSTRUCTORS = $typed.CONSTR;\n var TYPED_ARRAY = $typed.TYPED;\n var VIEW = $typed.VIEW;\n var WRONG_LENGTH = 'Wrong length!';\n\n var $map = createArrayMethod(1, function (O, length) {\n return allocate(speciesConstructor(O, O[DEF_CONSTRUCTOR]), length);\n });\n\n var LITTLE_ENDIAN = fails(function () {\n // eslint-disable-next-line no-undef\n return new Uint8Array(new Uint16Array([1]).buffer)[0] === 1;\n });\n\n var FORCED_SET = !!Uint8Array && !!Uint8Array[PROTOTYPE].set && fails(function () {\n new Uint8Array(1).set({});\n });\n\n var toOffset = function (it, BYTES) {\n var offset = toInteger(it);\n if (offset < 0 || offset % BYTES) throw RangeError('Wrong offset!');\n return offset;\n };\n\n var validate = function (it) {\n if (isObject(it) && TYPED_ARRAY in it) return it;\n throw TypeError(it + ' is not a typed array!');\n };\n\n var allocate = function (C, length) {\n if (!(isObject(C) && TYPED_CONSTRUCTOR in C)) {\n throw TypeError('It is not a typed array constructor!');\n } return new C(length);\n };\n\n var speciesFromList = function (O, list) {\n return fromList(speciesConstructor(O, O[DEF_CONSTRUCTOR]), list);\n };\n\n var fromList = function (C, list) {\n var index = 0;\n var length = list.length;\n var result = allocate(C, length);\n while (length > index) result[index] = list[index++];\n return result;\n };\n\n var addGetter = function (it, key, internal) {\n dP(it, key, { get: function () { return this._d[internal]; } });\n };\n\n var $from = function from(source /* , mapfn, thisArg */) {\n var O = toObject(source);\n var aLen = arguments.length;\n var mapfn = aLen > 1 ? arguments[1] : undefined;\n var mapping = mapfn !== undefined;\n var iterFn = getIterFn(O);\n var i, length, values, result, step, iterator;\n if (iterFn != undefined && !isArrayIter(iterFn)) {\n for (iterator = iterFn.call(O), values = [], i = 0; !(step = iterator.next()).done; i++) {\n values.push(step.value);\n } O = values;\n }\n if (mapping && aLen > 2) mapfn = ctx(mapfn, arguments[2], 2);\n for (i = 0, length = toLength(O.length), result = allocate(this, length); length > i; i++) {\n result[i] = mapping ? mapfn(O[i], i) : O[i];\n }\n return result;\n };\n\n var $of = function of(/* ...items */) {\n var index = 0;\n var length = arguments.length;\n var result = allocate(this, length);\n while (length > index) result[index] = arguments[index++];\n return result;\n };\n\n // iOS Safari 6.x fails here\n var TO_LOCALE_BUG = !!Uint8Array && fails(function () { arrayToLocaleString.call(new Uint8Array(1)); });\n\n var $toLocaleString = function toLocaleString() {\n return arrayToLocaleString.apply(TO_LOCALE_BUG ? arraySlice.call(validate(this)) : validate(this), arguments);\n };\n\n var proto = {\n copyWithin: function copyWithin(target, start /* , end */) {\n return arrayCopyWithin.call(validate(this), target, start, arguments.length > 2 ? arguments[2] : undefined);\n },\n every: function every(callbackfn /* , thisArg */) {\n return arrayEvery(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n },\n fill: function fill(value /* , start, end */) { // eslint-disable-line no-unused-vars\n return arrayFill.apply(validate(this), arguments);\n },\n filter: function filter(callbackfn /* , thisArg */) {\n return speciesFromList(this, arrayFilter(validate(this), callbackfn,\n arguments.length > 1 ? arguments[1] : undefined));\n },\n find: function find(predicate /* , thisArg */) {\n return arrayFind(validate(this), predicate, arguments.length > 1 ? arguments[1] : undefined);\n },\n findIndex: function findIndex(predicate /* , thisArg */) {\n return arrayFindIndex(validate(this), predicate, arguments.length > 1 ? arguments[1] : undefined);\n },\n forEach: function forEach(callbackfn /* , thisArg */) {\n arrayForEach(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n },\n indexOf: function indexOf(searchElement /* , fromIndex */) {\n return arrayIndexOf(validate(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);\n },\n includes: function includes(searchElement /* , fromIndex */) {\n return arrayIncludes(validate(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);\n },\n join: function join(separator) { // eslint-disable-line no-unused-vars\n return arrayJoin.apply(validate(this), arguments);\n },\n lastIndexOf: function lastIndexOf(searchElement /* , fromIndex */) { // eslint-disable-line no-unused-vars\n return arrayLastIndexOf.apply(validate(this), arguments);\n },\n map: function map(mapfn /* , thisArg */) {\n return $map(validate(this), mapfn, arguments.length > 1 ? arguments[1] : undefined);\n },\n reduce: function reduce(callbackfn /* , initialValue */) { // eslint-disable-line no-unused-vars\n return arrayReduce.apply(validate(this), arguments);\n },\n reduceRight: function reduceRight(callbackfn /* , initialValue */) { // eslint-disable-line no-unused-vars\n return arrayReduceRight.apply(validate(this), arguments);\n },\n reverse: function reverse() {\n var that = this;\n var length = validate(that).length;\n var middle = Math.floor(length / 2);\n var index = 0;\n var value;\n while (index < middle) {\n value = that[index];\n that[index++] = that[--length];\n that[length] = value;\n } return that;\n },\n some: function some(callbackfn /* , thisArg */) {\n return arraySome(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n },\n sort: function sort(comparefn) {\n return arraySort.call(validate(this), comparefn);\n },\n subarray: function subarray(begin, end) {\n var O = validate(this);\n var length = O.length;\n var $begin = toAbsoluteIndex(begin, length);\n return new (speciesConstructor(O, O[DEF_CONSTRUCTOR]))(\n O.buffer,\n O.byteOffset + $begin * O.BYTES_PER_ELEMENT,\n toLength((end === undefined ? length : toAbsoluteIndex(end, length)) - $begin)\n );\n }\n };\n\n var $slice = function slice(start, end) {\n return speciesFromList(this, arraySlice.call(validate(this), start, end));\n };\n\n var $set = function set(arrayLike /* , offset */) {\n validate(this);\n var offset = toOffset(arguments[1], 1);\n var length = this.length;\n var src = toObject(arrayLike);\n var len = toLength(src.length);\n var index = 0;\n if (len + offset > length) throw RangeError(WRONG_LENGTH);\n while (index < len) this[offset + index] = src[index++];\n };\n\n var $iterators = {\n entries: function entries() {\n return arrayEntries.call(validate(this));\n },\n keys: function keys() {\n return arrayKeys.call(validate(this));\n },\n values: function values() {\n return arrayValues.call(validate(this));\n }\n };\n\n var isTAIndex = function (target, key) {\n return isObject(target)\n && target[TYPED_ARRAY]\n && typeof key != 'symbol'\n && key in target\n && String(+key) == String(key);\n };\n var $getDesc = function getOwnPropertyDescriptor(target, key) {\n return isTAIndex(target, key = toPrimitive(key, true))\n ? propertyDesc(2, target[key])\n : gOPD(target, key);\n };\n var $setDesc = function defineProperty(target, key, desc) {\n if (isTAIndex(target, key = toPrimitive(key, true))\n && isObject(desc)\n && has(desc, 'value')\n && !has(desc, 'get')\n && !has(desc, 'set')\n // TODO: add validation descriptor w/o calling accessors\n && !desc.configurable\n && (!has(desc, 'writable') || desc.writable)\n && (!has(desc, 'enumerable') || desc.enumerable)\n ) {\n target[key] = desc.value;\n return target;\n } return dP(target, key, desc);\n };\n\n if (!ALL_CONSTRUCTORS) {\n $GOPD.f = $getDesc;\n $DP.f = $setDesc;\n }\n\n $export($export.S + $export.F * !ALL_CONSTRUCTORS, 'Object', {\n getOwnPropertyDescriptor: $getDesc,\n defineProperty: $setDesc\n });\n\n if (fails(function () { arrayToString.call({}); })) {\n arrayToString = arrayToLocaleString = function toString() {\n return arrayJoin.call(this);\n };\n }\n\n var $TypedArrayPrototype$ = redefineAll({}, proto);\n redefineAll($TypedArrayPrototype$, $iterators);\n hide($TypedArrayPrototype$, ITERATOR, $iterators.values);\n redefineAll($TypedArrayPrototype$, {\n slice: $slice,\n set: $set,\n constructor: function () { /* noop */ },\n toString: arrayToString,\n toLocaleString: $toLocaleString\n });\n addGetter($TypedArrayPrototype$, 'buffer', 'b');\n addGetter($TypedArrayPrototype$, 'byteOffset', 'o');\n addGetter($TypedArrayPrototype$, 'byteLength', 'l');\n addGetter($TypedArrayPrototype$, 'length', 'e');\n dP($TypedArrayPrototype$, TAG, {\n get: function () { return this[TYPED_ARRAY]; }\n });\n\n // eslint-disable-next-line max-statements\n module.exports = function (KEY, BYTES, wrapper, CLAMPED) {\n CLAMPED = !!CLAMPED;\n var NAME = KEY + (CLAMPED ? 'Clamped' : '') + 'Array';\n var GETTER = 'get' + KEY;\n var SETTER = 'set' + KEY;\n var TypedArray = global[NAME];\n var Base = TypedArray || {};\n var TAC = TypedArray && getPrototypeOf(TypedArray);\n var FORCED = !TypedArray || !$typed.ABV;\n var O = {};\n var TypedArrayPrototype = TypedArray && TypedArray[PROTOTYPE];\n var getter = function (that, index) {\n var data = that._d;\n return data.v[GETTER](index * BYTES + data.o, LITTLE_ENDIAN);\n };\n var setter = function (that, index, value) {\n var data = that._d;\n if (CLAMPED) value = (value = Math.round(value)) < 0 ? 0 : value > 0xff ? 0xff : value & 0xff;\n data.v[SETTER](index * BYTES + data.o, value, LITTLE_ENDIAN);\n };\n var addElement = function (that, index) {\n dP(that, index, {\n get: function () {\n return getter(this, index);\n },\n set: function (value) {\n return setter(this, index, value);\n },\n enumerable: true\n });\n };\n if (FORCED) {\n TypedArray = wrapper(function (that, data, $offset, $length) {\n anInstance(that, TypedArray, NAME, '_d');\n var index = 0;\n var offset = 0;\n var buffer, byteLength, length, klass;\n if (!isObject(data)) {\n length = toIndex(data);\n byteLength = length * BYTES;\n buffer = new $ArrayBuffer(byteLength);\n } else if (data instanceof $ArrayBuffer || (klass = classof(data)) == ARRAY_BUFFER || klass == SHARED_BUFFER) {\n buffer = data;\n offset = toOffset($offset, BYTES);\n var $len = data.byteLength;\n if ($length === undefined) {\n if ($len % BYTES) throw RangeError(WRONG_LENGTH);\n byteLength = $len - offset;\n if (byteLength < 0) throw RangeError(WRONG_LENGTH);\n } else {\n byteLength = toLength($length) * BYTES;\n if (byteLength + offset > $len) throw RangeError(WRONG_LENGTH);\n }\n length = byteLength / BYTES;\n } else if (TYPED_ARRAY in data) {\n return fromList(TypedArray, data);\n } else {\n return $from.call(TypedArray, data);\n }\n hide(that, '_d', {\n b: buffer,\n o: offset,\n l: byteLength,\n e: length,\n v: new $DataView(buffer)\n });\n while (index < length) addElement(that, index++);\n });\n TypedArrayPrototype = TypedArray[PROTOTYPE] = create($TypedArrayPrototype$);\n hide(TypedArrayPrototype, 'constructor', TypedArray);\n } else if (!fails(function () {\n TypedArray(1);\n }) || !fails(function () {\n new TypedArray(-1); // eslint-disable-line no-new\n }) || !$iterDetect(function (iter) {\n new TypedArray(); // eslint-disable-line no-new\n new TypedArray(null); // eslint-disable-line no-new\n new TypedArray(1.5); // eslint-disable-line no-new\n new TypedArray(iter); // eslint-disable-line no-new\n }, true)) {\n TypedArray = wrapper(function (that, data, $offset, $length) {\n anInstance(that, TypedArray, NAME);\n var klass;\n // `ws` module bug, temporarily remove validation length for Uint8Array\n // https://github.com/websockets/ws/pull/645\n if (!isObject(data)) return new Base(toIndex(data));\n if (data instanceof $ArrayBuffer || (klass = classof(data)) == ARRAY_BUFFER || klass == SHARED_BUFFER) {\n return $length !== undefined\n ? new Base(data, toOffset($offset, BYTES), $length)\n : $offset !== undefined\n ? new Base(data, toOffset($offset, BYTES))\n : new Base(data);\n }\n if (TYPED_ARRAY in data) return fromList(TypedArray, data);\n return $from.call(TypedArray, data);\n });\n arrayForEach(TAC !== Function.prototype ? gOPN(Base).concat(gOPN(TAC)) : gOPN(Base), function (key) {\n if (!(key in TypedArray)) hide(TypedArray, key, Base[key]);\n });\n TypedArray[PROTOTYPE] = TypedArrayPrototype;\n if (!LIBRARY) TypedArrayPrototype.constructor = TypedArray;\n }\n var $nativeIterator = TypedArrayPrototype[ITERATOR];\n var CORRECT_ITER_NAME = !!$nativeIterator\n && ($nativeIterator.name == 'values' || $nativeIterator.name == undefined);\n var $iterator = $iterators.values;\n hide(TypedArray, TYPED_CONSTRUCTOR, true);\n hide(TypedArrayPrototype, TYPED_ARRAY, NAME);\n hide(TypedArrayPrototype, VIEW, true);\n hide(TypedArrayPrototype, DEF_CONSTRUCTOR, TypedArray);\n\n if (CLAMPED ? new TypedArray(1)[TAG] != NAME : !(TAG in TypedArrayPrototype)) {\n dP(TypedArrayPrototype, TAG, {\n get: function () { return NAME; }\n });\n }\n\n O[NAME] = TypedArray;\n\n $export($export.G + $export.W + $export.F * (TypedArray != Base), O);\n\n $export($export.S, NAME, {\n BYTES_PER_ELEMENT: BYTES\n });\n\n $export($export.S + $export.F * fails(function () { Base.of.call(TypedArray, 1); }), NAME, {\n from: $from,\n of: $of\n });\n\n if (!(BYTES_PER_ELEMENT in TypedArrayPrototype)) hide(TypedArrayPrototype, BYTES_PER_ELEMENT, BYTES);\n\n $export($export.P, NAME, proto);\n\n setSpecies(NAME);\n\n $export($export.P + $export.F * FORCED_SET, NAME, { set: $set });\n\n $export($export.P + $export.F * !CORRECT_ITER_NAME, NAME, $iterators);\n\n if (!LIBRARY && TypedArrayPrototype.toString != arrayToString) TypedArrayPrototype.toString = arrayToString;\n\n $export($export.P + $export.F * fails(function () {\n new TypedArray(1).slice();\n }), NAME, { slice: $slice });\n\n $export($export.P + $export.F * (fails(function () {\n return [1, 2].toLocaleString() != new TypedArray([1, 2]).toLocaleString();\n }) || !fails(function () {\n TypedArrayPrototype.toLocaleString.call([1, 2]);\n })), NAME, { toLocaleString: $toLocaleString });\n\n Iterators[NAME] = CORRECT_ITER_NAME ? $nativeIterator : $iterator;\n if (!LIBRARY && !CORRECT_ITER_NAME) hide(TypedArrayPrototype, ITERATOR, $iterator);\n };\n} else module.exports = function () { /* empty */ };\n","require('./_typed-array')('Int8', 1, function (init) {\n return function Int8Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Uint8', 1, function (init) {\n return function Uint8Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Uint8', 1, function (init) {\n return function Uint8ClampedArray(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n}, true);\n","require('./_typed-array')('Int16', 2, function (init) {\n return function Int16Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Uint16', 2, function (init) {\n return function Uint16Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Int32', 4, function (init) {\n return function Int32Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Uint32', 4, function (init) {\n return function Uint32Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Float32', 4, function (init) {\n return function Float32Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Float64', 8, function (init) {\n return function Float64Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","// call something on iterator step with safe closing on error\nvar anObject = require('./_an-object');\nmodule.exports = function (iterator, fn, value, entries) {\n try {\n return entries ? fn(anObject(value)[0], value[1]) : fn(value);\n // 7.4.6 IteratorClose(iterator, completion)\n } catch (e) {\n var ret = iterator['return'];\n if (ret !== undefined) anObject(ret.call(iterator));\n throw e;\n }\n};\n","var ctx = require('./_ctx');\nvar call = require('./_iter-call');\nvar isArrayIter = require('./_is-array-iter');\nvar anObject = require('./_an-object');\nvar toLength = require('./_to-length');\nvar getIterFn = require('./core.get-iterator-method');\nvar BREAK = {};\nvar RETURN = {};\nvar exports = module.exports = function (iterable, entries, fn, that, ITERATOR) {\n var iterFn = ITERATOR ? function () { return iterable; } : getIterFn(iterable);\n var f = ctx(fn, that, entries ? 2 : 1);\n var index = 0;\n var length, step, iterator, result;\n if (typeof iterFn != 'function') throw TypeError(iterable + ' is not iterable!');\n // fast case for arrays with default iterator\n if (isArrayIter(iterFn)) for (length = toLength(iterable.length); length > index; index++) {\n result = entries ? f(anObject(step = iterable[index])[0], step[1]) : f(iterable[index]);\n if (result === BREAK || result === RETURN) return result;\n } else for (iterator = iterFn.call(iterable); !(step = iterator.next()).done;) {\n result = call(iterator, f, step.value, entries);\n if (result === BREAK || result === RETURN) return result;\n }\n};\nexports.BREAK = BREAK;\nexports.RETURN = RETURN;\n","var META = require('./_uid')('meta');\nvar isObject = require('./_is-object');\nvar has = require('./_has');\nvar setDesc = require('./_object-dp').f;\nvar id = 0;\nvar isExtensible = Object.isExtensible || function () {\n return true;\n};\nvar FREEZE = !require('./_fails')(function () {\n return isExtensible(Object.preventExtensions({}));\n});\nvar setMeta = function (it) {\n setDesc(it, META, { value: {\n i: 'O' + ++id, // object ID\n w: {} // weak collections IDs\n } });\n};\nvar fastKey = function (it, create) {\n // return primitive with prefix\n if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;\n if (!has(it, META)) {\n // can't set metadata to uncaught frozen object\n if (!isExtensible(it)) return 'F';\n // not necessary to add metadata\n if (!create) return 'E';\n // add missing metadata\n setMeta(it);\n // return object ID\n } return it[META].i;\n};\nvar getWeak = function (it, create) {\n if (!has(it, META)) {\n // can't set metadata to uncaught frozen object\n if (!isExtensible(it)) return true;\n // not necessary to add metadata\n if (!create) return false;\n // add missing metadata\n setMeta(it);\n // return hash weak collections IDs\n } return it[META].w;\n};\n// add metadata on freeze-family methods calling\nvar onFreeze = function (it) {\n if (FREEZE && meta.NEED && isExtensible(it) && !has(it, META)) setMeta(it);\n return it;\n};\nvar meta = module.exports = {\n KEY: META,\n NEED: false,\n fastKey: fastKey,\n getWeak: getWeak,\n onFreeze: onFreeze\n};\n","var isObject = require('./_is-object');\nmodule.exports = function (it, TYPE) {\n if (!isObject(it) || it._t !== TYPE) throw TypeError('Incompatible receiver, ' + TYPE + ' required!');\n return it;\n};\n","'use strict';\nvar dP = require('./_object-dp').f;\nvar create = require('./_object-create');\nvar redefineAll = require('./_redefine-all');\nvar ctx = require('./_ctx');\nvar anInstance = require('./_an-instance');\nvar forOf = require('./_for-of');\nvar $iterDefine = require('./_iter-define');\nvar step = require('./_iter-step');\nvar setSpecies = require('./_set-species');\nvar DESCRIPTORS = require('./_descriptors');\nvar fastKey = require('./_meta').fastKey;\nvar validate = require('./_validate-collection');\nvar SIZE = DESCRIPTORS ? '_s' : 'size';\n\nvar getEntry = function (that, key) {\n // fast case\n var index = fastKey(key);\n var entry;\n if (index !== 'F') return that._i[index];\n // frozen object case\n for (entry = that._f; entry; entry = entry.n) {\n if (entry.k == key) return entry;\n }\n};\n\nmodule.exports = {\n getConstructor: function (wrapper, NAME, IS_MAP, ADDER) {\n var C = wrapper(function (that, iterable) {\n anInstance(that, C, NAME, '_i');\n that._t = NAME; // collection type\n that._i = create(null); // index\n that._f = undefined; // first entry\n that._l = undefined; // last entry\n that[SIZE] = 0; // size\n if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n });\n redefineAll(C.prototype, {\n // 23.1.3.1 Map.prototype.clear()\n // 23.2.3.2 Set.prototype.clear()\n clear: function clear() {\n for (var that = validate(this, NAME), data = that._i, entry = that._f; entry; entry = entry.n) {\n entry.r = true;\n if (entry.p) entry.p = entry.p.n = undefined;\n delete data[entry.i];\n }\n that._f = that._l = undefined;\n that[SIZE] = 0;\n },\n // 23.1.3.3 Map.prototype.delete(key)\n // 23.2.3.4 Set.prototype.delete(value)\n 'delete': function (key) {\n var that = validate(this, NAME);\n var entry = getEntry(that, key);\n if (entry) {\n var next = entry.n;\n var prev = entry.p;\n delete that._i[entry.i];\n entry.r = true;\n if (prev) prev.n = next;\n if (next) next.p = prev;\n if (that._f == entry) that._f = next;\n if (that._l == entry) that._l = prev;\n that[SIZE]--;\n } return !!entry;\n },\n // 23.2.3.6 Set.prototype.forEach(callbackfn, thisArg = undefined)\n // 23.1.3.5 Map.prototype.forEach(callbackfn, thisArg = undefined)\n forEach: function forEach(callbackfn /* , that = undefined */) {\n validate(this, NAME);\n var f = ctx(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3);\n var entry;\n while (entry = entry ? entry.n : this._f) {\n f(entry.v, entry.k, this);\n // revert to the last existing entry\n while (entry && entry.r) entry = entry.p;\n }\n },\n // 23.1.3.7 Map.prototype.has(key)\n // 23.2.3.7 Set.prototype.has(value)\n has: function has(key) {\n return !!getEntry(validate(this, NAME), key);\n }\n });\n if (DESCRIPTORS) dP(C.prototype, 'size', {\n get: function () {\n return validate(this, NAME)[SIZE];\n }\n });\n return C;\n },\n def: function (that, key, value) {\n var entry = getEntry(that, key);\n var prev, index;\n // change existing entry\n if (entry) {\n entry.v = value;\n // create new entry\n } else {\n that._l = entry = {\n i: index = fastKey(key, true), // <- index\n k: key, // <- key\n v: value, // <- value\n p: prev = that._l, // <- previous entry\n n: undefined, // <- next entry\n r: false // <- removed\n };\n if (!that._f) that._f = entry;\n if (prev) prev.n = entry;\n that[SIZE]++;\n // add to index\n if (index !== 'F') that._i[index] = entry;\n } return that;\n },\n getEntry: getEntry,\n setStrong: function (C, NAME, IS_MAP) {\n // add .keys, .values, .entries, [@@iterator]\n // 23.1.3.4, 23.1.3.8, 23.1.3.11, 23.1.3.12, 23.2.3.5, 23.2.3.8, 23.2.3.10, 23.2.3.11\n $iterDefine(C, NAME, function (iterated, kind) {\n this._t = validate(iterated, NAME); // target\n this._k = kind; // kind\n this._l = undefined; // previous\n }, function () {\n var that = this;\n var kind = that._k;\n var entry = that._l;\n // revert to the last existing entry\n while (entry && entry.r) entry = entry.p;\n // get next entry\n if (!that._t || !(that._l = entry = entry ? entry.n : that._t._f)) {\n // or finish the iteration\n that._t = undefined;\n return step(1);\n }\n // return step by kind\n if (kind == 'keys') return step(0, entry.k);\n if (kind == 'values') return step(0, entry.v);\n return step(0, [entry.k, entry.v]);\n }, IS_MAP ? 'entries' : 'values', !IS_MAP, true);\n\n // add [@@species], 23.1.2.2, 23.2.2.2\n setSpecies(NAME);\n }\n};\n","// Works with __proto__ only. Old v8 can't work with null proto objects.\n/* eslint-disable no-proto */\nvar isObject = require('./_is-object');\nvar anObject = require('./_an-object');\nvar check = function (O, proto) {\n anObject(O);\n if (!isObject(proto) && proto !== null) throw TypeError(proto + \": can't set as prototype!\");\n};\nmodule.exports = {\n set: Object.setPrototypeOf || ('__proto__' in {} ? // eslint-disable-line\n function (test, buggy, set) {\n try {\n set = require('./_ctx')(Function.call, require('./_object-gopd').f(Object.prototype, '__proto__').set, 2);\n set(test, []);\n buggy = !(test instanceof Array);\n } catch (e) { buggy = true; }\n return function setPrototypeOf(O, proto) {\n check(O, proto);\n if (buggy) O.__proto__ = proto;\n else set(O, proto);\n return O;\n };\n }({}, false) : undefined),\n check: check\n};\n","var isObject = require('./_is-object');\nvar setPrototypeOf = require('./_set-proto').set;\nmodule.exports = function (that, target, C) {\n var S = target.constructor;\n var P;\n if (S !== C && typeof S == 'function' && (P = S.prototype) !== C.prototype && isObject(P) && setPrototypeOf) {\n setPrototypeOf(that, P);\n } return that;\n};\n","'use strict';\nvar global = require('./_global');\nvar $export = require('./_export');\nvar redefine = require('./_redefine');\nvar redefineAll = require('./_redefine-all');\nvar meta = require('./_meta');\nvar forOf = require('./_for-of');\nvar anInstance = require('./_an-instance');\nvar isObject = require('./_is-object');\nvar fails = require('./_fails');\nvar $iterDetect = require('./_iter-detect');\nvar setToStringTag = require('./_set-to-string-tag');\nvar inheritIfRequired = require('./_inherit-if-required');\n\nmodule.exports = function (NAME, wrapper, methods, common, IS_MAP, IS_WEAK) {\n var Base = global[NAME];\n var C = Base;\n var ADDER = IS_MAP ? 'set' : 'add';\n var proto = C && C.prototype;\n var O = {};\n var fixMethod = function (KEY) {\n var fn = proto[KEY];\n redefine(proto, KEY,\n KEY == 'delete' ? function (a) {\n return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);\n } : KEY == 'has' ? function has(a) {\n return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);\n } : KEY == 'get' ? function get(a) {\n return IS_WEAK && !isObject(a) ? undefined : fn.call(this, a === 0 ? 0 : a);\n } : KEY == 'add' ? function add(a) { fn.call(this, a === 0 ? 0 : a); return this; }\n : function set(a, b) { fn.call(this, a === 0 ? 0 : a, b); return this; }\n );\n };\n if (typeof C != 'function' || !(IS_WEAK || proto.forEach && !fails(function () {\n new C().entries().next();\n }))) {\n // create collection constructor\n C = common.getConstructor(wrapper, NAME, IS_MAP, ADDER);\n redefineAll(C.prototype, methods);\n meta.NEED = true;\n } else {\n var instance = new C();\n // early implementations not supports chaining\n var HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) != instance;\n // V8 ~ Chromium 40- weak-collections throws on primitives, but should return false\n var THROWS_ON_PRIMITIVES = fails(function () { instance.has(1); });\n // most early implementations doesn't supports iterables, most modern - not close it correctly\n var ACCEPT_ITERABLES = $iterDetect(function (iter) { new C(iter); }); // eslint-disable-line no-new\n // for early implementations -0 and +0 not the same\n var BUGGY_ZERO = !IS_WEAK && fails(function () {\n // V8 ~ Chromium 42- fails only with 5+ elements\n var $instance = new C();\n var index = 5;\n while (index--) $instance[ADDER](index, index);\n return !$instance.has(-0);\n });\n if (!ACCEPT_ITERABLES) {\n C = wrapper(function (target, iterable) {\n anInstance(target, C, NAME);\n var that = inheritIfRequired(new Base(), target, C);\n if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n return that;\n });\n C.prototype = proto;\n proto.constructor = C;\n }\n if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) {\n fixMethod('delete');\n fixMethod('has');\n IS_MAP && fixMethod('get');\n }\n if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER);\n // weak collections should not contains .clear method\n if (IS_WEAK && proto.clear) delete proto.clear;\n }\n\n setToStringTag(C, NAME);\n\n O[NAME] = C;\n $export($export.G + $export.W + $export.F * (C != Base), O);\n\n if (!IS_WEAK) common.setStrong(C, NAME, IS_MAP);\n\n return C;\n};\n","'use strict';\nvar strong = require('./_collection-strong');\nvar validate = require('./_validate-collection');\nvar MAP = 'Map';\n\n// 23.1 Map Objects\nmodule.exports = require('./_collection')(MAP, function (get) {\n return function Map() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };\n}, {\n // 23.1.3.6 Map.prototype.get(key)\n get: function get(key) {\n var entry = strong.getEntry(validate(this, MAP), key);\n return entry && entry.v;\n },\n // 23.1.3.9 Map.prototype.set(key, value)\n set: function set(key, value) {\n return strong.def(validate(this, MAP), key === 0 ? 0 : key, value);\n }\n}, strong, true);\n","'use strict';\nvar strong = require('./_collection-strong');\nvar validate = require('./_validate-collection');\nvar SET = 'Set';\n\n// 23.2 Set Objects\nmodule.exports = require('./_collection')(SET, function (get) {\n return function Set() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };\n}, {\n // 23.2.3.1 Set.prototype.add(value)\n add: function add(value) {\n return strong.def(validate(this, SET), value = value === 0 ? 0 : value, value);\n }\n}, strong);\n","exports.f = Object.getOwnPropertySymbols;\n","'use strict';\n// 19.1.2.1 Object.assign(target, source, ...)\nvar getKeys = require('./_object-keys');\nvar gOPS = require('./_object-gops');\nvar pIE = require('./_object-pie');\nvar toObject = require('./_to-object');\nvar IObject = require('./_iobject');\nvar $assign = Object.assign;\n\n// should work with symbols and should have deterministic property order (V8 bug)\nmodule.exports = !$assign || require('./_fails')(function () {\n var A = {};\n var B = {};\n // eslint-disable-next-line no-undef\n var S = Symbol();\n var K = 'abcdefghijklmnopqrst';\n A[S] = 7;\n K.split('').forEach(function (k) { B[k] = k; });\n return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K;\n}) ? function assign(target, source) { // eslint-disable-line no-unused-vars\n var T = toObject(target);\n var aLen = arguments.length;\n var index = 1;\n var getSymbols = gOPS.f;\n var isEnum = pIE.f;\n while (aLen > index) {\n var S = IObject(arguments[index++]);\n var keys = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S);\n var length = keys.length;\n var j = 0;\n var key;\n while (length > j) if (isEnum.call(S, key = keys[j++])) T[key] = S[key];\n } return T;\n} : $assign;\n","'use strict';\nvar redefineAll = require('./_redefine-all');\nvar getWeak = require('./_meta').getWeak;\nvar anObject = require('./_an-object');\nvar isObject = require('./_is-object');\nvar anInstance = require('./_an-instance');\nvar forOf = require('./_for-of');\nvar createArrayMethod = require('./_array-methods');\nvar $has = require('./_has');\nvar validate = require('./_validate-collection');\nvar arrayFind = createArrayMethod(5);\nvar arrayFindIndex = createArrayMethod(6);\nvar id = 0;\n\n// fallback for uncaught frozen keys\nvar uncaughtFrozenStore = function (that) {\n return that._l || (that._l = new UncaughtFrozenStore());\n};\nvar UncaughtFrozenStore = function () {\n this.a = [];\n};\nvar findUncaughtFrozen = function (store, key) {\n return arrayFind(store.a, function (it) {\n return it[0] === key;\n });\n};\nUncaughtFrozenStore.prototype = {\n get: function (key) {\n var entry = findUncaughtFrozen(this, key);\n if (entry) return entry[1];\n },\n has: function (key) {\n return !!findUncaughtFrozen(this, key);\n },\n set: function (key, value) {\n var entry = findUncaughtFrozen(this, key);\n if (entry) entry[1] = value;\n else this.a.push([key, value]);\n },\n 'delete': function (key) {\n var index = arrayFindIndex(this.a, function (it) {\n return it[0] === key;\n });\n if (~index) this.a.splice(index, 1);\n return !!~index;\n }\n};\n\nmodule.exports = {\n getConstructor: function (wrapper, NAME, IS_MAP, ADDER) {\n var C = wrapper(function (that, iterable) {\n anInstance(that, C, NAME, '_i');\n that._t = NAME; // collection type\n that._i = id++; // collection id\n that._l = undefined; // leak store for uncaught frozen objects\n if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n });\n redefineAll(C.prototype, {\n // 23.3.3.2 WeakMap.prototype.delete(key)\n // 23.4.3.3 WeakSet.prototype.delete(value)\n 'delete': function (key) {\n if (!isObject(key)) return false;\n var data = getWeak(key);\n if (data === true) return uncaughtFrozenStore(validate(this, NAME))['delete'](key);\n return data && $has(data, this._i) && delete data[this._i];\n },\n // 23.3.3.4 WeakMap.prototype.has(key)\n // 23.4.3.4 WeakSet.prototype.has(value)\n has: function has(key) {\n if (!isObject(key)) return false;\n var data = getWeak(key);\n if (data === true) return uncaughtFrozenStore(validate(this, NAME)).has(key);\n return data && $has(data, this._i);\n }\n });\n return C;\n },\n def: function (that, key, value) {\n var data = getWeak(anObject(key), true);\n if (data === true) uncaughtFrozenStore(that).set(key, value);\n else data[that._i] = value;\n return that;\n },\n ufstore: uncaughtFrozenStore\n};\n","'use strict';\nvar each = require('./_array-methods')(0);\nvar redefine = require('./_redefine');\nvar meta = require('./_meta');\nvar assign = require('./_object-assign');\nvar weak = require('./_collection-weak');\nvar isObject = require('./_is-object');\nvar fails = require('./_fails');\nvar validate = require('./_validate-collection');\nvar WEAK_MAP = 'WeakMap';\nvar getWeak = meta.getWeak;\nvar isExtensible = Object.isExtensible;\nvar uncaughtFrozenStore = weak.ufstore;\nvar tmp = {};\nvar InternalMap;\n\nvar wrapper = function (get) {\n return function WeakMap() {\n return get(this, arguments.length > 0 ? arguments[0] : undefined);\n };\n};\n\nvar methods = {\n // 23.3.3.3 WeakMap.prototype.get(key)\n get: function get(key) {\n if (isObject(key)) {\n var data = getWeak(key);\n if (data === true) return uncaughtFrozenStore(validate(this, WEAK_MAP)).get(key);\n return data ? data[this._i] : undefined;\n }\n },\n // 23.3.3.5 WeakMap.prototype.set(key, value)\n set: function set(key, value) {\n return weak.def(validate(this, WEAK_MAP), key, value);\n }\n};\n\n// 23.3 WeakMap Objects\nvar $WeakMap = module.exports = require('./_collection')(WEAK_MAP, wrapper, methods, weak, true, true);\n\n// IE11 WeakMap frozen keys fix\nif (fails(function () { return new $WeakMap().set((Object.freeze || Object)(tmp), 7).get(tmp) != 7; })) {\n InternalMap = weak.getConstructor(wrapper, WEAK_MAP);\n assign(InternalMap.prototype, methods);\n meta.NEED = true;\n each(['delete', 'has', 'get', 'set'], function (key) {\n var proto = $WeakMap.prototype;\n var method = proto[key];\n redefine(proto, key, function (a, b) {\n // store frozen objects on internal weakmap shim\n if (isObject(a) && !isExtensible(a)) {\n if (!this._f) this._f = new InternalMap();\n var result = this._f[key](a, b);\n return key == 'set' ? this : result;\n // store all the rest on native weakmap\n } return method.call(this, a, b);\n });\n });\n}\n","'use strict';\nvar weak = require('./_collection-weak');\nvar validate = require('./_validate-collection');\nvar WEAK_SET = 'WeakSet';\n\n// 23.4 WeakSet Objects\nrequire('./_collection')(WEAK_SET, function (get) {\n return function WeakSet() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };\n}, {\n // 23.4.3.1 WeakSet.prototype.add(value)\n add: function add(value) {\n return weak.def(validate(this, WEAK_SET), value, true);\n }\n}, weak, false, true);\n","// 26.1.1 Reflect.apply(target, thisArgument, argumentsList)\nvar $export = require('./_export');\nvar aFunction = require('./_a-function');\nvar anObject = require('./_an-object');\nvar rApply = (require('./_global').Reflect || {}).apply;\nvar fApply = Function.apply;\n// MS Edge argumentsList argument is optional\n$export($export.S + $export.F * !require('./_fails')(function () {\n rApply(function () { /* empty */ });\n}), 'Reflect', {\n apply: function apply(target, thisArgument, argumentsList) {\n var T = aFunction(target);\n var L = anObject(argumentsList);\n return rApply ? rApply(T, thisArgument, L) : fApply.call(T, thisArgument, L);\n }\n});\n","// fast apply, http://jsperf.lnkit.com/fast-apply/5\nmodule.exports = function (fn, args, that) {\n var un = that === undefined;\n switch (args.length) {\n case 0: return un ? fn()\n : fn.call(that);\n case 1: return un ? fn(args[0])\n : fn.call(that, args[0]);\n case 2: return un ? fn(args[0], args[1])\n : fn.call(that, args[0], args[1]);\n case 3: return un ? fn(args[0], args[1], args[2])\n : fn.call(that, args[0], args[1], args[2]);\n case 4: return un ? fn(args[0], args[1], args[2], args[3])\n : fn.call(that, args[0], args[1], args[2], args[3]);\n } return fn.apply(that, args);\n};\n","'use strict';\nvar aFunction = require('./_a-function');\nvar isObject = require('./_is-object');\nvar invoke = require('./_invoke');\nvar arraySlice = [].slice;\nvar factories = {};\n\nvar construct = function (F, len, args) {\n if (!(len in factories)) {\n for (var n = [], i = 0; i < len; i++) n[i] = 'a[' + i + ']';\n // eslint-disable-next-line no-new-func\n factories[len] = Function('F,a', 'return new F(' + n.join(',') + ')');\n } return factories[len](F, args);\n};\n\nmodule.exports = Function.bind || function bind(that /* , ...args */) {\n var fn = aFunction(this);\n var partArgs = arraySlice.call(arguments, 1);\n var bound = function (/* args... */) {\n var args = partArgs.concat(arraySlice.call(arguments));\n return this instanceof bound ? construct(fn, args.length, args) : invoke(fn, args, that);\n };\n if (isObject(fn.prototype)) bound.prototype = fn.prototype;\n return bound;\n};\n","// 26.1.2 Reflect.construct(target, argumentsList [, newTarget])\nvar $export = require('./_export');\nvar create = require('./_object-create');\nvar aFunction = require('./_a-function');\nvar anObject = require('./_an-object');\nvar isObject = require('./_is-object');\nvar fails = require('./_fails');\nvar bind = require('./_bind');\nvar rConstruct = (require('./_global').Reflect || {}).construct;\n\n// MS Edge supports only 2 arguments and argumentsList argument is optional\n// FF Nightly sets third argument as `new.target`, but does not create `this` from it\nvar NEW_TARGET_BUG = fails(function () {\n function F() { /* empty */ }\n return !(rConstruct(function () { /* empty */ }, [], F) instanceof F);\n});\nvar ARGS_BUG = !fails(function () {\n rConstruct(function () { /* empty */ });\n});\n\n$export($export.S + $export.F * (NEW_TARGET_BUG || ARGS_BUG), 'Reflect', {\n construct: function construct(Target, args /* , newTarget */) {\n aFunction(Target);\n anObject(args);\n var newTarget = arguments.length < 3 ? Target : aFunction(arguments[2]);\n if (ARGS_BUG && !NEW_TARGET_BUG) return rConstruct(Target, args, newTarget);\n if (Target == newTarget) {\n // w/o altered newTarget, optimization for 0-4 arguments\n switch (args.length) {\n case 0: return new Target();\n case 1: return new Target(args[0]);\n case 2: return new Target(args[0], args[1]);\n case 3: return new Target(args[0], args[1], args[2]);\n case 4: return new Target(args[0], args[1], args[2], args[3]);\n }\n // w/o altered newTarget, lot of arguments case\n var $args = [null];\n $args.push.apply($args, args);\n return new (bind.apply(Target, $args))();\n }\n // with altered newTarget, not support built-in constructors\n var proto = newTarget.prototype;\n var instance = create(isObject(proto) ? proto : Object.prototype);\n var result = Function.apply.call(Target, instance, args);\n return isObject(result) ? result : instance;\n }\n});\n","// 26.1.3 Reflect.defineProperty(target, propertyKey, attributes)\nvar dP = require('./_object-dp');\nvar $export = require('./_export');\nvar anObject = require('./_an-object');\nvar toPrimitive = require('./_to-primitive');\n\n// MS Edge has broken Reflect.defineProperty - throwing instead of returning false\n$export($export.S + $export.F * require('./_fails')(function () {\n // eslint-disable-next-line no-undef\n Reflect.defineProperty(dP.f({}, 1, { value: 1 }), 1, { value: 2 });\n}), 'Reflect', {\n defineProperty: function defineProperty(target, propertyKey, attributes) {\n anObject(target);\n propertyKey = toPrimitive(propertyKey, true);\n anObject(attributes);\n try {\n dP.f(target, propertyKey, attributes);\n return true;\n } catch (e) {\n return false;\n }\n }\n});\n","// 26.1.4 Reflect.deleteProperty(target, propertyKey)\nvar $export = require('./_export');\nvar gOPD = require('./_object-gopd').f;\nvar anObject = require('./_an-object');\n\n$export($export.S, 'Reflect', {\n deleteProperty: function deleteProperty(target, propertyKey) {\n var desc = gOPD(anObject(target), propertyKey);\n return desc && !desc.configurable ? false : delete target[propertyKey];\n }\n});\n","// 26.1.6 Reflect.get(target, propertyKey [, receiver])\nvar gOPD = require('./_object-gopd');\nvar getPrototypeOf = require('./_object-gpo');\nvar has = require('./_has');\nvar $export = require('./_export');\nvar isObject = require('./_is-object');\nvar anObject = require('./_an-object');\n\nfunction get(target, propertyKey /* , receiver */) {\n var receiver = arguments.length < 3 ? target : arguments[2];\n var desc, proto;\n if (anObject(target) === receiver) return target[propertyKey];\n if (desc = gOPD.f(target, propertyKey)) return has(desc, 'value')\n ? desc.value\n : desc.get !== undefined\n ? desc.get.call(receiver)\n : undefined;\n if (isObject(proto = getPrototypeOf(target))) return get(proto, propertyKey, receiver);\n}\n\n$export($export.S, 'Reflect', { get: get });\n","// 26.1.7 Reflect.getOwnPropertyDescriptor(target, propertyKey)\nvar gOPD = require('./_object-gopd');\nvar $export = require('./_export');\nvar anObject = require('./_an-object');\n\n$export($export.S, 'Reflect', {\n getOwnPropertyDescriptor: function getOwnPropertyDescriptor(target, propertyKey) {\n return gOPD.f(anObject(target), propertyKey);\n }\n});\n","// 26.1.8 Reflect.getPrototypeOf(target)\nvar $export = require('./_export');\nvar getProto = require('./_object-gpo');\nvar anObject = require('./_an-object');\n\n$export($export.S, 'Reflect', {\n getPrototypeOf: function getPrototypeOf(target) {\n return getProto(anObject(target));\n }\n});\n","// 26.1.9 Reflect.has(target, propertyKey)\nvar $export = require('./_export');\n\n$export($export.S, 'Reflect', {\n has: function has(target, propertyKey) {\n return propertyKey in target;\n }\n});\n","// 26.1.10 Reflect.isExtensible(target)\nvar $export = require('./_export');\nvar anObject = require('./_an-object');\nvar $isExtensible = Object.isExtensible;\n\n$export($export.S, 'Reflect', {\n isExtensible: function isExtensible(target) {\n anObject(target);\n return $isExtensible ? $isExtensible(target) : true;\n }\n});\n","// all object keys, includes non-enumerable and symbols\nvar gOPN = require('./_object-gopn');\nvar gOPS = require('./_object-gops');\nvar anObject = require('./_an-object');\nvar Reflect = require('./_global').Reflect;\nmodule.exports = Reflect && Reflect.ownKeys || function ownKeys(it) {\n var keys = gOPN.f(anObject(it));\n var getSymbols = gOPS.f;\n return getSymbols ? keys.concat(getSymbols(it)) : keys;\n};\n","// 26.1.11 Reflect.ownKeys(target)\nvar $export = require('./_export');\n\n$export($export.S, 'Reflect', { ownKeys: require('./_own-keys') });\n","// 26.1.12 Reflect.preventExtensions(target)\nvar $export = require('./_export');\nvar anObject = require('./_an-object');\nvar $preventExtensions = Object.preventExtensions;\n\n$export($export.S, 'Reflect', {\n preventExtensions: function preventExtensions(target) {\n anObject(target);\n try {\n if ($preventExtensions) $preventExtensions(target);\n return true;\n } catch (e) {\n return false;\n }\n }\n});\n","// 26.1.13 Reflect.set(target, propertyKey, V [, receiver])\nvar dP = require('./_object-dp');\nvar gOPD = require('./_object-gopd');\nvar getPrototypeOf = require('./_object-gpo');\nvar has = require('./_has');\nvar $export = require('./_export');\nvar createDesc = require('./_property-desc');\nvar anObject = require('./_an-object');\nvar isObject = require('./_is-object');\n\nfunction set(target, propertyKey, V /* , receiver */) {\n var receiver = arguments.length < 4 ? target : arguments[3];\n var ownDesc = gOPD.f(anObject(target), propertyKey);\n var existingDescriptor, proto;\n if (!ownDesc) {\n if (isObject(proto = getPrototypeOf(target))) {\n return set(proto, propertyKey, V, receiver);\n }\n ownDesc = createDesc(0);\n }\n if (has(ownDesc, 'value')) {\n if (ownDesc.writable === false || !isObject(receiver)) return false;\n existingDescriptor = gOPD.f(receiver, propertyKey) || createDesc(0);\n existingDescriptor.value = V;\n dP.f(receiver, propertyKey, existingDescriptor);\n return true;\n }\n return ownDesc.set === undefined ? false : (ownDesc.set.call(receiver, V), true);\n}\n\n$export($export.S, 'Reflect', { set: set });\n","// 26.1.14 Reflect.setPrototypeOf(target, proto)\nvar $export = require('./_export');\nvar setProto = require('./_set-proto');\n\nif (setProto) $export($export.S, 'Reflect', {\n setPrototypeOf: function setPrototypeOf(target, proto) {\n setProto.check(target, proto);\n try {\n setProto.set(target, proto);\n return true;\n } catch (e) {\n return false;\n }\n }\n});\n","var ctx = require('./_ctx');\nvar invoke = require('./_invoke');\nvar html = require('./_html');\nvar cel = require('./_dom-create');\nvar global = require('./_global');\nvar process = global.process;\nvar setTask = global.setImmediate;\nvar clearTask = global.clearImmediate;\nvar MessageChannel = global.MessageChannel;\nvar Dispatch = global.Dispatch;\nvar counter = 0;\nvar queue = {};\nvar ONREADYSTATECHANGE = 'onreadystatechange';\nvar defer, channel, port;\nvar run = function () {\n var id = +this;\n // eslint-disable-next-line no-prototype-builtins\n if (queue.hasOwnProperty(id)) {\n var fn = queue[id];\n delete queue[id];\n fn();\n }\n};\nvar listener = function (event) {\n run.call(event.data);\n};\n// Node.js 0.9+ & IE10+ has setImmediate, otherwise:\nif (!setTask || !clearTask) {\n setTask = function setImmediate(fn) {\n var args = [];\n var i = 1;\n while (arguments.length > i) args.push(arguments[i++]);\n queue[++counter] = function () {\n // eslint-disable-next-line no-new-func\n invoke(typeof fn == 'function' ? fn : Function(fn), args);\n };\n defer(counter);\n return counter;\n };\n clearTask = function clearImmediate(id) {\n delete queue[id];\n };\n // Node.js 0.8-\n if (require('./_cof')(process) == 'process') {\n defer = function (id) {\n process.nextTick(ctx(run, id, 1));\n };\n // Sphere (JS game engine) Dispatch API\n } else if (Dispatch && Dispatch.now) {\n defer = function (id) {\n Dispatch.now(ctx(run, id, 1));\n };\n // Browsers with MessageChannel, includes WebWorkers\n } else if (MessageChannel) {\n channel = new MessageChannel();\n port = channel.port2;\n channel.port1.onmessage = listener;\n defer = ctx(port.postMessage, port, 1);\n // Browsers with postMessage, skip WebWorkers\n // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'\n } else if (global.addEventListener && typeof postMessage == 'function' && !global.importScripts) {\n defer = function (id) {\n global.postMessage(id + '', '*');\n };\n global.addEventListener('message', listener, false);\n // IE8-\n } else if (ONREADYSTATECHANGE in cel('script')) {\n defer = function (id) {\n html.appendChild(cel('script'))[ONREADYSTATECHANGE] = function () {\n html.removeChild(this);\n run.call(id);\n };\n };\n // Rest old browsers\n } else {\n defer = function (id) {\n setTimeout(ctx(run, id, 1), 0);\n };\n }\n}\nmodule.exports = {\n set: setTask,\n clear: clearTask\n};\n","var global = require('./_global');\nvar macrotask = require('./_task').set;\nvar Observer = global.MutationObserver || global.WebKitMutationObserver;\nvar process = global.process;\nvar Promise = global.Promise;\nvar isNode = require('./_cof')(process) == 'process';\n\nmodule.exports = function () {\n var head, last, notify;\n\n var flush = function () {\n var parent, fn;\n if (isNode && (parent = process.domain)) parent.exit();\n while (head) {\n fn = head.fn;\n head = head.next;\n try {\n fn();\n } catch (e) {\n if (head) notify();\n else last = undefined;\n throw e;\n }\n } last = undefined;\n if (parent) parent.enter();\n };\n\n // Node.js\n if (isNode) {\n notify = function () {\n process.nextTick(flush);\n };\n // browsers with MutationObserver, except iOS Safari - https://github.com/zloirock/core-js/issues/339\n } else if (Observer && !(global.navigator && global.navigator.standalone)) {\n var toggle = true;\n var node = document.createTextNode('');\n new Observer(flush).observe(node, { characterData: true }); // eslint-disable-line no-new\n notify = function () {\n node.data = toggle = !toggle;\n };\n // environments with maybe non-completely correct, but existent Promise\n } else if (Promise && Promise.resolve) {\n var promise = Promise.resolve();\n notify = function () {\n promise.then(flush);\n };\n // for other environments - macrotask based on:\n // - setImmediate\n // - MessageChannel\n // - window.postMessag\n // - onreadystatechange\n // - setTimeout\n } else {\n notify = function () {\n // strange IE + webpack dev server bug - use .call(global)\n macrotask.call(global, flush);\n };\n }\n\n return function (fn) {\n var task = { fn: fn, next: undefined };\n if (last) last.next = task;\n if (!head) {\n head = task;\n notify();\n } last = task;\n };\n};\n","'use strict';\n// 25.4.1.5 NewPromiseCapability(C)\nvar aFunction = require('./_a-function');\n\nfunction PromiseCapability(C) {\n var resolve, reject;\n this.promise = new C(function ($$resolve, $$reject) {\n if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor');\n resolve = $$resolve;\n reject = $$reject;\n });\n this.resolve = aFunction(resolve);\n this.reject = aFunction(reject);\n}\n\nmodule.exports.f = function (C) {\n return new PromiseCapability(C);\n};\n","'use strict';\nvar LIBRARY = require('./_library');\nvar global = require('./_global');\nvar ctx = require('./_ctx');\nvar classof = require('./_classof');\nvar $export = require('./_export');\nvar isObject = require('./_is-object');\nvar aFunction = require('./_a-function');\nvar anInstance = require('./_an-instance');\nvar forOf = require('./_for-of');\nvar speciesConstructor = require('./_species-constructor');\nvar task = require('./_task').set;\nvar microtask = require('./_microtask')();\nvar newPromiseCapabilityModule = require('./_new-promise-capability');\nvar perform = require('./_perform');\nvar promiseResolve = require('./_promise-resolve');\nvar PROMISE = 'Promise';\nvar TypeError = global.TypeError;\nvar process = global.process;\nvar $Promise = global[PROMISE];\nvar isNode = classof(process) == 'process';\nvar empty = function () { /* empty */ };\nvar Internal, newGenericPromiseCapability, OwnPromiseCapability, Wrapper;\nvar newPromiseCapability = newGenericPromiseCapability = newPromiseCapabilityModule.f;\n\nvar USE_NATIVE = !!function () {\n try {\n // correct subclassing with @@species support\n var promise = $Promise.resolve(1);\n var FakePromise = (promise.constructor = {})[require('./_wks')('species')] = function (exec) {\n exec(empty, empty);\n };\n // unhandled rejections tracking support, NodeJS Promise without it fails @@species test\n return (isNode || typeof PromiseRejectionEvent == 'function') && promise.then(empty) instanceof FakePromise;\n } catch (e) { /* empty */ }\n}();\n\n// helpers\nvar isThenable = function (it) {\n var then;\n return isObject(it) && typeof (then = it.then) == 'function' ? then : false;\n};\nvar notify = function (promise, isReject) {\n if (promise._n) return;\n promise._n = true;\n var chain = promise._c;\n microtask(function () {\n var value = promise._v;\n var ok = promise._s == 1;\n var i = 0;\n var run = function (reaction) {\n var handler = ok ? reaction.ok : reaction.fail;\n var resolve = reaction.resolve;\n var reject = reaction.reject;\n var domain = reaction.domain;\n var result, then;\n try {\n if (handler) {\n if (!ok) {\n if (promise._h == 2) onHandleUnhandled(promise);\n promise._h = 1;\n }\n if (handler === true) result = value;\n else {\n if (domain) domain.enter();\n result = handler(value);\n if (domain) domain.exit();\n }\n if (result === reaction.promise) {\n reject(TypeError('Promise-chain cycle'));\n } else if (then = isThenable(result)) {\n then.call(result, resolve, reject);\n } else resolve(result);\n } else reject(value);\n } catch (e) {\n reject(e);\n }\n };\n while (chain.length > i) run(chain[i++]); // variable length - can't use forEach\n promise._c = [];\n promise._n = false;\n if (isReject && !promise._h) onUnhandled(promise);\n });\n};\nvar onUnhandled = function (promise) {\n task.call(global, function () {\n var value = promise._v;\n var unhandled = isUnhandled(promise);\n var result, handler, console;\n if (unhandled) {\n result = perform(function () {\n if (isNode) {\n process.emit('unhandledRejection', value, promise);\n } else if (handler = global.onunhandledrejection) {\n handler({ promise: promise, reason: value });\n } else if ((console = global.console) && console.error) {\n console.error('Unhandled promise rejection', value);\n }\n });\n // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should\n promise._h = isNode || isUnhandled(promise) ? 2 : 1;\n } promise._a = undefined;\n if (unhandled && result.e) throw result.v;\n });\n};\nvar isUnhandled = function (promise) {\n return promise._h !== 1 && (promise._a || promise._c).length === 0;\n};\nvar onHandleUnhandled = function (promise) {\n task.call(global, function () {\n var handler;\n if (isNode) {\n process.emit('rejectionHandled', promise);\n } else if (handler = global.onrejectionhandled) {\n handler({ promise: promise, reason: promise._v });\n }\n });\n};\nvar $reject = function (value) {\n var promise = this;\n if (promise._d) return;\n promise._d = true;\n promise = promise._w || promise; // unwrap\n promise._v = value;\n promise._s = 2;\n if (!promise._a) promise._a = promise._c.slice();\n notify(promise, true);\n};\nvar $resolve = function (value) {\n var promise = this;\n var then;\n if (promise._d) return;\n promise._d = true;\n promise = promise._w || promise; // unwrap\n try {\n if (promise === value) throw TypeError(\"Promise can't be resolved itself\");\n if (then = isThenable(value)) {\n microtask(function () {\n var wrapper = { _w: promise, _d: false }; // wrap\n try {\n then.call(value, ctx($resolve, wrapper, 1), ctx($reject, wrapper, 1));\n } catch (e) {\n $reject.call(wrapper, e);\n }\n });\n } else {\n promise._v = value;\n promise._s = 1;\n notify(promise, false);\n }\n } catch (e) {\n $reject.call({ _w: promise, _d: false }, e); // wrap\n }\n};\n\n// constructor polyfill\nif (!USE_NATIVE) {\n // 25.4.3.1 Promise(executor)\n $Promise = function Promise(executor) {\n anInstance(this, $Promise, PROMISE, '_h');\n aFunction(executor);\n Internal.call(this);\n try {\n executor(ctx($resolve, this, 1), ctx($reject, this, 1));\n } catch (err) {\n $reject.call(this, err);\n }\n };\n // eslint-disable-next-line no-unused-vars\n Internal = function Promise(executor) {\n this._c = []; // <- awaiting reactions\n this._a = undefined; // <- checked in isUnhandled reactions\n this._s = 0; // <- state\n this._d = false; // <- done\n this._v = undefined; // <- value\n this._h = 0; // <- rejection state, 0 - default, 1 - handled, 2 - unhandled\n this._n = false; // <- notify\n };\n Internal.prototype = require('./_redefine-all')($Promise.prototype, {\n // 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected)\n then: function then(onFulfilled, onRejected) {\n var reaction = newPromiseCapability(speciesConstructor(this, $Promise));\n reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;\n reaction.fail = typeof onRejected == 'function' && onRejected;\n reaction.domain = isNode ? process.domain : undefined;\n this._c.push(reaction);\n if (this._a) this._a.push(reaction);\n if (this._s) notify(this, false);\n return reaction.promise;\n },\n // 25.4.5.1 Promise.prototype.catch(onRejected)\n 'catch': function (onRejected) {\n return this.then(undefined, onRejected);\n }\n });\n OwnPromiseCapability = function () {\n var promise = new Internal();\n this.promise = promise;\n this.resolve = ctx($resolve, promise, 1);\n this.reject = ctx($reject, promise, 1);\n };\n newPromiseCapabilityModule.f = newPromiseCapability = function (C) {\n return C === $Promise || C === Wrapper\n ? new OwnPromiseCapability(C)\n : newGenericPromiseCapability(C);\n };\n}\n\n$export($export.G + $export.W + $export.F * !USE_NATIVE, { Promise: $Promise });\nrequire('./_set-to-string-tag')($Promise, PROMISE);\nrequire('./_set-species')(PROMISE);\nWrapper = require('./_core')[PROMISE];\n\n// statics\n$export($export.S + $export.F * !USE_NATIVE, PROMISE, {\n // 25.4.4.5 Promise.reject(r)\n reject: function reject(r) {\n var capability = newPromiseCapability(this);\n var $$reject = capability.reject;\n $$reject(r);\n return capability.promise;\n }\n});\n$export($export.S + $export.F * (LIBRARY || !USE_NATIVE), PROMISE, {\n // 25.4.4.6 Promise.resolve(x)\n resolve: function resolve(x) {\n return promiseResolve(LIBRARY && this === Wrapper ? $Promise : this, x);\n }\n});\n$export($export.S + $export.F * !(USE_NATIVE && require('./_iter-detect')(function (iter) {\n $Promise.all(iter)['catch'](empty);\n})), PROMISE, {\n // 25.4.4.1 Promise.all(iterable)\n all: function all(iterable) {\n var C = this;\n var capability = newPromiseCapability(C);\n var resolve = capability.resolve;\n var reject = capability.reject;\n var result = perform(function () {\n var values = [];\n var index = 0;\n var remaining = 1;\n forOf(iterable, false, function (promise) {\n var $index = index++;\n var alreadyCalled = false;\n values.push(undefined);\n remaining++;\n C.resolve(promise).then(function (value) {\n if (alreadyCalled) return;\n alreadyCalled = true;\n values[$index] = value;\n --remaining || resolve(values);\n }, reject);\n });\n --remaining || resolve(values);\n });\n if (result.e) reject(result.v);\n return capability.promise;\n },\n // 25.4.4.4 Promise.race(iterable)\n race: function race(iterable) {\n var C = this;\n var capability = newPromiseCapability(C);\n var reject = capability.reject;\n var result = perform(function () {\n forOf(iterable, false, function (promise) {\n C.resolve(promise).then(capability.resolve, reject);\n });\n });\n if (result.e) reject(result.v);\n return capability.promise;\n }\n});\n","module.exports = function (exec) {\n try {\n return { e: false, v: exec() };\n } catch (e) {\n return { e: true, v: e };\n }\n};\n","var anObject = require('./_an-object');\nvar isObject = require('./_is-object');\nvar newPromiseCapability = require('./_new-promise-capability');\n\nmodule.exports = function (C, x) {\n anObject(C);\n if (isObject(x) && x.constructor === C) return x;\n var promiseCapability = newPromiseCapability.f(C);\n var resolve = promiseCapability.resolve;\n resolve(x);\n return promiseCapability.promise;\n};\n","exports.f = require('./_wks');\n","var global = require('./_global');\nvar core = require('./_core');\nvar LIBRARY = require('./_library');\nvar wksExt = require('./_wks-ext');\nvar defineProperty = require('./_object-dp').f;\nmodule.exports = function (name) {\n var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {});\n if (name.charAt(0) != '_' && !(name in $Symbol)) defineProperty($Symbol, name, { value: wksExt.f(name) });\n};\n","// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window\nvar toIObject = require('./_to-iobject');\nvar gOPN = require('./_object-gopn').f;\nvar toString = {}.toString;\n\nvar windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames\n ? Object.getOwnPropertyNames(window) : [];\n\nvar getWindowNames = function (it) {\n try {\n return gOPN(it);\n } catch (e) {\n return windowNames.slice();\n }\n};\n\nmodule.exports.f = function getOwnPropertyNames(it) {\n return windowNames && toString.call(it) == '[object Window]' ? getWindowNames(it) : gOPN(toIObject(it));\n};\n","'use strict';\n// ECMAScript 6 symbols shim\nvar global = require('./_global');\nvar has = require('./_has');\nvar DESCRIPTORS = require('./_descriptors');\nvar $export = require('./_export');\nvar redefine = require('./_redefine');\nvar META = require('./_meta').KEY;\nvar $fails = require('./_fails');\nvar shared = require('./_shared');\nvar setToStringTag = require('./_set-to-string-tag');\nvar uid = require('./_uid');\nvar wks = require('./_wks');\nvar wksExt = require('./_wks-ext');\nvar wksDefine = require('./_wks-define');\nvar enumKeys = require('./_enum-keys');\nvar isArray = require('./_is-array');\nvar anObject = require('./_an-object');\nvar isObject = require('./_is-object');\nvar toIObject = require('./_to-iobject');\nvar toPrimitive = require('./_to-primitive');\nvar createDesc = require('./_property-desc');\nvar _create = require('./_object-create');\nvar gOPNExt = require('./_object-gopn-ext');\nvar $GOPD = require('./_object-gopd');\nvar $DP = require('./_object-dp');\nvar $keys = require('./_object-keys');\nvar gOPD = $GOPD.f;\nvar dP = $DP.f;\nvar gOPN = gOPNExt.f;\nvar $Symbol = global.Symbol;\nvar $JSON = global.JSON;\nvar _stringify = $JSON && $JSON.stringify;\nvar PROTOTYPE = 'prototype';\nvar HIDDEN = wks('_hidden');\nvar TO_PRIMITIVE = wks('toPrimitive');\nvar isEnum = {}.propertyIsEnumerable;\nvar SymbolRegistry = shared('symbol-registry');\nvar AllSymbols = shared('symbols');\nvar OPSymbols = shared('op-symbols');\nvar ObjectProto = Object[PROTOTYPE];\nvar USE_NATIVE = typeof $Symbol == 'function';\nvar QObject = global.QObject;\n// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173\nvar setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;\n\n// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687\nvar setSymbolDesc = DESCRIPTORS && $fails(function () {\n return _create(dP({}, 'a', {\n get: function () { return dP(this, 'a', { value: 7 }).a; }\n })).a != 7;\n}) ? function (it, key, D) {\n var protoDesc = gOPD(ObjectProto, key);\n if (protoDesc) delete ObjectProto[key];\n dP(it, key, D);\n if (protoDesc && it !== ObjectProto) dP(ObjectProto, key, protoDesc);\n} : dP;\n\nvar wrap = function (tag) {\n var sym = AllSymbols[tag] = _create($Symbol[PROTOTYPE]);\n sym._k = tag;\n return sym;\n};\n\nvar isSymbol = USE_NATIVE && typeof $Symbol.iterator == 'symbol' ? function (it) {\n return typeof it == 'symbol';\n} : function (it) {\n return it instanceof $Symbol;\n};\n\nvar $defineProperty = function defineProperty(it, key, D) {\n if (it === ObjectProto) $defineProperty(OPSymbols, key, D);\n anObject(it);\n key = toPrimitive(key, true);\n anObject(D);\n if (has(AllSymbols, key)) {\n if (!D.enumerable) {\n if (!has(it, HIDDEN)) dP(it, HIDDEN, createDesc(1, {}));\n it[HIDDEN][key] = true;\n } else {\n if (has(it, HIDDEN) && it[HIDDEN][key]) it[HIDDEN][key] = false;\n D = _create(D, { enumerable: createDesc(0, false) });\n } return setSymbolDesc(it, key, D);\n } return dP(it, key, D);\n};\nvar $defineProperties = function defineProperties(it, P) {\n anObject(it);\n var keys = enumKeys(P = toIObject(P));\n var i = 0;\n var l = keys.length;\n var key;\n while (l > i) $defineProperty(it, key = keys[i++], P[key]);\n return it;\n};\nvar $create = function create(it, P) {\n return P === undefined ? _create(it) : $defineProperties(_create(it), P);\n};\nvar $propertyIsEnumerable = function propertyIsEnumerable(key) {\n var E = isEnum.call(this, key = toPrimitive(key, true));\n if (this === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return false;\n return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true;\n};\nvar $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key) {\n it = toIObject(it);\n key = toPrimitive(key, true);\n if (it === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return;\n var D = gOPD(it, key);\n if (D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) D.enumerable = true;\n return D;\n};\nvar $getOwnPropertyNames = function getOwnPropertyNames(it) {\n var names = gOPN(toIObject(it));\n var result = [];\n var i = 0;\n var key;\n while (names.length > i) {\n if (!has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META) result.push(key);\n } return result;\n};\nvar $getOwnPropertySymbols = function getOwnPropertySymbols(it) {\n var IS_OP = it === ObjectProto;\n var names = gOPN(IS_OP ? OPSymbols : toIObject(it));\n var result = [];\n var i = 0;\n var key;\n while (names.length > i) {\n if (has(AllSymbols, key = names[i++]) && (IS_OP ? has(ObjectProto, key) : true)) result.push(AllSymbols[key]);\n } return result;\n};\n\n// 19.4.1.1 Symbol([description])\nif (!USE_NATIVE) {\n $Symbol = function Symbol() {\n if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor!');\n var tag = uid(arguments.length > 0 ? arguments[0] : undefined);\n var $set = function (value) {\n if (this === ObjectProto) $set.call(OPSymbols, value);\n if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;\n setSymbolDesc(this, tag, createDesc(1, value));\n };\n if (DESCRIPTORS && setter) setSymbolDesc(ObjectProto, tag, { configurable: true, set: $set });\n return wrap(tag);\n };\n redefine($Symbol[PROTOTYPE], 'toString', function toString() {\n return this._k;\n });\n\n $GOPD.f = $getOwnPropertyDescriptor;\n $DP.f = $defineProperty;\n require('./_object-gopn').f = gOPNExt.f = $getOwnPropertyNames;\n require('./_object-pie').f = $propertyIsEnumerable;\n require('./_object-gops').f = $getOwnPropertySymbols;\n\n if (DESCRIPTORS && !require('./_library')) {\n redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true);\n }\n\n wksExt.f = function (name) {\n return wrap(wks(name));\n };\n}\n\n$export($export.G + $export.W + $export.F * !USE_NATIVE, { Symbol: $Symbol });\n\nfor (var es6Symbols = (\n // 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14\n 'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'\n).split(','), j = 0; es6Symbols.length > j;)wks(es6Symbols[j++]);\n\nfor (var wellKnownSymbols = $keys(wks.store), k = 0; wellKnownSymbols.length > k;) wksDefine(wellKnownSymbols[k++]);\n\n$export($export.S + $export.F * !USE_NATIVE, 'Symbol', {\n // 19.4.2.1 Symbol.for(key)\n 'for': function (key) {\n return has(SymbolRegistry, key += '')\n ? SymbolRegistry[key]\n : SymbolRegistry[key] = $Symbol(key);\n },\n // 19.4.2.5 Symbol.keyFor(sym)\n keyFor: function keyFor(sym) {\n if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol!');\n for (var key in SymbolRegistry) if (SymbolRegistry[key] === sym) return key;\n },\n useSetter: function () { setter = true; },\n useSimple: function () { setter = false; }\n});\n\n$export($export.S + $export.F * !USE_NATIVE, 'Object', {\n // 19.1.2.2 Object.create(O [, Properties])\n create: $create,\n // 19.1.2.4 Object.defineProperty(O, P, Attributes)\n defineProperty: $defineProperty,\n // 19.1.2.3 Object.defineProperties(O, Properties)\n defineProperties: $defineProperties,\n // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)\n getOwnPropertyDescriptor: $getOwnPropertyDescriptor,\n // 19.1.2.7 Object.getOwnPropertyNames(O)\n getOwnPropertyNames: $getOwnPropertyNames,\n // 19.1.2.8 Object.getOwnPropertySymbols(O)\n getOwnPropertySymbols: $getOwnPropertySymbols\n});\n\n// 24.3.2 JSON.stringify(value [, replacer [, space]])\n$JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function () {\n var S = $Symbol();\n // MS Edge converts symbol values to JSON as {}\n // WebKit converts symbol values to JSON as null\n // V8 throws on boxed symbols\n return _stringify([S]) != '[null]' || _stringify({ a: S }) != '{}' || _stringify(Object(S)) != '{}';\n})), 'JSON', {\n stringify: function stringify(it) {\n var args = [it];\n var i = 1;\n var replacer, $replacer;\n while (arguments.length > i) args.push(arguments[i++]);\n $replacer = replacer = args[1];\n if (!isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined\n if (!isArray(replacer)) replacer = function (key, value) {\n if (typeof $replacer == 'function') value = $replacer.call(this, key, value);\n if (!isSymbol(value)) return value;\n };\n args[1] = replacer;\n return _stringify.apply($JSON, args);\n }\n});\n\n// 19.4.3.4 Symbol.prototype[@@toPrimitive](hint)\n$Symbol[PROTOTYPE][TO_PRIMITIVE] || require('./_hide')($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf);\n// 19.4.3.5 Symbol.prototype[@@toStringTag]\nsetToStringTag($Symbol, 'Symbol');\n// 20.2.1.9 Math[@@toStringTag]\nsetToStringTag(Math, 'Math', true);\n// 24.3.3 JSON[@@toStringTag]\nsetToStringTag(global.JSON, 'JSON', true);\n","// all enumerable object keys, includes symbols\nvar getKeys = require('./_object-keys');\nvar gOPS = require('./_object-gops');\nvar pIE = require('./_object-pie');\nmodule.exports = function (it) {\n var result = getKeys(it);\n var getSymbols = gOPS.f;\n if (getSymbols) {\n var symbols = getSymbols(it);\n var isEnum = pIE.f;\n var i = 0;\n var key;\n while (symbols.length > i) if (isEnum.call(it, key = symbols[i++])) result.push(key);\n } return result;\n};\n","// most Object methods by ES6 should accept primitives\nvar $export = require('./_export');\nvar core = require('./_core');\nvar fails = require('./_fails');\nmodule.exports = function (KEY, exec) {\n var fn = (core.Object || {})[KEY] || Object[KEY];\n var exp = {};\n exp[KEY] = exec(fn);\n $export($export.S + $export.F * fails(function () { fn(1); }), 'Object', exp);\n};\n","// 19.1.2.5 Object.freeze(O)\nvar isObject = require('./_is-object');\nvar meta = require('./_meta').onFreeze;\n\nrequire('./_object-sap')('freeze', function ($freeze) {\n return function freeze(it) {\n return $freeze && isObject(it) ? $freeze(meta(it)) : it;\n };\n});\n","// 19.1.2.17 Object.seal(O)\nvar isObject = require('./_is-object');\nvar meta = require('./_meta').onFreeze;\n\nrequire('./_object-sap')('seal', function ($seal) {\n return function seal(it) {\n return $seal && isObject(it) ? $seal(meta(it)) : it;\n };\n});\n","// 19.1.2.15 Object.preventExtensions(O)\nvar isObject = require('./_is-object');\nvar meta = require('./_meta').onFreeze;\n\nrequire('./_object-sap')('preventExtensions', function ($preventExtensions) {\n return function preventExtensions(it) {\n return $preventExtensions && isObject(it) ? $preventExtensions(meta(it)) : it;\n };\n});\n","// 19.1.2.12 Object.isFrozen(O)\nvar isObject = require('./_is-object');\n\nrequire('./_object-sap')('isFrozen', function ($isFrozen) {\n return function isFrozen(it) {\n return isObject(it) ? $isFrozen ? $isFrozen(it) : false : true;\n };\n});\n","// 19.1.2.13 Object.isSealed(O)\nvar isObject = require('./_is-object');\n\nrequire('./_object-sap')('isSealed', function ($isSealed) {\n return function isSealed(it) {\n return isObject(it) ? $isSealed ? $isSealed(it) : false : true;\n };\n});\n","// 19.1.2.11 Object.isExtensible(O)\nvar isObject = require('./_is-object');\n\nrequire('./_object-sap')('isExtensible', function ($isExtensible) {\n return function isExtensible(it) {\n return isObject(it) ? $isExtensible ? $isExtensible(it) : true : false;\n };\n});\n","// 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)\nvar toIObject = require('./_to-iobject');\nvar $getOwnPropertyDescriptor = require('./_object-gopd').f;\n\nrequire('./_object-sap')('getOwnPropertyDescriptor', function () {\n return function getOwnPropertyDescriptor(it, key) {\n return $getOwnPropertyDescriptor(toIObject(it), key);\n };\n});\n","// 19.1.2.9 Object.getPrototypeOf(O)\nvar toObject = require('./_to-object');\nvar $getPrototypeOf = require('./_object-gpo');\n\nrequire('./_object-sap')('getPrototypeOf', function () {\n return function getPrototypeOf(it) {\n return $getPrototypeOf(toObject(it));\n };\n});\n","// 19.1.2.14 Object.keys(O)\nvar toObject = require('./_to-object');\nvar $keys = require('./_object-keys');\n\nrequire('./_object-sap')('keys', function () {\n return function keys(it) {\n return $keys(toObject(it));\n };\n});\n","// 19.1.2.7 Object.getOwnPropertyNames(O)\nrequire('./_object-sap')('getOwnPropertyNames', function () {\n return require('./_object-gopn-ext').f;\n});\n","// 19.1.3.1 Object.assign(target, source)\nvar $export = require('./_export');\n\n$export($export.S + $export.F, 'Object', { assign: require('./_object-assign') });\n","// 7.2.9 SameValue(x, y)\nmodule.exports = Object.is || function is(x, y) {\n // eslint-disable-next-line no-self-compare\n return x === y ? x !== 0 || 1 / x === 1 / y : x != x && y != y;\n};\n","// 19.1.3.10 Object.is(value1, value2)\nvar $export = require('./_export');\n$export($export.S, 'Object', { is: require('./_same-value') });\n","var dP = require('./_object-dp').f;\nvar FProto = Function.prototype;\nvar nameRE = /^\\s*function ([^ (]*)/;\nvar NAME = 'name';\n\n// 19.2.4.2 name\nNAME in FProto || require('./_descriptors') && dP(FProto, NAME, {\n configurable: true,\n get: function () {\n try {\n return ('' + this).match(nameRE)[1];\n } catch (e) {\n return '';\n }\n }\n});\n","var $export = require('./_export');\nvar toIObject = require('./_to-iobject');\nvar toLength = require('./_to-length');\n\n$export($export.S, 'String', {\n // 21.1.2.4 String.raw(callSite, ...substitutions)\n raw: function raw(callSite) {\n var tpl = toIObject(callSite.raw);\n var len = toLength(tpl.length);\n var aLen = arguments.length;\n var res = [];\n var i = 0;\n while (len > i) {\n res.push(String(tpl[i++]));\n if (i < aLen) res.push(String(arguments[i]));\n } return res.join('');\n }\n});\n","var $export = require('./_export');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nvar fromCharCode = String.fromCharCode;\nvar $fromCodePoint = String.fromCodePoint;\n\n// length should be 1, old FF problem\n$export($export.S + $export.F * (!!$fromCodePoint && $fromCodePoint.length != 1), 'String', {\n // 21.1.2.2 String.fromCodePoint(...codePoints)\n fromCodePoint: function fromCodePoint(x) { // eslint-disable-line no-unused-vars\n var res = [];\n var aLen = arguments.length;\n var i = 0;\n var code;\n while (aLen > i) {\n code = +arguments[i++];\n if (toAbsoluteIndex(code, 0x10ffff) !== code) throw RangeError(code + ' is not a valid code point');\n res.push(code < 0x10000\n ? fromCharCode(code)\n : fromCharCode(((code -= 0x10000) >> 10) + 0xd800, code % 0x400 + 0xdc00)\n );\n } return res.join('');\n }\n});\n","var toInteger = require('./_to-integer');\nvar defined = require('./_defined');\n// true -> String#at\n// false -> String#codePointAt\nmodule.exports = function (TO_STRING) {\n return function (that, pos) {\n var s = String(defined(that));\n var i = toInteger(pos);\n var l = s.length;\n var a, b;\n if (i < 0 || i >= l) return TO_STRING ? '' : undefined;\n a = s.charCodeAt(i);\n return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff\n ? TO_STRING ? s.charAt(i) : a\n : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;\n };\n};\n","'use strict';\nvar $export = require('./_export');\nvar $at = require('./_string-at')(false);\n$export($export.P, 'String', {\n // 21.1.3.3 String.prototype.codePointAt(pos)\n codePointAt: function codePointAt(pos) {\n return $at(this, pos);\n }\n});\n","'use strict';\nvar toInteger = require('./_to-integer');\nvar defined = require('./_defined');\n\nmodule.exports = function repeat(count) {\n var str = String(defined(this));\n var res = '';\n var n = toInteger(count);\n if (n < 0 || n == Infinity) throw RangeError(\"Count can't be negative\");\n for (;n > 0; (n >>>= 1) && (str += str)) if (n & 1) res += str;\n return res;\n};\n","var $export = require('./_export');\n\n$export($export.P, 'String', {\n // 21.1.3.13 String.prototype.repeat(count)\n repeat: require('./_string-repeat')\n});\n","// 7.2.8 IsRegExp(argument)\nvar isObject = require('./_is-object');\nvar cof = require('./_cof');\nvar MATCH = require('./_wks')('match');\nmodule.exports = function (it) {\n var isRegExp;\n return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : cof(it) == 'RegExp');\n};\n","// helper for String#{startsWith, endsWith, includes}\nvar isRegExp = require('./_is-regexp');\nvar defined = require('./_defined');\n\nmodule.exports = function (that, searchString, NAME) {\n if (isRegExp(searchString)) throw TypeError('String#' + NAME + \" doesn't accept regex!\");\n return String(defined(that));\n};\n","var MATCH = require('./_wks')('match');\nmodule.exports = function (KEY) {\n var re = /./;\n try {\n '/./'[KEY](re);\n } catch (e) {\n try {\n re[MATCH] = false;\n return !'/./'[KEY](re);\n } catch (f) { /* empty */ }\n } return true;\n};\n","// 21.1.3.18 String.prototype.startsWith(searchString [, position ])\n'use strict';\nvar $export = require('./_export');\nvar toLength = require('./_to-length');\nvar context = require('./_string-context');\nvar STARTS_WITH = 'startsWith';\nvar $startsWith = ''[STARTS_WITH];\n\n$export($export.P + $export.F * require('./_fails-is-regexp')(STARTS_WITH), 'String', {\n startsWith: function startsWith(searchString /* , position = 0 */) {\n var that = context(this, searchString, STARTS_WITH);\n var index = toLength(Math.min(arguments.length > 1 ? arguments[1] : undefined, that.length));\n var search = String(searchString);\n return $startsWith\n ? $startsWith.call(that, search, index)\n : that.slice(index, index + search.length) === search;\n }\n});\n","// 21.1.3.6 String.prototype.endsWith(searchString [, endPosition])\n'use strict';\nvar $export = require('./_export');\nvar toLength = require('./_to-length');\nvar context = require('./_string-context');\nvar ENDS_WITH = 'endsWith';\nvar $endsWith = ''[ENDS_WITH];\n\n$export($export.P + $export.F * require('./_fails-is-regexp')(ENDS_WITH), 'String', {\n endsWith: function endsWith(searchString /* , endPosition = @length */) {\n var that = context(this, searchString, ENDS_WITH);\n var endPosition = arguments.length > 1 ? arguments[1] : undefined;\n var len = toLength(that.length);\n var end = endPosition === undefined ? len : Math.min(toLength(endPosition), len);\n var search = String(searchString);\n return $endsWith\n ? $endsWith.call(that, search, end)\n : that.slice(end - search.length, end) === search;\n }\n});\n","// 21.1.3.7 String.prototype.includes(searchString, position = 0)\n'use strict';\nvar $export = require('./_export');\nvar context = require('./_string-context');\nvar INCLUDES = 'includes';\n\n$export($export.P + $export.F * require('./_fails-is-regexp')(INCLUDES), 'String', {\n includes: function includes(searchString /* , position = 0 */) {\n return !!~context(this, searchString, INCLUDES)\n .indexOf(searchString, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","// 21.2.5.3 get RegExp.prototype.flags()\nif (require('./_descriptors') && /./g.flags != 'g') require('./_object-dp').f(RegExp.prototype, 'flags', {\n configurable: true,\n get: require('./_flags')\n});\n","'use strict';\n// 21.2.5.3 get RegExp.prototype.flags\nvar anObject = require('./_an-object');\nmodule.exports = function () {\n var that = anObject(this);\n var result = '';\n if (that.global) result += 'g';\n if (that.ignoreCase) result += 'i';\n if (that.multiline) result += 'm';\n if (that.unicode) result += 'u';\n if (that.sticky) result += 'y';\n return result;\n};\n","'use strict';\nvar hide = require('./_hide');\nvar redefine = require('./_redefine');\nvar fails = require('./_fails');\nvar defined = require('./_defined');\nvar wks = require('./_wks');\n\nmodule.exports = function (KEY, length, exec) {\n var SYMBOL = wks(KEY);\n var fns = exec(defined, SYMBOL, ''[KEY]);\n var strfn = fns[0];\n var rxfn = fns[1];\n if (fails(function () {\n var O = {};\n O[SYMBOL] = function () { return 7; };\n return ''[KEY](O) != 7;\n })) {\n redefine(String.prototype, KEY, strfn);\n hide(RegExp.prototype, SYMBOL, length == 2\n // 21.2.5.8 RegExp.prototype[@@replace](string, replaceValue)\n // 21.2.5.11 RegExp.prototype[@@split](string, limit)\n ? function (string, arg) { return rxfn.call(string, this, arg); }\n // 21.2.5.6 RegExp.prototype[@@match](string)\n // 21.2.5.9 RegExp.prototype[@@search](string)\n : function (string) { return rxfn.call(string, this); }\n );\n }\n};\n","// @@match logic\nrequire('./_fix-re-wks')('match', 1, function (defined, MATCH, $match) {\n // 21.1.3.11 String.prototype.match(regexp)\n return [function match(regexp) {\n 'use strict';\n var O = defined(this);\n var fn = regexp == undefined ? undefined : regexp[MATCH];\n return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[MATCH](String(O));\n }, $match];\n});\n","// @@replace logic\nrequire('./_fix-re-wks')('replace', 2, function (defined, REPLACE, $replace) {\n // 21.1.3.14 String.prototype.replace(searchValue, replaceValue)\n return [function replace(searchValue, replaceValue) {\n 'use strict';\n var O = defined(this);\n var fn = searchValue == undefined ? undefined : searchValue[REPLACE];\n return fn !== undefined\n ? fn.call(searchValue, O, replaceValue)\n : $replace.call(String(O), searchValue, replaceValue);\n }, $replace];\n});\n","// @@split logic\nrequire('./_fix-re-wks')('split', 2, function (defined, SPLIT, $split) {\n 'use strict';\n var isRegExp = require('./_is-regexp');\n var _split = $split;\n var $push = [].push;\n var $SPLIT = 'split';\n var LENGTH = 'length';\n var LAST_INDEX = 'lastIndex';\n if (\n 'abbc'[$SPLIT](/(b)*/)[1] == 'c' ||\n 'test'[$SPLIT](/(?:)/, -1)[LENGTH] != 4 ||\n 'ab'[$SPLIT](/(?:ab)*/)[LENGTH] != 2 ||\n '.'[$SPLIT](/(.?)(.?)/)[LENGTH] != 4 ||\n '.'[$SPLIT](/()()/)[LENGTH] > 1 ||\n ''[$SPLIT](/.?/)[LENGTH]\n ) {\n var NPCG = /()??/.exec('')[1] === undefined; // nonparticipating capturing group\n // based on es5-shim implementation, need to rework it\n $split = function (separator, limit) {\n var string = String(this);\n if (separator === undefined && limit === 0) return [];\n // If `separator` is not a regex, use native split\n if (!isRegExp(separator)) return _split.call(string, separator, limit);\n var output = [];\n var flags = (separator.ignoreCase ? 'i' : '') +\n (separator.multiline ? 'm' : '') +\n (separator.unicode ? 'u' : '') +\n (separator.sticky ? 'y' : '');\n var lastLastIndex = 0;\n var splitLimit = limit === undefined ? 4294967295 : limit >>> 0;\n // Make `global` and avoid `lastIndex` issues by working with a copy\n var separatorCopy = new RegExp(separator.source, flags + 'g');\n var separator2, match, lastIndex, lastLength, i;\n // Doesn't need flags gy, but they don't hurt\n if (!NPCG) separator2 = new RegExp('^' + separatorCopy.source + '$(?!\\\\s)', flags);\n while (match = separatorCopy.exec(string)) {\n // `separatorCopy.lastIndex` is not reliable cross-browser\n lastIndex = match.index + match[0][LENGTH];\n if (lastIndex > lastLastIndex) {\n output.push(string.slice(lastLastIndex, match.index));\n // Fix browsers whose `exec` methods don't consistently return `undefined` for NPCG\n // eslint-disable-next-line no-loop-func\n if (!NPCG && match[LENGTH] > 1) match[0].replace(separator2, function () {\n for (i = 1; i < arguments[LENGTH] - 2; i++) if (arguments[i] === undefined) match[i] = undefined;\n });\n if (match[LENGTH] > 1 && match.index < string[LENGTH]) $push.apply(output, match.slice(1));\n lastLength = match[0][LENGTH];\n lastLastIndex = lastIndex;\n if (output[LENGTH] >= splitLimit) break;\n }\n if (separatorCopy[LAST_INDEX] === match.index) separatorCopy[LAST_INDEX]++; // Avoid an infinite loop\n }\n if (lastLastIndex === string[LENGTH]) {\n if (lastLength || !separatorCopy.test('')) output.push('');\n } else output.push(string.slice(lastLastIndex));\n return output[LENGTH] > splitLimit ? output.slice(0, splitLimit) : output;\n };\n // Chakra, V8\n } else if ('0'[$SPLIT](undefined, 0)[LENGTH]) {\n $split = function (separator, limit) {\n return separator === undefined && limit === 0 ? [] : _split.call(this, separator, limit);\n };\n }\n // 21.1.3.17 String.prototype.split(separator, limit)\n return [function split(separator, limit) {\n var O = defined(this);\n var fn = separator == undefined ? undefined : separator[SPLIT];\n return fn !== undefined ? fn.call(separator, O, limit) : $split.call(String(O), separator, limit);\n }, $split];\n});\n","// @@search logic\nrequire('./_fix-re-wks')('search', 1, function (defined, SEARCH, $search) {\n // 21.1.3.15 String.prototype.search(regexp)\n return [function search(regexp) {\n 'use strict';\n var O = defined(this);\n var fn = regexp == undefined ? undefined : regexp[SEARCH];\n return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[SEARCH](String(O));\n }, $search];\n});\n","'use strict';\nvar $defineProperty = require('./_object-dp');\nvar createDesc = require('./_property-desc');\n\nmodule.exports = function (object, index, value) {\n if (index in object) $defineProperty.f(object, index, createDesc(0, value));\n else object[index] = value;\n};\n","'use strict';\nvar ctx = require('./_ctx');\nvar $export = require('./_export');\nvar toObject = require('./_to-object');\nvar call = require('./_iter-call');\nvar isArrayIter = require('./_is-array-iter');\nvar toLength = require('./_to-length');\nvar createProperty = require('./_create-property');\nvar getIterFn = require('./core.get-iterator-method');\n\n$export($export.S + $export.F * !require('./_iter-detect')(function (iter) { Array.from(iter); }), 'Array', {\n // 22.1.2.1 Array.from(arrayLike, mapfn = undefined, thisArg = undefined)\n from: function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {\n var O = toObject(arrayLike);\n var C = typeof this == 'function' ? this : Array;\n var aLen = arguments.length;\n var mapfn = aLen > 1 ? arguments[1] : undefined;\n var mapping = mapfn !== undefined;\n var index = 0;\n var iterFn = getIterFn(O);\n var length, result, step, iterator;\n if (mapping) mapfn = ctx(mapfn, aLen > 2 ? arguments[2] : undefined, 2);\n // if object isn't iterable or it's array with default iterator - use simple case\n if (iterFn != undefined && !(C == Array && isArrayIter(iterFn))) {\n for (iterator = iterFn.call(O), result = new C(); !(step = iterator.next()).done; index++) {\n createProperty(result, index, mapping ? call(iterator, mapfn, [step.value, index], true) : step.value);\n }\n } else {\n length = toLength(O.length);\n for (result = new C(length); length > index; index++) {\n createProperty(result, index, mapping ? mapfn(O[index], index) : O[index]);\n }\n }\n result.length = index;\n return result;\n }\n});\n","'use strict';\nvar $export = require('./_export');\nvar createProperty = require('./_create-property');\n\n// WebKit Array.of isn't generic\n$export($export.S + $export.F * require('./_fails')(function () {\n function F() { /* empty */ }\n return !(Array.of.call(F) instanceof F);\n}), 'Array', {\n // 22.1.2.3 Array.of( ...items)\n of: function of(/* ...args */) {\n var index = 0;\n var aLen = arguments.length;\n var result = new (typeof this == 'function' ? this : Array)(aLen);\n while (aLen > index) createProperty(result, index, arguments[index++]);\n result.length = aLen;\n return result;\n }\n});\n","// 22.1.3.3 Array.prototype.copyWithin(target, start, end = this.length)\nvar $export = require('./_export');\n\n$export($export.P, 'Array', { copyWithin: require('./_array-copy-within') });\n\nrequire('./_add-to-unscopables')('copyWithin');\n","'use strict';\n// 22.1.3.8 Array.prototype.find(predicate, thisArg = undefined)\nvar $export = require('./_export');\nvar $find = require('./_array-methods')(5);\nvar KEY = 'find';\nvar forced = true;\n// Shouldn't skip holes\nif (KEY in []) Array(1)[KEY](function () { forced = false; });\n$export($export.P + $export.F * forced, 'Array', {\n find: function find(callbackfn /* , that = undefined */) {\n return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\nrequire('./_add-to-unscopables')(KEY);\n","'use strict';\n// 22.1.3.9 Array.prototype.findIndex(predicate, thisArg = undefined)\nvar $export = require('./_export');\nvar $find = require('./_array-methods')(6);\nvar KEY = 'findIndex';\nvar forced = true;\n// Shouldn't skip holes\nif (KEY in []) Array(1)[KEY](function () { forced = false; });\n$export($export.P + $export.F * forced, 'Array', {\n findIndex: function findIndex(callbackfn /* , that = undefined */) {\n return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\nrequire('./_add-to-unscopables')(KEY);\n","// 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length)\nvar $export = require('./_export');\n\n$export($export.P, 'Array', { fill: require('./_array-fill') });\n\nrequire('./_add-to-unscopables')('fill');\n","// 20.1.2.2 Number.isFinite(number)\nvar $export = require('./_export');\nvar _isFinite = require('./_global').isFinite;\n\n$export($export.S, 'Number', {\n isFinite: function isFinite(it) {\n return typeof it == 'number' && _isFinite(it);\n }\n});\n","// 20.1.2.3 Number.isInteger(number)\nvar isObject = require('./_is-object');\nvar floor = Math.floor;\nmodule.exports = function isInteger(it) {\n return !isObject(it) && isFinite(it) && floor(it) === it;\n};\n","// 20.1.2.3 Number.isInteger(number)\nvar $export = require('./_export');\n\n$export($export.S, 'Number', { isInteger: require('./_is-integer') });\n","// 20.1.2.5 Number.isSafeInteger(number)\nvar $export = require('./_export');\nvar isInteger = require('./_is-integer');\nvar abs = Math.abs;\n\n$export($export.S, 'Number', {\n isSafeInteger: function isSafeInteger(number) {\n return isInteger(number) && abs(number) <= 0x1fffffffffffff;\n }\n});\n","// 20.1.2.4 Number.isNaN(number)\nvar $export = require('./_export');\n\n$export($export.S, 'Number', {\n isNaN: function isNaN(number) {\n // eslint-disable-next-line no-self-compare\n return number != number;\n }\n});\n","// 20.1.2.1 Number.EPSILON\nvar $export = require('./_export');\n\n$export($export.S, 'Number', { EPSILON: Math.pow(2, -52) });\n","// 20.1.2.10 Number.MIN_SAFE_INTEGER\nvar $export = require('./_export');\n\n$export($export.S, 'Number', { MIN_SAFE_INTEGER: -0x1fffffffffffff });\n","// 20.1.2.6 Number.MAX_SAFE_INTEGER\nvar $export = require('./_export');\n\n$export($export.S, 'Number', { MAX_SAFE_INTEGER: 0x1fffffffffffff });\n","// 20.2.2.20 Math.log1p(x)\nmodule.exports = Math.log1p || function log1p(x) {\n return (x = +x) > -1e-8 && x < 1e-8 ? x - x * x / 2 : Math.log(1 + x);\n};\n","// 20.2.2.3 Math.acosh(x)\nvar $export = require('./_export');\nvar log1p = require('./_math-log1p');\nvar sqrt = Math.sqrt;\nvar $acosh = Math.acosh;\n\n$export($export.S + $export.F * !($acosh\n // V8 bug: https://code.google.com/p/v8/issues/detail?id=3509\n && Math.floor($acosh(Number.MAX_VALUE)) == 710\n // Tor Browser bug: Math.acosh(Infinity) -> NaN\n && $acosh(Infinity) == Infinity\n), 'Math', {\n acosh: function acosh(x) {\n return (x = +x) < 1 ? NaN : x > 94906265.62425156\n ? Math.log(x) + Math.LN2\n : log1p(x - 1 + sqrt(x - 1) * sqrt(x + 1));\n }\n});\n","// 20.2.2.5 Math.asinh(x)\nvar $export = require('./_export');\nvar $asinh = Math.asinh;\n\nfunction asinh(x) {\n return !isFinite(x = +x) || x == 0 ? x : x < 0 ? -asinh(-x) : Math.log(x + Math.sqrt(x * x + 1));\n}\n\n// Tor Browser bug: Math.asinh(0) -> -0\n$export($export.S + $export.F * !($asinh && 1 / $asinh(0) > 0), 'Math', { asinh: asinh });\n","// 20.2.2.7 Math.atanh(x)\nvar $export = require('./_export');\nvar $atanh = Math.atanh;\n\n// Tor Browser bug: Math.atanh(-0) -> 0\n$export($export.S + $export.F * !($atanh && 1 / $atanh(-0) < 0), 'Math', {\n atanh: function atanh(x) {\n return (x = +x) == 0 ? x : Math.log((1 + x) / (1 - x)) / 2;\n }\n});\n","// 20.2.2.28 Math.sign(x)\nmodule.exports = Math.sign || function sign(x) {\n // eslint-disable-next-line no-self-compare\n return (x = +x) == 0 || x != x ? x : x < 0 ? -1 : 1;\n};\n","// 20.2.2.9 Math.cbrt(x)\nvar $export = require('./_export');\nvar sign = require('./_math-sign');\n\n$export($export.S, 'Math', {\n cbrt: function cbrt(x) {\n return sign(x = +x) * Math.pow(Math.abs(x), 1 / 3);\n }\n});\n","// 20.2.2.11 Math.clz32(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n clz32: function clz32(x) {\n return (x >>>= 0) ? 31 - Math.floor(Math.log(x + 0.5) * Math.LOG2E) : 32;\n }\n});\n","// 20.2.2.12 Math.cosh(x)\nvar $export = require('./_export');\nvar exp = Math.exp;\n\n$export($export.S, 'Math', {\n cosh: function cosh(x) {\n return (exp(x = +x) + exp(-x)) / 2;\n }\n});\n","// 20.2.2.14 Math.expm1(x)\nvar $expm1 = Math.expm1;\nmodule.exports = (!$expm1\n // Old FF bug\n || $expm1(10) > 22025.465794806719 || $expm1(10) < 22025.4657948067165168\n // Tor Browser bug\n || $expm1(-2e-17) != -2e-17\n) ? function expm1(x) {\n return (x = +x) == 0 ? x : x > -1e-6 && x < 1e-6 ? x + x * x / 2 : Math.exp(x) - 1;\n} : $expm1;\n","// 20.2.2.14 Math.expm1(x)\nvar $export = require('./_export');\nvar $expm1 = require('./_math-expm1');\n\n$export($export.S + $export.F * ($expm1 != Math.expm1), 'Math', { expm1: $expm1 });\n","// 20.2.2.16 Math.fround(x)\nvar sign = require('./_math-sign');\nvar pow = Math.pow;\nvar EPSILON = pow(2, -52);\nvar EPSILON32 = pow(2, -23);\nvar MAX32 = pow(2, 127) * (2 - EPSILON32);\nvar MIN32 = pow(2, -126);\n\nvar roundTiesToEven = function (n) {\n return n + 1 / EPSILON - 1 / EPSILON;\n};\n\nmodule.exports = Math.fround || function fround(x) {\n var $abs = Math.abs(x);\n var $sign = sign(x);\n var a, result;\n if ($abs < MIN32) return $sign * roundTiesToEven($abs / MIN32 / EPSILON32) * MIN32 * EPSILON32;\n a = (1 + EPSILON32 / EPSILON) * $abs;\n result = a - (a - $abs);\n // eslint-disable-next-line no-self-compare\n if (result > MAX32 || result != result) return $sign * Infinity;\n return $sign * result;\n};\n","// 20.2.2.16 Math.fround(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', { fround: require('./_math-fround') });\n","// 20.2.2.17 Math.hypot([value1[, value2[, … ]]])\nvar $export = require('./_export');\nvar abs = Math.abs;\n\n$export($export.S, 'Math', {\n hypot: function hypot(value1, value2) { // eslint-disable-line no-unused-vars\n var sum = 0;\n var i = 0;\n var aLen = arguments.length;\n var larg = 0;\n var arg, div;\n while (i < aLen) {\n arg = abs(arguments[i++]);\n if (larg < arg) {\n div = larg / arg;\n sum = sum * div * div + 1;\n larg = arg;\n } else if (arg > 0) {\n div = arg / larg;\n sum += div * div;\n } else sum += arg;\n }\n return larg === Infinity ? Infinity : larg * Math.sqrt(sum);\n }\n});\n","// 20.2.2.18 Math.imul(x, y)\nvar $export = require('./_export');\nvar $imul = Math.imul;\n\n// some WebKit versions fails with big numbers, some has wrong arity\n$export($export.S + $export.F * require('./_fails')(function () {\n return $imul(0xffffffff, 5) != -5 || $imul.length != 2;\n}), 'Math', {\n imul: function imul(x, y) {\n var UINT16 = 0xffff;\n var xn = +x;\n var yn = +y;\n var xl = UINT16 & xn;\n var yl = UINT16 & yn;\n return 0 | xl * yl + ((UINT16 & xn >>> 16) * yl + xl * (UINT16 & yn >>> 16) << 16 >>> 0);\n }\n});\n","// 20.2.2.20 Math.log1p(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', { log1p: require('./_math-log1p') });\n","// 20.2.2.21 Math.log10(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n log10: function log10(x) {\n return Math.log(x) * Math.LOG10E;\n }\n});\n","// 20.2.2.22 Math.log2(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n log2: function log2(x) {\n return Math.log(x) / Math.LN2;\n }\n});\n","// 20.2.2.28 Math.sign(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', { sign: require('./_math-sign') });\n","// 20.2.2.30 Math.sinh(x)\nvar $export = require('./_export');\nvar expm1 = require('./_math-expm1');\nvar exp = Math.exp;\n\n// V8 near Chromium 38 has a problem with very small numbers\n$export($export.S + $export.F * require('./_fails')(function () {\n return !Math.sinh(-2e-17) != -2e-17;\n}), 'Math', {\n sinh: function sinh(x) {\n return Math.abs(x = +x) < 1\n ? (expm1(x) - expm1(-x)) / 2\n : (exp(x - 1) - exp(-x - 1)) * (Math.E / 2);\n }\n});\n","// 20.2.2.33 Math.tanh(x)\nvar $export = require('./_export');\nvar expm1 = require('./_math-expm1');\nvar exp = Math.exp;\n\n$export($export.S, 'Math', {\n tanh: function tanh(x) {\n var a = expm1(x = +x);\n var b = expm1(-x);\n return a == Infinity ? 1 : b == Infinity ? -1 : (a - b) / (exp(x) + exp(-x));\n }\n});\n","// 20.2.2.34 Math.trunc(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n trunc: function trunc(it) {\n return (it > 0 ? Math.floor : Math.ceil)(it);\n }\n});\n","'use strict';\n// https://github.com/tc39/Array.prototype.includes\nvar $export = require('./_export');\nvar $includes = require('./_array-includes')(true);\n\n$export($export.P, 'Array', {\n includes: function includes(el /* , fromIndex = 0 */) {\n return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\nrequire('./_add-to-unscopables')('includes');\n","var getKeys = require('./_object-keys');\nvar toIObject = require('./_to-iobject');\nvar isEnum = require('./_object-pie').f;\nmodule.exports = function (isEntries) {\n return function (it) {\n var O = toIObject(it);\n var keys = getKeys(O);\n var length = keys.length;\n var i = 0;\n var result = [];\n var key;\n while (length > i) if (isEnum.call(O, key = keys[i++])) {\n result.push(isEntries ? [key, O[key]] : O[key]);\n } return result;\n };\n};\n","// https://github.com/tc39/proposal-object-values-entries\nvar $export = require('./_export');\nvar $values = require('./_object-to-array')(false);\n\n$export($export.S, 'Object', {\n values: function values(it) {\n return $values(it);\n }\n});\n","// https://github.com/tc39/proposal-object-values-entries\nvar $export = require('./_export');\nvar $entries = require('./_object-to-array')(true);\n\n$export($export.S, 'Object', {\n entries: function entries(it) {\n return $entries(it);\n }\n});\n","// https://github.com/tc39/proposal-object-getownpropertydescriptors\nvar $export = require('./_export');\nvar ownKeys = require('./_own-keys');\nvar toIObject = require('./_to-iobject');\nvar gOPD = require('./_object-gopd');\nvar createProperty = require('./_create-property');\n\n$export($export.S, 'Object', {\n getOwnPropertyDescriptors: function getOwnPropertyDescriptors(object) {\n var O = toIObject(object);\n var getDesc = gOPD.f;\n var keys = ownKeys(O);\n var result = {};\n var i = 0;\n var key, desc;\n while (keys.length > i) {\n desc = getDesc(O, key = keys[i++]);\n if (desc !== undefined) createProperty(result, key, desc);\n }\n return result;\n }\n});\n","// https://github.com/tc39/proposal-string-pad-start-end\nvar toLength = require('./_to-length');\nvar repeat = require('./_string-repeat');\nvar defined = require('./_defined');\n\nmodule.exports = function (that, maxLength, fillString, left) {\n var S = String(defined(that));\n var stringLength = S.length;\n var fillStr = fillString === undefined ? ' ' : String(fillString);\n var intMaxLength = toLength(maxLength);\n if (intMaxLength <= stringLength || fillStr == '') return S;\n var fillLen = intMaxLength - stringLength;\n var stringFiller = repeat.call(fillStr, Math.ceil(fillLen / fillStr.length));\n if (stringFiller.length > fillLen) stringFiller = stringFiller.slice(0, fillLen);\n return left ? stringFiller + S : S + stringFiller;\n};\n","var global = require('./_global');\nvar navigator = global.navigator;\n\nmodule.exports = navigator && navigator.userAgent || '';\n","'use strict';\n// https://github.com/tc39/proposal-string-pad-start-end\nvar $export = require('./_export');\nvar $pad = require('./_string-pad');\nvar userAgent = require('./_user-agent');\n\n// https://github.com/zloirock/core-js/issues/280\n$export($export.P + $export.F * /Version\\/10\\.\\d+(\\.\\d+)? Safari\\//.test(userAgent), 'String', {\n padStart: function padStart(maxLength /* , fillString = ' ' */) {\n return $pad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, true);\n }\n});\n","'use strict';\n// https://github.com/tc39/proposal-string-pad-start-end\nvar $export = require('./_export');\nvar $pad = require('./_string-pad');\nvar userAgent = require('./_user-agent');\n\n// https://github.com/zloirock/core-js/issues/280\n$export($export.P + $export.F * /Version\\/10\\.\\d+(\\.\\d+)? Safari\\//.test(userAgent), 'String', {\n padEnd: function padEnd(maxLength /* , fillString = ' ' */) {\n return $pad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, false);\n }\n});\n","// ie9- setTimeout & setInterval additional parameters fix\nvar global = require('./_global');\nvar $export = require('./_export');\nvar userAgent = require('./_user-agent');\nvar slice = [].slice;\nvar MSIE = /MSIE .\\./.test(userAgent); // <- dirty ie9- check\nvar wrap = function (set) {\n return function (fn, time /* , ...args */) {\n var boundArgs = arguments.length > 2;\n var args = boundArgs ? slice.call(arguments, 2) : false;\n return set(boundArgs ? function () {\n // eslint-disable-next-line no-new-func\n (typeof fn == 'function' ? fn : Function(fn)).apply(this, args);\n } : fn, time);\n };\n};\n$export($export.G + $export.B + $export.F * MSIE, {\n setTimeout: wrap(global.setTimeout),\n setInterval: wrap(global.setInterval)\n});\n","var $export = require('./_export');\nvar $task = require('./_task');\n$export($export.G + $export.B, {\n setImmediate: $task.set,\n clearImmediate: $task.clear\n});\n","var $iterators = require('./es6.array.iterator');\nvar getKeys = require('./_object-keys');\nvar redefine = require('./_redefine');\nvar global = require('./_global');\nvar hide = require('./_hide');\nvar Iterators = require('./_iterators');\nvar wks = require('./_wks');\nvar ITERATOR = wks('iterator');\nvar TO_STRING_TAG = wks('toStringTag');\nvar ArrayValues = Iterators.Array;\n\nvar DOMIterables = {\n CSSRuleList: true, // TODO: Not spec compliant, should be false.\n CSSStyleDeclaration: false,\n CSSValueList: false,\n ClientRectList: false,\n DOMRectList: false,\n DOMStringList: false,\n DOMTokenList: true,\n DataTransferItemList: false,\n FileList: false,\n HTMLAllCollection: false,\n HTMLCollection: false,\n HTMLFormElement: false,\n HTMLSelectElement: false,\n MediaList: true, // TODO: Not spec compliant, should be false.\n MimeTypeArray: false,\n NamedNodeMap: false,\n NodeList: true,\n PaintRequestList: false,\n Plugin: false,\n PluginArray: false,\n SVGLengthList: false,\n SVGNumberList: false,\n SVGPathSegList: false,\n SVGPointList: false,\n SVGStringList: false,\n SVGTransformList: false,\n SourceBufferList: false,\n StyleSheetList: true, // TODO: Not spec compliant, should be false.\n TextTrackCueList: false,\n TextTrackList: false,\n TouchList: false\n};\n\nfor (var collections = getKeys(DOMIterables), i = 0; i < collections.length; i++) {\n var NAME = collections[i];\n var explicit = DOMIterables[NAME];\n var Collection = global[NAME];\n var proto = Collection && Collection.prototype;\n var key;\n if (proto) {\n if (!proto[ITERATOR]) hide(proto, ITERATOR, ArrayValues);\n if (!proto[TO_STRING_TAG]) hide(proto, TO_STRING_TAG, NAME);\n Iterators[NAME] = ArrayValues;\n if (explicit) for (key in $iterators) if (!proto[key]) redefine(proto, key, $iterators[key], true);\n }\n}\n","/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * https://raw.github.com/facebook/regenerator/master/LICENSE file. An\n * additional grant of patent rights can be found in the PATENTS file in\n * the same directory.\n */\n\n!(function(global) {\n \"use strict\";\n\n var Op = Object.prototype;\n var hasOwn = Op.hasOwnProperty;\n var undefined; // More compressible than void 0.\n var $Symbol = typeof Symbol === \"function\" ? Symbol : {};\n var iteratorSymbol = $Symbol.iterator || \"@@iterator\";\n var asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\";\n var toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n\n var inModule = typeof module === \"object\";\n var runtime = global.regeneratorRuntime;\n if (runtime) {\n if (inModule) {\n // If regeneratorRuntime is defined globally and we're in a module,\n // make the exports object identical to regeneratorRuntime.\n module.exports = runtime;\n }\n // Don't bother evaluating the rest of this file if the runtime was\n // already defined globally.\n return;\n }\n\n // Define the runtime globally (as expected by generated code) as either\n // module.exports (if we're in a module) or a new, empty object.\n runtime = global.regeneratorRuntime = inModule ? module.exports : {};\n\n function wrap(innerFn, outerFn, self, tryLocsList) {\n // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.\n var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;\n var generator = Object.create(protoGenerator.prototype);\n var context = new Context(tryLocsList || []);\n\n // The ._invoke method unifies the implementations of the .next,\n // .throw, and .return methods.\n generator._invoke = makeInvokeMethod(innerFn, self, context);\n\n return generator;\n }\n runtime.wrap = wrap;\n\n // Try/catch helper to minimize deoptimizations. Returns a completion\n // record like context.tryEntries[i].completion. This interface could\n // have been (and was previously) designed to take a closure to be\n // invoked without arguments, but in all the cases we care about we\n // already have an existing method we want to call, so there's no need\n // to create a new function object. We can even get away with assuming\n // the method takes exactly one argument, since that happens to be true\n // in every case, so we don't have to touch the arguments object. The\n // only additional allocation required is the completion record, which\n // has a stable shape and so hopefully should be cheap to allocate.\n function tryCatch(fn, obj, arg) {\n try {\n return { type: \"normal\", arg: fn.call(obj, arg) };\n } catch (err) {\n return { type: \"throw\", arg: err };\n }\n }\n\n var GenStateSuspendedStart = \"suspendedStart\";\n var GenStateSuspendedYield = \"suspendedYield\";\n var GenStateExecuting = \"executing\";\n var GenStateCompleted = \"completed\";\n\n // Returning this object from the innerFn has the same effect as\n // breaking out of the dispatch switch statement.\n var ContinueSentinel = {};\n\n // Dummy constructor functions that we use as the .constructor and\n // .constructor.prototype properties for functions that return Generator\n // objects. For full spec compliance, you may wish to configure your\n // minifier not to mangle the names of these two functions.\n function Generator() {}\n function GeneratorFunction() {}\n function GeneratorFunctionPrototype() {}\n\n // This is a polyfill for %IteratorPrototype% for environments that\n // don't natively support it.\n var IteratorPrototype = {};\n IteratorPrototype[iteratorSymbol] = function () {\n return this;\n };\n\n var getProto = Object.getPrototypeOf;\n var NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n if (NativeIteratorPrototype &&\n NativeIteratorPrototype !== Op &&\n hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {\n // This environment has a native %IteratorPrototype%; use it instead\n // of the polyfill.\n IteratorPrototype = NativeIteratorPrototype;\n }\n\n var Gp = GeneratorFunctionPrototype.prototype =\n Generator.prototype = Object.create(IteratorPrototype);\n GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;\n GeneratorFunctionPrototype.constructor = GeneratorFunction;\n GeneratorFunctionPrototype[toStringTagSymbol] =\n GeneratorFunction.displayName = \"GeneratorFunction\";\n\n // Helper for defining the .next, .throw, and .return methods of the\n // Iterator interface in terms of a single ._invoke method.\n function defineIteratorMethods(prototype) {\n [\"next\", \"throw\", \"return\"].forEach(function(method) {\n prototype[method] = function(arg) {\n return this._invoke(method, arg);\n };\n });\n }\n\n runtime.isGeneratorFunction = function(genFun) {\n var ctor = typeof genFun === \"function\" && genFun.constructor;\n return ctor\n ? ctor === GeneratorFunction ||\n // For the native GeneratorFunction constructor, the best we can\n // do is to check its .name property.\n (ctor.displayName || ctor.name) === \"GeneratorFunction\"\n : false;\n };\n\n runtime.mark = function(genFun) {\n if (Object.setPrototypeOf) {\n Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);\n } else {\n genFun.__proto__ = GeneratorFunctionPrototype;\n if (!(toStringTagSymbol in genFun)) {\n genFun[toStringTagSymbol] = \"GeneratorFunction\";\n }\n }\n genFun.prototype = Object.create(Gp);\n return genFun;\n };\n\n // Within the body of any async function, `await x` is transformed to\n // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n // `hasOwn.call(value, \"__await\")` to determine if the yielded value is\n // meant to be awaited.\n runtime.awrap = function(arg) {\n return { __await: arg };\n };\n\n function AsyncIterator(generator) {\n function invoke(method, arg, resolve, reject) {\n var record = tryCatch(generator[method], generator, arg);\n if (record.type === \"throw\") {\n reject(record.arg);\n } else {\n var result = record.arg;\n var value = result.value;\n if (value &&\n typeof value === \"object\" &&\n hasOwn.call(value, \"__await\")) {\n return Promise.resolve(value.__await).then(function(value) {\n invoke(\"next\", value, resolve, reject);\n }, function(err) {\n invoke(\"throw\", err, resolve, reject);\n });\n }\n\n return Promise.resolve(value).then(function(unwrapped) {\n // When a yielded Promise is resolved, its final value becomes\n // the .value of the Promise<{value,done}> result for the\n // current iteration. If the Promise is rejected, however, the\n // result for this iteration will be rejected with the same\n // reason. Note that rejections of yielded Promises are not\n // thrown back into the generator function, as is the case\n // when an awaited Promise is rejected. This difference in\n // behavior between yield and await is important, because it\n // allows the consumer to decide what to do with the yielded\n // rejection (swallow it and continue, manually .throw it back\n // into the generator, abandon iteration, whatever). With\n // await, by contrast, there is no opportunity to examine the\n // rejection reason outside the generator function, so the\n // only option is to throw it from the await expression, and\n // let the generator function handle the exception.\n result.value = unwrapped;\n resolve(result);\n }, reject);\n }\n }\n\n if (typeof global.process === \"object\" && global.process.domain) {\n invoke = global.process.domain.bind(invoke);\n }\n\n var previousPromise;\n\n function enqueue(method, arg) {\n function callInvokeWithMethodAndArg() {\n return new Promise(function(resolve, reject) {\n invoke(method, arg, resolve, reject);\n });\n }\n\n return previousPromise =\n // If enqueue has been called before, then we want to wait until\n // all previous Promises have been resolved before calling invoke,\n // so that results are always delivered in the correct order. If\n // enqueue has not been called before, then it is important to\n // call invoke immediately, without waiting on a callback to fire,\n // so that the async generator function has the opportunity to do\n // any necessary setup in a predictable way. This predictability\n // is why the Promise constructor synchronously invokes its\n // executor callback, and why async functions synchronously\n // execute code before the first await. Since we implement simple\n // async functions in terms of async generators, it is especially\n // important to get this right, even though it requires care.\n previousPromise ? previousPromise.then(\n callInvokeWithMethodAndArg,\n // Avoid propagating failures to Promises returned by later\n // invocations of the iterator.\n callInvokeWithMethodAndArg\n ) : callInvokeWithMethodAndArg();\n }\n\n // Define the unified helper method that is used to implement .next,\n // .throw, and .return (see defineIteratorMethods).\n this._invoke = enqueue;\n }\n\n defineIteratorMethods(AsyncIterator.prototype);\n AsyncIterator.prototype[asyncIteratorSymbol] = function () {\n return this;\n };\n runtime.AsyncIterator = AsyncIterator;\n\n // Note that simple async functions are implemented on top of\n // AsyncIterator objects; they just return a Promise for the value of\n // the final result produced by the iterator.\n runtime.async = function(innerFn, outerFn, self, tryLocsList) {\n var iter = new AsyncIterator(\n wrap(innerFn, outerFn, self, tryLocsList)\n );\n\n return runtime.isGeneratorFunction(outerFn)\n ? iter // If outerFn is a generator, return the full iterator.\n : iter.next().then(function(result) {\n return result.done ? result.value : iter.next();\n });\n };\n\n function makeInvokeMethod(innerFn, self, context) {\n var state = GenStateSuspendedStart;\n\n return function invoke(method, arg) {\n if (state === GenStateExecuting) {\n throw new Error(\"Generator is already running\");\n }\n\n if (state === GenStateCompleted) {\n if (method === \"throw\") {\n throw arg;\n }\n\n // Be forgiving, per 25.3.3.3.3 of the spec:\n // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n return doneResult();\n }\n\n context.method = method;\n context.arg = arg;\n\n while (true) {\n var delegate = context.delegate;\n if (delegate) {\n var delegateResult = maybeInvokeDelegate(delegate, context);\n if (delegateResult) {\n if (delegateResult === ContinueSentinel) continue;\n return delegateResult;\n }\n }\n\n if (context.method === \"next\") {\n // Setting context._sent for legacy support of Babel's\n // function.sent implementation.\n context.sent = context._sent = context.arg;\n\n } else if (context.method === \"throw\") {\n if (state === GenStateSuspendedStart) {\n state = GenStateCompleted;\n throw context.arg;\n }\n\n context.dispatchException(context.arg);\n\n } else if (context.method === \"return\") {\n context.abrupt(\"return\", context.arg);\n }\n\n state = GenStateExecuting;\n\n var record = tryCatch(innerFn, self, context);\n if (record.type === \"normal\") {\n // If an exception is thrown from innerFn, we leave state ===\n // GenStateExecuting and loop back for another invocation.\n state = context.done\n ? GenStateCompleted\n : GenStateSuspendedYield;\n\n if (record.arg === ContinueSentinel) {\n continue;\n }\n\n return {\n value: record.arg,\n done: context.done\n };\n\n } else if (record.type === \"throw\") {\n state = GenStateCompleted;\n // Dispatch the exception by looping back around to the\n // context.dispatchException(context.arg) call above.\n context.method = \"throw\";\n context.arg = record.arg;\n }\n }\n };\n }\n\n // Call delegate.iterator[context.method](context.arg) and handle the\n // result, either by returning a { value, done } result from the\n // delegate iterator, or by modifying context.method and context.arg,\n // setting context.delegate to null, and returning the ContinueSentinel.\n function maybeInvokeDelegate(delegate, context) {\n var method = delegate.iterator[context.method];\n if (method === undefined) {\n // A .throw or .return when the delegate iterator has no .throw\n // method always terminates the yield* loop.\n context.delegate = null;\n\n if (context.method === \"throw\") {\n if (delegate.iterator.return) {\n // If the delegate iterator has a return method, give it a\n // chance to clean up.\n context.method = \"return\";\n context.arg = undefined;\n maybeInvokeDelegate(delegate, context);\n\n if (context.method === \"throw\") {\n // If maybeInvokeDelegate(context) changed context.method from\n // \"return\" to \"throw\", let that override the TypeError below.\n return ContinueSentinel;\n }\n }\n\n context.method = \"throw\";\n context.arg = new TypeError(\n \"The iterator does not provide a 'throw' method\");\n }\n\n return ContinueSentinel;\n }\n\n var record = tryCatch(method, delegate.iterator, context.arg);\n\n if (record.type === \"throw\") {\n context.method = \"throw\";\n context.arg = record.arg;\n context.delegate = null;\n return ContinueSentinel;\n }\n\n var info = record.arg;\n\n if (! info) {\n context.method = \"throw\";\n context.arg = new TypeError(\"iterator result is not an object\");\n context.delegate = null;\n return ContinueSentinel;\n }\n\n if (info.done) {\n // Assign the result of the finished delegate to the temporary\n // variable specified by delegate.resultName (see delegateYield).\n context[delegate.resultName] = info.value;\n\n // Resume execution at the desired location (see delegateYield).\n context.next = delegate.nextLoc;\n\n // If context.method was \"throw\" but the delegate handled the\n // exception, let the outer generator proceed normally. If\n // context.method was \"next\", forget context.arg since it has been\n // \"consumed\" by the delegate iterator. If context.method was\n // \"return\", allow the original .return call to continue in the\n // outer generator.\n if (context.method !== \"return\") {\n context.method = \"next\";\n context.arg = undefined;\n }\n\n } else {\n // Re-yield the result returned by the delegate method.\n return info;\n }\n\n // The delegate iterator is finished, so forget it and continue with\n // the outer generator.\n context.delegate = null;\n return ContinueSentinel;\n }\n\n // Define Generator.prototype.{next,throw,return} in terms of the\n // unified ._invoke helper method.\n defineIteratorMethods(Gp);\n\n Gp[toStringTagSymbol] = \"Generator\";\n\n // A Generator should always return itself as the iterator object when the\n // @@iterator function is called on it. Some browsers' implementations of the\n // iterator prototype chain incorrectly implement this, causing the Generator\n // object to not be returned from this call. This ensures that doesn't happen.\n // See https://github.com/facebook/regenerator/issues/274 for more details.\n Gp[iteratorSymbol] = function() {\n return this;\n };\n\n Gp.toString = function() {\n return \"[object Generator]\";\n };\n\n function pushTryEntry(locs) {\n var entry = { tryLoc: locs[0] };\n\n if (1 in locs) {\n entry.catchLoc = locs[1];\n }\n\n if (2 in locs) {\n entry.finallyLoc = locs[2];\n entry.afterLoc = locs[3];\n }\n\n this.tryEntries.push(entry);\n }\n\n function resetTryEntry(entry) {\n var record = entry.completion || {};\n record.type = \"normal\";\n delete record.arg;\n entry.completion = record;\n }\n\n function Context(tryLocsList) {\n // The root entry object (effectively a try statement without a catch\n // or a finally block) gives us a place to store values thrown from\n // locations where there is no enclosing try statement.\n this.tryEntries = [{ tryLoc: \"root\" }];\n tryLocsList.forEach(pushTryEntry, this);\n this.reset(true);\n }\n\n runtime.keys = function(object) {\n var keys = [];\n for (var key in object) {\n keys.push(key);\n }\n keys.reverse();\n\n // Rather than returning an object with a next method, we keep\n // things simple and return the next function itself.\n return function next() {\n while (keys.length) {\n var key = keys.pop();\n if (key in object) {\n next.value = key;\n next.done = false;\n return next;\n }\n }\n\n // To avoid creating an additional object, we just hang the .value\n // and .done properties off the next function object itself. This\n // also ensures that the minifier will not anonymize the function.\n next.done = true;\n return next;\n };\n };\n\n function values(iterable) {\n if (iterable) {\n var iteratorMethod = iterable[iteratorSymbol];\n if (iteratorMethod) {\n return iteratorMethod.call(iterable);\n }\n\n if (typeof iterable.next === \"function\") {\n return iterable;\n }\n\n if (!isNaN(iterable.length)) {\n var i = -1, next = function next() {\n while (++i < iterable.length) {\n if (hasOwn.call(iterable, i)) {\n next.value = iterable[i];\n next.done = false;\n return next;\n }\n }\n\n next.value = undefined;\n next.done = true;\n\n return next;\n };\n\n return next.next = next;\n }\n }\n\n // Return an iterator with no values.\n return { next: doneResult };\n }\n runtime.values = values;\n\n function doneResult() {\n return { value: undefined, done: true };\n }\n\n Context.prototype = {\n constructor: Context,\n\n reset: function(skipTempReset) {\n this.prev = 0;\n this.next = 0;\n // Resetting context._sent for legacy support of Babel's\n // function.sent implementation.\n this.sent = this._sent = undefined;\n this.done = false;\n this.delegate = null;\n\n this.method = \"next\";\n this.arg = undefined;\n\n this.tryEntries.forEach(resetTryEntry);\n\n if (!skipTempReset) {\n for (var name in this) {\n // Not sure about the optimal order of these conditions:\n if (name.charAt(0) === \"t\" &&\n hasOwn.call(this, name) &&\n !isNaN(+name.slice(1))) {\n this[name] = undefined;\n }\n }\n }\n },\n\n stop: function() {\n this.done = true;\n\n var rootEntry = this.tryEntries[0];\n var rootRecord = rootEntry.completion;\n if (rootRecord.type === \"throw\") {\n throw rootRecord.arg;\n }\n\n return this.rval;\n },\n\n dispatchException: function(exception) {\n if (this.done) {\n throw exception;\n }\n\n var context = this;\n function handle(loc, caught) {\n record.type = \"throw\";\n record.arg = exception;\n context.next = loc;\n\n if (caught) {\n // If the dispatched exception was caught by a catch block,\n // then let that catch block handle the exception normally.\n context.method = \"next\";\n context.arg = undefined;\n }\n\n return !! caught;\n }\n\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n var record = entry.completion;\n\n if (entry.tryLoc === \"root\") {\n // Exception thrown outside of any try block that could handle\n // it, so set the completion value of the entire function to\n // throw the exception.\n return handle(\"end\");\n }\n\n if (entry.tryLoc <= this.prev) {\n var hasCatch = hasOwn.call(entry, \"catchLoc\");\n var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n if (hasCatch && hasFinally) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n } else if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else if (hasCatch) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n }\n\n } else if (hasFinally) {\n if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else {\n throw new Error(\"try statement without catch or finally\");\n }\n }\n }\n },\n\n abrupt: function(type, arg) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc <= this.prev &&\n hasOwn.call(entry, \"finallyLoc\") &&\n this.prev < entry.finallyLoc) {\n var finallyEntry = entry;\n break;\n }\n }\n\n if (finallyEntry &&\n (type === \"break\" ||\n type === \"continue\") &&\n finallyEntry.tryLoc <= arg &&\n arg <= finallyEntry.finallyLoc) {\n // Ignore the finally entry if control is not jumping to a\n // location outside the try/catch block.\n finallyEntry = null;\n }\n\n var record = finallyEntry ? finallyEntry.completion : {};\n record.type = type;\n record.arg = arg;\n\n if (finallyEntry) {\n this.method = \"next\";\n this.next = finallyEntry.finallyLoc;\n return ContinueSentinel;\n }\n\n return this.complete(record);\n },\n\n complete: function(record, afterLoc) {\n if (record.type === \"throw\") {\n throw record.arg;\n }\n\n if (record.type === \"break\" ||\n record.type === \"continue\") {\n this.next = record.arg;\n } else if (record.type === \"return\") {\n this.rval = this.arg = record.arg;\n this.method = \"return\";\n this.next = \"end\";\n } else if (record.type === \"normal\" && afterLoc) {\n this.next = afterLoc;\n }\n\n return ContinueSentinel;\n },\n\n finish: function(finallyLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.finallyLoc === finallyLoc) {\n this.complete(entry.completion, entry.afterLoc);\n resetTryEntry(entry);\n return ContinueSentinel;\n }\n }\n },\n\n \"catch\": function(tryLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc === tryLoc) {\n var record = entry.completion;\n if (record.type === \"throw\") {\n var thrown = record.arg;\n resetTryEntry(entry);\n }\n return thrown;\n }\n }\n\n // The context.catch method must only be called with a location\n // argument that corresponds to a known catch block.\n throw new Error(\"illegal catch attempt\");\n },\n\n delegateYield: function(iterable, resultName, nextLoc) {\n this.delegate = {\n iterator: values(iterable),\n resultName: resultName,\n nextLoc: nextLoc\n };\n\n if (this.method === \"next\") {\n // Deliberately forget the last sent value so that we don't\n // accidentally pass it on to the delegate.\n this.arg = undefined;\n }\n\n return ContinueSentinel;\n }\n };\n})(\n // Among the various tricks for obtaining a reference to the global\n // object, this seems to be the most reliable technique that does not\n // use indirect eval (which violates Content Security Policy).\n typeof global === \"object\" ? global :\n typeof window === \"object\" ? window :\n typeof self === \"object\" ? self : this\n);\n","// Polyfill for creating CustomEvents on IE9/10/11\n\n// code pulled from:\n// https://github.com/d4tocchini/customevent-polyfill\n// https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent#Polyfill\n\ntry {\n var ce = new window.CustomEvent('test');\n ce.preventDefault();\n if (ce.defaultPrevented !== true) {\n // IE has problems with .preventDefault() on custom events\n // http://stackoverflow.com/questions/23349191\n throw new Error('Could not prevent default');\n }\n} catch(e) {\n var CustomEvent = function(event, params) {\n var evt, origPrevent;\n params = params || {\n bubbles: false,\n cancelable: false,\n detail: undefined\n };\n\n evt = document.createEvent(\"CustomEvent\");\n evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);\n origPrevent = evt.preventDefault;\n evt.preventDefault = function () {\n origPrevent.call(this);\n try {\n Object.defineProperty(this, 'defaultPrevented', {\n get: function () {\n return true;\n }\n });\n } catch(e) {\n this.defaultPrevented = true;\n }\n };\n return evt;\n };\n\n CustomEvent.prototype = window.Event.prototype;\n window.CustomEvent = CustomEvent; // expose definition to window\n}\n","(function(global) {\r\n /**\r\n * Polyfill URLSearchParams\r\n *\r\n * Inspired from : https://github.com/WebReflection/url-search-params/blob/master/src/url-search-params.js\r\n */\r\n\r\n var checkIfIteratorIsSupported = function() {\r\n try {\r\n return !!Symbol.iterator;\r\n } catch(error) {\r\n return false;\r\n }\r\n };\r\n\r\n\r\n var iteratorSupported = checkIfIteratorIsSupported();\r\n\r\n var createIterator = function(items) {\r\n var iterator = {\r\n next: function() {\r\n var value = items.shift();\r\n return { done: value === void 0, value: value };\r\n }\r\n };\r\n\r\n if(iteratorSupported) {\r\n iterator[Symbol.iterator] = function() {\r\n return iterator;\r\n };\r\n }\r\n\r\n return iterator;\r\n };\r\n\r\n /**\r\n * Search param name and values should be encoded according to https://url.spec.whatwg.org/#urlencoded-serializing\r\n * encodeURIComponent() produces the same result except encoding spaces as `%20` instead of `+`.\r\n */\r\n var serializeParam = function(value) {\r\n return encodeURIComponent(value).replace(/%20/g, '+');\r\n };\r\n\r\n var deserializeParam = function(value) {\r\n return decodeURIComponent(value).replace(/\\+/g, ' ');\r\n };\r\n\r\n var polyfillURLSearchParams= function() {\r\n\r\n var URLSearchParams = function(searchString) {\r\n Object.defineProperty(this, '_entries', { value: {} });\r\n\r\n if(typeof searchString === 'string') {\r\n if(searchString !== '') {\r\n searchString = searchString.replace(/^\\?/, '');\r\n var attributes = searchString.split('&');\r\n var attribute;\r\n for(var i = 0; i < attributes.length; i++) {\r\n attribute = attributes[i].split('=');\r\n this.append(\r\n deserializeParam(attribute[0]),\r\n (attribute.length > 1) ? deserializeParam(attribute[1]) : ''\r\n );\r\n }\r\n }\r\n } else if(searchString instanceof URLSearchParams) {\r\n var _this = this;\r\n searchString.forEach(function(value, name) {\r\n _this.append(value, name);\r\n });\r\n }\r\n };\r\n\r\n var proto = URLSearchParams.prototype;\r\n\r\n proto.append = function(name, value) {\r\n if(name in this._entries) {\r\n this._entries[name].push(value.toString());\r\n } else {\r\n this._entries[name] = [value.toString()];\r\n }\r\n };\r\n\r\n proto.delete = function(name) {\r\n delete this._entries[name];\r\n };\r\n\r\n proto.get = function(name) {\r\n return (name in this._entries) ? this._entries[name][0] : null;\r\n };\r\n\r\n proto.getAll = function(name) {\r\n return (name in this._entries) ? this._entries[name].slice(0) : [];\r\n };\r\n\r\n proto.has = function(name) {\r\n return (name in this._entries);\r\n };\r\n\r\n proto.set = function(name, value) {\r\n this._entries[name] = [value.toString()];\r\n };\r\n\r\n proto.forEach = function(callback, thisArg) {\r\n var entries;\r\n for(var name in this._entries) {\r\n if(this._entries.hasOwnProperty(name)) {\r\n entries = this._entries[name];\r\n for(var i = 0; i < entries.length; i++) {\r\n callback.call(thisArg, entries[i], name, this);\r\n }\r\n }\r\n }\r\n };\r\n\r\n proto.keys = function() {\r\n var items = [];\r\n this.forEach(function(value, name) { items.push(name); });\r\n return createIterator(items);\r\n };\r\n\r\n proto.values = function() {\r\n var items = [];\r\n this.forEach(function(value) { items.push(value); });\r\n return createIterator(items);\r\n };\r\n\r\n proto.entries = function() {\r\n var items = [];\r\n this.forEach(function(value, name) { items.push([name, value]); });\r\n return createIterator(items);\r\n };\r\n\r\n if(iteratorSupported) {\r\n proto[Symbol.iterator] = proto.entries;\r\n }\r\n\r\n proto.toString = function() {\r\n var searchString = '';\r\n this.forEach(function(value, name) {\r\n if(searchString.length > 0) searchString+= '&';\r\n searchString += serializeParam(name) + '=' + serializeParam(value);\r\n });\r\n return searchString;\r\n };\r\n\r\n global.URLSearchParams = URLSearchParams;\r\n };\r\n\r\n if(!('URLSearchParams' in global) || (new URLSearchParams('?a=1').toString() !== 'a=1')) {\r\n polyfillURLSearchParams();\r\n }\r\n\r\n // HTMLAnchorElement\r\n\r\n})(\r\n (typeof global !== 'undefined') ? global\r\n : ((typeof window !== 'undefined') ? window\r\n : ((typeof self !== 'undefined') ? self : this))\r\n);\r\n\r\n(function(global) {\r\n /**\r\n * Polyfill URL\r\n *\r\n * Inspired from : https://github.com/arv/DOM-URL-Polyfill/blob/master/src/url.js\r\n */\r\n\r\n var checkIfURLIsSupported = function() {\r\n try {\r\n var u = new URL('b', 'http://a');\r\n u.pathname = 'c%20d';\r\n return (u.href === 'http://a/c%20d') && u.searchParams;\r\n } catch(e) {\r\n return false;\r\n }\r\n };\r\n\r\n\r\n var polyfillURL = function() {\r\n var _URL = global.URL;\r\n\r\n var URL = function(url, base) {\r\n if(typeof url !== 'string') url = String(url);\r\n\r\n var doc = document.implementation.createHTMLDocument('');\r\n window.doc = doc;\r\n if(base) {\r\n var baseElement = doc.createElement('base');\r\n baseElement.href = base;\r\n doc.head.appendChild(baseElement);\r\n }\r\n\r\n var anchorElement = doc.createElement('a');\r\n anchorElement.href = url;\r\n doc.body.appendChild(anchorElement);\r\n anchorElement.href = anchorElement.href; // force href to refresh\r\n\r\n if(anchorElement.protocol === ':' || !/:/.test(anchorElement.href)) {\r\n throw new TypeError('Invalid URL');\r\n }\r\n\r\n Object.defineProperty(this, '_anchorElement', {\r\n value: anchorElement\r\n });\r\n };\r\n\r\n var proto = URL.prototype;\r\n\r\n var linkURLWithAnchorAttribute = function(attributeName) {\r\n Object.defineProperty(proto, attributeName, {\r\n get: function() {\r\n return this._anchorElement[attributeName];\r\n },\r\n set: function(value) {\r\n this._anchorElement[attributeName] = value;\r\n },\r\n enumerable: true\r\n });\r\n };\r\n\r\n ['hash', 'host', 'hostname', 'port', 'protocol', 'search']\r\n .forEach(function(attributeName) {\r\n linkURLWithAnchorAttribute(attributeName);\r\n });\r\n\r\n Object.defineProperties(proto, {\r\n\r\n 'toString': {\r\n get: function() {\r\n var _this = this;\r\n return function() {\r\n return _this.href;\r\n };\r\n }\r\n },\r\n\r\n 'href' : {\r\n get: function() {\r\n return this._anchorElement.href.replace(/\\?$/,'');\r\n },\r\n set: function(value) {\r\n this._anchorElement.href = value;\r\n },\r\n enumerable: true\r\n },\r\n\r\n 'pathname' : {\r\n get: function() {\r\n return this._anchorElement.pathname.replace(/(^\\/?)/,'/');\r\n },\r\n set: function(value) {\r\n this._anchorElement.pathname = value;\r\n },\r\n enumerable: true\r\n },\r\n\r\n 'origin': {\r\n get: function() {\r\n // get expected port from protocol\r\n var expectedPort = {'http:': 80, 'https:': 443, 'ftp:': 21}[this._anchorElement.protocol];\r\n // add port to origin if, expected port is different than actual port\r\n // and it is not empty f.e http://foo:8080\r\n // 8080 != 80 && 8080 != ''\r\n var addPortToOrigin = this._anchorElement.port != expectedPort &&\r\n this._anchorElement.port !== ''\r\n\r\n return this._anchorElement.protocol +\r\n '//' +\r\n this._anchorElement.hostname +\r\n (addPortToOrigin ? (':' + this._anchorElement.port) : '');\r\n },\r\n enumerable: true\r\n },\r\n\r\n 'password': { // TODO\r\n get: function() {\r\n return '';\r\n },\r\n set: function(value) {\r\n },\r\n enumerable: true\r\n },\r\n\r\n 'username': { // TODO\r\n get: function() {\r\n return '';\r\n },\r\n set: function(value) {\r\n },\r\n enumerable: true\r\n },\r\n\r\n 'searchParams': {\r\n get: function() {\r\n var searchParams = new URLSearchParams(this.search);\r\n var _this = this;\r\n ['append', 'delete', 'set'].forEach(function(methodName) {\r\n var method = searchParams[methodName];\r\n searchParams[methodName] = function() {\r\n method.apply(searchParams, arguments);\r\n _this.search = searchParams.toString();\r\n };\r\n });\r\n return searchParams;\r\n },\r\n enumerable: true\r\n }\r\n });\r\n\r\n URL.createObjectURL = function(blob) {\r\n return _URL.createObjectURL.apply(_URL, arguments);\r\n };\r\n\r\n URL.revokeObjectURL = function(url) {\r\n return _URL.revokeObjectURL.apply(_URL, arguments);\r\n };\r\n\r\n global.URL = URL;\r\n\r\n };\r\n\r\n if(!checkIfURLIsSupported()) {\r\n polyfillURL();\r\n }\r\n\r\n if((global.location !== void 0) && !('origin' in global.location)) {\r\n var getOrigin = function() {\r\n return global.location.protocol + '//' + global.location.hostname + (global.location.port ? (':' + global.location.port) : '');\r\n };\r\n\r\n try {\r\n Object.defineProperty(global.location, 'origin', {\r\n get: getOrigin,\r\n enumerable: true\r\n });\r\n } catch(e) {\r\n setInterval(function() {\r\n global.location.origin = getOrigin();\r\n }, 100);\r\n }\r\n }\r\n\r\n})(\r\n (typeof global !== 'undefined') ? global\r\n : ((typeof window !== 'undefined') ? window\r\n : ((typeof self !== 'undefined') ? self : this))\r\n);\r\n","// ==========================================================================\n// Type checking utils\n// ==========================================================================\n\nconst getConstructor = input => (input !== null && typeof input !== 'undefined' ? input.constructor : null);\n\nconst instanceOf = (input, constructor) => Boolean(input && constructor && input instanceof constructor);\n\nconst is = {\n object(input) {\n return getConstructor(input) === Object;\n },\n number(input) {\n return getConstructor(input) === Number && !Number.isNaN(input);\n },\n string(input) {\n return getConstructor(input) === String;\n },\n boolean(input) {\n return getConstructor(input) === Boolean;\n },\n function(input) {\n return getConstructor(input) === Function;\n },\n array(input) {\n return !is.nullOrUndefined(input) && Array.isArray(input);\n },\n weakMap(input) {\n return instanceOf(input, WeakMap);\n },\n nodeList(input) {\n return instanceOf(input, NodeList);\n },\n element(input) {\n return instanceOf(input, Element);\n },\n textNode(input) {\n return getConstructor(input) === Text;\n },\n event(input) {\n return instanceOf(input, Event);\n },\n cue(input) {\n return instanceOf(input, window.TextTrackCue) || instanceOf(input, window.VTTCue);\n },\n track(input) {\n return instanceOf(input, TextTrack) || (!is.nullOrUndefined(input) && is.string(input.kind));\n },\n url(input) {\n return (\n !is.nullOrUndefined(input) &&\n /(ftp|http|https):\\/\\/(\\w+:{0,1}\\w*@)?(\\S+)(:[0-9]+)?(\\/|\\/([\\w#!:.?+=&%@!\\-/]))?/.test(input)\n );\n },\n nullOrUndefined(input) {\n return input === null || typeof input === 'undefined';\n },\n empty(input) {\n return (\n is.nullOrUndefined(input) ||\n ((is.string(input) || is.array(input) || is.nodeList(input)) && !input.length) ||\n (is.object(input) && !Object.keys(input).length)\n );\n },\n};\n\nexport default is;\n","// ==========================================================================\n// Event utils\n// ==========================================================================\n\nimport is from './is';\n\n// Check for passive event listener support\n// https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md\n// https://www.youtube.com/watch?v=NPM6172J22g\nconst supportsPassiveListeners = (() => {\n // Test via a getter in the options object to see if the passive property is accessed\n let supported = false;\n try {\n const options = Object.defineProperty({}, 'passive', {\n get() {\n supported = true;\n return null;\n },\n });\n window.addEventListener('test', null, options);\n window.removeEventListener('test', null, options);\n } catch (e) {\n // Do nothing\n }\n\n return supported;\n})();\n\n// Toggle event listener\nexport function toggleListener(element, event, callback, toggle = false, passive = true, capture = false) {\n // Bail if no element, event, or callback\n if (!element || !('addEventListener' in element) || is.empty(event) || !is.function(callback)) {\n return;\n }\n\n // Allow multiple events\n const events = event.split(' ');\n\n // Build options\n // Default to just the capture boolean for browsers with no passive listener support\n let options = capture;\n\n // If passive events listeners are supported\n if (supportsPassiveListeners) {\n options = {\n // Whether the listener can be passive (i.e. default never prevented)\n passive,\n // Whether the listener is a capturing listener or not\n capture,\n };\n }\n\n // If a single node is passed, bind the event listener\n events.forEach(type => {\n if (this && this.eventListeners && toggle) {\n // Cache event listener\n this.eventListeners.push({ element, type, callback, options });\n }\n\n element[toggle ? 'addEventListener' : 'removeEventListener'](type, callback, options);\n });\n}\n\n// Bind event handler\nexport function on(element, events = '', callback, passive = true, capture = false) {\n toggleListener.call(this, element, events, callback, true, passive, capture);\n}\n\n// Unbind event handler\nexport function off(element, events = '', callback, passive = true, capture = false) {\n toggleListener.call(this, element, events, callback, false, passive, capture);\n}\n\n// Bind once-only event handler\nexport function once(element, events = '', callback, passive = true, capture = false) {\n function onceCallback(...args) {\n off(element, events, onceCallback, passive, capture);\n callback.apply(this, args);\n }\n\n toggleListener.call(this, element, events, onceCallback, true, passive, capture);\n}\n\n// Trigger event\nexport function triggerEvent(element, type = '', bubbles = false, detail = {}) {\n // Bail if no element\n if (!is.element(element) || is.empty(type)) {\n return;\n }\n\n // Create and dispatch the event\n const event = new CustomEvent(type, {\n bubbles,\n detail: Object.assign({}, detail, {\n plyr: this,\n }),\n });\n\n // Dispatch the event\n element.dispatchEvent(event);\n}\n\n// Unbind all cached event listeners\nexport function unbindListeners() {\n if (this && this.eventListeners) {\n this.eventListeners.forEach(item => {\n const { element, type, callback, options } = item;\n element.removeEventListener(type, callback, options);\n });\n\n this.eventListeners = [];\n }\n}\n\n// Run method when / if player is ready\nexport function ready() {\n return new Promise(\n resolve => (this.ready ? setTimeout(resolve, 0) : on.call(this, this.elements.container, 'ready', resolve)),\n ).then(() => {});\n}\n","// ==========================================================================\n// Element utils\n// ==========================================================================\n\nimport { toggleListener } from './events';\nimport is from './is';\n\n// Wrap an element\nexport function wrap(elements, wrapper) {\n // Convert `elements` to an array, if necessary.\n const targets = elements.length ? elements : [elements];\n\n // Loops backwards to prevent having to clone the wrapper on the\n // first element (see `child` below).\n Array.from(targets)\n .reverse()\n .forEach((element, index) => {\n const child = index > 0 ? wrapper.cloneNode(true) : wrapper;\n\n // Cache the current parent and sibling.\n const parent = element.parentNode;\n const sibling = element.nextSibling;\n\n // Wrap the element (is automatically removed from its current\n // parent).\n child.appendChild(element);\n\n // If the element had a sibling, insert the wrapper before\n // the sibling to maintain the HTML structure; otherwise, just\n // append it to the parent.\n if (sibling) {\n parent.insertBefore(child, sibling);\n } else {\n parent.appendChild(child);\n }\n });\n}\n\n// Set attributes\nexport function setAttributes(element, attributes) {\n if (!is.element(element) || is.empty(attributes)) {\n return;\n }\n\n // Assume null and undefined attributes should be left out,\n // Setting them would otherwise convert them to \"null\" and \"undefined\"\n Object.entries(attributes)\n .filter(([, value]) => !is.nullOrUndefined(value))\n .forEach(([key, value]) => element.setAttribute(key, value));\n}\n\n// Create a DocumentFragment\nexport function createElement(type, attributes, text) {\n // Create a new <element>\n const element = document.createElement(type);\n\n // Set all passed attributes\n if (is.object(attributes)) {\n setAttributes(element, attributes);\n }\n\n // Add text node\n if (is.string(text)) {\n element.innerText = text;\n }\n\n // Return built element\n return element;\n}\n\n// Inaert an element after another\nexport function insertAfter(element, target) {\n target.parentNode.insertBefore(element, target.nextSibling);\n}\n\n// Insert a DocumentFragment\nexport function insertElement(type, parent, attributes, text) {\n // Inject the new <element>\n parent.appendChild(createElement(type, attributes, text));\n}\n\n// Remove element(s)\nexport function removeElement(element) {\n if (is.nodeList(element) || is.array(element)) {\n Array.from(element).forEach(removeElement);\n return;\n }\n\n if (!is.element(element) || !is.element(element.parentNode)) {\n return;\n }\n\n element.parentNode.removeChild(element);\n}\n\n// Remove all child elements\nexport function emptyElement(element) {\n let { length } = element.childNodes;\n\n while (length > 0) {\n element.removeChild(element.lastChild);\n length -= 1;\n }\n}\n\n// Replace element\nexport function replaceElement(newChild, oldChild) {\n if (!is.element(oldChild) || !is.element(oldChild.parentNode) || !is.element(newChild)) {\n return null;\n }\n\n oldChild.parentNode.replaceChild(newChild, oldChild);\n\n return newChild;\n}\n\n// Get an attribute object from a string selector\nexport function getAttributesFromSelector(sel, existingAttributes) {\n // For example:\n // '.test' to { class: 'test' }\n // '#test' to { id: 'test' }\n // '[data-test=\"test\"]' to { 'data-test': 'test' }\n\n if (!is.string(sel) || is.empty(sel)) {\n return {};\n }\n\n const attributes = {};\n const existing = existingAttributes;\n\n sel.split(',').forEach(s => {\n // Remove whitespace\n const selector = s.trim();\n const className = selector.replace('.', '');\n const stripped = selector.replace(/[[\\]]/g, '');\n\n // Get the parts and value\n const parts = stripped.split('=');\n const key = parts[0];\n const value = parts.length > 1 ? parts[1].replace(/[\"']/g, '') : '';\n\n // Get the first character\n const start = selector.charAt(0);\n\n switch (start) {\n case '.':\n // Add to existing classname\n if (is.object(existing) && is.string(existing.class)) {\n existing.class += ` ${className}`;\n }\n\n attributes.class = className;\n break;\n\n case '#':\n // ID selector\n attributes.id = selector.replace('#', '');\n break;\n\n case '[':\n // Attribute selector\n attributes[key] = value;\n\n break;\n\n default:\n break;\n }\n });\n\n return attributes;\n}\n\n// Toggle hidden\nexport function toggleHidden(element, hidden) {\n if (!is.element(element)) {\n return;\n }\n\n let hide = hidden;\n\n if (!is.boolean(hide)) {\n hide = !element.hasAttribute('hidden');\n }\n\n if (hide) {\n element.setAttribute('hidden', '');\n } else {\n element.removeAttribute('hidden');\n }\n}\n\n// Mirror Element.classList.toggle, with IE compatibility for \"force\" argument\nexport function toggleClass(element, className, force) {\n if (is.element(element)) {\n let method = 'toggle';\n if (typeof force !== 'undefined') {\n method = force ? 'add' : 'remove';\n }\n\n element.classList[method](className);\n return element.classList.contains(className);\n }\n\n return null;\n}\n\n// Has class name\nexport function hasClass(element, className) {\n return is.element(element) && element.classList.contains(className);\n}\n\n// Element matches selector\nexport function matches(element, selector) {\n const prototype = { Element };\n\n function match() {\n return Array.from(document.querySelectorAll(selector)).includes(this);\n }\n\n const matches =\n prototype.matches ||\n prototype.webkitMatchesSelector ||\n prototype.mozMatchesSelector ||\n prototype.msMatchesSelector ||\n match;\n\n return matches.call(element, selector);\n}\n\n// Find all elements\nexport function getElements(selector) {\n return this.elements.container.querySelectorAll(selector);\n}\n\n// Find a single element\nexport function getElement(selector) {\n return this.elements.container.querySelector(selector);\n}\n\n// Get the focused element\nexport function getFocusElement() {\n let focused = document.activeElement;\n\n if (!focused || focused === document.body) {\n focused = null;\n } else {\n focused = document.querySelector(':focus');\n }\n\n return focused;\n}\n\n// Trap focus inside container\nexport function trapFocus(element = null, toggle = false) {\n if (!is.element(element)) {\n return;\n }\n\n const focusable = getElements.call(this, 'button:not(:disabled), input:not(:disabled), [tabindex]');\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n\n const trap = event => {\n // Bail if not tab key or not fullscreen\n if (event.key !== 'Tab' || event.keyCode !== 9) {\n return;\n }\n\n // Get the current focused element\n const focused = getFocusElement();\n\n if (focused === last && !event.shiftKey) {\n // Move focus to first element that can be tabbed if Shift isn't used\n first.focus();\n event.preventDefault();\n } else if (focused === first && event.shiftKey) {\n // Move focus to last element that can be tabbed if Shift is used\n last.focus();\n event.preventDefault();\n }\n };\n\n toggleListener.call(this, this.elements.container, 'keydown', trap, toggle, false);\n}\n","// ==========================================================================\n// Animation utils\n// ==========================================================================\n\nimport { toggleHidden } from './elements';\nimport is from './is';\n\nexport const transitionEndEvent = (() => {\n const element = document.createElement('span');\n\n const events = {\n WebkitTransition: 'webkitTransitionEnd',\n MozTransition: 'transitionend',\n OTransition: 'oTransitionEnd otransitionend',\n transition: 'transitionend',\n };\n\n const type = Object.keys(events).find(event => element.style[event] !== undefined);\n\n return is.string(type) ? events[type] : false;\n})();\n\n// Force repaint of element\nexport function repaint(element) {\n setTimeout(() => {\n toggleHidden(element, true);\n element.offsetHeight; // eslint-disable-line\n toggleHidden(element, false);\n }, 0);\n}\n","// ==========================================================================\n// Browser sniffing\n// Unfortunately, due to mixed support, UA sniffing is required\n// ==========================================================================\n\nconst browser = {\n isIE: /* @cc_on!@ */ false || !!document.documentMode,\n isWebkit: 'WebkitAppearance' in document.documentElement.style && !/Edge/.test(navigator.userAgent),\n isIPhone: /(iPhone|iPod)/gi.test(navigator.platform),\n isIos: /(iPad|iPhone|iPod)/gi.test(navigator.platform),\n};\n\nexport default browser;\n","// ==========================================================================\n// Plyr support checks\n// ==========================================================================\n\nimport { transitionEndEvent } from './utils/animation';\nimport browser from './utils/browser';\nimport { createElement } from './utils/elements';\nimport is from './utils/is';\n\n// Default codecs for checking mimetype support\nconst defaultCodecs = {\n 'audio/ogg': 'vorbis',\n 'audio/wav': '1',\n 'video/webm': 'vp8, vorbis',\n 'video/mp4': 'avc1.42E01E, mp4a.40.2',\n 'video/ogg': 'theora',\n};\n\n// Check for feature support\nconst support = {\n // Basic support\n audio: 'canPlayType' in document.createElement('audio'),\n video: 'canPlayType' in document.createElement('video'),\n\n // Check for support\n // Basic functionality vs full UI\n check(type, provider, playsinline) {\n const canPlayInline = browser.isIPhone && playsinline && support.playsinline;\n const api = support[type] || provider !== 'html5';\n const ui = api && support.rangeInput && (type !== 'video' || !browser.isIPhone || canPlayInline);\n\n return {\n api,\n ui,\n };\n },\n\n // Picture-in-picture support\n // Safari only currently\n pip: (() => !browser.isIPhone && is.function(createElement('video').webkitSetPresentationMode))(),\n\n // Airplay support\n // Safari only currently\n airplay: is.function(window.WebKitPlaybackTargetAvailabilityEvent),\n\n // Inline playback support\n // https://webkit.org/blog/6784/new-video-policies-for-ios/\n playsinline: 'playsInline' in document.createElement('video'),\n\n // Check for mime type support against a player instance\n // Credits: http://diveintohtml5.info/everything.html\n // Related: http://www.leanbackplayer.com/test/h5mt.html\n mime(inputType) {\n const [mediaType] = inputType.split('/');\n if (!this.isHTML5 || mediaType !== this.type) {\n return false;\n }\n\n let type;\n if (inputType && inputType.includes('codecs=')) {\n // Use input directly\n type = inputType;\n } else if (inputType === 'audio/mpeg') {\n // Skip codec\n type = 'audio/mpeg;';\n } else if (inputType in defaultCodecs) {\n // Use codec\n type = `${inputType}; codecs=\"${defaultCodecs[inputType]}\"`;\n }\n\n try {\n return Boolean(type && this.media.canPlayType(type).replace(/no/, ''));\n } catch (err) {\n return false;\n }\n },\n\n // Check for textTracks support\n textTracks: 'textTracks' in document.createElement('video'),\n\n // <input type=\"range\"> Sliders\n rangeInput: (() => {\n const range = document.createElement('input');\n range.type = 'range';\n return range.type === 'range';\n })(),\n\n // Touch\n // NOTE: Remember a device can be mouse + touch enabled so we check on first touch event\n touch: 'ontouchstart' in document.documentElement,\n\n // Detect transitions support\n transitions: transitionEndEvent !== false,\n\n // Reduced motion iOS & MacOS setting\n // https://webkit.org/blog/7551/responsive-design-for-motion/\n reducedMotion: 'matchMedia' in window && window.matchMedia('(prefers-reduced-motion)').matches,\n};\n\nexport default support;\n","// ==========================================================================\n// Plyr HTML5 helpers\n// ==========================================================================\n\nimport support from './support';\nimport { removeElement } from './utils/elements';\nimport { triggerEvent } from './utils/events';\n\nconst html5 = {\n getSources() {\n if (!this.isHTML5) {\n return [];\n }\n\n const sources = Array.from(this.media.querySelectorAll('source'));\n\n // Filter out unsupported sources\n return sources.filter(source => support.mime.call(this, source.getAttribute('type')));\n },\n\n // Get quality levels\n getQualityOptions() {\n // Get sizes from <source> elements\n return html5.getSources\n .call(this)\n .map(source => Number(source.getAttribute('size')))\n .filter(Boolean);\n },\n\n extend() {\n if (!this.isHTML5) {\n return;\n }\n\n const player = this;\n\n // Quality\n Object.defineProperty(player.media, 'quality', {\n get() {\n // Get sources\n const sources = html5.getSources.call(player);\n const [source] = sources.filter(source => source.getAttribute('src') === player.source);\n\n // Return size, if match is found\n return source && Number(source.getAttribute('size'));\n },\n set(input) {\n // Get sources\n const sources = html5.getSources.call(player);\n\n // Get first match for requested size\n const source = sources.find(source => Number(source.getAttribute('size')) === input);\n\n // No matching source found\n if (!source) {\n return;\n }\n\n // Get current state\n const { currentTime, playing } = player;\n\n // Set new source\n player.media.src = source.getAttribute('src');\n\n // Restore time\n const onLoadedMetaData = () => {\n player.currentTime = currentTime;\n };\n player.once('loadedmetadata', onLoadedMetaData);\n\n // Load new source\n player.media.load();\n\n // Resume playing\n if (playing) {\n player.play();\n }\n\n // Trigger change event\n triggerEvent.call(player, player.media, 'qualitychange', false, {\n quality: input,\n });\n },\n });\n },\n\n // Cancel current network requests\n // See https://github.com/sampotts/plyr/issues/174\n cancelRequests() {\n if (!this.isHTML5) {\n return;\n }\n\n // Remove child sources\n removeElement(html5.getSources.call(this));\n\n // Set blank video src attribute\n // This is to prevent a MEDIA_ERR_SRC_NOT_SUPPORTED error\n // Info: http://stackoverflow.com/questions/32231579/how-to-properly-dispose-of-an-html5-video-and-close-socket-or-connection\n this.media.setAttribute('src', this.config.blankVideo);\n\n // Load the new empty source\n // This will cancel existing requests\n // See https://github.com/sampotts/plyr/issues/174\n this.media.load();\n\n // Debugging\n this.debug.log('Cancelled network requests');\n },\n};\n\nexport default html5;\n","// ==========================================================================\n// Object utils\n// ==========================================================================\n\nimport is from './is';\n\n// Clone nested objects\nexport function cloneDeep(object) {\n return JSON.parse(JSON.stringify(object));\n}\n\n// Get a nested value in an object\nexport function getDeep(object, path) {\n return path.split('.').reduce((obj, key) => obj && obj[key], object);\n}\n\n// Deep extend destination object with N more objects\nexport function extend(target = {}, ...sources) {\n if (!sources.length) {\n return target;\n }\n\n const source = sources.shift();\n\n if (!is.object(source)) {\n return target;\n }\n\n Object.keys(source).forEach(key => {\n if (is.object(source[key])) {\n if (!Object.keys(target).includes(key)) {\n Object.assign(target, { [key]: {} });\n }\n\n extend(target[key], source[key]);\n } else {\n Object.assign(target, { [key]: source[key] });\n }\n });\n\n return extend(target, ...sources);\n}\n","// ==========================================================================\n// String utils\n// ==========================================================================\n\nimport is from './is';\n\n// Generate a random ID\nexport function generateId(prefix) {\n return `${prefix}-${Math.floor(Math.random() * 10000)}`;\n}\n\n// Format string\nexport function format(input, ...args) {\n if (is.empty(input)) {\n return input;\n }\n\n return input.toString().replace(/{(\\d+)}/g, (match, i) => args[i].toString());\n}\n\n// Get percentage\nexport function getPercentage(current, max) {\n if (current === 0 || max === 0 || Number.isNaN(current) || Number.isNaN(max)) {\n return 0;\n }\n\n return (current / max * 100).toFixed(2);\n}\n\n// Replace all occurances of a string in a string\nexport function replaceAll(input = '', find = '', replace = '') {\n return input.replace(\n new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\\]/\\\\])/g, '\\\\$1'), 'g'),\n replace.toString(),\n );\n}\n\n// Convert to title case\nexport function toTitleCase(input = '') {\n return input.toString().replace(/\\w\\S*/g, text => text.charAt(0).toUpperCase() + text.substr(1).toLowerCase());\n}\n\n// Convert string to pascalCase\nexport function toPascalCase(input = '') {\n let string = input.toString();\n\n // Convert kebab case\n string = replaceAll(string, '-', ' ');\n\n // Convert snake case\n string = replaceAll(string, '_', ' ');\n\n // Convert to title case\n string = toTitleCase(string);\n\n // Convert to pascal case\n return replaceAll(string, ' ', '');\n}\n\n// Convert string to pascalCase\nexport function toCamelCase(input = '') {\n let string = input.toString();\n\n // Convert to pascal case\n string = toPascalCase(string);\n\n // Convert first character to lowercase\n return string.charAt(0).toLowerCase() + string.slice(1);\n}\n\n// Remove HTML from a string\nexport function stripHTML(source) {\n const fragment = document.createDocumentFragment();\n const element = document.createElement('div');\n fragment.appendChild(element);\n element.innerHTML = source;\n return fragment.firstChild.innerText;\n}\n\n// Like outerHTML, but also works for DocumentFragment\nexport function getHTML(element) {\n const wrapper = document.createElement('div');\n wrapper.appendChild(element);\n return wrapper.innerHTML;\n}\n","// ==========================================================================\n// Plyr internationalization\n// ==========================================================================\n\nimport is from './utils/is';\nimport { getDeep } from './utils/objects';\nimport { replaceAll } from './utils/strings';\n\nconst i18n = {\n get(key = '', config = {}) {\n if (is.empty(key) || is.empty(config)) {\n return '';\n }\n\n let string = getDeep(config.i18n, key);\n\n if (is.empty(string)) {\n return '';\n }\n\n const replace = {\n '{seektime}': config.seekTime,\n '{title}': config.title,\n };\n\n Object.entries(replace).forEach(([key, value]) => {\n string = replaceAll(string, key, value);\n });\n\n return string;\n },\n};\n\nexport default i18n;\n","// ==========================================================================\n// Array utils\n// ==========================================================================\n\nimport is from './is';\n\n// Remove duplicates in an array\nexport function dedupe(array) {\n if (!is.array(array)) {\n return array;\n }\n\n return array.filter((item, index) => array.indexOf(item) === index);\n}\n\n// Get the closest value in an array\nexport function closest(array, value) {\n if (!is.array(array) || !array.length) {\n return null;\n }\n\n return array.reduce((prev, curr) => (Math.abs(curr - value) < Math.abs(prev - value) ? curr : prev));\n}\n","// ==========================================================================\n// Plyr storage\n// ==========================================================================\n\nimport is from './utils/is';\nimport { extend } from './utils/objects';\n\nclass Storage {\n constructor(player) {\n this.enabled = player.config.storage.enabled;\n this.key = player.config.storage.key;\n }\n\n // Check for actual support (see if we can use it)\n static get supported() {\n try {\n if (!('localStorage' in window)) {\n return false;\n }\n\n const test = '___test';\n\n // Try to use it (it might be disabled, e.g. user is in private mode)\n // see: https://github.com/sampotts/plyr/issues/131\n window.localStorage.setItem(test, test);\n window.localStorage.removeItem(test);\n\n return true;\n } catch (e) {\n return false;\n }\n }\n\n get(key) {\n if (!Storage.supported || !this.enabled) {\n return null;\n }\n\n const store = window.localStorage.getItem(this.key);\n\n if (is.empty(store)) {\n return null;\n }\n\n const json = JSON.parse(store);\n\n return is.string(key) && key.length ? json[key] : json;\n }\n\n set(object) {\n // Bail if we don't have localStorage support or it's disabled\n if (!Storage.supported || !this.enabled) {\n return;\n }\n\n // Can only store objectst\n if (!is.object(object)) {\n return;\n }\n\n // Get current storage\n let storage = this.get();\n\n // Default to empty object\n if (is.empty(storage)) {\n storage = {};\n }\n\n // Update the working copy of the values\n extend(storage, object);\n\n // Update storage\n window.localStorage.setItem(this.key, JSON.stringify(storage));\n }\n}\n\nexport default Storage;\n","// ==========================================================================\n// Sprite loader\n// ==========================================================================\n\nimport Storage from './../storage';\nimport is from './is';\n\n// Load an external SVG sprite\nexport default function loadSprite(url, id) {\n if (!is.string(url)) {\n return;\n }\n\n const prefix = 'cache';\n const hasId = is.string(id);\n let isCached = false;\n\n const exists = () => document.getElementById(id) !== null;\n\n const update = (container, data) => {\n container.innerHTML = data;\n\n // Check again incase of race condition\n if (hasId && exists()) {\n return;\n }\n\n // Inject the SVG to the body\n document.body.insertAdjacentElement('afterbegin', container);\n };\n\n // Only load once if ID set\n if (!hasId || !exists()) {\n const useStorage = Storage.supported;\n\n // Create container\n const container = document.createElement('div');\n container.setAttribute('hidden', '');\n\n if (hasId) {\n container.setAttribute('id', id);\n }\n\n // Check in cache\n if (useStorage) {\n const cached = window.localStorage.getItem(`${prefix}-${id}`);\n isCached = cached !== null;\n\n if (isCached) {\n const data = JSON.parse(cached);\n update(container, data.content);\n }\n }\n\n // Get the sprite\n fetch(url)\n .then(result => {\n if (is.empty(result)) {\n return;\n }\n\n if (useStorage) {\n window.localStorage.setItem(\n `${prefix}-${id}`,\n JSON.stringify({\n content: result,\n }),\n );\n }\n\n update(container, result);\n })\n .catch(() => {});\n }\n}\n","// ==========================================================================\n// Time utils\n// ==========================================================================\n\nimport is from './is';\n\n// Time helpers\nexport const getHours = value => parseInt((value / 60 / 60) % 60, 10);\nexport const getMinutes = value => parseInt((value / 60) % 60, 10);\nexport const getSeconds = value => parseInt(value % 60, 10);\n\n// Format time to UI friendly string\nexport function formatTime(time = 0, displayHours = false, inverted = false) {\n // Bail if the value isn't a number\n if (!is.number(time)) {\n return formatTime(null, displayHours, inverted);\n }\n\n // Format time component to add leading zero\n const format = value => `0${value}`.slice(-2);\n\n // Breakdown to hours, mins, secs\n let hours = getHours(time);\n const mins = getMinutes(time);\n const secs = getSeconds(time);\n\n // Do we need to display hours?\n if (displayHours || hours > 0) {\n hours = `${hours}:`;\n } else {\n hours = '';\n }\n\n // Render\n return `${inverted && time > 0 ? '-' : ''}${hours}${format(mins)}:${format(secs)}`;\n}\n","// ==========================================================================\n// Plyr controls\n// ==========================================================================\n\nimport captions from './captions';\nimport html5 from './html5';\nimport i18n from './i18n';\nimport support from './support';\nimport { repaint, transitionEndEvent } from './utils/animation';\nimport { dedupe } from './utils/arrays';\nimport browser from './utils/browser';\nimport {\n createElement,\n emptyElement,\n getAttributesFromSelector,\n getElement,\n getElements,\n hasClass,\n removeElement,\n setAttributes,\n toggleClass,\n toggleHidden,\n matches,\n} from './utils/elements';\nimport { off, on } from './utils/events';\nimport is from './utils/is';\nimport loadSprite from './utils/loadSprite';\nimport { extend } from './utils/objects';\nimport { getPercentage, replaceAll, toCamelCase, toTitleCase } from './utils/strings';\nimport { formatTime, getHours } from './utils/time';\n\n// TODO: Don't export a massive object - break down and create class\nconst controls = {\n // Get icon URL\n getIconUrl() {\n const url = new URL(this.config.iconUrl, window.location);\n const cors = url.host !== window.location.host || (browser.isIE && !window.svg4everybody);\n\n return {\n url: this.config.iconUrl,\n cors,\n };\n },\n\n // Find the UI controls\n findElements() {\n try {\n this.elements.controls = getElement.call(this, this.config.selectors.controls.wrapper);\n\n // Buttons\n this.elements.buttons = {\n play: getElements.call(this, this.config.selectors.buttons.play),\n pause: getElement.call(this, this.config.selectors.buttons.pause),\n restart: getElement.call(this, this.config.selectors.buttons.restart),\n rewind: getElement.call(this, this.config.selectors.buttons.rewind),\n fastForward: getElement.call(this, this.config.selectors.buttons.fastForward),\n mute: getElement.call(this, this.config.selectors.buttons.mute),\n pip: getElement.call(this, this.config.selectors.buttons.pip),\n airplay: getElement.call(this, this.config.selectors.buttons.airplay),\n settings: getElement.call(this, this.config.selectors.buttons.settings),\n captions: getElement.call(this, this.config.selectors.buttons.captions),\n fullscreen: getElement.call(this, this.config.selectors.buttons.fullscreen),\n };\n\n // Progress\n this.elements.progress = getElement.call(this, this.config.selectors.progress);\n\n // Inputs\n this.elements.inputs = {\n seek: getElement.call(this, this.config.selectors.inputs.seek),\n volume: getElement.call(this, this.config.selectors.inputs.volume),\n };\n\n // Display\n this.elements.display = {\n buffer: getElement.call(this, this.config.selectors.display.buffer),\n currentTime: getElement.call(this, this.config.selectors.display.currentTime),\n duration: getElement.call(this, this.config.selectors.display.duration),\n };\n\n // Seek tooltip\n if (is.element(this.elements.progress)) {\n this.elements.display.seekTooltip = this.elements.progress.querySelector(\n `.${this.config.classNames.tooltip}`,\n );\n }\n\n return true;\n } catch (error) {\n // Log it\n this.debug.warn('It looks like there is a problem with your custom controls HTML', error);\n\n // Restore native video controls\n this.toggleNativeControls(true);\n\n return false;\n }\n },\n\n // Create <svg> icon\n createIcon(type, attributes) {\n const namespace = 'http://www.w3.org/2000/svg';\n const iconUrl = controls.getIconUrl.call(this);\n const iconPath = `${!iconUrl.cors ? iconUrl.url : ''}#${this.config.iconPrefix}`;\n\n // Create <svg>\n const icon = document.createElementNS(namespace, 'svg');\n setAttributes(\n icon,\n extend(attributes, {\n role: 'presentation',\n focusable: 'false',\n }),\n );\n\n // Create the <use> to reference sprite\n const use = document.createElementNS(namespace, 'use');\n const path = `${iconPath}-${type}`;\n\n // Set `href` attributes\n // https://github.com/sampotts/plyr/issues/460\n // https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/xlink:href\n if ('href' in use) {\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'href', path);\n } else {\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path);\n }\n\n // Add <use> to <svg>\n icon.appendChild(use);\n\n return icon;\n },\n\n // Create hidden text label\n createLabel(type, attr = {}) {\n // Skip i18n for abbreviations and brand names\n const universals = {\n pip: 'PIP',\n airplay: 'AirPlay',\n };\n const text = universals[type] || i18n.get(type, this.config);\n\n const attributes = Object.assign({}, attr, {\n class: [attr.class, this.config.classNames.hidden].filter(Boolean).join(' '),\n });\n return createElement('span', attributes, text);\n },\n\n // Create a badge\n createBadge(text) {\n if (is.empty(text)) {\n return null;\n }\n\n const badge = createElement('span', {\n class: this.config.classNames.menu.value,\n });\n\n badge.appendChild(\n createElement(\n 'span',\n {\n class: this.config.classNames.menu.badge,\n },\n text,\n ),\n );\n\n return badge;\n },\n\n // Create a <button>\n createButton(buttonType, attr) {\n const button = createElement('button');\n const attributes = Object.assign({}, attr);\n let type = toCamelCase(buttonType);\n\n let toggle = false;\n let label;\n let icon;\n let labelPressed;\n let iconPressed;\n\n if (!('type' in attributes)) {\n attributes.type = 'button';\n }\n\n if ('class' in attributes) {\n if (attributes.class.includes(this.config.classNames.control)) {\n attributes.class += ` ${this.config.classNames.control}`;\n }\n } else {\n attributes.class = this.config.classNames.control;\n }\n\n // Large play button\n switch (buttonType) {\n case 'play':\n toggle = true;\n label = 'play';\n labelPressed = 'pause';\n icon = 'play';\n iconPressed = 'pause';\n break;\n\n case 'mute':\n toggle = true;\n label = 'mute';\n labelPressed = 'unmute';\n icon = 'volume';\n iconPressed = 'muted';\n break;\n\n case 'captions':\n toggle = true;\n label = 'enableCaptions';\n labelPressed = 'disableCaptions';\n icon = 'captions-off';\n iconPressed = 'captions-on';\n break;\n\n case 'fullscreen':\n toggle = true;\n label = 'enterFullscreen';\n labelPressed = 'exitFullscreen';\n icon = 'enter-fullscreen';\n iconPressed = 'exit-fullscreen';\n break;\n\n case 'play-large':\n attributes.class += ` ${this.config.classNames.control}--overlaid`;\n type = 'play';\n label = 'play';\n icon = 'play';\n break;\n\n default:\n label = type;\n icon = buttonType;\n }\n\n // Setup toggle icon and labels\n if (toggle) {\n // Icon\n button.appendChild(controls.createIcon.call(this, iconPressed, { class: 'icon--pressed' }));\n button.appendChild(controls.createIcon.call(this, icon, { class: 'icon--not-pressed' }));\n\n // Label/Tooltip\n button.appendChild(controls.createLabel.call(this, labelPressed, { class: 'label--pressed' }));\n button.appendChild(controls.createLabel.call(this, label, { class: 'label--not-pressed' }));\n } else {\n button.appendChild(controls.createIcon.call(this, icon));\n button.appendChild(controls.createLabel.call(this, label));\n }\n\n // Merge attributes\n extend(attributes, getAttributesFromSelector(this.config.selectors.buttons[type], attributes));\n\n setAttributes(button, attributes);\n\n // We have multiple play buttons\n if (type === 'play') {\n if (!is.array(this.elements.buttons[type])) {\n this.elements.buttons[type] = [];\n }\n\n this.elements.buttons[type].push(button);\n } else {\n this.elements.buttons[type] = button;\n }\n\n // Toggle classname when pressed property is set\n const className = this.config.classNames.controlPressed;\n Object.defineProperty(button, 'pressed', {\n enumerable: true,\n get() {\n return hasClass(button, className);\n },\n set(pressed = false) {\n toggleClass(button, className, pressed);\n },\n });\n\n return button;\n },\n\n // Create an <input type='range'>\n createRange(type, attributes) {\n // Seek input\n const input = createElement(\n 'input',\n extend(\n getAttributesFromSelector(this.config.selectors.inputs[type]),\n {\n type: 'range',\n min: 0,\n max: 100,\n step: 0.01,\n value: 0,\n autocomplete: 'off',\n // A11y fixes for https://github.com/sampotts/plyr/issues/905\n role: 'slider',\n 'aria-label': i18n.get(type, this.config),\n 'aria-valuemin': 0,\n 'aria-valuemax': 100,\n 'aria-valuenow': 0,\n },\n attributes,\n ),\n );\n\n this.elements.inputs[type] = input;\n\n // Set the fill for webkit now\n controls.updateRangeFill.call(this, input);\n\n return input;\n },\n\n // Create a <progress>\n createProgress(type, attributes) {\n const progress = createElement(\n 'progress',\n extend(\n getAttributesFromSelector(this.config.selectors.display[type]),\n {\n min: 0,\n max: 100,\n value: 0,\n role: 'presentation',\n 'aria-hidden': true,\n },\n attributes,\n ),\n );\n\n // Create the label inside\n if (type !== 'volume') {\n progress.appendChild(createElement('span', null, '0'));\n\n const suffixKey = {\n played: 'played',\n buffer: 'buffered',\n }[type];\n const suffix = suffixKey ? i18n.get(suffixKey, this.config) : '';\n\n progress.innerText = `% ${suffix.toLowerCase()}`;\n }\n\n this.elements.display[type] = progress;\n\n return progress;\n },\n\n // Create time display\n createTime(type) {\n const attributes = getAttributesFromSelector(this.config.selectors.display[type]);\n\n const container = createElement(\n 'div',\n extend(attributes, {\n class: `plyr__time ${attributes.class}`,\n 'aria-label': i18n.get(type, this.config),\n }),\n '00:00',\n );\n\n // Reference for updates\n this.elements.display[type] = container;\n\n return container;\n },\n\n // Create a settings menu item\n createMenuItem({ value, list, type, title, badge = null, checked = false }) {\n const item = createElement('li');\n\n const label = createElement('label', {\n class: this.config.classNames.control,\n });\n\n const radio = createElement(\n 'input',\n extend(getAttributesFromSelector(this.config.selectors.inputs[type]), {\n type: 'radio',\n name: `plyr-${type}`,\n value,\n checked,\n class: 'plyr__sr-only',\n }),\n );\n\n const faux = createElement('span', { hidden: '' });\n\n label.appendChild(radio);\n label.appendChild(faux);\n label.insertAdjacentHTML('beforeend', title);\n\n if (is.element(badge)) {\n label.appendChild(badge);\n }\n\n item.appendChild(label);\n list.appendChild(item);\n },\n\n // Format a time for display\n formatTime(time = 0, inverted = false) {\n // Bail if the value isn't a number\n if (!is.number(time)) {\n return time;\n }\n\n // Always display hours if duration is over an hour\n const forceHours = getHours(this.duration) > 0;\n\n return formatTime(time, forceHours, inverted);\n },\n\n // Update the displayed time\n updateTimeDisplay(target = null, time = 0, inverted = false) {\n // Bail if there's no element to display or the value isn't a number\n if (!is.element(target) || !is.number(time)) {\n return;\n }\n\n // eslint-disable-next-line no-param-reassign\n target.innerText = controls.formatTime(time, inverted);\n },\n\n // Update volume UI and storage\n updateVolume() {\n if (!this.supported.ui) {\n return;\n }\n\n // Update range\n if (is.element(this.elements.inputs.volume)) {\n controls.setRange.call(this, this.elements.inputs.volume, this.muted ? 0 : this.volume);\n }\n\n // Update mute state\n if (is.element(this.elements.buttons.mute)) {\n this.elements.buttons.mute.pressed = this.muted || this.volume === 0;\n }\n },\n\n // Update seek value and lower fill\n setRange(target, value = 0) {\n if (!is.element(target)) {\n return;\n }\n\n // eslint-disable-next-line\n target.value = value;\n\n // Webkit range fill\n controls.updateRangeFill.call(this, target);\n },\n\n // Update <progress> elements\n updateProgress(event) {\n if (!this.supported.ui || !is.event(event)) {\n return;\n }\n\n let value = 0;\n\n const setProgress = (target, input) => {\n const value = is.number(input) ? input : 0;\n const progress = is.element(target) ? target : this.elements.display.buffer;\n\n // Update value and label\n if (is.element(progress)) {\n progress.value = value;\n\n // Update text label inside\n const label = progress.getElementsByTagName('span')[0];\n if (is.element(label)) {\n label.childNodes[0].nodeValue = value;\n }\n }\n };\n\n if (event) {\n switch (event.type) {\n // Video playing\n case 'timeupdate':\n case 'seeking':\n case 'seeked':\n value = getPercentage(this.currentTime, this.duration);\n\n // Set seek range value only if it's a 'natural' time event\n if (event.type === 'timeupdate') {\n controls.setRange.call(this, this.elements.inputs.seek, value);\n }\n\n break;\n\n // Check buffer status\n case 'playing':\n case 'progress':\n setProgress(this.elements.display.buffer, this.buffered * 100);\n\n break;\n\n default:\n break;\n }\n }\n },\n\n // Webkit polyfill for lower fill range\n updateRangeFill(target) {\n // Get range from event if event passed\n const range = is.event(target) ? target.target : target;\n\n // Needs to be a valid <input type='range'>\n if (!is.element(range) || range.getAttribute('type') !== 'range') {\n return;\n }\n\n // Set aria values for https://github.com/sampotts/plyr/issues/905\n if (matches(range, this.config.selectors.inputs.seek)) {\n range.setAttribute('aria-valuenow', this.currentTime);\n const currentTime = controls.formatTime(this.currentTime);\n const duration = controls.formatTime(this.duration);\n const format = i18n.get('seekLabel', this.config);\n range.setAttribute(\n 'aria-valuetext',\n format.replace('{currentTime}', currentTime).replace('{duration}', duration),\n );\n } else if (matches(range, this.config.selectors.inputs.volume)) {\n const percent = range.value * 100;\n range.setAttribute('aria-valuenow', percent);\n range.setAttribute('aria-valuetext', `${percent}%`);\n } else {\n range.setAttribute('aria-valuenow', range.value);\n }\n\n // WebKit only\n if (!browser.isWebkit) {\n return;\n }\n\n // Set CSS custom property\n range.style.setProperty('--value', `${range.value / range.max * 100}%`);\n },\n\n // Update hover tooltip for seeking\n updateSeekTooltip(event) {\n // Bail if setting not true\n if (\n !this.config.tooltips.seek ||\n !is.element(this.elements.inputs.seek) ||\n !is.element(this.elements.display.seekTooltip) ||\n this.duration === 0\n ) {\n return;\n }\n\n // Calculate percentage\n let percent = 0;\n const clientRect = this.elements.progress.getBoundingClientRect();\n const visible = `${this.config.classNames.tooltip}--visible`;\n\n const toggle = toggle => {\n toggleClass(this.elements.display.seekTooltip, visible, toggle);\n };\n\n // Hide on touch\n if (this.touch) {\n toggle(false);\n return;\n }\n\n // Determine percentage, if already visible\n if (is.event(event)) {\n percent = 100 / clientRect.width * (event.pageX - clientRect.left);\n } else if (hasClass(this.elements.display.seekTooltip, visible)) {\n percent = parseFloat(this.elements.display.seekTooltip.style.left, 10);\n } else {\n return;\n }\n\n // Set bounds\n if (percent < 0) {\n percent = 0;\n } else if (percent > 100) {\n percent = 100;\n }\n\n // Display the time a click would seek to\n controls.updateTimeDisplay.call(this, this.elements.display.seekTooltip, this.duration / 100 * percent);\n\n // Set position\n this.elements.display.seekTooltip.style.left = `${percent}%`;\n\n // Show/hide the tooltip\n // If the event is a moues in/out and percentage is inside bounds\n if (is.event(event) && ['mouseenter', 'mouseleave'].includes(event.type)) {\n toggle(event.type === 'mouseenter');\n }\n },\n\n // Handle time change event\n timeUpdate(event) {\n // Only invert if only one time element is displayed and used for both duration and currentTime\n const invert = !is.element(this.elements.display.duration) && this.config.invertTime;\n\n // Duration\n controls.updateTimeDisplay.call(\n this,\n this.elements.display.currentTime,\n invert ? this.duration - this.currentTime : this.currentTime,\n invert,\n );\n\n // Ignore updates while seeking\n if (event && event.type === 'timeupdate' && this.media.seeking) {\n return;\n }\n\n // Playing progress\n controls.updateProgress.call(this, event);\n },\n\n // Show the duration on metadataloaded or durationchange events\n durationUpdate() {\n // Bail if no UI or durationchange event triggered after playing/seek when invertTime is false\n if (!this.supported.ui || (!this.config.invertTime && this.currentTime)) {\n return;\n }\n\n // Update ARIA values\n if (is.element(this.elements.inputs.seek)) {\n this.elements.inputs.seek.setAttribute('aria-valuemax', this.duration);\n }\n\n // If there's a spot to display duration\n const hasDuration = is.element(this.elements.display.duration);\n\n // If there's only one time display, display duration there\n if (!hasDuration && this.config.displayDuration && this.paused) {\n controls.updateTimeDisplay.call(this, this.elements.display.currentTime, this.duration);\n }\n\n // If there's a duration element, update content\n if (hasDuration) {\n controls.updateTimeDisplay.call(this, this.elements.display.duration, this.duration);\n }\n\n // Update the tooltip (if visible)\n controls.updateSeekTooltip.call(this);\n },\n\n // Hide/show a tab\n toggleTab(setting, toggle) {\n toggleHidden(this.elements.settings.tabs[setting], !toggle);\n },\n\n // Set the quality menu\n setQualityMenu(options) {\n // Menu required\n if (!is.element(this.elements.settings.panes.quality)) {\n return;\n }\n\n const type = 'quality';\n const list = this.elements.settings.panes.quality.querySelector('ul');\n\n // Set options if passed and filter based on uniqueness and config\n if (is.array(options)) {\n this.options.quality = dedupe(options).filter(quality => this.config.quality.options.includes(quality));\n }\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.options.quality) && this.options.quality.length > 1;\n controls.toggleTab.call(this, type, toggle);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If we're hiding, nothing more to do\n if (!toggle) {\n return;\n }\n\n // Empty the menu\n emptyElement(list);\n\n // Get the badge HTML for HD, 4K etc\n const getBadge = quality => {\n const label = i18n.get(`qualityBadge.${quality}`, this.config);\n\n if (!label.length) {\n return null;\n }\n\n return controls.createBadge.call(this, label);\n };\n\n // Sort options by the config and then render options\n this.options.quality\n .sort((a, b) => {\n const sorting = this.config.quality.options;\n return sorting.indexOf(a) > sorting.indexOf(b) ? 1 : -1;\n })\n .forEach(quality => {\n controls.createMenuItem.call(this, {\n value: quality,\n list,\n type,\n title: controls.getLabel.call(this, 'quality', quality),\n badge: getBadge(quality),\n });\n });\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Translate a value into a nice label\n getLabel(setting, value) {\n switch (setting) {\n case 'speed':\n return value === 1 ? i18n.get('normal', this.config) : `${value}&times;`;\n\n case 'quality':\n if (is.number(value)) {\n const label = i18n.get(`qualityLabel.${value}`, this.config);\n\n if (!label.length) {\n return `${value}p`;\n }\n\n return label;\n }\n\n return toTitleCase(value);\n\n case 'captions':\n return captions.getLabel.call(this);\n\n default:\n return null;\n }\n },\n\n // Update the selected setting\n updateSetting(setting, container, input) {\n const pane = this.elements.settings.panes[setting];\n let value = null;\n let list = container;\n\n if (setting === 'captions') {\n value = this.currentTrack;\n } else {\n value = !is.empty(input) ? input : this[setting];\n\n // Get default\n if (is.empty(value)) {\n value = this.config[setting].default;\n }\n\n // Unsupported value\n if (!is.empty(this.options[setting]) && !this.options[setting].includes(value)) {\n this.debug.warn(`Unsupported value of '${value}' for ${setting}`);\n return;\n }\n\n // Disabled value\n if (!this.config[setting].options.includes(value)) {\n this.debug.warn(`Disabled value of '${value}' for ${setting}`);\n return;\n }\n }\n\n // Get the list if we need to\n if (!is.element(list)) {\n list = pane && pane.querySelector('ul');\n }\n\n // If there's no list it means it's not been rendered...\n if (!is.element(list)) {\n return;\n }\n\n // Update the label\n const label = this.elements.settings.tabs[setting].querySelector(`.${this.config.classNames.menu.value}`);\n label.innerHTML = controls.getLabel.call(this, setting, value);\n\n // Find the radio option and check it\n const target = list && list.querySelector(`input[value=\"${value}\"]`);\n\n if (is.element(target)) {\n target.checked = true;\n }\n },\n\n // Set the looping options\n /* setLoopMenu() {\n // Menu required\n if (!is.element(this.elements.settings.panes.loop)) {\n return;\n }\n\n const options = ['start', 'end', 'all', 'reset'];\n const list = this.elements.settings.panes.loop.querySelector('ul');\n\n // Show the pane and tab\n toggleHidden(this.elements.settings.tabs.loop, false);\n toggleHidden(this.elements.settings.panes.loop, false);\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.loop.options);\n controls.toggleTab.call(this, 'loop', toggle);\n\n // Empty the menu\n emptyElement(list);\n\n options.forEach(option => {\n const item = createElement('li');\n\n const button = createElement(\n 'button',\n extend(getAttributesFromSelector(this.config.selectors.buttons.loop), {\n type: 'button',\n class: this.config.classNames.control,\n 'data-plyr-loop-action': option,\n }),\n i18n.get(option, this.config)\n );\n\n if (['start', 'end'].includes(option)) {\n const badge = controls.createBadge.call(this, '00:00');\n button.appendChild(badge);\n }\n\n item.appendChild(button);\n list.appendChild(item);\n });\n }, */\n\n // Get current selected caption language\n // TODO: rework this to user the getter in the API?\n\n // Set a list of available captions languages\n setCaptionsMenu() {\n // TODO: Captions or language? Currently it's mixed\n const type = 'captions';\n const list = this.elements.settings.panes.captions.querySelector('ul');\n const tracks = captions.getTracks.call(this);\n\n // Toggle the pane and tab\n controls.toggleTab.call(this, type, tracks.length);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If there's no captions, bail\n if (!tracks.length) {\n return;\n }\n\n // Generate options data\n const options = tracks.map((track, value) => ({\n value,\n checked: this.captions.toggled && this.currentTrack === value,\n title: captions.getLabel.call(this, track),\n badge: track.language && controls.createBadge.call(this, track.language.toUpperCase()),\n list,\n type: 'language',\n }));\n\n // Add the \"Disabled\" option to turn off captions\n options.unshift({\n value: -1,\n checked: !this.captions.toggled,\n title: i18n.get('disabled', this.config),\n list,\n type: 'language',\n });\n\n // Generate options\n options.forEach(controls.createMenuItem.bind(this));\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Set a list of available captions languages\n setSpeedMenu(options) {\n // Do nothing if not selected\n if (!this.config.controls.includes('settings') || !this.config.settings.includes('speed')) {\n return;\n }\n\n // Menu required\n if (!is.element(this.elements.settings.panes.speed)) {\n return;\n }\n\n const type = 'speed';\n\n // Set the speed options\n if (is.array(options)) {\n this.options.speed = options;\n } else if (this.isHTML5 || this.isVimeo) {\n this.options.speed = [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2];\n }\n\n // Set options if passed and filter based on config\n this.options.speed = this.options.speed.filter(speed => this.config.speed.options.includes(speed));\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.options.speed) && this.options.speed.length > 1;\n controls.toggleTab.call(this, type, toggle);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If we're hiding, nothing more to do\n if (!toggle) {\n return;\n }\n\n // Get the list to populate\n const list = this.elements.settings.panes.speed.querySelector('ul');\n\n // Empty the menu\n emptyElement(list);\n\n // Create items\n this.options.speed.forEach(speed => {\n controls.createMenuItem.call(this, {\n value: speed,\n list,\n type,\n title: controls.getLabel.call(this, 'speed', speed),\n });\n });\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Check if we need to hide/show the settings menu\n checkMenu() {\n const { tabs } = this.elements.settings;\n const visible = !is.empty(tabs) && Object.values(tabs).some(tab => !tab.hidden);\n\n toggleHidden(this.elements.settings.menu, !visible);\n },\n\n // Show/hide menu\n toggleMenu(event) {\n const { form } = this.elements.settings;\n const button = this.elements.buttons.settings;\n\n // Menu and button are required\n if (!is.element(form) || !is.element(button)) {\n return;\n }\n\n const show = is.boolean(event) ? event : is.element(form) && form.hasAttribute('hidden');\n\n if (is.event(event)) {\n const isMenuItem = is.element(form) && form.contains(event.target);\n const isButton = event.target === this.elements.buttons.settings;\n\n // If the click was inside the form or if the click\n // wasn't the button or menu item and we're trying to\n // show the menu (a doc click shouldn't show the menu)\n if (isMenuItem || (!isMenuItem && !isButton && show)) {\n return;\n }\n\n // Prevent the toggle being caught by the doc listener\n if (isButton) {\n event.stopPropagation();\n }\n }\n\n // Set form and button attributes\n if (is.element(button)) {\n button.setAttribute('aria-expanded', show);\n }\n\n if (is.element(form)) {\n toggleHidden(form, !show);\n toggleClass(this.elements.container, this.config.classNames.menu.open, show);\n\n if (show) {\n form.removeAttribute('tabindex');\n } else {\n form.setAttribute('tabindex', -1);\n }\n }\n },\n\n // Get the natural size of a tab\n getTabSize(tab) {\n const clone = tab.cloneNode(true);\n clone.style.position = 'absolute';\n clone.style.opacity = 0;\n clone.removeAttribute('hidden');\n\n // Prevent input's being unchecked due to the name being identical\n Array.from(clone.querySelectorAll('input[name]')).forEach(input => {\n const name = input.getAttribute('name');\n input.setAttribute('name', `${name}-clone`);\n });\n\n // Append to parent so we get the \"real\" size\n tab.parentNode.appendChild(clone);\n\n // Get the sizes before we remove\n const width = clone.scrollWidth;\n const height = clone.scrollHeight;\n\n // Remove from the DOM\n removeElement(clone);\n\n return {\n width,\n height,\n };\n },\n\n // Toggle Menu\n showTab(target = '') {\n const { menu } = this.elements.settings;\n const pane = document.getElementById(target);\n\n // Nothing to show, bail\n if (!is.element(pane)) {\n return;\n }\n\n // Are we targeting a tab? If not, bail\n const isTab = pane.getAttribute('role') === 'tabpanel';\n if (!isTab) {\n return;\n }\n\n // Hide all other tabs\n // Get other tabs\n const current = menu.querySelector('[role=\"tabpanel\"]:not([hidden])');\n const container = current.parentNode;\n\n // Set other toggles to be expanded false\n Array.from(menu.querySelectorAll(`[aria-controls=\"${current.getAttribute('id')}\"]`)).forEach(toggle => {\n toggle.setAttribute('aria-expanded', false);\n });\n\n // If we can do fancy animations, we'll animate the height/width\n if (support.transitions && !support.reducedMotion) {\n // Set the current width as a base\n container.style.width = `${current.scrollWidth}px`;\n container.style.height = `${current.scrollHeight}px`;\n\n // Get potential sizes\n const size = controls.getTabSize.call(this, pane);\n\n // Restore auto height/width\n const restore = e => {\n // We're only bothered about height and width on the container\n if (e.target !== container || !['width', 'height'].includes(e.propertyName)) {\n return;\n }\n\n // Revert back to auto\n container.style.width = '';\n container.style.height = '';\n\n // Only listen once\n off.call(this, container, transitionEndEvent, restore);\n };\n\n // Listen for the transition finishing and restore auto height/width\n on.call(this, container, transitionEndEvent, restore);\n\n // Set dimensions to target\n container.style.width = `${size.width}px`;\n container.style.height = `${size.height}px`;\n }\n\n // Set attributes on current tab\n toggleHidden(current, true);\n current.setAttribute('tabindex', -1);\n\n // Set attributes on target\n toggleHidden(pane, false);\n\n const tabs = getElements.call(this, `[aria-controls=\"${target}\"]`);\n Array.from(tabs).forEach(tab => {\n tab.setAttribute('aria-expanded', true);\n });\n pane.removeAttribute('tabindex');\n\n // Focus the first item\n pane.querySelectorAll('button:not(:disabled), input:not(:disabled), [tabindex]')[0].focus();\n },\n\n // Build the default HTML\n // TODO: Set order based on order in the config.controls array?\n create(data) {\n // Do nothing if we want no controls\n if (is.empty(this.config.controls)) {\n return null;\n }\n\n // Create the container\n const container = createElement('div', getAttributesFromSelector(this.config.selectors.controls.wrapper));\n\n // Restart button\n if (this.config.controls.includes('restart')) {\n container.appendChild(controls.createButton.call(this, 'restart'));\n }\n\n // Rewind button\n if (this.config.controls.includes('rewind')) {\n container.appendChild(controls.createButton.call(this, 'rewind'));\n }\n\n // Play/Pause button\n if (this.config.controls.includes('play')) {\n container.appendChild(controls.createButton.call(this, 'play'));\n }\n\n // Fast forward button\n if (this.config.controls.includes('fast-forward')) {\n container.appendChild(controls.createButton.call(this, 'fast-forward'));\n }\n\n // Progress\n if (this.config.controls.includes('progress')) {\n const progress = createElement('div', getAttributesFromSelector(this.config.selectors.progress));\n\n // Seek range slider\n progress.appendChild(\n controls.createRange.call(this, 'seek', {\n id: `plyr-seek-${data.id}`,\n }),\n );\n\n // Buffer progress\n progress.appendChild(controls.createProgress.call(this, 'buffer'));\n\n // TODO: Add loop display indicator\n\n // Seek tooltip\n if (this.config.tooltips.seek) {\n const tooltip = createElement(\n 'span',\n {\n class: this.config.classNames.tooltip,\n },\n '00:00',\n );\n\n progress.appendChild(tooltip);\n this.elements.display.seekTooltip = tooltip;\n }\n\n this.elements.progress = progress;\n container.appendChild(this.elements.progress);\n }\n\n // Media current time display\n if (this.config.controls.includes('current-time')) {\n container.appendChild(controls.createTime.call(this, 'currentTime'));\n }\n\n // Media duration display\n if (this.config.controls.includes('duration')) {\n container.appendChild(controls.createTime.call(this, 'duration'));\n }\n\n // Toggle mute button\n if (this.config.controls.includes('mute')) {\n container.appendChild(controls.createButton.call(this, 'mute'));\n }\n\n // Volume range control\n if (this.config.controls.includes('volume')) {\n const volume = createElement('div', {\n class: 'plyr__volume',\n });\n\n // Set the attributes\n const attributes = {\n max: 1,\n step: 0.05,\n value: this.config.volume,\n };\n\n // Create the volume range slider\n volume.appendChild(\n controls.createRange.call(\n this,\n 'volume',\n extend(attributes, {\n id: `plyr-volume-${data.id}`,\n }),\n ),\n );\n\n this.elements.volume = volume;\n\n container.appendChild(volume);\n }\n\n // Toggle captions button\n if (this.config.controls.includes('captions')) {\n container.appendChild(controls.createButton.call(this, 'captions'));\n }\n\n // Settings button / menu\n if (this.config.controls.includes('settings') && !is.empty(this.config.settings)) {\n const menu = createElement('div', {\n class: 'plyr__menu',\n hidden: '',\n });\n\n menu.appendChild(\n controls.createButton.call(this, 'settings', {\n id: `plyr-settings-toggle-${data.id}`,\n 'aria-haspopup': true,\n 'aria-controls': `plyr-settings-${data.id}`,\n 'aria-expanded': false,\n }),\n );\n\n const form = createElement('form', {\n class: 'plyr__menu__container',\n id: `plyr-settings-${data.id}`,\n hidden: '',\n 'aria-labelled-by': `plyr-settings-toggle-${data.id}`,\n role: 'tablist',\n tabindex: -1,\n });\n\n const inner = createElement('div');\n\n const home = createElement('div', {\n id: `plyr-settings-${data.id}-home`,\n 'aria-labelled-by': `plyr-settings-toggle-${data.id}`,\n role: 'tabpanel',\n });\n\n // Create the tab list\n const tabs = createElement('ul', {\n role: 'tablist',\n });\n\n // Build the tabs\n this.config.settings.forEach(type => {\n const tab = createElement('li', {\n role: 'tab',\n hidden: '',\n });\n\n const button = createElement(\n 'button',\n extend(getAttributesFromSelector(this.config.selectors.buttons.settings), {\n type: 'button',\n class: `${this.config.classNames.control} ${this.config.classNames.control}--forward`,\n id: `plyr-settings-${data.id}-${type}-tab`,\n 'aria-haspopup': true,\n 'aria-controls': `plyr-settings-${data.id}-${type}`,\n 'aria-expanded': false,\n }),\n i18n.get(type, this.config),\n );\n\n const value = createElement('span', {\n class: this.config.classNames.menu.value,\n });\n\n // Speed contains HTML entities\n value.innerHTML = data[type];\n\n button.appendChild(value);\n tab.appendChild(button);\n tabs.appendChild(tab);\n\n this.elements.settings.tabs[type] = tab;\n });\n\n home.appendChild(tabs);\n inner.appendChild(home);\n\n // Build the panes\n this.config.settings.forEach(type => {\n const pane = createElement('div', {\n id: `plyr-settings-${data.id}-${type}`,\n hidden: '',\n 'aria-labelled-by': `plyr-settings-${data.id}-${type}-tab`,\n role: 'tabpanel',\n tabindex: -1,\n });\n\n const back = createElement(\n 'button',\n {\n type: 'button',\n class: `${this.config.classNames.control} ${this.config.classNames.control}--back`,\n 'aria-haspopup': true,\n 'aria-controls': `plyr-settings-${data.id}-home`,\n 'aria-expanded': false,\n },\n i18n.get(type, this.config),\n );\n\n pane.appendChild(back);\n\n const options = createElement('ul');\n\n pane.appendChild(options);\n inner.appendChild(pane);\n\n this.elements.settings.panes[type] = pane;\n });\n\n form.appendChild(inner);\n menu.appendChild(form);\n container.appendChild(menu);\n\n this.elements.settings.form = form;\n this.elements.settings.menu = menu;\n }\n\n // Picture in picture button\n if (this.config.controls.includes('pip') && support.pip) {\n container.appendChild(controls.createButton.call(this, 'pip'));\n }\n\n // Airplay button\n if (this.config.controls.includes('airplay') && support.airplay) {\n container.appendChild(controls.createButton.call(this, 'airplay'));\n }\n\n // Toggle fullscreen button\n if (this.config.controls.includes('fullscreen')) {\n container.appendChild(controls.createButton.call(this, 'fullscreen'));\n }\n\n // Larger overlaid play button\n if (this.config.controls.includes('play-large')) {\n this.elements.container.appendChild(controls.createButton.call(this, 'play-large'));\n }\n\n this.elements.controls = container;\n\n if (this.isHTML5) {\n controls.setQualityMenu.call(this, html5.getQualityOptions.call(this));\n }\n\n controls.setSpeedMenu.call(this);\n\n return container;\n },\n\n // Insert controls\n inject() {\n // Sprite\n if (this.config.loadSprite) {\n const icon = controls.getIconUrl.call(this);\n\n // Only load external sprite using AJAX\n if (icon.cors) {\n loadSprite(icon.url, 'sprite-plyr');\n }\n }\n\n // Create a unique ID\n this.id = Math.floor(Math.random() * 10000);\n\n // Null by default\n let container = null;\n this.elements.controls = null;\n\n // Set template properties\n const props = {\n id: this.id,\n seektime: this.config.seekTime,\n title: this.config.title,\n };\n let update = true;\n\n if (is.string(this.config.controls) || is.element(this.config.controls)) {\n // String or HTMLElement passed as the option\n container = this.config.controls;\n } else if (is.function(this.config.controls)) {\n // A custom function to build controls\n // The function can return a HTMLElement or String\n container = this.config.controls.call(this, props);\n } else {\n // Create controls\n container = controls.create.call(this, {\n id: this.id,\n seektime: this.config.seekTime,\n speed: this.speed,\n quality: this.quality,\n captions: captions.getLabel.call(this),\n // TODO: Looping\n // loop: 'None',\n });\n update = false;\n }\n\n // Replace props with their value\n const replace = input => {\n let result = input;\n\n Object.entries(props).forEach(([key, value]) => {\n result = replaceAll(result, `{${key}}`, value);\n });\n\n return result;\n };\n\n // Update markup\n if (update) {\n if (is.string(this.config.controls)) {\n container = replace(container);\n } else if (is.element(container)) {\n container.innerHTML = replace(container.innerHTML);\n }\n }\n\n // Controls container\n let target;\n\n // Inject to custom location\n if (is.string(this.config.selectors.controls.container)) {\n target = document.querySelector(this.config.selectors.controls.container);\n }\n\n // Inject into the container by default\n if (!is.element(target)) {\n target = this.elements.container;\n }\n\n // Inject controls HTML\n if (is.element(container)) {\n target.appendChild(container);\n } else if (container) {\n target.insertAdjacentHTML('beforeend', container);\n }\n\n // Find the elements if need be\n if (!is.element(this.elements.controls)) {\n controls.findElements.call(this);\n }\n\n // Edge sometimes doesn't finish the paint so force a redraw\n if (window.navigator.userAgent.includes('Edge')) {\n repaint(target);\n }\n\n // Setup tooltips\n if (this.config.tooltips.controls) {\n const { classNames, selectors } = this.config;\n const selector = `${selectors.controls.wrapper} ${selectors.labels} .${classNames.hidden}`;\n const labels = getElements.call(this, selector);\n\n Array.from(labels).forEach(label => {\n toggleClass(label, this.config.classNames.hidden, false);\n toggleClass(label, this.config.classNames.tooltip, true);\n });\n }\n },\n};\n\nexport default controls;\n","// ==========================================================================\n// Fetch wrapper\n// Using XHR to avoid issues with older browsers\n// ==========================================================================\n\nexport default function fetch(url, responseType = 'text') {\n return new Promise((resolve, reject) => {\n try {\n const request = new XMLHttpRequest();\n\n // Check for CORS support\n if (!('withCredentials' in request)) {\n return;\n }\n\n request.addEventListener('load', () => {\n if (responseType === 'text') {\n try {\n resolve(JSON.parse(request.responseText));\n } catch (e) {\n resolve(request.responseText);\n }\n } else {\n resolve(request.response);\n }\n });\n\n request.addEventListener('error', () => {\n throw new Error(request.statusText);\n });\n\n request.open('GET', url, true);\n\n // Set the required response type\n request.responseType = responseType;\n\n request.send();\n } catch (e) {\n reject(e);\n }\n });\n}\n","// ==========================================================================\n// URL utils\n// ==========================================================================\n\nimport is from './is';\n\n/**\n * Parse a string to a URL object\n * @param {string} input - the URL to be parsed\n * @param {boolean} safe - failsafe parsing\n */\nexport function parseUrl(input, safe = true) {\n let url = input;\n\n if (safe) {\n const parser = document.createElement('a');\n parser.href = url;\n url = parser.href;\n }\n\n try {\n return new URL(url);\n } catch (e) {\n return null;\n }\n}\n\n// Convert object to URLSearchParams\nexport function buildUrlParams(input) {\n const params = new URLSearchParams();\n\n if (is.object(input)) {\n Object.entries(input).forEach(([key, value]) => {\n params.set(key, value);\n });\n }\n\n return params;\n}\n","// ==========================================================================\n// Plyr Captions\n// TODO: Create as class\n// ==========================================================================\n\nimport controls from './controls';\nimport i18n from './i18n';\nimport support from './support';\nimport { dedupe } from './utils/arrays';\nimport browser from './utils/browser';\nimport {\n createElement,\n emptyElement,\n getAttributesFromSelector,\n insertAfter,\n removeElement,\n toggleClass,\n} from './utils/elements';\nimport { on, triggerEvent } from './utils/events';\nimport fetch from './utils/fetch';\nimport is from './utils/is';\nimport { getHTML } from './utils/strings';\nimport { parseUrl } from './utils/urls';\n\nconst captions = {\n // Setup captions\n setup() {\n // Requires UI support\n if (!this.supported.ui) {\n return;\n }\n\n // Only Vimeo and HTML5 video supported at this point\n if (!this.isVideo || this.isYouTube || (this.isHTML5 && !support.textTracks)) {\n // Clear menu and hide\n if (\n is.array(this.config.controls) &&\n this.config.controls.includes('settings') &&\n this.config.settings.includes('captions')\n ) {\n controls.setCaptionsMenu.call(this);\n }\n\n return;\n }\n\n // Inject the container\n if (!is.element(this.elements.captions)) {\n this.elements.captions = createElement('div', getAttributesFromSelector(this.config.selectors.captions));\n\n insertAfter(this.elements.captions, this.elements.wrapper);\n }\n\n // Fix IE captions if CORS is used\n // Fetch captions and inject as blobs instead (data URIs not supported!)\n if (browser.isIE && window.URL) {\n const elements = this.media.querySelectorAll('track');\n\n Array.from(elements).forEach(track => {\n const src = track.getAttribute('src');\n const url = parseUrl(src);\n\n if (\n url !== null &&\n url.hostname !== window.location.href.hostname &&\n ['http:', 'https:'].includes(url.protocol)\n ) {\n fetch(src, 'blob')\n .then(blob => {\n track.setAttribute('src', window.URL.createObjectURL(blob));\n })\n .catch(() => {\n removeElement(track);\n });\n }\n });\n }\n\n // Get and set initial data\n // The \"preferred\" options are not realized unless / until the wanted language has a match\n // * languages: Array of user's browser languages.\n // * language: The language preferred by user settings or config\n // * active: The state preferred by user settings or config\n // * toggled: The real captions state\n\n const languages = dedupe(\n Array.from(navigator.languages || navigator.userLanguage).map(language => language.split('-')[0]),\n );\n\n let language = (this.storage.get('language') || this.config.captions.language || 'auto').toLowerCase();\n\n // Use first browser language when language is 'auto'\n if (language === 'auto') {\n [language] = languages;\n }\n\n let active = this.storage.get('captions');\n if (!is.boolean(active)) {\n ({ active } = this.config.captions);\n }\n\n Object.assign(this.captions, {\n toggled: false,\n active,\n language,\n languages,\n });\n\n // Watch changes to textTracks and update captions menu\n if (this.isHTML5) {\n const trackEvents = this.config.captions.update ? 'addtrack removetrack' : 'removetrack';\n on.call(this, this.media.textTracks, trackEvents, captions.update.bind(this));\n }\n\n // Update available languages in list next tick (the event must not be triggered before the listeners)\n setTimeout(captions.update.bind(this), 0);\n },\n\n // Update available language options in settings based on tracks\n update() {\n const tracks = captions.getTracks.call(this, true);\n // Get the wanted language\n const { active, language, meta, currentTrackNode } = this.captions;\n const languageExists = Boolean(tracks.find(track => track.language === language));\n\n // Handle tracks (add event listener and \"pseudo\"-default)\n if (this.isHTML5 && this.isVideo) {\n tracks.filter(track => !meta.get(track)).forEach(track => {\n this.debug.log('Track added', track);\n // Attempt to store if the original dom element was \"default\"\n meta.set(track, {\n default: track.mode === 'showing',\n });\n\n // Turn off native caption rendering to avoid double captions\n track.mode = 'hidden';\n\n // Add event listener for cue changes\n on.call(this, track, 'cuechange', () => captions.updateCues.call(this));\n });\n }\n\n // Update language first time it matches, or if the previous matching track was removed\n if ((languageExists && this.language !== language) || !tracks.includes(currentTrackNode)) {\n captions.setLanguage.call(this, language);\n captions.toggle.call(this, active && languageExists);\n }\n\n // Enable or disable captions based on track length\n toggleClass(this.elements.container, this.config.classNames.captions.enabled, !is.empty(tracks));\n\n // Update available languages in list\n if ((this.config.controls || []).includes('settings') && this.config.settings.includes('captions')) {\n controls.setCaptionsMenu.call(this);\n }\n },\n\n // Toggle captions display\n // Used internally for the toggleCaptions method, with the passive option forced to false\n toggle(input, passive = true) {\n // If there's no full support\n if (!this.supported.ui) {\n return;\n }\n\n const { toggled } = this.captions; // Current state\n const activeClass = this.config.classNames.captions.active;\n\n // Get the next state\n // If the method is called without parameter, toggle based on current value\n const active = is.nullOrUndefined(input) ? !toggled : input;\n\n // Update state and trigger event\n if (active !== toggled) {\n // When passive, don't override user preferences\n if (!passive) {\n this.captions.active = active;\n this.storage.set({ captions: active });\n }\n\n // Force language if the call isn't passive and there is no matching language to toggle to\n if (!this.language && active && !passive) {\n const tracks = captions.getTracks.call(this);\n const track = captions.findTrack.call(this, [this.captions.language, ...this.captions.languages], true);\n\n // Override user preferences to avoid switching languages if a matching track is added\n this.captions.language = track.language;\n\n // Set caption, but don't store in localStorage as user preference\n captions.set.call(this, tracks.indexOf(track));\n return;\n }\n\n // Toggle state\n this.elements.buttons.captions.pressed = active;\n\n // Add class hook\n toggleClass(this.elements.container, activeClass, active);\n\n this.captions.toggled = active;\n\n // Update settings menu\n controls.updateSetting.call(this, 'captions');\n\n // Trigger event (not used internally)\n triggerEvent.call(this, this.media, active ? 'captionsenabled' : 'captionsdisabled');\n }\n },\n\n // Set captions by track index\n // Used internally for the currentTrack setter with the passive option forced to false\n set(index, passive = true) {\n const tracks = captions.getTracks.call(this);\n\n // Disable captions if setting to -1\n if (index === -1) {\n captions.toggle.call(this, false, passive);\n return;\n }\n\n if (!is.number(index)) {\n this.debug.warn('Invalid caption argument', index);\n return;\n }\n\n if (!(index in tracks)) {\n this.debug.warn('Track not found', index);\n return;\n }\n\n if (this.captions.currentTrack !== index) {\n this.captions.currentTrack = index;\n const track = tracks[index];\n const { language } = track || {};\n\n // Store reference to node for invalidation on remove\n this.captions.currentTrackNode = track;\n\n // Update settings menu\n controls.updateSetting.call(this, 'captions');\n\n // When passive, don't override user preferences\n if (!passive) {\n this.captions.language = language;\n this.storage.set({ language });\n }\n\n // Handle Vimeo captions\n if (this.isVimeo) {\n this.embed.enableTextTrack(language);\n }\n\n // Trigger event\n triggerEvent.call(this, this.media, 'languagechange');\n }\n\n // Show captions\n captions.toggle.call(this, true, passive);\n\n if (this.isHTML5 && this.isVideo) {\n // If we change the active track while a cue is already displayed we need to update it\n captions.updateCues.call(this);\n }\n },\n\n // Set captions by language\n // Used internally for the language setter with the passive option forced to false\n setLanguage(input, passive = true) {\n if (!is.string(input)) {\n this.debug.warn('Invalid language argument', input);\n return;\n }\n // Normalize\n const language = input.toLowerCase();\n this.captions.language = language;\n\n // Set currentTrack\n const tracks = captions.getTracks.call(this);\n const track = captions.findTrack.call(this, [language]);\n captions.set.call(this, tracks.indexOf(track), passive);\n },\n\n // Get current valid caption tracks\n // If update is false it will also ignore tracks without metadata\n // This is used to \"freeze\" the language options when captions.update is false\n getTracks(update = false) {\n // Handle media or textTracks missing or null\n const tracks = Array.from((this.media || {}).textTracks || []);\n // For HTML5, use cache instead of current tracks when it exists (if captions.update is false)\n // Filter out removed tracks and tracks that aren't captions/subtitles (for example metadata)\n return tracks\n .filter(track => !this.isHTML5 || update || this.captions.meta.has(track))\n .filter(track => ['captions', 'subtitles'].includes(track.kind));\n },\n\n // Match tracks based on languages and get the first\n findTrack(languages, force = false) {\n const tracks = captions.getTracks.call(this);\n const sortIsDefault = track => Number((this.captions.meta.get(track) || {}).default);\n const sorted = Array.from(tracks).sort((a, b) => sortIsDefault(b) - sortIsDefault(a));\n let track;\n languages.every(language => {\n track = sorted.find(track => track.language === language);\n return !track; // Break iteration if there is a match\n });\n // If no match is found but is required, get first\n return track || (force ? sorted[0] : undefined);\n },\n\n // Get the current track\n getCurrentTrack() {\n return captions.getTracks.call(this)[this.currentTrack];\n },\n\n // Get UI label for track\n getLabel(track) {\n let currentTrack = track;\n\n if (!is.track(currentTrack) && support.textTracks && this.captions.toggled) {\n currentTrack = captions.getCurrentTrack.call(this);\n }\n\n if (is.track(currentTrack)) {\n if (!is.empty(currentTrack.label)) {\n return currentTrack.label;\n }\n\n if (!is.empty(currentTrack.language)) {\n return track.language.toUpperCase();\n }\n\n return i18n.get('enabled', this.config);\n }\n\n return i18n.get('disabled', this.config);\n },\n\n // Update captions using current track's active cues\n // Also optional array argument in case there isn't any track (ex: vimeo)\n updateCues(input) {\n // Requires UI\n if (!this.supported.ui) {\n return;\n }\n\n if (!is.element(this.elements.captions)) {\n this.debug.warn('No captions element to render to');\n return;\n }\n\n // Only accept array or empty input\n if (!is.nullOrUndefined(input) && !Array.isArray(input)) {\n this.debug.warn('updateCues: Invalid input', input);\n return;\n }\n\n let cues = input;\n\n // Get cues from track\n if (!cues) {\n const track = captions.getCurrentTrack.call(this);\n cues = Array.from((track || {}).activeCues || [])\n .map(cue => cue.getCueAsHTML())\n .map(getHTML);\n }\n\n // Set new caption text\n const content = cues.map(cueText => cueText.trim()).join('\\n');\n const changed = content !== this.elements.captions.innerHTML;\n\n if (changed) {\n // Empty the container and create a new child element\n emptyElement(this.elements.captions);\n const caption = createElement('span', getAttributesFromSelector(this.config.selectors.caption));\n caption.innerHTML = content;\n this.elements.captions.appendChild(caption);\n\n // Trigger event\n triggerEvent.call(this, this.media, 'cuechange');\n }\n },\n};\n\nexport default captions;\n","// ==========================================================================\n// Plyr default config\n// ==========================================================================\n\nconst defaults = {\n // Disable\n enabled: true,\n\n // Custom media title\n title: '',\n\n // Logging to console\n debug: false,\n\n // Auto play (if supported)\n autoplay: false,\n\n // Only allow one media playing at once (vimeo only)\n autopause: true,\n\n // Allow inline playback on iOS (this effects YouTube/Vimeo - HTML5 requires the attribute present)\n // TODO: Remove iosNative fullscreen option in favour of this (logic needs work)\n playsinline: true,\n\n // Default time to skip when rewind/fast forward\n seekTime: 10,\n\n // Default volume\n volume: 1,\n muted: false,\n\n // Pass a custom duration\n duration: null,\n\n // Display the media duration on load in the current time position\n // If you have opted to display both duration and currentTime, this is ignored\n displayDuration: true,\n\n // Invert the current time to be a countdown\n invertTime: true,\n\n // Clicking the currentTime inverts it's value to show time left rather than elapsed\n toggleInvert: true,\n\n // Aspect ratio (for embeds)\n ratio: '16:9',\n\n // Click video container to play/pause\n clickToPlay: true,\n\n // Auto hide the controls\n hideControls: true,\n\n // Reset to start when playback ended\n resetOnEnd: false,\n\n // Disable the standard context menu\n disableContextMenu: true,\n\n // Sprite (for icons)\n loadSprite: true,\n iconPrefix: 'plyr',\n iconUrl: 'https://cdn.plyr.io/3.3.12/plyr.svg',\n\n // Blank video (used to prevent errors on source change)\n blankVideo: 'https://cdn.plyr.io/static/blank.mp4',\n\n // Quality default\n quality: {\n default: 576,\n options: [\n 4320,\n 2880,\n 2160,\n 1440,\n 1080,\n 720,\n 576,\n 480,\n 360,\n 240,\n 'default', // YouTube's \"auto\"\n ],\n },\n\n // Set loops\n loop: {\n active: false,\n // start: null,\n // end: null,\n },\n\n // Speed default and options to display\n speed: {\n selected: 1,\n options: [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2],\n },\n\n // Keyboard shortcut settings\n keyboard: {\n focused: true,\n global: false,\n },\n\n // Display tooltips\n tooltips: {\n controls: false,\n seek: true,\n },\n\n // Captions settings\n captions: {\n active: false,\n language: 'auto',\n // Listen to new tracks added after Plyr is initialized.\n // This is needed for streaming captions, but may result in unselectable options\n update: false,\n },\n\n // Fullscreen settings\n fullscreen: {\n enabled: true, // Allow fullscreen?\n fallback: true, // Fallback for vintage browsers\n iosNative: false, // Use the native fullscreen in iOS (disables custom controls)\n },\n\n // Local storage\n storage: {\n enabled: true,\n key: 'plyr',\n },\n\n // Default controls\n controls: [\n 'play-large',\n // 'restart',\n // 'rewind',\n 'play',\n // 'fast-forward',\n 'progress',\n 'current-time',\n 'mute',\n 'volume',\n 'captions',\n 'settings',\n 'pip',\n 'airplay',\n 'fullscreen',\n ],\n settings: ['captions', 'quality', 'speed'],\n\n // Localisation\n i18n: {\n restart: 'Restart',\n rewind: 'Rewind {seektime}s',\n play: 'Play',\n pause: 'Pause',\n fastForward: 'Forward {seektime}s',\n seek: 'Seek',\n seekLabel: '{currentTime} of {duration}',\n played: 'Played',\n buffered: 'Buffered',\n currentTime: 'Current time',\n duration: 'Duration',\n volume: 'Volume',\n mute: 'Mute',\n unmute: 'Unmute',\n enableCaptions: 'Enable captions',\n disableCaptions: 'Disable captions',\n enterFullscreen: 'Enter fullscreen',\n exitFullscreen: 'Exit fullscreen',\n frameTitle: 'Player for {title}',\n captions: 'Captions',\n settings: 'Settings',\n menuBack: 'Go back to previous menu',\n speed: 'Speed',\n normal: 'Normal',\n quality: 'Quality',\n loop: 'Loop',\n start: 'Start',\n end: 'End',\n all: 'All',\n reset: 'Reset',\n disabled: 'Disabled',\n enabled: 'Enabled',\n advertisement: 'Ad',\n qualityBadge: {\n 2160: '4K',\n 1440: 'HD',\n 1080: 'HD',\n 720: 'HD',\n 576: 'SD',\n 480: 'SD',\n },\n },\n\n // URLs\n urls: {\n vimeo: {\n sdk: 'https://player.vimeo.com/api/player.js',\n iframe: 'https://player.vimeo.com/video/{0}?{1}',\n api: 'https://vimeo.com/api/v2/video/{0}.json',\n },\n youtube: {\n sdk: 'https://www.youtube.com/iframe_api',\n api:\n 'https://www.googleapis.com/youtube/v3/videos?id={0}&key={1}&fields=items(snippet(title))&part=snippet',\n },\n googleIMA: {\n sdk: 'https://imasdk.googleapis.com/js/sdkloader/ima3.js',\n },\n },\n\n // Custom control listeners\n listeners: {\n seek: null,\n play: null,\n pause: null,\n restart: null,\n rewind: null,\n fastForward: null,\n mute: null,\n volume: null,\n captions: null,\n fullscreen: null,\n pip: null,\n airplay: null,\n speed: null,\n quality: null,\n loop: null,\n language: null,\n },\n\n // Events to watch and bubble\n events: [\n // Events to watch on HTML5 media elements and bubble\n // https://developer.mozilla.org/en/docs/Web/Guide/Events/Media_events\n 'ended',\n 'progress',\n 'stalled',\n 'playing',\n 'waiting',\n 'canplay',\n 'canplaythrough',\n 'loadstart',\n 'loadeddata',\n 'loadedmetadata',\n 'timeupdate',\n 'volumechange',\n 'play',\n 'pause',\n 'error',\n 'seeking',\n 'seeked',\n 'emptied',\n 'ratechange',\n 'cuechange',\n\n // Custom events\n 'enterfullscreen',\n 'exitfullscreen',\n 'captionsenabled',\n 'captionsdisabled',\n 'languagechange',\n 'controlshidden',\n 'controlsshown',\n 'ready',\n\n // YouTube\n 'statechange',\n 'qualitychange',\n 'qualityrequested',\n\n // Ads\n 'adsloaded',\n 'adscontentpause',\n 'adscontentresume',\n 'adstarted',\n 'adsmidpoint',\n 'adscomplete',\n 'adsallcomplete',\n 'adsimpression',\n 'adsclick',\n ],\n\n // Selectors\n // Change these to match your template if using custom HTML\n selectors: {\n editable: 'input, textarea, select, [contenteditable]',\n container: '.plyr',\n controls: {\n container: null,\n wrapper: '.plyr__controls',\n },\n labels: '[data-plyr]',\n buttons: {\n play: '[data-plyr=\"play\"]',\n pause: '[data-plyr=\"pause\"]',\n restart: '[data-plyr=\"restart\"]',\n rewind: '[data-plyr=\"rewind\"]',\n fastForward: '[data-plyr=\"fast-forward\"]',\n mute: '[data-plyr=\"mute\"]',\n captions: '[data-plyr=\"captions\"]',\n fullscreen: '[data-plyr=\"fullscreen\"]',\n pip: '[data-plyr=\"pip\"]',\n airplay: '[data-plyr=\"airplay\"]',\n settings: '[data-plyr=\"settings\"]',\n loop: '[data-plyr=\"loop\"]',\n },\n inputs: {\n seek: '[data-plyr=\"seek\"]',\n volume: '[data-plyr=\"volume\"]',\n speed: '[data-plyr=\"speed\"]',\n language: '[data-plyr=\"language\"]',\n quality: '[data-plyr=\"quality\"]',\n },\n display: {\n currentTime: '.plyr__time--current',\n duration: '.plyr__time--duration',\n buffer: '.plyr__progress__buffer',\n loop: '.plyr__progress__loop', // Used later\n volume: '.plyr__volume--display',\n },\n progress: '.plyr__progress',\n captions: '.plyr__captions',\n caption: '.plyr__caption',\n menu: {\n quality: '.js-plyr__menu__list--quality',\n },\n },\n\n // Class hooks added to the player in different states\n classNames: {\n type: 'plyr--{0}',\n provider: 'plyr--{0}',\n video: 'plyr__video-wrapper',\n embed: 'plyr__video-embed',\n embedContainer: 'plyr__video-embed__container',\n poster: 'plyr__poster',\n posterEnabled: 'plyr__poster-enabled',\n ads: 'plyr__ads',\n control: 'plyr__control',\n controlPressed: 'plyr__control--pressed',\n playing: 'plyr--playing',\n paused: 'plyr--paused',\n stopped: 'plyr--stopped',\n loading: 'plyr--loading',\n hover: 'plyr--hover',\n tooltip: 'plyr__tooltip',\n cues: 'plyr__cues',\n hidden: 'plyr__sr-only',\n hideControls: 'plyr--hide-controls',\n isIos: 'plyr--is-ios',\n isTouch: 'plyr--is-touch',\n uiSupported: 'plyr--full-ui',\n noTransition: 'plyr--no-transition',\n menu: {\n value: 'plyr__menu__value',\n badge: 'plyr__badge',\n open: 'plyr--menu-open',\n },\n captions: {\n enabled: 'plyr--captions-enabled',\n active: 'plyr--captions-active',\n },\n fullscreen: {\n enabled: 'plyr--fullscreen-enabled',\n fallback: 'plyr--fullscreen-fallback',\n },\n pip: {\n supported: 'plyr--pip-supported',\n active: 'plyr--pip-active',\n },\n airplay: {\n supported: 'plyr--airplay-supported',\n active: 'plyr--airplay-active',\n },\n tabFocus: 'plyr__tab-focus',\n },\n\n // Embed attributes\n attributes: {\n embed: {\n provider: 'data-plyr-provider',\n id: 'data-plyr-embed-id',\n },\n },\n\n // API keys\n keys: {\n google: null,\n },\n\n // Advertisements plugin\n // Register for an account here: http://vi.ai/publisher-video-monetization/?aid=plyrio\n ads: {\n enabled: false,\n publisherId: '',\n },\n};\n\nexport default defaults;\n","// ==========================================================================\n// Plyr supported types and providers\n// ==========================================================================\n\nexport const providers = {\n html5: 'html5',\n youtube: 'youtube',\n vimeo: 'vimeo',\n};\n\nexport const types = {\n audio: 'audio',\n video: 'video',\n};\n\n/**\n * Get provider by URL\n * @param {string} url\n */\nexport function getProviderByUrl(url) {\n // YouTube\n if (/^(https?:\\/\\/)?(www\\.)?(youtube\\.com|youtu\\.?be)\\/.+$/.test(url)) {\n return providers.youtube;\n }\n\n // Vimeo\n if (/^https?:\\/\\/player.vimeo.com\\/video\\/\\d{0,9}(?=\\b|\\/)/.test(url)) {\n return providers.vimeo;\n }\n\n return null;\n}\n\nexport default { providers, types };\n","// ==========================================================================\n// Console wrapper\n// ==========================================================================\n\nconst noop = () => {};\n\nexport default class Console {\n constructor(enabled = false) {\n this.enabled = window.console && enabled;\n\n if (this.enabled) {\n this.log('Debugging enabled');\n }\n }\n\n get log() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.log, console) : noop;\n }\n get warn() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.warn, console) : noop;\n }\n get error() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.error, console) : noop;\n }\n}\n","// ==========================================================================\n// Fullscreen wrapper\n// https://developer.mozilla.org/en-US/docs/Web/API/Fullscreen_API#prefixing\n// ==========================================================================\n\nimport browser from './utils/browser';\nimport { hasClass, toggleClass, trapFocus } from './utils/elements';\nimport { on, triggerEvent } from './utils/events';\nimport is from './utils/is';\n\nfunction onChange() {\n if (!this.enabled) {\n return;\n }\n\n // Update toggle button\n const button = this.player.elements.buttons.fullscreen;\n if (is.element(button)) {\n button.pressed = this.active;\n }\n\n // Trigger an event\n triggerEvent.call(this.player, this.target, this.active ? 'enterfullscreen' : 'exitfullscreen', true);\n\n // Trap focus in container\n if (!browser.isIos) {\n trapFocus.call(this.player, this.target, this.active);\n }\n}\n\nfunction toggleFallback(toggle = false) {\n // Store or restore scroll position\n if (toggle) {\n this.scrollPosition = {\n x: window.scrollX || 0,\n y: window.scrollY || 0,\n };\n } else {\n window.scrollTo(this.scrollPosition.x, this.scrollPosition.y);\n }\n\n // Toggle scroll\n document.body.style.overflow = toggle ? 'hidden' : '';\n\n // Toggle class hook\n toggleClass(this.target, this.player.config.classNames.fullscreen.fallback, toggle);\n\n // Toggle button and fire events\n onChange.call(this);\n}\n\nclass Fullscreen {\n constructor(player) {\n // Keep reference to parent\n this.player = player;\n\n // Get prefix\n this.prefix = Fullscreen.prefix;\n this.property = Fullscreen.property;\n\n // Scroll position\n this.scrollPosition = { x: 0, y: 0 };\n\n // Register event listeners\n // Handle event (incase user presses escape etc)\n on.call(\n this.player,\n document,\n this.prefix === 'ms' ? 'MSFullscreenChange' : `${this.prefix}fullscreenchange`,\n () => {\n // TODO: Filter for target??\n onChange.call(this);\n },\n );\n\n // Fullscreen toggle on double click\n on.call(this.player, this.player.elements.container, 'dblclick', event => {\n // Ignore double click in controls\n if (is.element(this.player.elements.controls) && this.player.elements.controls.contains(event.target)) {\n return;\n }\n\n this.toggle();\n });\n\n // Update the UI\n this.update();\n }\n\n // Determine if native supported\n static get native() {\n return !!(\n document.fullscreenEnabled ||\n document.webkitFullscreenEnabled ||\n document.mozFullScreenEnabled ||\n document.msFullscreenEnabled\n );\n }\n\n // Get the prefix for handlers\n static get prefix() {\n // No prefix\n if (is.function(document.exitFullscreen)) {\n return '';\n }\n\n // Check for fullscreen support by vendor prefix\n let value = '';\n const prefixes = ['webkit', 'moz', 'ms'];\n\n prefixes.some(pre => {\n if (is.function(document[`${pre}ExitFullscreen`]) || is.function(document[`${pre}CancelFullScreen`])) {\n value = pre;\n return true;\n }\n\n return false;\n });\n\n return value;\n }\n\n static get property() {\n return this.prefix === 'moz' ? 'FullScreen' : 'Fullscreen';\n }\n\n // Determine if fullscreen is enabled\n get enabled() {\n return (\n (Fullscreen.native || this.player.config.fullscreen.fallback) &&\n this.player.config.fullscreen.enabled &&\n this.player.supported.ui &&\n this.player.isVideo\n );\n }\n\n // Get active state\n get active() {\n if (!this.enabled) {\n return false;\n }\n\n // Fallback using classname\n if (!Fullscreen.native) {\n return hasClass(this.target, this.player.config.classNames.fullscreen.fallback);\n }\n\n const element = !this.prefix ? document.fullscreenElement : document[`${this.prefix}${this.property}Element`];\n\n return element === this.target;\n }\n\n // Get target element\n get target() {\n return browser.isIos && this.player.config.fullscreen.iosNative\n ? this.player.media\n : this.player.elements.container;\n }\n\n // Update UI\n update() {\n if (this.enabled) {\n this.player.debug.log(`${Fullscreen.native ? 'Native' : 'Fallback'} fullscreen enabled`);\n } else {\n this.player.debug.log('Fullscreen not supported and fallback disabled');\n }\n\n // Add styling hook to show button\n toggleClass(this.player.elements.container, this.player.config.classNames.fullscreen.enabled, this.enabled);\n }\n\n // Make an element fullscreen\n enter() {\n if (!this.enabled) {\n return;\n }\n\n // iOS native fullscreen doesn't need the request step\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n if (this.player.playing) {\n this.target.webkitEnterFullscreen();\n }\n } else if (!Fullscreen.native) {\n toggleFallback.call(this, true);\n } else if (!this.prefix) {\n this.target.requestFullscreen();\n } else if (!is.empty(this.prefix)) {\n this.target[`${this.prefix}Request${this.property}`]();\n }\n }\n\n // Bail from fullscreen\n exit() {\n if (!this.enabled) {\n return;\n }\n\n // iOS native fullscreen\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n this.target.webkitExitFullscreen();\n this.player.play();\n } else if (!Fullscreen.native) {\n toggleFallback.call(this, false);\n } else if (!this.prefix) {\n (document.cancelFullScreen || document.exitFullscreen).call(document);\n } else if (!is.empty(this.prefix)) {\n const action = this.prefix === 'moz' ? 'Cancel' : 'Exit';\n document[`${this.prefix}${action}${this.property}`]();\n }\n }\n\n // Toggle state\n toggle() {\n if (!this.active) {\n this.enter();\n } else {\n this.exit();\n }\n }\n}\n\nexport default Fullscreen;\n","// ==========================================================================\n// Load image avoiding xhr/fetch CORS issues\n// Server status can't be obtained this way unfortunately, so this uses \"naturalWidth\" to determine if the image has loaded\n// By default it checks if it is at least 1px, but you can add a second argument to change this\n// ==========================================================================\n\nexport default function loadImage(src, minWidth = 1) {\n return new Promise((resolve, reject) => {\n const image = new Image();\n\n const handler = () => {\n delete image.onload;\n delete image.onerror;\n (image.naturalWidth >= minWidth ? resolve : reject)(image);\n };\n\n Object.assign(image, { onload: handler, onerror: handler, src });\n });\n}\n","// ==========================================================================\n// Plyr UI\n// ==========================================================================\n\nimport captions from './captions';\nimport controls from './controls';\nimport i18n from './i18n';\nimport support from './support';\nimport browser from './utils/browser';\nimport { getElement, toggleClass } from './utils/elements';\nimport { ready, triggerEvent } from './utils/events';\nimport is from './utils/is';\nimport loadImage from './utils/loadImage';\n\nconst ui = {\n addStyleHook() {\n toggleClass(this.elements.container, this.config.selectors.container.replace('.', ''), true);\n toggleClass(this.elements.container, this.config.classNames.uiSupported, this.supported.ui);\n },\n\n // Toggle native HTML5 media controls\n toggleNativeControls(toggle = false) {\n if (toggle && this.isHTML5) {\n this.media.setAttribute('controls', '');\n } else {\n this.media.removeAttribute('controls');\n }\n },\n\n // Setup the UI\n build() {\n // Re-attach media element listeners\n // TODO: Use event bubbling?\n this.listeners.media();\n\n // Don't setup interface if no support\n if (!this.supported.ui) {\n this.debug.warn(`Basic support only for ${this.provider} ${this.type}`);\n\n // Restore native controls\n ui.toggleNativeControls.call(this, true);\n\n // Bail\n return;\n }\n\n // Inject custom controls if not present\n if (!is.element(this.elements.controls)) {\n // Inject custom controls\n controls.inject.call(this);\n\n // Re-attach control listeners\n this.listeners.controls();\n }\n\n // Remove native controls\n ui.toggleNativeControls.call(this);\n\n // Setup captions for HTML5\n if (this.isHTML5) {\n captions.setup.call(this);\n }\n\n // Reset volume\n this.volume = null;\n\n // Reset mute state\n this.muted = null;\n\n // Reset speed\n this.speed = null;\n\n // Reset loop state\n this.loop = null;\n\n // Reset quality setting\n this.quality = null;\n\n // Reset volume display\n controls.updateVolume.call(this);\n\n // Reset time display\n controls.timeUpdate.call(this);\n\n // Update the UI\n ui.checkPlaying.call(this);\n\n // Check for picture-in-picture support\n toggleClass(\n this.elements.container,\n this.config.classNames.pip.supported,\n support.pip && this.isHTML5 && this.isVideo,\n );\n\n // Check for airplay support\n toggleClass(this.elements.container, this.config.classNames.airplay.supported, support.airplay && this.isHTML5);\n\n // Add iOS class\n toggleClass(this.elements.container, this.config.classNames.isIos, browser.isIos);\n\n // Add touch class\n toggleClass(this.elements.container, this.config.classNames.isTouch, this.touch);\n\n // Ready for API calls\n this.ready = true;\n\n // Ready event at end of execution stack\n setTimeout(() => {\n triggerEvent.call(this, this.media, 'ready');\n }, 0);\n\n // Set the title\n ui.setTitle.call(this);\n\n // Assure the poster image is set, if the property was added before the element was created\n if (this.poster) {\n ui.setPoster.call(this, this.poster, false).catch(() => {});\n }\n\n // Manually set the duration if user has overridden it.\n // The event listeners for it doesn't get called if preload is disabled (#701)\n if (this.config.duration) {\n controls.durationUpdate.call(this);\n }\n },\n\n // Setup aria attribute for play and iframe title\n setTitle() {\n // Find the current text\n let label = i18n.get('play', this.config);\n\n // If there's a media title set, use that for the label\n if (is.string(this.config.title) && !is.empty(this.config.title)) {\n label += `, ${this.config.title}`;\n }\n\n // If there's a play button, set label\n if (is.nodeList(this.elements.buttons.play)) {\n Array.from(this.elements.buttons.play).forEach(button => {\n button.setAttribute('aria-label', label);\n });\n }\n\n // Set iframe title\n // https://github.com/sampotts/plyr/issues/124\n if (this.isEmbed) {\n const iframe = getElement.call(this, 'iframe');\n\n if (!is.element(iframe)) {\n return;\n }\n\n // Default to media type\n const title = !is.empty(this.config.title) ? this.config.title : 'video';\n const format = i18n.get('frameTitle', this.config);\n\n iframe.setAttribute('title', format.replace('{title}', title));\n }\n },\n\n // Toggle poster\n togglePoster(enable) {\n toggleClass(this.elements.container, this.config.classNames.posterEnabled, enable);\n },\n\n // Set the poster image (async)\n // Used internally for the poster setter, with the passive option forced to false\n setPoster(poster, passive = true) {\n // Don't override if call is passive\n if (passive && this.poster) {\n return Promise.reject(new Error('Poster already set'));\n }\n\n // Set property synchronously to respect the call order\n this.media.setAttribute('poster', poster);\n\n // Wait until ui is ready\n return (\n ready\n .call(this)\n // Load image\n .then(() => loadImage(poster))\n .catch(err => {\n // Hide poster on error unless it's been set by another call\n if (poster === this.poster) {\n ui.togglePoster.call(this, false);\n }\n // Rethrow\n throw err;\n })\n .then(() => {\n // Prevent race conditions\n if (poster !== this.poster) {\n throw new Error('setPoster cancelled by later call to setPoster');\n }\n })\n .then(() => {\n Object.assign(this.elements.poster.style, {\n backgroundImage: `url('${poster}')`,\n // Reset backgroundSize as well (since it can be set to \"cover\" for padded thumbnails for youtube)\n backgroundSize: '',\n });\n ui.togglePoster.call(this, true);\n return poster;\n })\n );\n },\n\n // Check playing state\n checkPlaying(event) {\n // Class hooks\n toggleClass(this.elements.container, this.config.classNames.playing, this.playing);\n toggleClass(this.elements.container, this.config.classNames.paused, this.paused);\n toggleClass(this.elements.container, this.config.classNames.stopped, this.stopped);\n\n // Set state\n Array.from(this.elements.buttons.play).forEach(target => {\n target.pressed = this.playing;\n });\n\n // Only update controls on non timeupdate events\n if (is.event(event) && event.type === 'timeupdate') {\n return;\n }\n\n // Toggle controls\n ui.toggleControls.call(this);\n },\n\n // Check if media is loading\n checkLoading(event) {\n this.loading = ['stalled', 'waiting'].includes(event.type);\n\n // Clear timer\n clearTimeout(this.timers.loading);\n\n // Timer to prevent flicker when seeking\n this.timers.loading = setTimeout(() => {\n // Update progress bar loading class state\n toggleClass(this.elements.container, this.config.classNames.loading, this.loading);\n\n // Update controls visibility\n ui.toggleControls.call(this);\n }, this.loading ? 250 : 0);\n },\n\n // Toggle controls based on state and `force` argument\n toggleControls(force) {\n const { controls } = this.elements;\n\n if (controls && this.config.hideControls) {\n // Show controls if force, loading, paused, or button interaction, otherwise hide\n this.toggleControls(Boolean(force || this.loading || this.paused || controls.pressed || controls.hover));\n }\n },\n};\n\nexport default ui;\n","// ==========================================================================\n// Plyr Event Listeners\n// ==========================================================================\n\nimport controls from './controls';\nimport ui from './ui';\nimport browser from './utils/browser';\nimport { getElement, getElements, getFocusElement, matches, toggleClass, toggleHidden } from './utils/elements';\nimport { on, once, toggleListener, triggerEvent } from './utils/events';\nimport is from './utils/is';\n\nclass Listeners {\n constructor(player) {\n this.player = player;\n this.lastKey = null;\n\n this.handleKey = this.handleKey.bind(this);\n this.toggleMenu = this.toggleMenu.bind(this);\n this.firstTouch = this.firstTouch.bind(this);\n }\n\n // Handle key presses\n handleKey(event) {\n const code = event.keyCode ? event.keyCode : event.which;\n const pressed = event.type === 'keydown';\n const repeat = pressed && code === this.lastKey;\n\n // Bail if a modifier key is set\n if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) {\n return;\n }\n\n // If the event is bubbled from the media element\n // Firefox doesn't get the keycode for whatever reason\n if (!is.number(code)) {\n return;\n }\n\n // Seek by the number keys\n const seekByKey = () => {\n // Divide the max duration into 10th's and times by the number value\n this.player.currentTime = this.player.duration / 10 * (code - 48);\n };\n\n // Handle the key on keydown\n // Reset on keyup\n if (pressed) {\n // Which keycodes should we prevent default\n const preventDefault = [32, 37, 38, 39, 40, 48, 49, 50, 51, 52, 53, 54, 56, 57, 67, 70, 73, 75, 76, 77, 79];\n\n // Check focused element\n // and if the focused element is not editable (e.g. text input)\n // and any that accept key input http://webaim.org/techniques/keyboard/\n const focused = getFocusElement();\n if (\n is.element(focused) &&\n (focused !== this.player.elements.inputs.seek &&\n matches(focused, this.player.config.selectors.editable))\n ) {\n return;\n }\n\n // If the code is found prevent default (e.g. prevent scrolling for arrows)\n if (preventDefault.includes(code)) {\n event.preventDefault();\n event.stopPropagation();\n }\n\n switch (code) {\n case 48:\n case 49:\n case 50:\n case 51:\n case 52:\n case 53:\n case 54:\n case 55:\n case 56:\n case 57:\n // 0-9\n if (!repeat) {\n seekByKey();\n }\n break;\n\n case 32:\n case 75:\n // Space and K key\n if (!repeat) {\n this.player.togglePlay();\n }\n break;\n\n case 38:\n // Arrow up\n this.player.increaseVolume(0.1);\n break;\n\n case 40:\n // Arrow down\n this.player.decreaseVolume(0.1);\n break;\n\n case 77:\n // M key\n if (!repeat) {\n this.player.muted = !this.player.muted;\n }\n break;\n\n case 39:\n // Arrow forward\n this.player.forward();\n break;\n\n case 37:\n // Arrow back\n this.player.rewind();\n break;\n\n case 70:\n // F key\n this.player.fullscreen.toggle();\n break;\n\n case 67:\n // C key\n if (!repeat) {\n this.player.toggleCaptions();\n }\n break;\n\n case 76:\n // L key\n this.player.loop = !this.player.loop;\n break;\n\n /* case 73:\n this.setLoop('start');\n break;\n\n case 76:\n this.setLoop();\n break;\n\n case 79:\n this.setLoop('end');\n break; */\n\n default:\n break;\n }\n\n // Escape is handle natively when in full screen\n // So we only need to worry about non native\n if (!this.player.fullscreen.enabled && this.player.fullscreen.active && code === 27) {\n this.player.fullscreen.toggle();\n }\n\n // Store last code for next cycle\n this.lastKey = code;\n } else {\n this.lastKey = null;\n }\n }\n\n // Toggle menu\n toggleMenu(event) {\n controls.toggleMenu.call(this.player, event);\n }\n\n // Device is touch enabled\n firstTouch() {\n this.player.touch = true;\n\n // Add touch class\n toggleClass(this.player.elements.container, this.player.config.classNames.isTouch, true);\n }\n\n // Global window & document listeners\n global(toggle = true) {\n // Keyboard shortcuts\n if (this.player.config.keyboard.global) {\n toggleListener.call(this.player, window, 'keydown keyup', this.handleKey, toggle, false);\n }\n\n // Click anywhere closes menu\n toggleListener.call(this.player, document.body, 'click', this.toggleMenu, toggle);\n\n // Detect touch by events\n once.call(this.player, document.body, 'touchstart', this.firstTouch);\n }\n\n // Container listeners\n container() {\n // Keyboard shortcuts\n if (!this.player.config.keyboard.global && this.player.config.keyboard.focused) {\n on.call(this.player, this.player.elements.container, 'keydown keyup', this.handleKey, false);\n }\n\n // Detect tab focus\n // Remove class on blur/focusout\n on.call(this.player, this.player.elements.container, 'focusout', event => {\n toggleClass(event.target, this.player.config.classNames.tabFocus, false);\n });\n // Add classname to tabbed elements\n on.call(this.player, this.player.elements.container, 'keydown', event => {\n if (event.keyCode !== 9) {\n return;\n }\n\n // Delay the adding of classname until the focus has changed\n // This event fires before the focusin event\n setTimeout(() => {\n toggleClass(getFocusElement(), this.player.config.classNames.tabFocus, true);\n }, 0);\n });\n\n // Toggle controls on mouse events and entering fullscreen\n on.call(\n this.player,\n this.player.elements.container,\n 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen',\n event => {\n const { controls } = this.player.elements;\n\n // Remove button states for fullscreen\n if (event.type === 'enterfullscreen') {\n controls.pressed = false;\n controls.hover = false;\n }\n\n // Show, then hide after a timeout unless another control event occurs\n const show = ['touchstart', 'touchmove', 'mousemove'].includes(event.type);\n\n let delay = 0;\n\n if (show) {\n ui.toggleControls.call(this.player, true);\n // Use longer timeout for touch devices\n delay = this.player.touch ? 3000 : 2000;\n }\n\n // Clear timer\n clearTimeout(this.player.timers.controls);\n // Timer to prevent flicker when seeking\n this.player.timers.controls = setTimeout(() => ui.toggleControls.call(this.player, false), delay);\n },\n );\n }\n\n // Listen for media events\n media() {\n // Time change on media\n on.call(this.player, this.player.media, 'timeupdate seeking seeked', event =>\n controls.timeUpdate.call(this.player, event),\n );\n\n // Display duration\n on.call(this.player, this.player.media, 'durationchange loadeddata loadedmetadata', event =>\n controls.durationUpdate.call(this.player, event),\n );\n\n // Check for audio tracks on load\n // We can't use `loadedmetadata` as it doesn't seem to have audio tracks at that point\n on.call(this.player, this.player.media, 'canplay', () => {\n toggleHidden(this.player.elements.volume, !this.player.hasAudio);\n toggleHidden(this.player.elements.buttons.mute, !this.player.hasAudio);\n });\n\n // Handle the media finishing\n on.call(this.player, this.player.media, 'ended', () => {\n // Show poster on end\n if (this.player.isHTML5 && this.player.isVideo && this.player.config.resetOnEnd) {\n // Restart\n this.player.restart();\n }\n });\n\n // Check for buffer progress\n on.call(this.player, this.player.media, 'progress playing seeking seeked', event =>\n controls.updateProgress.call(this.player, event),\n );\n\n // Handle volume changes\n on.call(this.player, this.player.media, 'volumechange', event =>\n controls.updateVolume.call(this.player, event),\n );\n\n // Handle play/pause\n on.call(this.player, this.player.media, 'playing play pause ended emptied timeupdate', event =>\n ui.checkPlaying.call(this.player, event),\n );\n\n // Loading state\n on.call(this.player, this.player.media, 'waiting canplay seeked playing', event =>\n ui.checkLoading.call(this.player, event),\n );\n\n // If autoplay, then load advertisement if required\n // TODO: Show some sort of loading state while the ad manager loads else there's a delay before ad shows\n on.call(this.player, this.player.media, 'playing', () => {\n if (!this.player.ads) {\n return;\n }\n\n // If ads are enabled, wait for them first\n if (this.player.ads.enabled && !this.player.ads.initialized) {\n // Wait for manager response\n this.player.ads.managerPromise.then(() => this.player.ads.play()).catch(() => this.player.play());\n }\n });\n\n // Click video\n if (this.player.supported.ui && this.player.config.clickToPlay && !this.player.isAudio) {\n // Re-fetch the wrapper\n const wrapper = getElement.call(this.player, `.${this.player.config.classNames.video}`);\n\n // Bail if there's no wrapper (this should never happen)\n if (!is.element(wrapper)) {\n return;\n }\n\n // On click play, pause ore restart\n on.call(this.player, wrapper, 'click', () => {\n // Touch devices will just show controls (if we're hiding controls)\n if (this.player.config.hideControls && this.player.touch && !this.player.paused) {\n return;\n }\n\n if (this.player.paused) {\n this.player.play();\n } else if (this.player.ended) {\n this.player.restart();\n this.player.play();\n } else {\n this.player.pause();\n }\n });\n }\n\n // Disable right click\n if (this.player.supported.ui && this.player.config.disableContextMenu) {\n on.call(\n this.player,\n this.player.elements.wrapper,\n 'contextmenu',\n event => {\n event.preventDefault();\n },\n false,\n );\n }\n\n // Volume change\n on.call(this.player, this.player.media, 'volumechange', () => {\n // Save to storage\n this.player.storage.set({ volume: this.player.volume, muted: this.player.muted });\n });\n\n // Speed change\n on.call(this.player, this.player.media, 'ratechange', () => {\n // Update UI\n controls.updateSetting.call(this.player, 'speed');\n\n // Save to storage\n this.player.storage.set({ speed: this.player.speed });\n });\n\n // Quality request\n on.call(this.player, this.player.media, 'qualityrequested', event => {\n // Save to storage\n this.player.storage.set({ quality: event.detail.quality });\n });\n\n // Quality change\n on.call(this.player, this.player.media, 'qualitychange', event => {\n // Update UI\n controls.updateSetting.call(this.player, 'quality', null, event.detail.quality);\n });\n\n // Proxy events to container\n // Bubble up key events for Edge\n const proxyEvents = this.player.config.events.concat(['keyup', 'keydown']).join(' ');\n on.call(this.player, this.player.media, proxyEvents, event => {\n let { detail = {} } = event;\n\n // Get error details from media\n if (event.type === 'error') {\n detail = this.player.media.error;\n }\n\n triggerEvent.call(this.player, this.player.elements.container, event.type, true, detail);\n });\n }\n\n // Listen for control events\n controls() {\n // IE doesn't support input event, so we fallback to change\n const inputEvent = browser.isIE ? 'change' : 'input';\n\n // Run default and custom handlers\n const proxy = (event, defaultHandler, customHandlerKey) => {\n const customHandler = this.player.config.listeners[customHandlerKey];\n const hasCustomHandler = is.function(customHandler);\n let returned = true;\n\n // Execute custom handler\n if (hasCustomHandler) {\n returned = customHandler.call(this.player, event);\n }\n\n // Only call default handler if not prevented in custom handler\n if (returned && is.function(defaultHandler)) {\n defaultHandler.call(this.player, event);\n }\n };\n\n // Trigger custom and default handlers\n const bind = (element, type, defaultHandler, customHandlerKey, passive = true) => {\n const customHandler = this.player.config.listeners[customHandlerKey];\n const hasCustomHandler = is.function(customHandler);\n\n on.call(\n this.player,\n element,\n type,\n event => proxy(event, defaultHandler, customHandlerKey),\n passive && !hasCustomHandler,\n );\n };\n\n // Play/pause toggle\n Array.from(this.player.elements.buttons.play).forEach(button => {\n bind(button, 'click', this.player.togglePlay, 'play');\n });\n\n // Pause\n bind(this.player.elements.buttons.restart, 'click', this.player.restart, 'restart');\n\n // Rewind\n bind(this.player.elements.buttons.rewind, 'click', this.player.rewind, 'rewind');\n\n // Rewind\n bind(this.player.elements.buttons.fastForward, 'click', this.player.forward, 'fastForward');\n\n // Mute toggle\n bind(\n this.player.elements.buttons.mute,\n 'click',\n () => {\n this.player.muted = !this.player.muted;\n },\n 'mute',\n );\n\n // Captions toggle\n bind(this.player.elements.buttons.captions, 'click', () => this.player.toggleCaptions());\n\n // Fullscreen toggle\n bind(\n this.player.elements.buttons.fullscreen,\n 'click',\n () => {\n this.player.fullscreen.toggle();\n },\n 'fullscreen',\n );\n\n // Picture-in-Picture\n bind(\n this.player.elements.buttons.pip,\n 'click',\n () => {\n this.player.pip = 'toggle';\n },\n 'pip',\n );\n\n // Airplay\n bind(this.player.elements.buttons.airplay, 'click', this.player.airplay, 'airplay');\n\n // Settings menu\n bind(this.player.elements.buttons.settings, 'click', event => {\n controls.toggleMenu.call(this.player, event);\n });\n\n // Settings menu\n bind(this.player.elements.settings.form, 'click', event => {\n event.stopPropagation();\n\n // Go back to home tab on click\n const showHomeTab = () => {\n const id = `plyr-settings-${this.player.id}-home`;\n controls.showTab.call(this.player, id);\n };\n\n // Settings menu items - use event delegation as items are added/removed\n if (matches(event.target, this.player.config.selectors.inputs.language)) {\n proxy(\n event,\n () => {\n this.player.currentTrack = Number(event.target.value);\n showHomeTab();\n },\n 'language',\n );\n } else if (matches(event.target, this.player.config.selectors.inputs.quality)) {\n proxy(\n event,\n () => {\n this.player.quality = event.target.value;\n showHomeTab();\n },\n 'quality',\n );\n } else if (matches(event.target, this.player.config.selectors.inputs.speed)) {\n proxy(\n event,\n () => {\n this.player.speed = parseFloat(event.target.value);\n showHomeTab();\n },\n 'speed',\n );\n } else {\n const tab = event.target;\n controls.showTab.call(this.player, tab.getAttribute('aria-controls'));\n }\n });\n\n // Set range input alternative \"value\", which matches the tooltip time (#954)\n bind(this.player.elements.inputs.seek, 'mousedown mousemove', event => {\n const clientRect = this.player.elements.progress.getBoundingClientRect();\n const percent = 100 / clientRect.width * (event.pageX - clientRect.left);\n event.currentTarget.setAttribute('seek-value', percent);\n });\n\n // Pause while seeking\n bind(this.player.elements.inputs.seek, 'mousedown mouseup keydown keyup touchstart touchend', event => {\n const seek = event.currentTarget;\n\n const code = event.keyCode ? event.keyCode : event.which;\n const eventType = event.type;\n\n if ((eventType === 'keydown' || eventType === 'keyup') && (code !== 39 && code !== 37)) {\n return;\n }\n // Was playing before?\n const play = seek.hasAttribute('play-on-seeked');\n\n // Done seeking\n const done = ['mouseup', 'touchend', 'keyup'].includes(event.type);\n\n // If we're done seeking and it was playing, resume playback\n if (play && done) {\n seek.removeAttribute('play-on-seeked');\n this.player.play();\n } else if (!done && this.player.playing) {\n seek.setAttribute('play-on-seeked', '');\n this.player.pause();\n }\n });\n\n // Seek\n bind(\n this.player.elements.inputs.seek,\n inputEvent,\n event => {\n const seek = event.currentTarget;\n\n // If it exists, use seek-value instead of \"value\" for consistency with tooltip time (#954)\n let seekTo = seek.getAttribute('seek-value');\n\n if (is.empty(seekTo)) {\n seekTo = seek.value;\n }\n\n seek.removeAttribute('seek-value');\n\n this.player.currentTime = seekTo / seek.max * this.player.duration;\n },\n 'seek',\n );\n\n // Current time invert\n // Only if one time element is used for both currentTime and duration\n if (this.player.config.toggleInvert && !is.element(this.player.elements.display.duration)) {\n bind(this.player.elements.display.currentTime, 'click', () => {\n // Do nothing if we're at the start\n if (this.player.currentTime === 0) {\n return;\n }\n\n this.player.config.invertTime = !this.player.config.invertTime;\n\n controls.timeUpdate.call(this.player);\n });\n }\n\n // Volume\n bind(\n this.player.elements.inputs.volume,\n inputEvent,\n event => {\n this.player.volume = event.target.value;\n },\n 'volume',\n );\n\n // Polyfill for lower fill in <input type=\"range\"> for webkit\n if (browser.isWebkit) {\n Array.from(getElements.call(this.player, 'input[type=\"range\"]')).forEach(element => {\n bind(element, 'input', event => controls.updateRangeFill.call(this.player, event.target));\n });\n }\n\n // Seek tooltip\n bind(this.player.elements.progress, 'mouseenter mouseleave mousemove', event =>\n controls.updateSeekTooltip.call(this.player, event),\n );\n\n // Update controls.hover state (used for ui.toggleControls to avoid hiding when interacting)\n bind(this.player.elements.controls, 'mouseenter mouseleave', event => {\n this.player.elements.controls.hover = !this.player.touch && event.type === 'mouseenter';\n });\n\n // Update controls.pressed state (used for ui.toggleControls to avoid hiding when interacting)\n bind(this.player.elements.controls, 'mousedown mouseup touchstart touchend touchcancel', event => {\n this.player.elements.controls.pressed = ['mousedown', 'touchstart'].includes(event.type);\n });\n\n // Focus in/out on controls\n bind(this.player.elements.controls, 'focusin focusout', event => {\n const { config, elements, timers } = this.player;\n\n // Skip transition to prevent focus from scrolling the parent element\n toggleClass(elements.controls, config.classNames.noTransition, event.type === 'focusin');\n\n // Toggle\n ui.toggleControls.call(this.player, event.type === 'focusin');\n\n // If focusin, hide again after delay\n if (event.type === 'focusin') {\n // Restore transition\n setTimeout(() => {\n toggleClass(elements.controls, config.classNames.noTransition, false);\n }, 0);\n\n // Delay a little more for keyboard users\n const delay = this.touch ? 3000 : 4000;\n\n // Clear timer\n clearTimeout(timers.controls);\n // Hide\n timers.controls = setTimeout(() => ui.toggleControls.call(this.player, false), delay);\n }\n });\n\n // Mouse wheel for volume\n bind(\n this.player.elements.inputs.volume,\n 'wheel',\n event => {\n // Detect \"natural\" scroll - suppored on OS X Safari only\n // Other browsers on OS X will be inverted until support improves\n const inverted = event.webkitDirectionInvertedFromDevice;\n const step = 1 / 50;\n let direction = 0;\n\n // Scroll down (or up on natural) to decrease\n if (event.deltaY < 0 || event.deltaX > 0) {\n if (inverted) {\n this.player.decreaseVolume(step);\n direction = -1;\n } else {\n this.player.increaseVolume(step);\n direction = 1;\n }\n }\n\n // Scroll up (or down on natural) to increase\n if (event.deltaY > 0 || event.deltaX < 0) {\n if (inverted) {\n this.player.increaseVolume(step);\n direction = 1;\n } else {\n this.player.decreaseVolume(step);\n direction = -1;\n }\n }\n\n // Don't break page scrolling at max and min\n if (\n (direction === 1 && this.player.media.volume < 1) ||\n (direction === -1 && this.player.media.volume > 0)\n ) {\n event.preventDefault();\n }\n },\n 'volume',\n false,\n );\n }\n}\n\nexport default Listeners;\n","(function(root, factory) {\n if (typeof define === 'function' && define.amd) {\n define([], factory);\n } else if (typeof exports === 'object') {\n module.exports = factory();\n } else {\n root.loadjs = factory();\n }\n}(this, function() {\n/**\n * Global dependencies.\n * @global {Object} document - DOM\n */\n\nvar devnull = function() {},\n bundleIdCache = {},\n bundleResultCache = {},\n bundleCallbackQueue = {};\n\n\n/**\n * Subscribe to bundle load event.\n * @param {string[]} bundleIds - Bundle ids\n * @param {Function} callbackFn - The callback function\n */\nfunction subscribe(bundleIds, callbackFn) {\n // listify\n bundleIds = bundleIds.push ? bundleIds : [bundleIds];\n\n var depsNotFound = [],\n i = bundleIds.length,\n numWaiting = i,\n fn,\n bundleId,\n r,\n q;\n\n // define callback function\n fn = function (bundleId, pathsNotFound) {\n if (pathsNotFound.length) depsNotFound.push(bundleId);\n\n numWaiting--;\n if (!numWaiting) callbackFn(depsNotFound);\n };\n\n // register callback\n while (i--) {\n bundleId = bundleIds[i];\n\n // execute callback if in result cache\n r = bundleResultCache[bundleId];\n if (r) {\n fn(bundleId, r);\n continue;\n }\n\n // add to callback queue\n q = bundleCallbackQueue[bundleId] = bundleCallbackQueue[bundleId] || [];\n q.push(fn);\n }\n}\n\n\n/**\n * Publish bundle load event.\n * @param {string} bundleId - Bundle id\n * @param {string[]} pathsNotFound - List of files not found\n */\nfunction publish(bundleId, pathsNotFound) {\n // exit if id isn't defined\n if (!bundleId) return;\n\n var q = bundleCallbackQueue[bundleId];\n\n // cache result\n bundleResultCache[bundleId] = pathsNotFound;\n\n // exit if queue is empty\n if (!q) return;\n\n // empty callback queue\n while (q.length) {\n q[0](bundleId, pathsNotFound);\n q.splice(0, 1);\n }\n}\n\n\n/**\n * Execute callbacks.\n * @param {Object or Function} args - The callback args\n * @param {string[]} depsNotFound - List of dependencies not found\n */\nfunction executeCallbacks(args, depsNotFound) {\n // accept function as argument\n if (args.call) args = {success: args};\n\n // success and error callbacks\n if (depsNotFound.length) (args.error || devnull)(depsNotFound);\n else (args.success || devnull)(args);\n}\n\n\n/**\n * Load individual file.\n * @param {string} path - The file path\n * @param {Function} callbackFn - The callback function\n */\nfunction loadFile(path, callbackFn, args, numTries) {\n var doc = document,\n async = args.async,\n maxTries = (args.numRetries || 0) + 1,\n beforeCallbackFn = args.before || devnull,\n pathStripped = path.replace(/^(css|img)!/, ''),\n isCss,\n e;\n\n numTries = numTries || 0;\n\n if (/(^css!|\\.css$)/.test(path)) {\n isCss = true;\n\n // css\n e = doc.createElement('link');\n e.rel = 'stylesheet';\n e.href = pathStripped; //.replace(/^css!/, ''); // remove \"css!\" prefix\n } else if (/(^img!|\\.(png|gif|jpg|svg)$)/.test(path)) {\n // image\n e = doc.createElement('img');\n e.src = pathStripped; \n } else {\n // javascript\n e = doc.createElement('script');\n e.src = path;\n e.async = async === undefined ? true : async;\n }\n\n e.onload = e.onerror = e.onbeforeload = function (ev) {\n var result = ev.type[0];\n\n // Note: The following code isolates IE using `hideFocus` and treats empty\n // stylesheets as failures to get around lack of onerror support\n if (isCss && 'hideFocus' in e) {\n try {\n if (!e.sheet.cssText.length) result = 'e';\n } catch (x) {\n // sheets objects created from load errors don't allow access to\n // `cssText`\n result = 'e';\n }\n }\n\n // handle retries in case of load failure\n if (result == 'e') {\n // increment counter\n numTries += 1;\n\n // exit function and try again\n if (numTries < maxTries) {\n return loadFile(path, callbackFn, args, numTries);\n }\n }\n\n // execute callback\n callbackFn(path, result, ev.defaultPrevented);\n };\n\n // add to document (unless callback returns `false`)\n if (beforeCallbackFn(path, e) !== false) doc.head.appendChild(e);\n}\n\n\n/**\n * Load multiple files.\n * @param {string[]} paths - The file paths\n * @param {Function} callbackFn - The callback function\n */\nfunction loadFiles(paths, callbackFn, args) {\n // listify paths\n paths = paths.push ? paths : [paths];\n\n var numWaiting = paths.length,\n x = numWaiting,\n pathsNotFound = [],\n fn,\n i;\n\n // define callback function\n fn = function(path, result, defaultPrevented) {\n // handle error\n if (result == 'e') pathsNotFound.push(path);\n\n // handle beforeload event. If defaultPrevented then that means the load\n // will be blocked (ex. Ghostery/ABP on Safari)\n if (result == 'b') {\n if (defaultPrevented) pathsNotFound.push(path);\n else return;\n }\n\n numWaiting--;\n if (!numWaiting) callbackFn(pathsNotFound);\n };\n\n // load scripts\n for (i=0; i < x; i++) loadFile(paths[i], fn, args);\n}\n\n\n/**\n * Initiate script load and register bundle.\n * @param {(string|string[])} paths - The file paths\n * @param {(string|Function)} [arg1] - The bundleId or success callback\n * @param {Function} [arg2] - The success or error callback\n * @param {Function} [arg3] - The error callback\n */\nfunction loadjs(paths, arg1, arg2) {\n var bundleId,\n args;\n\n // bundleId (if string)\n if (arg1 && arg1.trim) bundleId = arg1;\n\n // args (default is {})\n args = (bundleId ? arg2 : arg1) || {};\n\n // throw error if bundle is already defined\n if (bundleId) {\n if (bundleId in bundleIdCache) {\n throw \"LoadJS\";\n } else {\n bundleIdCache[bundleId] = true;\n }\n }\n\n // load scripts\n loadFiles(paths, function (pathsNotFound) {\n // execute callbacks\n executeCallbacks(args, pathsNotFound);\n\n // publish bundle load event\n publish(bundleId, pathsNotFound);\n }, args);\n}\n\n\n/**\n * Execute callbacks when dependencies have been satisfied.\n * @param {(string|string[])} deps - List of bundle ids\n * @param {Object} args - success/error arguments\n */\nloadjs.ready = function ready(deps, args) {\n // subscribe to bundle load event\n subscribe(deps, function (depsNotFound) {\n // execute callbacks\n executeCallbacks(args, depsNotFound);\n });\n\n return loadjs;\n};\n\n\n/**\n * Manually satisfy bundle dependencies.\n * @param {string} bundleId - The bundle id\n */\nloadjs.done = function done(bundleId) {\n publish(bundleId, []);\n};\n\n\n/**\n * Reset loadjs dependencies statuses\n */\nloadjs.reset = function reset() {\n bundleIdCache = {};\n bundleResultCache = {};\n bundleCallbackQueue = {};\n};\n\n\n/**\n * Determine if bundle has already been defined\n * @param String} bundleId - The bundle id\n */\nloadjs.isDefined = function isDefined(bundleId) {\n return bundleId in bundleIdCache;\n};\n\n\n// export\nreturn loadjs;\n\n}));\n","// ==========================================================================\n// Load an external script\n// ==========================================================================\n\nimport loadjs from 'loadjs';\n\nexport default function loadScript(url) {\n return new Promise((resolve, reject) => {\n loadjs(url, {\n success: resolve,\n error: reject,\n });\n });\n}\n","// ==========================================================================\n// Vimeo plugin\n// ==========================================================================\n\nimport captions from './../captions';\nimport controls from './../controls';\nimport ui from './../ui';\nimport { createElement, replaceElement, toggleClass } from './../utils/elements';\nimport { triggerEvent } from './../utils/events';\nimport fetch from './../utils/fetch';\nimport is from './../utils/is';\nimport loadScript from './../utils/loadScript';\nimport { format, stripHTML } from './../utils/strings';\nimport { buildUrlParams } from './../utils/urls';\n\n// Parse Vimeo ID from URL\nfunction parseId(url) {\n if (is.empty(url)) {\n return null;\n }\n\n if (is.number(Number(url))) {\n return url;\n }\n\n const regex = /^.*(vimeo.com\\/|video\\/)(\\d+).*/;\n return url.match(regex) ? RegExp.$2 : url;\n}\n\n// Get aspect ratio for dimensions\nfunction getAspectRatio(width, height) {\n const getRatio = (w, h) => (h === 0 ? w : getRatio(h, w % h));\n const ratio = getRatio(width, height);\n return `${width / ratio}:${height / ratio}`;\n}\n\n// Set playback state and trigger change (only on actual change)\nfunction assurePlaybackState(play) {\n if (play && !this.embed.hasPlayed) {\n this.embed.hasPlayed = true;\n }\n if (this.media.paused === play) {\n this.media.paused = !play;\n triggerEvent.call(this, this.media, play ? 'play' : 'pause');\n }\n}\n\nconst vimeo = {\n setup() {\n // Add embed class for responsive\n toggleClass(this.elements.wrapper, this.config.classNames.embed, true);\n\n // Set intial ratio\n vimeo.setAspectRatio.call(this);\n\n // Load the API if not already\n if (!is.object(window.Vimeo)) {\n loadScript(this.config.urls.vimeo.sdk)\n .then(() => {\n vimeo.ready.call(this);\n })\n .catch(error => {\n this.debug.warn('Vimeo API failed to load', error);\n });\n } else {\n vimeo.ready.call(this);\n }\n },\n\n // Set aspect ratio\n // For Vimeo we have an extra 300% height <div> to hide the standard controls and UI\n setAspectRatio(input) {\n const [x, y] = (is.string(input) ? input : this.config.ratio).split(':');\n const padding = 100 / x * y;\n this.elements.wrapper.style.paddingBottom = `${padding}%`;\n\n if (this.supported.ui) {\n const height = 240;\n const offset = (height - padding) / (height / 50);\n\n this.media.style.transform = `translateY(-${offset}%)`;\n }\n },\n\n // API Ready\n ready() {\n const player = this;\n\n // Get Vimeo params for the iframe\n const options = {\n loop: player.config.loop.active,\n autoplay: player.autoplay,\n // muted: player.muted,\n byline: false,\n portrait: false,\n title: false,\n speed: true,\n transparent: 0,\n gesture: 'media',\n playsinline: !this.config.fullscreen.iosNative,\n };\n const params = buildUrlParams(options);\n\n // Get the source URL or ID\n let source = player.media.getAttribute('src');\n\n // Get from <div> if needed\n if (is.empty(source)) {\n source = player.media.getAttribute(player.config.attributes.embed.id);\n }\n\n const id = parseId(source);\n\n // Build an iframe\n const iframe = createElement('iframe');\n const src = format(player.config.urls.vimeo.iframe, id, params);\n iframe.setAttribute('src', src);\n iframe.setAttribute('allowfullscreen', '');\n iframe.setAttribute('allowtransparency', '');\n iframe.setAttribute('allow', 'autoplay');\n\n // Get poster, if already set\n const { poster } = player;\n\n // Inject the package\n const wrapper = createElement('div', { poster, class: player.config.classNames.embedContainer });\n wrapper.appendChild(iframe);\n player.media = replaceElement(wrapper, player.media);\n\n // Get poster image\n fetch(format(player.config.urls.vimeo.api, id), 'json').then(response => {\n if (is.empty(response)) {\n return;\n }\n\n // Get the URL for thumbnail\n const url = new URL(response[0].thumbnail_large);\n\n // Get original image\n url.pathname = `${url.pathname.split('_')[0]}.jpg`;\n\n // Set and show poster\n ui.setPoster.call(player, url.href).catch(() => {});\n });\n\n // Setup instance\n // https://github.com/vimeo/player.js\n player.embed = new window.Vimeo.Player(iframe, {\n autopause: player.config.autopause,\n muted: player.muted,\n });\n\n player.media.paused = true;\n player.media.currentTime = 0;\n\n // Disable native text track rendering\n if (player.supported.ui) {\n player.embed.disableTextTrack();\n }\n\n // Create a faux HTML5 API using the Vimeo API\n player.media.play = () => {\n assurePlaybackState.call(player, true);\n return player.embed.play();\n };\n\n player.media.pause = () => {\n assurePlaybackState.call(player, false);\n return player.embed.pause();\n };\n\n player.media.stop = () => {\n player.pause();\n player.currentTime = 0;\n };\n\n // Seeking\n let { currentTime } = player.media;\n Object.defineProperty(player.media, 'currentTime', {\n get() {\n return currentTime;\n },\n set(time) {\n // Vimeo will automatically play on seek if the video hasn't been played before\n\n // Get current paused state and volume etc\n const { embed, media, paused, volume } = player;\n const restorePause = paused && !embed.hasPlayed;\n\n // Set seeking state and trigger event\n media.seeking = true;\n triggerEvent.call(player, media, 'seeking');\n\n // If paused, mute until seek is complete\n Promise.resolve(restorePause && embed.setVolume(0))\n // Seek\n .then(() => embed.setCurrentTime(time))\n // Restore paused\n .then(() => restorePause && embed.pause())\n // Restore volume\n .then(() => restorePause && embed.setVolume(volume))\n .catch(() => {\n // Do nothing\n });\n },\n });\n\n // Playback speed\n let speed = player.config.speed.selected;\n Object.defineProperty(player.media, 'playbackRate', {\n get() {\n return speed;\n },\n set(input) {\n player.embed\n .setPlaybackRate(input)\n .then(() => {\n speed = input;\n triggerEvent.call(player, player.media, 'ratechange');\n })\n .catch(error => {\n // Hide menu item (and menu if empty)\n if (error.name === 'Error') {\n controls.setSpeedMenu.call(player, []);\n }\n });\n },\n });\n\n // Volume\n let { volume } = player.config;\n Object.defineProperty(player.media, 'volume', {\n get() {\n return volume;\n },\n set(input) {\n player.embed.setVolume(input).then(() => {\n volume = input;\n triggerEvent.call(player, player.media, 'volumechange');\n });\n },\n });\n\n // Muted\n let { muted } = player.config;\n Object.defineProperty(player.media, 'muted', {\n get() {\n return muted;\n },\n set(input) {\n const toggle = is.boolean(input) ? input : false;\n\n player.embed.setVolume(toggle ? 0 : player.config.volume).then(() => {\n muted = toggle;\n triggerEvent.call(player, player.media, 'volumechange');\n });\n },\n });\n\n // Loop\n let { loop } = player.config;\n Object.defineProperty(player.media, 'loop', {\n get() {\n return loop;\n },\n set(input) {\n const toggle = is.boolean(input) ? input : player.config.loop.active;\n\n player.embed.setLoop(toggle).then(() => {\n loop = toggle;\n });\n },\n });\n\n // Source\n let currentSrc;\n player.embed\n .getVideoUrl()\n .then(value => {\n currentSrc = value;\n })\n .catch(error => {\n this.debug.warn(error);\n });\n\n Object.defineProperty(player.media, 'currentSrc', {\n get() {\n return currentSrc;\n },\n });\n\n // Ended\n Object.defineProperty(player.media, 'ended', {\n get() {\n return player.currentTime === player.duration;\n },\n });\n\n // Set aspect ratio based on video size\n Promise.all([player.embed.getVideoWidth(), player.embed.getVideoHeight()]).then(dimensions => {\n const ratio = getAspectRatio(dimensions[0], dimensions[1]);\n vimeo.setAspectRatio.call(this, ratio);\n });\n\n // Set autopause\n player.embed.setAutopause(player.config.autopause).then(state => {\n player.config.autopause = state;\n });\n\n // Get title\n player.embed.getVideoTitle().then(title => {\n player.config.title = title;\n ui.setTitle.call(this);\n });\n\n // Get current time\n player.embed.getCurrentTime().then(value => {\n currentTime = value;\n triggerEvent.call(player, player.media, 'timeupdate');\n });\n\n // Get duration\n player.embed.getDuration().then(value => {\n player.media.duration = value;\n triggerEvent.call(player, player.media, 'durationchange');\n });\n\n // Get captions\n player.embed.getTextTracks().then(tracks => {\n player.media.textTracks = tracks;\n captions.setup.call(player);\n });\n\n player.embed.on('cuechange', ({ cues = [] }) => {\n const strippedCues = cues.map(cue => stripHTML(cue.text));\n captions.updateCues.call(player, strippedCues);\n });\n\n player.embed.on('loaded', () => {\n // Assure state and events are updated on autoplay\n player.embed.getPaused().then(paused => {\n assurePlaybackState.call(player, !paused);\n if (!paused) {\n triggerEvent.call(player, player.media, 'playing');\n }\n });\n\n if (is.element(player.embed.element) && player.supported.ui) {\n const frame = player.embed.element;\n\n // Fix keyboard focus issues\n // https://github.com/sampotts/plyr/issues/317\n frame.setAttribute('tabindex', -1);\n }\n });\n\n player.embed.on('play', () => {\n assurePlaybackState.call(player, true);\n triggerEvent.call(player, player.media, 'playing');\n });\n\n player.embed.on('pause', () => {\n assurePlaybackState.call(player, false);\n });\n\n player.embed.on('timeupdate', data => {\n player.media.seeking = false;\n currentTime = data.seconds;\n triggerEvent.call(player, player.media, 'timeupdate');\n });\n\n player.embed.on('progress', data => {\n player.media.buffered = data.percent;\n triggerEvent.call(player, player.media, 'progress');\n\n // Check all loaded\n if (parseInt(data.percent, 10) === 1) {\n triggerEvent.call(player, player.media, 'canplaythrough');\n }\n\n // Get duration as if we do it before load, it gives an incorrect value\n // https://github.com/sampotts/plyr/issues/891\n player.embed.getDuration().then(value => {\n if (value !== player.media.duration) {\n player.media.duration = value;\n triggerEvent.call(player, player.media, 'durationchange');\n }\n });\n });\n\n player.embed.on('seeked', () => {\n player.media.seeking = false;\n triggerEvent.call(player, player.media, 'seeked');\n });\n\n player.embed.on('ended', () => {\n player.media.paused = true;\n triggerEvent.call(player, player.media, 'ended');\n });\n\n player.embed.on('error', detail => {\n player.media.error = detail;\n triggerEvent.call(player, player.media, 'error');\n });\n\n // Rebuild UI\n setTimeout(() => ui.build.call(player), 0);\n },\n};\n\nexport default vimeo;\n","// ==========================================================================\n// YouTube plugin\n// ==========================================================================\n\nimport controls from './../controls';\nimport ui from './../ui';\nimport { dedupe } from './../utils/arrays';\nimport { createElement, replaceElement, toggleClass } from './../utils/elements';\nimport { triggerEvent } from './../utils/events';\nimport fetch from './../utils/fetch';\nimport is from './../utils/is';\nimport loadImage from './../utils/loadImage';\nimport loadScript from './../utils/loadScript';\nimport { format, generateId } from './../utils/strings';\n\n// Parse YouTube ID from URL\nfunction parseId(url) {\n if (is.empty(url)) {\n return null;\n }\n\n const regex = /^.*(youtu.be\\/|v\\/|u\\/\\w\\/|embed\\/|watch\\?v=|&v=)([^#&?]*).*/;\n return url.match(regex) ? RegExp.$2 : url;\n}\n\n// Standardise YouTube quality unit\nfunction mapQualityUnit(input) {\n const qualities = {\n hd2160: 2160,\n hd1440: 1440,\n hd1080: 1080,\n hd720: 720,\n large: 480,\n medium: 360,\n small: 240,\n tiny: 144,\n };\n\n const entry = Object.entries(qualities).find(entry => entry.includes(input));\n\n if (entry) {\n // Get the match corresponding to the input\n return entry.find(value => value !== input);\n }\n\n return 'default';\n}\n\nfunction mapQualityUnits(levels) {\n if (is.empty(levels)) {\n return levels;\n }\n\n return dedupe(levels.map(level => mapQualityUnit(level)));\n}\n\n// Set playback state and trigger change (only on actual change)\nfunction assurePlaybackState(play) {\n if (play && !this.embed.hasPlayed) {\n this.embed.hasPlayed = true;\n }\n if (this.media.paused === play) {\n this.media.paused = !play;\n triggerEvent.call(this, this.media, play ? 'play' : 'pause');\n }\n}\n\nconst youtube = {\n setup() {\n // Add embed class for responsive\n toggleClass(this.elements.wrapper, this.config.classNames.embed, true);\n\n // Set aspect ratio\n youtube.setAspectRatio.call(this);\n\n // Setup API\n if (is.object(window.YT) && is.function(window.YT.Player)) {\n youtube.ready.call(this);\n } else {\n // Load the API\n loadScript(this.config.urls.youtube.sdk).catch(error => {\n this.debug.warn('YouTube API failed to load', error);\n });\n\n // Setup callback for the API\n // YouTube has it's own system of course...\n window.onYouTubeReadyCallbacks = window.onYouTubeReadyCallbacks || [];\n\n // Add to queue\n window.onYouTubeReadyCallbacks.push(() => {\n youtube.ready.call(this);\n });\n\n // Set callback to process queue\n window.onYouTubeIframeAPIReady = () => {\n window.onYouTubeReadyCallbacks.forEach(callback => {\n callback();\n });\n };\n }\n },\n\n // Get the media title\n getTitle(videoId) {\n // Try via undocumented API method first\n // This method disappears now and then though...\n // https://github.com/sampotts/plyr/issues/709\n if (is.function(this.embed.getVideoData)) {\n const { title } = this.embed.getVideoData();\n\n if (is.empty(title)) {\n this.config.title = title;\n ui.setTitle.call(this);\n return;\n }\n }\n\n // Or via Google API\n const key = this.config.keys.google;\n if (is.string(key) && !is.empty(key)) {\n const url = format(this.config.urls.youtube.api, videoId, key);\n\n fetch(url)\n .then(result => {\n if (is.object(result)) {\n this.config.title = result.items[0].snippet.title;\n ui.setTitle.call(this);\n }\n })\n .catch(() => {});\n }\n },\n\n // Set aspect ratio\n setAspectRatio() {\n const ratio = this.config.ratio.split(':');\n this.elements.wrapper.style.paddingBottom = `${100 / ratio[0] * ratio[1]}%`;\n },\n\n // API ready\n ready() {\n const player = this;\n\n // Ignore already setup (race condition)\n const currentId = player.media.getAttribute('id');\n if (!is.empty(currentId) && currentId.startsWith('youtube-')) {\n return;\n }\n\n // Get the source URL or ID\n let source = player.media.getAttribute('src');\n\n // Get from <div> if needed\n if (is.empty(source)) {\n source = player.media.getAttribute(this.config.attributes.embed.id);\n }\n\n // Replace the <iframe> with a <div> due to YouTube API issues\n const videoId = parseId(source);\n const id = generateId(player.provider);\n\n // Get poster, if already set\n const { poster } = player;\n\n // Replace media element\n const container = createElement('div', { id, poster });\n player.media = replaceElement(container, player.media);\n\n // Id to poster wrapper\n const posterSrc = format => `https://img.youtube.com/vi/${videoId}/${format}default.jpg`;\n\n // Check thumbnail images in order of quality, but reject fallback thumbnails (120px wide)\n loadImage(posterSrc('maxres'), 121) // Higest quality and unpadded\n .catch(() => loadImage(posterSrc('sd'), 121)) // 480p padded 4:3\n .catch(() => loadImage(posterSrc('hq'))) // 360p padded 4:3. Always exists\n .then(image => ui.setPoster.call(player, image.src))\n .then(posterSrc => {\n // If the image is padded, use background-size \"cover\" instead (like youtube does too with their posters)\n if (!posterSrc.includes('maxres')) {\n player.elements.poster.style.backgroundSize = 'cover';\n }\n })\n .catch(() => {});\n\n // Setup instance\n // https://developers.google.com/youtube/iframe_api_reference\n player.embed = new window.YT.Player(id, {\n videoId,\n playerVars: {\n autoplay: player.config.autoplay ? 1 : 0, // Autoplay\n controls: player.supported.ui ? 0 : 1, // Only show controls if not fully supported\n rel: 0, // No related vids\n showinfo: 0, // Hide info\n iv_load_policy: 3, // Hide annotations\n modestbranding: 1, // Hide logos as much as possible (they still show one in the corner when paused)\n disablekb: 1, // Disable keyboard as we handle it\n playsinline: 1, // Allow iOS inline playback\n\n // Tracking for stats\n // origin: window ? `${window.location.protocol}//${window.location.host}` : null,\n widget_referrer: window ? window.location.href : null,\n\n // Captions are flaky on YouTube\n cc_load_policy: player.captions.active ? 1 : 0,\n cc_lang_pref: player.config.captions.language,\n },\n events: {\n onError(event) {\n // YouTube may fire onError twice, so only handle it once\n if (!player.media.error) {\n const code = event.data;\n // Messages copied from https://developers.google.com/youtube/iframe_api_reference#onError\n const message =\n {\n 2: 'The request contains an invalid parameter value. For example, this error occurs if you specify a video ID that does not have 11 characters, or if the video ID contains invalid characters, such as exclamation points or asterisks.',\n 5: 'The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.',\n 100: 'The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.',\n 101: 'The owner of the requested video does not allow it to be played in embedded players.',\n 150: 'The owner of the requested video does not allow it to be played in embedded players.',\n }[code] || 'An unknown error occured';\n\n player.media.error = { code, message };\n\n triggerEvent.call(player, player.media, 'error');\n }\n },\n onPlaybackQualityChange() {\n triggerEvent.call(player, player.media, 'qualitychange', false, {\n quality: player.media.quality,\n });\n },\n onPlaybackRateChange(event) {\n // Get the instance\n const instance = event.target;\n\n // Get current speed\n player.media.playbackRate = instance.getPlaybackRate();\n\n triggerEvent.call(player, player.media, 'ratechange');\n },\n onReady(event) {\n // Get the instance\n const instance = event.target;\n\n // Get the title\n youtube.getTitle.call(player, videoId);\n\n // Create a faux HTML5 API using the YouTube API\n player.media.play = () => {\n assurePlaybackState.call(player, true);\n instance.playVideo();\n };\n\n player.media.pause = () => {\n assurePlaybackState.call(player, false);\n instance.pauseVideo();\n };\n\n player.media.stop = () => {\n instance.stopVideo();\n };\n\n player.media.duration = instance.getDuration();\n player.media.paused = true;\n\n // Seeking\n player.media.currentTime = 0;\n Object.defineProperty(player.media, 'currentTime', {\n get() {\n return Number(instance.getCurrentTime());\n },\n set(time) {\n // If paused, mute audio preventively (YouTube starts playing on seek if the video hasn't been played yet).\n if (player.paused) {\n player.embed.mute();\n }\n\n // Set seeking state and trigger event\n player.media.seeking = true;\n triggerEvent.call(player, player.media, 'seeking');\n\n // Seek after events sent\n instance.seekTo(time);\n },\n });\n\n // Playback speed\n Object.defineProperty(player.media, 'playbackRate', {\n get() {\n return instance.getPlaybackRate();\n },\n set(input) {\n instance.setPlaybackRate(input);\n },\n });\n\n // Quality\n Object.defineProperty(player.media, 'quality', {\n get() {\n return mapQualityUnit(instance.getPlaybackQuality());\n },\n set(input) {\n instance.setPlaybackQuality(mapQualityUnit(input));\n },\n });\n\n // Volume\n let { volume } = player.config;\n Object.defineProperty(player.media, 'volume', {\n get() {\n return volume;\n },\n set(input) {\n volume = input;\n instance.setVolume(volume * 100);\n triggerEvent.call(player, player.media, 'volumechange');\n },\n });\n\n // Muted\n let { muted } = player.config;\n Object.defineProperty(player.media, 'muted', {\n get() {\n return muted;\n },\n set(input) {\n const toggle = is.boolean(input) ? input : muted;\n muted = toggle;\n instance[toggle ? 'mute' : 'unMute']();\n triggerEvent.call(player, player.media, 'volumechange');\n },\n });\n\n // Source\n Object.defineProperty(player.media, 'currentSrc', {\n get() {\n return instance.getVideoUrl();\n },\n });\n\n // Ended\n Object.defineProperty(player.media, 'ended', {\n get() {\n return player.currentTime === player.duration;\n },\n });\n\n // Get available speeds\n player.options.speed = instance.getAvailablePlaybackRates();\n\n // Set the tabindex to avoid focus entering iframe\n if (player.supported.ui) {\n player.media.setAttribute('tabindex', -1);\n }\n\n triggerEvent.call(player, player.media, 'timeupdate');\n triggerEvent.call(player, player.media, 'durationchange');\n\n // Reset timer\n clearInterval(player.timers.buffering);\n\n // Setup buffering\n player.timers.buffering = setInterval(() => {\n // Get loaded % from YouTube\n player.media.buffered = instance.getVideoLoadedFraction();\n\n // Trigger progress only when we actually buffer something\n if (player.media.lastBuffered === null || player.media.lastBuffered < player.media.buffered) {\n triggerEvent.call(player, player.media, 'progress');\n }\n\n // Set last buffer point\n player.media.lastBuffered = player.media.buffered;\n\n // Bail if we're at 100%\n if (player.media.buffered === 1) {\n clearInterval(player.timers.buffering);\n\n // Trigger event\n triggerEvent.call(player, player.media, 'canplaythrough');\n }\n }, 200);\n\n // Rebuild UI\n setTimeout(() => ui.build.call(player), 50);\n },\n onStateChange(event) {\n // Get the instance\n const instance = event.target;\n\n // Reset timer\n clearInterval(player.timers.playing);\n\n const seeked = player.media.seeking && [1, 2].includes(event.data);\n\n if (seeked) {\n // Unset seeking and fire seeked event\n player.media.seeking = false;\n triggerEvent.call(player, player.media, 'seeked');\n }\n\n // Handle events\n // -1 Unstarted\n // 0 Ended\n // 1 Playing\n // 2 Paused\n // 3 Buffering\n // 5 Video cued\n switch (event.data) {\n case -1:\n // Update scrubber\n triggerEvent.call(player, player.media, 'timeupdate');\n\n // Get loaded % from YouTube\n player.media.buffered = instance.getVideoLoadedFraction();\n triggerEvent.call(player, player.media, 'progress');\n\n break;\n\n case 0:\n assurePlaybackState.call(player, false);\n\n // YouTube doesn't support loop for a single video, so mimick it.\n if (player.media.loop) {\n // YouTube needs a call to `stopVideo` before playing again\n instance.stopVideo();\n instance.playVideo();\n } else {\n triggerEvent.call(player, player.media, 'ended');\n }\n\n break;\n\n case 1:\n // Restore paused state (YouTube starts playing on seek if the video hasn't been played yet)\n if (player.media.paused && !player.embed.hasPlayed) {\n player.media.pause();\n } else {\n assurePlaybackState.call(player, true);\n\n triggerEvent.call(player, player.media, 'playing');\n\n // Poll to get playback progress\n player.timers.playing = setInterval(() => {\n triggerEvent.call(player, player.media, 'timeupdate');\n }, 50);\n\n // Check duration again due to YouTube bug\n // https://github.com/sampotts/plyr/issues/374\n // https://code.google.com/p/gdata-issues/issues/detail?id=8690\n if (player.media.duration !== instance.getDuration()) {\n player.media.duration = instance.getDuration();\n triggerEvent.call(player, player.media, 'durationchange');\n }\n\n // Get quality\n controls.setQualityMenu.call(\n player,\n mapQualityUnits(instance.getAvailableQualityLevels()),\n );\n }\n\n break;\n\n case 2:\n // Restore audio (YouTube starts playing on seek if the video hasn't been played yet)\n if (!player.muted) {\n player.embed.unMute();\n }\n assurePlaybackState.call(player, false);\n\n break;\n\n default:\n break;\n }\n\n triggerEvent.call(player, player.elements.container, 'statechange', false, {\n code: event.data,\n });\n },\n },\n });\n },\n};\n\nexport default youtube;\n","// ==========================================================================\n// Plyr Media\n// ==========================================================================\n\nimport html5 from './html5';\nimport vimeo from './plugins/vimeo';\nimport youtube from './plugins/youtube';\nimport { createElement, toggleClass, wrap } from './utils/elements';\n\nconst media = {\n // Setup media\n setup() {\n // If there's no media, bail\n if (!this.media) {\n this.debug.warn('No media element found!');\n return;\n }\n\n // Add type class\n toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', this.type), true);\n\n // Add provider class\n toggleClass(this.elements.container, this.config.classNames.provider.replace('{0}', this.provider), true);\n\n // Add video class for embeds\n // This will require changes if audio embeds are added\n if (this.isEmbed) {\n toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', 'video'), true);\n }\n\n // Inject the player wrapper\n if (this.isVideo) {\n // Create the wrapper div\n this.elements.wrapper = createElement('div', {\n class: this.config.classNames.video,\n });\n\n // Wrap the video in a container\n wrap(this.media, this.elements.wrapper);\n\n // Faux poster container\n this.elements.poster = createElement('div', {\n class: this.config.classNames.poster,\n });\n\n this.elements.wrapper.appendChild(this.elements.poster);\n }\n\n if (this.isHTML5) {\n html5.extend.call(this);\n } else if (this.isYouTube) {\n youtube.setup.call(this);\n } else if (this.isVimeo) {\n vimeo.setup.call(this);\n }\n },\n};\n\nexport default media;\n","// ==========================================================================\n// Advertisement plugin using Google IMA HTML5 SDK\n// Create an account with our ad partner, vi here:\n// https://www.vi.ai/publisher-video-monetization/\n// ==========================================================================\n\n/* global google */\n\nimport i18n from '../i18n';\nimport { createElement } from './../utils/elements';\nimport { triggerEvent } from './../utils/events';\nimport is from './../utils/is';\nimport loadScript from './../utils/loadScript';\nimport { formatTime } from './../utils/time';\nimport { buildUrlParams } from './../utils/urls';\n\nclass Ads {\n /**\n * Ads constructor.\n * @param {object} player\n * @return {Ads}\n */\n constructor(player) {\n this.player = player;\n this.publisherId = player.config.ads.publisherId;\n this.playing = false;\n this.initialized = false;\n this.elements = {\n container: null,\n displayContainer: null,\n };\n this.manager = null;\n this.loader = null;\n this.cuePoints = null;\n this.events = {};\n this.safetyTimer = null;\n this.countdownTimer = null;\n\n // Setup a promise to resolve when the IMA manager is ready\n this.managerPromise = new Promise((resolve, reject) => {\n // The ad is loaded and ready\n this.on('loaded', resolve);\n\n // Ads failed\n this.on('error', reject);\n });\n\n this.load();\n }\n\n get enabled() {\n return this.player.isVideo && this.player.config.ads.enabled && !is.empty(this.publisherId);\n }\n\n /**\n * Load the IMA SDK\n */\n load() {\n if (this.enabled) {\n // Check if the Google IMA3 SDK is loaded or load it ourselves\n if (!is.object(window.google) || !is.object(window.google.ima)) {\n loadScript(this.player.config.urls.googleIMA.sdk)\n .then(() => {\n this.ready();\n })\n .catch(() => {\n // Script failed to load or is blocked\n this.trigger('error', new Error('Google IMA SDK failed to load'));\n });\n } else {\n this.ready();\n }\n }\n }\n\n /**\n * Get the ads instance ready\n */\n ready() {\n // Start ticking our safety timer. If the whole advertisement\n // thing doesn't resolve within our set time; we bail\n this.startSafetyTimer(12000, 'ready()');\n\n // Clear the safety timer\n this.managerPromise.then(() => {\n this.clearSafetyTimer('onAdsManagerLoaded()');\n });\n\n // Set listeners on the Plyr instance\n this.listeners();\n\n // Setup the IMA SDK\n this.setupIMA();\n }\n\n // Build the default tag URL\n get tagUrl() {\n const params = {\n AV_PUBLISHERID: '58c25bb0073ef448b1087ad6',\n AV_CHANNELID: '5a0458dc28a06145e4519d21',\n AV_URL: location.hostname,\n cb: Date.now(),\n AV_WIDTH: 640,\n AV_HEIGHT: 480,\n AV_CDIM2: this.publisherId,\n };\n\n const base = 'https://go.aniview.com/api/adserver6/vast/';\n\n return `${base}?${buildUrlParams(params)}`;\n }\n\n /**\n * In order for the SDK to display ads for our video, we need to tell it where to put them,\n * so here we define our ad container. This div is set up to render on top of the video player.\n * Using the code below, we tell the SDK to render ads within that div. We also provide a\n * handle to the content video player - the SDK will poll the current time of our player to\n * properly place mid-rolls. After we create the ad display container, we initialize it. On\n * mobile devices, this initialization is done as the result of a user action.\n */\n setupIMA() {\n // Create the container for our advertisements\n this.elements.container = createElement('div', {\n class: this.player.config.classNames.ads,\n });\n this.player.elements.container.appendChild(this.elements.container);\n\n // So we can run VPAID2\n google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED);\n\n // Set language\n google.ima.settings.setLocale(this.player.config.ads.language);\n\n // We assume the adContainer is the video container of the plyr element\n // that will house the ads\n this.elements.displayContainer = new google.ima.AdDisplayContainer(this.elements.container);\n\n // Request video ads to be pre-loaded\n this.requestAds();\n }\n\n /**\n * Request advertisements\n */\n requestAds() {\n const { container } = this.player.elements;\n\n try {\n // Create ads loader\n this.loader = new google.ima.AdsLoader(this.elements.displayContainer);\n\n // Listen and respond to ads loaded and error events\n this.loader.addEventListener(\n google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED,\n event => this.onAdsManagerLoaded(event),\n false,\n );\n this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, error => this.onAdError(error), false);\n\n // Request video ads\n const request = new google.ima.AdsRequest();\n request.adTagUrl = this.tagUrl;\n\n // Specify the linear and nonlinear slot sizes. This helps the SDK\n // to select the correct creative if multiple are returned\n request.linearAdSlotWidth = container.offsetWidth;\n request.linearAdSlotHeight = container.offsetHeight;\n request.nonLinearAdSlotWidth = container.offsetWidth;\n request.nonLinearAdSlotHeight = container.offsetHeight;\n\n // We only overlay ads as we only support video.\n request.forceNonLinearFullSlot = false;\n\n // Mute based on current state\n request.setAdWillPlayMuted(!this.player.muted);\n\n this.loader.requestAds(request);\n } catch (e) {\n this.onAdError(e);\n }\n }\n\n /**\n * Update the ad countdown\n * @param {boolean} start\n */\n pollCountdown(start = false) {\n if (!start) {\n clearInterval(this.countdownTimer);\n this.elements.container.removeAttribute('data-badge-text');\n return;\n }\n\n const update = () => {\n const time = formatTime(Math.max(this.manager.getRemainingTime(), 0));\n const label = `${i18n.get('advertisement', this.player.config)} - ${time}`;\n this.elements.container.setAttribute('data-badge-text', label);\n };\n\n this.countdownTimer = setInterval(update, 100);\n }\n\n /**\n * This method is called whenever the ads are ready inside the AdDisplayContainer\n * @param {Event} adsManagerLoadedEvent\n */\n onAdsManagerLoaded(event) {\n // Get the ads manager\n const settings = new google.ima.AdsRenderingSettings();\n\n // Tell the SDK to save and restore content video state on our behalf\n settings.restoreCustomPlaybackStateOnAdBreakComplete = true;\n settings.enablePreloading = true;\n\n // The SDK is polling currentTime on the contentPlayback. And needs a duration\n // so it can determine when to start the mid- and post-roll\n this.manager = event.getAdsManager(this.player, settings);\n\n // Get the cue points for any mid-rolls by filtering out the pre- and post-roll\n this.cuePoints = this.manager.getCuePoints();\n\n // Add advertisement cue's within the time line if available\n if (!is.empty(this.cuePoints)) {\n this.cuePoints.forEach(cuePoint => {\n if (cuePoint !== 0 && cuePoint !== -1 && cuePoint < this.player.duration) {\n const seekElement = this.player.elements.progress;\n\n if (is.element(seekElement)) {\n const cuePercentage = 100 / this.player.duration * cuePoint;\n const cue = createElement('span', {\n class: this.player.config.classNames.cues,\n });\n\n cue.style.left = `${cuePercentage.toString()}%`;\n seekElement.appendChild(cue);\n }\n }\n });\n }\n\n // Get skippable state\n // TODO: Skip button\n // this.player.debug.warn(this.manager.getAdSkippableState());\n\n // Set volume to match player\n this.manager.setVolume(this.player.volume);\n\n // Add listeners to the required events\n // Advertisement error events\n this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, error => this.onAdError(error));\n\n // Advertisement regular events\n Object.keys(google.ima.AdEvent.Type).forEach(type => {\n this.manager.addEventListener(google.ima.AdEvent.Type[type], event => this.onAdEvent(event));\n });\n\n // Resolve our adsManager\n this.trigger('loaded');\n }\n\n /**\n * This is where all the event handling takes place. Retrieve the ad from the event. Some\n * events (e.g. ALL_ADS_COMPLETED) don't have the ad object associated\n * https://developers.google.com/interactive-media-ads/docs/sdks/html5/v3/apis#ima.AdEvent.Type\n * @param {Event} event\n */\n onAdEvent(event) {\n const { container } = this.player.elements;\n\n // Retrieve the ad from the event. Some events (e.g. ALL_ADS_COMPLETED)\n // don't have ad object associated\n const ad = event.getAd();\n\n // Proxy event\n const dispatchEvent = type => {\n const event = `ads${type.replace(/_/g, '').toLowerCase()}`;\n triggerEvent.call(this.player, this.player.media, event);\n };\n\n switch (event.type) {\n case google.ima.AdEvent.Type.LOADED:\n // This is the first event sent for an ad - it is possible to determine whether the\n // ad is a video ad or an overlay\n this.trigger('loaded');\n\n // Bubble event\n dispatchEvent(event.type);\n\n // Start countdown\n this.pollCountdown(true);\n\n if (!ad.isLinear()) {\n // Position AdDisplayContainer correctly for overlay\n ad.width = container.offsetWidth;\n ad.height = container.offsetHeight;\n }\n\n // console.info('Ad type: ' + event.getAd().getAdPodInfo().getPodIndex());\n // console.info('Ad time: ' + event.getAd().getAdPodInfo().getTimeOffset());\n break;\n\n case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:\n // All ads for the current videos are done. We can now request new advertisements\n // in case the video is re-played\n\n // Fire event\n dispatchEvent(event.type);\n\n // TODO: Example for what happens when a next video in a playlist would be loaded.\n // So here we load a new video when all ads are done.\n // Then we load new ads within a new adsManager. When the video\n // Is started - after - the ads are loaded, then we get ads.\n // You can also easily test cancelling and reloading by running\n // player.ads.cancel() and player.ads.play from the console I guess.\n // this.player.source = {\n // type: 'video',\n // title: 'View From A Blue Moon',\n // sources: [{\n // src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.mp4', type:\n // 'video/mp4', }], poster:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg', tracks:\n // [ { kind: 'captions', label: 'English', srclang: 'en', src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt',\n // default: true, }, { kind: 'captions', label: 'French', srclang: 'fr', src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt', }, ],\n // };\n\n // TODO: So there is still this thing where a video should only be allowed to start\n // playing when the IMA SDK is ready or has failed\n\n this.loadAds();\n break;\n\n case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:\n // This event indicates the ad has started - the video player can adjust the UI,\n // for example display a pause button and remaining time. Fired when content should\n // be paused. This usually happens right before an ad is about to cover the content\n\n dispatchEvent(event.type);\n\n this.pauseContent();\n\n break;\n\n case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:\n // This event indicates the ad has finished - the video player can perform\n // appropriate UI actions, such as removing the timer for remaining time detection.\n // Fired when content should be resumed. This usually happens when an ad finishes\n // or collapses\n\n dispatchEvent(event.type);\n\n this.pollCountdown();\n\n this.resumeContent();\n\n break;\n\n case google.ima.AdEvent.Type.STARTED:\n case google.ima.AdEvent.Type.MIDPOINT:\n case google.ima.AdEvent.Type.COMPLETE:\n case google.ima.AdEvent.Type.IMPRESSION:\n case google.ima.AdEvent.Type.CLICK:\n dispatchEvent(event.type);\n break;\n\n default:\n break;\n }\n }\n\n /**\n * Any ad error handling comes through here\n * @param {Event} event\n */\n onAdError(event) {\n this.cancel();\n this.player.debug.warn('Ads error', event);\n }\n\n /**\n * Setup hooks for Plyr and window events. This ensures\n * the mid- and post-roll launch at the correct time. And\n * resize the advertisement when the player resizes\n */\n listeners() {\n const { container } = this.player.elements;\n let time;\n\n // Add listeners to the required events\n this.player.on('ended', () => {\n this.loader.contentComplete();\n });\n\n this.player.on('seeking', () => {\n time = this.player.currentTime;\n return time;\n });\n\n this.player.on('seeked', () => {\n const seekedTime = this.player.currentTime;\n\n if (is.empty(this.cuePoints)) {\n return;\n }\n\n this.cuePoints.forEach((cuePoint, index) => {\n if (time < cuePoint && cuePoint < seekedTime) {\n this.manager.discardAdBreak();\n this.cuePoints.splice(index, 1);\n }\n });\n });\n\n // Listen to the resizing of the window. And resize ad accordingly\n // TODO: eventually implement ResizeObserver\n window.addEventListener('resize', () => {\n if (this.manager) {\n this.manager.resize(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);\n }\n });\n }\n\n /**\n * Initialize the adsManager and start playing advertisements\n */\n play() {\n const { container } = this.player.elements;\n\n if (!this.managerPromise) {\n this.resumeContent();\n }\n\n // Play the requested advertisement whenever the adsManager is ready\n this.managerPromise\n .then(() => {\n // Initialize the container. Must be done via a user action on mobile devices\n this.elements.displayContainer.initialize();\n\n try {\n if (!this.initialized) {\n // Initialize the ads manager. Ad rules playlist will start at this time\n this.manager.init(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);\n\n // Call play to start showing the ad. Single video and overlay ads will\n // start at this time; the call will be ignored for ad rules\n this.manager.start();\n }\n\n this.initialized = true;\n } catch (adError) {\n // An error may be thrown if there was a problem with the\n // VAST response\n this.onAdError(adError);\n }\n })\n .catch(() => {});\n }\n\n /**\n * Resume our video\n */\n resumeContent() {\n // Hide the advertisement container\n this.elements.container.style.zIndex = '';\n\n // Ad is stopped\n this.playing = false;\n\n // Play our video\n if (this.player.currentTime < this.player.duration) {\n this.player.play();\n }\n }\n\n /**\n * Pause our video\n */\n pauseContent() {\n // Show the advertisement container\n this.elements.container.style.zIndex = 3;\n\n // Ad is playing.\n this.playing = true;\n\n // Pause our video.\n this.player.pause();\n }\n\n /**\n * Destroy the adsManager so we can grab new ads after this. If we don't then we're not\n * allowed to call new ads based on google policies, as they interpret this as an accidental\n * video requests. https://developers.google.com/interactive-\n * media-ads/docs/sdks/android/faq#8\n */\n cancel() {\n // Pause our video\n if (this.initialized) {\n this.resumeContent();\n }\n\n // Tell our instance that we're done for now\n this.trigger('error');\n\n // Re-create our adsManager\n this.loadAds();\n }\n\n /**\n * Re-create our adsManager\n */\n loadAds() {\n // Tell our adsManager to go bye bye\n this.managerPromise\n .then(() => {\n // Destroy our adsManager\n if (this.manager) {\n this.manager.destroy();\n }\n\n // Re-set our adsManager promises\n this.managerPromise = new Promise(resolve => {\n this.on('loaded', resolve);\n this.player.debug.log(this.manager);\n });\n\n // Now request some new advertisements\n this.requestAds();\n })\n .catch(() => {});\n }\n\n /**\n * Handles callbacks after an ad event was invoked\n * @param {string} event - Event type\n */\n trigger(event, ...args) {\n const handlers = this.events[event];\n\n if (is.array(handlers)) {\n handlers.forEach(handler => {\n if (is.function(handler)) {\n handler.apply(this, args);\n }\n });\n }\n }\n\n /**\n * Add event listeners\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n * @return {Ads}\n */\n on(event, callback) {\n if (!is.array(this.events[event])) {\n this.events[event] = [];\n }\n\n this.events[event].push(callback);\n\n return this;\n }\n\n /**\n * Setup a safety timer for when the ad network doesn't respond for whatever reason.\n * The advertisement has 12 seconds to get its things together. We stop this timer when the\n * advertisement is playing, or when a user action is required to start, then we clear the\n * timer on ad ready\n * @param {number} time\n * @param {string} from\n */\n startSafetyTimer(time, from) {\n this.player.debug.log(`Safety timer invoked from: ${from}`);\n\n this.safetyTimer = setTimeout(() => {\n this.cancel();\n this.clearSafetyTimer('startSafetyTimer()');\n }, time);\n }\n\n /**\n * Clear our safety timer(s)\n * @param {string} from\n */\n clearSafetyTimer(from) {\n if (!is.nullOrUndefined(this.safetyTimer)) {\n this.player.debug.log(`Safety timer cleared from: ${from}`);\n\n clearTimeout(this.safetyTimer);\n this.safetyTimer = null;\n }\n }\n}\n\nexport default Ads;\n","// ==========================================================================\n// Plyr source update\n// ==========================================================================\n\nimport { providers } from './config/types';\nimport html5 from './html5';\nimport media from './media';\nimport support from './support';\nimport ui from './ui';\nimport { createElement, insertElement, removeElement } from './utils/elements';\nimport is from './utils/is';\nimport { getDeep } from './utils/objects';\n\nconst source = {\n // Add elements to HTML5 media (source, tracks, etc)\n insertElements(type, attributes) {\n if (is.string(attributes)) {\n insertElement(type, this.media, {\n src: attributes,\n });\n } else if (is.array(attributes)) {\n attributes.forEach(attribute => {\n insertElement(type, this.media, attribute);\n });\n }\n },\n\n // Update source\n // Sources are not checked for support so be careful\n change(input) {\n if (!getDeep(input, 'sources.length')) {\n this.debug.warn('Invalid source format');\n return;\n }\n\n // Cancel current network requests\n html5.cancelRequests.call(this);\n\n // Destroy instance and re-setup\n this.destroy.call(\n this,\n () => {\n // Reset quality options\n this.options.quality = [];\n\n // Remove elements\n removeElement(this.media);\n this.media = null;\n\n // Reset class name\n if (is.element(this.elements.container)) {\n this.elements.container.removeAttribute('class');\n }\n\n // Set the type and provider\n const { sources, type } = input;\n const [{ provider = providers.html5, src }] = sources;\n const tagName = provider === 'html5' ? type : 'div';\n const attributes = provider === 'html5' ? {} : { src };\n\n Object.assign(this, {\n provider,\n type,\n // Check for support\n supported: support.check(type, provider, this.config.playsinline),\n // Create new element\n media: createElement(tagName, attributes),\n });\n\n // Inject the new element\n this.elements.container.appendChild(this.media);\n\n // Autoplay the new source?\n if (is.boolean(input.autoplay)) {\n this.config.autoplay = input.autoplay;\n }\n\n // Set attributes for audio and video\n if (this.isHTML5) {\n if (this.config.crossorigin) {\n this.media.setAttribute('crossorigin', '');\n }\n if (this.config.autoplay) {\n this.media.setAttribute('autoplay', '');\n }\n if (!is.empty(input.poster)) {\n this.poster = input.poster;\n }\n if (this.config.loop.active) {\n this.media.setAttribute('loop', '');\n }\n if (this.config.muted) {\n this.media.setAttribute('muted', '');\n }\n if (this.config.playsinline) {\n this.media.setAttribute('playsinline', '');\n }\n }\n\n // Restore class hook\n ui.addStyleHook.call(this);\n\n // Set new sources for html5\n if (this.isHTML5) {\n source.insertElements.call(this, 'source', sources);\n }\n\n // Set video title\n this.config.title = input.title;\n\n // Set up from scratch\n media.setup.call(this);\n\n // HTML5 stuff\n if (this.isHTML5) {\n // Setup captions\n if ('tracks' in input) {\n source.insertElements.call(this, 'track', input.tracks);\n }\n\n // Load HTML5 sources\n this.media.load();\n }\n\n // If HTML5 or embed but not fully supported, setupInterface and call ready now\n if (this.isHTML5 || (this.isEmbed && !this.supported.ui)) {\n // Setup interface\n ui.build.call(this);\n }\n\n // Update the fullscreen support\n this.fullscreen.update();\n },\n true,\n );\n },\n};\n\nexport default source;\n","// ==========================================================================\n// Plyr\n// plyr.js v3.3.12\n// https://github.com/sampotts/plyr\n// License: The MIT License (MIT)\n// ==========================================================================\n\nimport captions from './captions';\nimport defaults from './config/defaults';\nimport { getProviderByUrl, providers, types } from './config/types';\nimport Console from './console';\nimport controls from './controls';\nimport Fullscreen from './fullscreen';\nimport Listeners from './listeners';\nimport media from './media';\nimport Ads from './plugins/ads';\nimport source from './source';\nimport Storage from './storage';\nimport support from './support';\nimport ui from './ui';\nimport { closest } from './utils/arrays';\nimport { createElement, hasClass, removeElement, replaceElement, toggleClass, wrap } from './utils/elements';\nimport { off, on, once, triggerEvent, unbindListeners } from './utils/events';\nimport is from './utils/is';\nimport loadSprite from './utils/loadSprite';\nimport { cloneDeep, extend } from './utils/objects';\nimport { parseUrl } from './utils/urls';\n\n// Private properties\n// TODO: Use a WeakMap for private globals\n// const globals = new WeakMap();\n\n// Plyr instance\nclass Plyr {\n constructor(target, options) {\n this.timers = {};\n\n // State\n this.ready = false;\n this.loading = false;\n this.failed = false;\n\n // Touch device\n this.touch = support.touch;\n\n // Set the media element\n this.media = target;\n\n // String selector passed\n if (is.string(this.media)) {\n this.media = document.querySelectorAll(this.media);\n }\n\n // jQuery, NodeList or Array passed, use first element\n if ((window.jQuery && this.media instanceof jQuery) || is.nodeList(this.media) || is.array(this.media)) {\n // eslint-disable-next-line\n this.media = this.media[0];\n }\n\n // Set config\n this.config = extend(\n {},\n defaults,\n Plyr.defaults,\n options || {},\n (() => {\n try {\n return JSON.parse(this.media.getAttribute('data-plyr-config'));\n } catch (e) {\n return {};\n }\n })(),\n );\n\n // Elements cache\n this.elements = {\n container: null,\n buttons: {},\n display: {},\n progress: {},\n inputs: {},\n settings: {\n menu: null,\n panes: {},\n tabs: {},\n },\n captions: null,\n };\n\n // Captions\n this.captions = {\n active: null,\n currentTrack: -1,\n meta: new WeakMap(),\n };\n\n // Fullscreen\n this.fullscreen = {\n active: false,\n };\n\n // Options\n this.options = {\n speed: [],\n quality: [],\n };\n\n // Debugging\n // TODO: move to globals\n this.debug = new Console(this.config.debug);\n\n // Log config options and support\n this.debug.log('Config', this.config);\n this.debug.log('Support', support);\n\n // We need an element to setup\n if (is.nullOrUndefined(this.media) || !is.element(this.media)) {\n this.debug.error('Setup failed: no suitable element passed');\n return;\n }\n\n // Bail if the element is initialized\n if (this.media.plyr) {\n this.debug.warn('Target already setup');\n return;\n }\n\n // Bail if not enabled\n if (!this.config.enabled) {\n this.debug.error('Setup failed: disabled by config');\n return;\n }\n\n // Bail if disabled or no basic support\n // You may want to disable certain UAs etc\n if (!support.check().api) {\n this.debug.error('Setup failed: no support');\n return;\n }\n\n // Cache original element state for .destroy()\n const clone = this.media.cloneNode(true);\n clone.autoplay = false;\n this.elements.original = clone;\n\n // Set media type based on tag or data attribute\n // Supported: video, audio, vimeo, youtube\n const type = this.media.tagName.toLowerCase();\n\n // Embed properties\n let iframe = null;\n let url = null;\n\n // Different setup based on type\n switch (type) {\n case 'div':\n // Find the frame\n iframe = this.media.querySelector('iframe');\n\n // <iframe> type\n if (is.element(iframe)) {\n // Detect provider\n url = parseUrl(iframe.getAttribute('src'));\n this.provider = getProviderByUrl(url.toString());\n\n // Rework elements\n this.elements.container = this.media;\n this.media = iframe;\n\n // Reset classname\n this.elements.container.className = '';\n\n // Get attributes from URL and set config\n if (url.searchParams.length) {\n const truthy = ['1', 'true'];\n\n if (truthy.includes(url.searchParams.get('autoplay'))) {\n this.config.autoplay = true;\n }\n if (truthy.includes(url.searchParams.get('loop'))) {\n this.config.loop.active = true;\n }\n\n // TODO: replace fullscreen.iosNative with this playsinline config option\n // YouTube requires the playsinline in the URL\n if (this.isYouTube) {\n this.config.playsinline = truthy.includes(url.searchParams.get('playsinline'));\n } else {\n this.config.playsinline = true;\n }\n }\n } else {\n // <div> with attributes\n this.provider = this.media.getAttribute(this.config.attributes.embed.provider);\n\n // Remove attribute\n this.media.removeAttribute(this.config.attributes.embed.provider);\n }\n\n // Unsupported or missing provider\n if (is.empty(this.provider) || !Object.keys(providers).includes(this.provider)) {\n this.debug.error('Setup failed: Invalid provider');\n return;\n }\n\n // Audio will come later for external providers\n this.type = types.video;\n\n break;\n\n case 'video':\n case 'audio':\n this.type = type;\n this.provider = providers.html5;\n\n // Get config from attributes\n if (this.media.hasAttribute('crossorigin')) {\n this.config.crossorigin = true;\n }\n if (this.media.hasAttribute('autoplay')) {\n this.config.autoplay = true;\n }\n if (this.media.hasAttribute('playsinline')) {\n this.config.playsinline = true;\n }\n if (this.media.hasAttribute('muted')) {\n this.config.muted = true;\n }\n if (this.media.hasAttribute('loop')) {\n this.config.loop.active = true;\n }\n\n break;\n\n default:\n this.debug.error('Setup failed: unsupported type');\n return;\n }\n\n // Check for support again but with type\n this.supported = support.check(this.type, this.provider, this.config.playsinline);\n\n // If no support for even API, bail\n if (!this.supported.api) {\n this.debug.error('Setup failed: no support');\n return;\n }\n\n this.eventListeners = [];\n\n // Create listeners\n this.listeners = new Listeners(this);\n\n // Setup local storage for user settings\n this.storage = new Storage(this);\n\n // Store reference\n this.media.plyr = this;\n\n // Wrap media\n if (!is.element(this.elements.container)) {\n this.elements.container = createElement('div');\n wrap(this.media, this.elements.container);\n }\n\n // Add style hook\n ui.addStyleHook.call(this);\n\n // Setup media\n media.setup.call(this);\n\n // Listen for events if debugging\n if (this.config.debug) {\n on.call(this, this.elements.container, this.config.events.join(' '), event => {\n this.debug.log(`event: ${event.type}`);\n });\n }\n\n // Setup interface\n // If embed but not fully supported, build interface now to avoid flash of controls\n if (this.isHTML5 || (this.isEmbed && !this.supported.ui)) {\n ui.build.call(this);\n }\n\n // Container listeners\n this.listeners.container();\n\n // Global listeners\n this.listeners.global();\n\n // Setup fullscreen\n this.fullscreen = new Fullscreen(this);\n\n // Setup ads if provided\n this.ads = new Ads(this);\n\n // Autoplay if required\n if (this.config.autoplay) {\n this.play();\n }\n }\n\n // ---------------------------------------\n // API\n // ---------------------------------------\n\n /**\n * Types and provider helpers\n */\n get isHTML5() {\n return Boolean(this.provider === providers.html5);\n }\n get isEmbed() {\n return Boolean(this.isYouTube || this.isVimeo);\n }\n get isYouTube() {\n return Boolean(this.provider === providers.youtube);\n }\n get isVimeo() {\n return Boolean(this.provider === providers.vimeo);\n }\n get isVideo() {\n return Boolean(this.type === types.video);\n }\n get isAudio() {\n return Boolean(this.type === types.audio);\n }\n\n /**\n * Play the media, or play the advertisement (if they are not blocked)\n */\n play() {\n if (!is.function(this.media.play)) {\n return null;\n }\n\n // Return the promise (for HTML5)\n return this.media.play();\n }\n\n /**\n * Pause the media\n */\n pause() {\n if (!this.playing || !is.function(this.media.pause)) {\n return;\n }\n\n this.media.pause();\n }\n\n /**\n * Get playing state\n */\n get playing() {\n return Boolean(this.ready && !this.paused && !this.ended);\n }\n\n /**\n * Get paused state\n */\n get paused() {\n return Boolean(this.media.paused);\n }\n\n /**\n * Get stopped state\n */\n get stopped() {\n return Boolean(this.paused && this.currentTime === 0);\n }\n\n /**\n * Get ended state\n */\n get ended() {\n return Boolean(this.media.ended);\n }\n\n /**\n * Toggle playback based on current status\n * @param {boolean} input\n */\n togglePlay(input) {\n // Toggle based on current state if nothing passed\n const toggle = is.boolean(input) ? input : !this.playing;\n\n if (toggle) {\n this.play();\n } else {\n this.pause();\n }\n }\n\n /**\n * Stop playback\n */\n stop() {\n if (this.isHTML5) {\n this.pause();\n this.restart();\n } else if (is.function(this.media.stop)) {\n this.media.stop();\n }\n }\n\n /**\n * Restart playback\n */\n restart() {\n this.currentTime = 0;\n }\n\n /**\n * Rewind\n * @param {number} seekTime - how far to rewind in seconds. Defaults to the config.seekTime\n */\n rewind(seekTime) {\n this.currentTime = this.currentTime - (is.number(seekTime) ? seekTime : this.config.seekTime);\n }\n\n /**\n * Fast forward\n * @param {number} seekTime - how far to fast forward in seconds. Defaults to the config.seekTime\n */\n forward(seekTime) {\n this.currentTime = this.currentTime + (is.number(seekTime) ? seekTime : this.config.seekTime);\n }\n\n /**\n * Seek to a time\n * @param {number} input - where to seek to in seconds. Defaults to 0 (the start)\n */\n set currentTime(input) {\n // Bail if media duration isn't available yet\n if (!this.duration) {\n return;\n }\n\n // Validate input\n const inputIsValid = is.number(input) && input > 0;\n\n // Set\n this.media.currentTime = inputIsValid ? Math.min(input, this.duration) : 0;\n\n // Logging\n this.debug.log(`Seeking to ${this.currentTime} seconds`);\n }\n\n /**\n * Get current time\n */\n get currentTime() {\n return Number(this.media.currentTime);\n }\n\n /**\n * Get buffered\n */\n get buffered() {\n const { buffered } = this.media;\n\n // YouTube / Vimeo return a float between 0-1\n if (is.number(buffered)) {\n return buffered;\n }\n\n // HTML5\n // TODO: Handle buffered chunks of the media\n // (i.e. seek to another section buffers only that section)\n if (buffered && buffered.length && this.duration > 0) {\n return buffered.end(0) / this.duration;\n }\n\n return 0;\n }\n\n /**\n * Get seeking status\n */\n get seeking() {\n return Boolean(this.media.seeking);\n }\n\n /**\n * Get the duration of the current media\n */\n get duration() {\n // Faux duration set via config\n const fauxDuration = parseFloat(this.config.duration);\n\n // Media duration can be NaN before the media has loaded\n const duration = (this.media || {}).duration || 0;\n\n // If config duration is funky, use regular duration\n return fauxDuration || duration;\n }\n\n /**\n * Set the player volume\n * @param {number} value - must be between 0 and 1. Defaults to the value from local storage and config.volume if not set in storage\n */\n set volume(value) {\n let volume = value;\n const max = 1;\n const min = 0;\n\n if (is.string(volume)) {\n volume = Number(volume);\n }\n\n // Load volume from storage if no value specified\n if (!is.number(volume)) {\n volume = this.storage.get('volume');\n }\n\n // Use config if all else fails\n if (!is.number(volume)) {\n ({ volume } = this.config);\n }\n\n // Maximum is volumeMax\n if (volume > max) {\n volume = max;\n }\n // Minimum is volumeMin\n if (volume < min) {\n volume = min;\n }\n\n // Update config\n this.config.volume = volume;\n\n // Set the player volume\n this.media.volume = volume;\n\n // If muted, and we're increasing volume manually, reset muted state\n if (!is.empty(value) && this.muted && volume > 0) {\n this.muted = false;\n }\n }\n\n /**\n * Get the current player volume\n */\n get volume() {\n return Number(this.media.volume);\n }\n\n /**\n * Increase volume\n * @param {boolean} step - How much to decrease by (between 0 and 1)\n */\n increaseVolume(step) {\n const volume = this.media.muted ? 0 : this.volume;\n this.volume = volume + (is.number(step) ? step : 1);\n }\n\n /**\n * Decrease volume\n * @param {boolean} step - How much to decrease by (between 0 and 1)\n */\n decreaseVolume(step) {\n const volume = this.media.muted ? 0 : this.volume;\n this.volume = volume - (is.number(step) ? step : 1);\n }\n\n /**\n * Set muted state\n * @param {boolean} mute\n */\n set muted(mute) {\n let toggle = mute;\n\n // Load muted state from storage\n if (!is.boolean(toggle)) {\n toggle = this.storage.get('muted');\n }\n\n // Use config if all else fails\n if (!is.boolean(toggle)) {\n toggle = this.config.muted;\n }\n\n // Update config\n this.config.muted = toggle;\n\n // Set mute on the player\n this.media.muted = toggle;\n }\n\n /**\n * Get current muted state\n */\n get muted() {\n return Boolean(this.media.muted);\n }\n\n /**\n * Check if the media has audio\n */\n get hasAudio() {\n // Assume yes for all non HTML5 (as we can't tell...)\n if (!this.isHTML5) {\n return true;\n }\n\n if (this.isAudio) {\n return true;\n }\n\n // Get audio tracks\n return (\n Boolean(this.media.mozHasAudio) ||\n Boolean(this.media.webkitAudioDecodedByteCount) ||\n Boolean(this.media.audioTracks && this.media.audioTracks.length)\n );\n }\n\n /**\n * Set playback speed\n * @param {number} speed - the speed of playback (0.5-2.0)\n */\n set speed(input) {\n let speed = null;\n\n if (is.number(input)) {\n speed = input;\n }\n\n if (!is.number(speed)) {\n speed = this.storage.get('speed');\n }\n\n if (!is.number(speed)) {\n speed = this.config.speed.selected;\n }\n\n // Set min/max\n if (speed < 0.1) {\n speed = 0.1;\n }\n if (speed > 2.0) {\n speed = 2.0;\n }\n\n if (!this.config.speed.options.includes(speed)) {\n this.debug.warn(`Unsupported speed (${speed})`);\n return;\n }\n\n // Update config\n this.config.speed.selected = speed;\n\n // Set media speed\n this.media.playbackRate = speed;\n }\n\n /**\n * Get current playback speed\n */\n get speed() {\n return Number(this.media.playbackRate);\n }\n\n /**\n * Set playback quality\n * Currently HTML5 & YouTube only\n * @param {number} input - Quality level\n */\n set quality(input) {\n const config = this.config.quality;\n const options = this.options.quality;\n\n if (!options.length) {\n return;\n }\n\n let quality = [\n !is.empty(input) && Number(input),\n this.storage.get('quality'),\n config.selected,\n config.default,\n ].find(is.number);\n\n if (!options.includes(quality)) {\n const value = closest(options, quality);\n this.debug.warn(`Unsupported quality option: ${quality}, using ${value} instead`);\n quality = value;\n }\n\n // Trigger request event\n triggerEvent.call(this, this.media, 'qualityrequested', false, { quality });\n\n // Update config\n config.selected = quality;\n\n // Set quality\n this.media.quality = quality;\n }\n\n /**\n * Get current quality level\n */\n get quality() {\n return this.media.quality;\n }\n\n /**\n * Toggle loop\n * TODO: Finish fancy new logic. Set the indicator on load as user may pass loop as config\n * @param {boolean} input - Whether to loop or not\n */\n set loop(input) {\n const toggle = is.boolean(input) ? input : this.config.loop.active;\n this.config.loop.active = toggle;\n this.media.loop = toggle;\n\n // Set default to be a true toggle\n /* const type = ['start', 'end', 'all', 'none', 'toggle'].includes(input) ? input : 'toggle';\n\n switch (type) {\n case 'start':\n if (this.config.loop.end && this.config.loop.end <= this.currentTime) {\n this.config.loop.end = null;\n }\n this.config.loop.start = this.currentTime;\n // this.config.loop.indicator.start = this.elements.display.played.value;\n break;\n\n case 'end':\n if (this.config.loop.start >= this.currentTime) {\n return this;\n }\n this.config.loop.end = this.currentTime;\n // this.config.loop.indicator.end = this.elements.display.played.value;\n break;\n\n case 'all':\n this.config.loop.start = 0;\n this.config.loop.end = this.duration - 2;\n this.config.loop.indicator.start = 0;\n this.config.loop.indicator.end = 100;\n break;\n\n case 'toggle':\n if (this.config.loop.active) {\n this.config.loop.start = 0;\n this.config.loop.end = null;\n } else {\n this.config.loop.start = 0;\n this.config.loop.end = this.duration - 2;\n }\n break;\n\n default:\n this.config.loop.start = 0;\n this.config.loop.end = null;\n break;\n } */\n }\n\n /**\n * Get current loop state\n */\n get loop() {\n return Boolean(this.media.loop);\n }\n\n /**\n * Set new media source\n * @param {object} input - The new source object (see docs)\n */\n set source(input) {\n source.change.call(this, input);\n }\n\n /**\n * Get current source\n */\n get source() {\n return this.media.currentSrc;\n }\n\n /**\n * Set the poster image for a video\n * @param {input} - the URL for the new poster image\n */\n set poster(input) {\n if (!this.isVideo) {\n this.debug.warn('Poster can only be set for video');\n return;\n }\n\n ui.setPoster.call(this, input, false).catch(() => {});\n }\n\n /**\n * Get the current poster image\n */\n get poster() {\n if (!this.isVideo) {\n return null;\n }\n\n return this.media.getAttribute('poster');\n }\n\n /**\n * Set the autoplay state\n * @param {boolean} input - Whether to autoplay or not\n */\n set autoplay(input) {\n const toggle = is.boolean(input) ? input : this.config.autoplay;\n this.config.autoplay = toggle;\n }\n\n /**\n * Get the current autoplay state\n */\n get autoplay() {\n return Boolean(this.config.autoplay);\n }\n\n /**\n * Toggle captions\n * @param {boolean} input - Whether to enable captions\n */\n toggleCaptions(input) {\n captions.toggle.call(this, input, false);\n }\n\n /**\n * Set the caption track by index\n * @param {number} - Caption index\n */\n set currentTrack(input) {\n captions.set.call(this, input, false);\n }\n\n /**\n * Get the current caption track index (-1 if disabled)\n */\n get currentTrack() {\n const { toggled, currentTrack } = this.captions;\n return toggled ? currentTrack : -1;\n }\n\n /**\n * Set the wanted language for captions\n * Since tracks can be added later it won't update the actual caption track until there is a matching track\n * @param {string} - Two character ISO language code (e.g. EN, FR, PT, etc)\n */\n set language(input) {\n captions.setLanguage.call(this, input, false);\n }\n\n /**\n * Get the current track's language\n */\n get language() {\n return (captions.getCurrentTrack.call(this) || {}).language;\n }\n\n /**\n * Toggle picture-in-picture playback on WebKit/MacOS\n * TODO: update player with state, support, enabled\n * TODO: detect outside changes\n */\n set pip(input) {\n const states = {\n pip: 'picture-in-picture',\n inline: 'inline',\n };\n\n // Bail if no support\n if (!support.pip) {\n return;\n }\n\n // Toggle based on current state if not passed\n const toggle = is.boolean(input) ? input : this.pip === states.inline;\n\n // Toggle based on current state\n this.media.webkitSetPresentationMode(toggle ? states.pip : states.inline);\n }\n\n /**\n * Get the current picture-in-picture state\n */\n get pip() {\n if (!support.pip) {\n return null;\n }\n\n return this.media.webkitPresentationMode;\n }\n\n /**\n * Trigger the airplay dialog\n * TODO: update player with state, support, enabled\n */\n airplay() {\n // Show dialog if supported\n if (support.airplay) {\n this.media.webkitShowPlaybackTargetPicker();\n }\n }\n\n /**\n * Toggle the player controls\n * @param {boolean} [toggle] - Whether to show the controls\n */\n toggleControls(toggle) {\n // Don't toggle if missing UI support or if it's audio\n if (this.supported.ui && !this.isAudio) {\n // Get state before change\n const isHidden = hasClass(this.elements.container, this.config.classNames.hideControls);\n\n // Negate the argument if not undefined since adding the class to hides the controls\n const force = typeof toggle === 'undefined' ? undefined : !toggle;\n\n // Apply and get updated state\n const hiding = toggleClass(this.elements.container, this.config.classNames.hideControls, force);\n\n // Close menu\n if (hiding && this.config.controls.includes('settings') && !is.empty(this.config.settings)) {\n controls.toggleMenu.call(this, false);\n }\n // Trigger event on change\n if (hiding !== isHidden) {\n const eventName = hiding ? 'controlshidden' : 'controlsshown';\n triggerEvent.call(this, this.media, eventName);\n }\n return !hiding;\n }\n return false;\n }\n\n /**\n * Add event listeners\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n */\n on(event, callback) {\n on.call(this, this.elements.container, event, callback);\n }\n /**\n * Add event listeners once\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n */\n once(event, callback) {\n once.call(this, this.elements.container, event, callback);\n }\n /**\n * Remove event listeners\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n */\n off(event, callback) {\n off(this.elements.container, event, callback);\n }\n\n /**\n * Destroy an instance\n * Event listeners are removed when elements are removed\n * http://stackoverflow.com/questions/12528049/if-a-dom-element-is-removed-are-its-listeners-also-removed-from-memory\n * @param {function} callback - Callback for when destroy is complete\n * @param {boolean} soft - Whether it's a soft destroy (for source changes etc)\n */\n destroy(callback, soft = false) {\n if (!this.ready) {\n return;\n }\n\n const done = () => {\n // Reset overflow (incase destroyed while in fullscreen)\n document.body.style.overflow = '';\n\n // GC for embed\n this.embed = null;\n\n // If it's a soft destroy, make minimal changes\n if (soft) {\n if (Object.keys(this.elements).length) {\n // Remove elements\n removeElement(this.elements.buttons.play);\n removeElement(this.elements.captions);\n removeElement(this.elements.controls);\n removeElement(this.elements.wrapper);\n\n // Clear for GC\n this.elements.buttons.play = null;\n this.elements.captions = null;\n this.elements.controls = null;\n this.elements.wrapper = null;\n }\n\n // Callback\n if (is.function(callback)) {\n callback();\n }\n } else {\n // Unbind listeners\n unbindListeners.call(this);\n\n // Replace the container with the original element provided\n replaceElement(this.elements.original, this.elements.container);\n\n // Event\n triggerEvent.call(this, this.elements.original, 'destroyed', true);\n\n // Callback\n if (is.function(callback)) {\n callback.call(this.elements.original);\n }\n\n // Reset state\n this.ready = false;\n\n // Clear for garbage collection\n setTimeout(() => {\n this.elements = null;\n this.media = null;\n }, 200);\n }\n };\n\n // Stop playback\n this.stop();\n\n // Provider specific stuff\n if (this.isHTML5) {\n // Clear timeout\n clearTimeout(this.timers.loading);\n\n // Restore native video controls\n ui.toggleNativeControls.call(this, true);\n\n // Clean up\n done();\n } else if (this.isYouTube) {\n // Clear timers\n clearInterval(this.timers.buffering);\n clearInterval(this.timers.playing);\n\n // Destroy YouTube API\n if (this.embed !== null && is.function(this.embed.destroy)) {\n this.embed.destroy();\n }\n\n // Clean up\n done();\n } else if (this.isVimeo) {\n // Destroy Vimeo API\n // then clean up (wait, to prevent postmessage errors)\n if (this.embed !== null) {\n this.embed.unload().then(done);\n }\n\n // Vimeo does not always return\n setTimeout(done, 200);\n }\n }\n\n /**\n * Check for support for a mime type (HTML5 only)\n * @param {string} type - Mime type\n */\n supports(type) {\n return support.mime.call(this, type);\n }\n\n /**\n * Check for support\n * @param {string} type - Player type (audio/video)\n * @param {string} provider - Provider (html5/youtube/vimeo)\n * @param {bool} inline - Where player has `playsinline` sttribute\n */\n static supported(type, provider, inline) {\n return support.check(type, provider, inline);\n }\n\n /**\n * Load an SVG sprite into the page\n * @param {string} url - URL for the SVG sprite\n * @param {string} [id] - Unique ID\n */\n static loadSprite(url, id) {\n return loadSprite(url, id);\n }\n\n /**\n * Setup multiple instances\n * @param {*} selector\n * @param {object} options\n */\n static setup(selector, options = {}) {\n let targets = null;\n\n if (is.string(selector)) {\n targets = Array.from(document.querySelectorAll(selector));\n } else if (is.nodeList(selector)) {\n targets = Array.from(selector);\n } else if (is.array(selector)) {\n targets = selector.filter(is.element);\n }\n\n if (is.empty(targets)) {\n return null;\n }\n\n return targets.map(t => new Plyr(t, options));\n }\n}\n\nPlyr.defaults = cloneDeep(defaults);\n\nexport default Plyr;\n"]} \ No newline at end of file
diff --git a/package.json b/package.json
index 23a7b632..8172aadd 100644
--- a/package.json
+++ b/package.json
@@ -20,14 +20,14 @@
"git-branch": "^2.0.1",
"gulp": "^3.9.1",
"gulp-autoprefixer": "^5.0.0",
- "gulp-better-rollup": "^3.1.0",
+ "gulp-better-rollup": "^3.2.1",
"gulp-clean-css": "^3.9.4",
"gulp-concat": "^2.6.1",
"gulp-filter": "^5.1.0",
"gulp-header": "^2.0.5",
"gulp-open": "^3.0.1",
"gulp-postcss": "^7.0.1",
- "gulp-rename": "^1.2.3",
+ "gulp-rename": "^1.3.0",
"gulp-replace": "^1.0.0",
"gulp-s3": "^0.11.0",
"gulp-sass": "^4.0.1",
@@ -44,12 +44,12 @@
"rollup-plugin-commonjs": "^9.1.3",
"rollup-plugin-node-resolve": "^3.3.0",
"run-sequence": "^2.2.1",
- "stylelint": "^9.2.1",
+ "stylelint": "^9.3.0",
"stylelint-config-prettier": "^3.2.0",
"stylelint-config-recommended": "^2.1.0",
"stylelint-config-sass-guidelines": "^5.0.0",
"stylelint-order": "^0.8.1",
- "stylelint-scss": "^3.1.0",
+ "stylelint-scss": "^3.1.2",
"stylelint-selector-bem-pattern": "^2.0.0"
},
"keywords": ["HTML5 Video", "HTML5 Audio", "Media Player", "DASH", "Shaka", "WordPress", "HLS"],
@@ -74,7 +74,7 @@
"babel-polyfill": "^6.26.0",
"custom-event-polyfill": "^0.3.0",
"loadjs": "^3.5.4",
- "raven-js": "^3.26.1",
+ "raven-js": "^3.26.2",
"url-polyfill": "^1.0.13"
}
}
diff --git a/plyr.code-workspace b/plyr.code-workspace
index c0b30608..467623c9 100644
--- a/plyr.code-workspace
+++ b/plyr.code-workspace
@@ -11,7 +11,8 @@
},
// Exclude from search
"search.exclude": {
- "dist/": true
+ "dist/": true,
+ "demo/dist/": true
},
// Linting
"stylelint.enable": true,
diff --git a/readme.md b/readme.md
index 6ffe8bc0..9dece860 100644
--- a/readme.md
+++ b/readme.md
@@ -215,7 +215,7 @@ You can specify a range of arguments for the constructor to use:
* A CSS string selector that's compatible with [`querySelector`](https://developer.mozilla.org/en-US/docs/Web/API/Document/querySelector)
* A [`HTMLElement`](https://developer.mozilla.org/en/docs/Web/API/HTMLElement)
-* A [`NodeList]`(https://developer.mozilla.org/en-US/docs/Web/API/NodeList)
+* A [`NodeList`](https://developer.mozilla.org/en-US/docs/Web/API/NodeList)
* A [jQuery](https://jquery.com) object
_Note_: If a `NodeList`, `Array`, or jQuery object are passed, the first element will be used for setup. To setup multiple players, see [setting up multiple players](#setting-up-multiple-players) below.
@@ -367,6 +367,7 @@ player.fullscreen.enter(); // Enter fullscreen
| `airplay()` | - | Trigger the airplay dialog on supported devices. |
| `toggleControls(toggle)` | Boolean | Toggle the controls (video only). Takes optional truthy value to force it on/off. |
| `on(event, function)` | String, Function | Add an event listener for the specified event. |
+| `once(event, function)` | String, Function | Add an event listener for the specified event once. |
| `off(event, function)` | String, Function | Remove an event listener for the specified event. |
| `supports(type)` | String | Check support for a mime type. |
| `destroy()` | - | Destroy the instance and garbage collect any elements. |
diff --git a/src/js/captions.js b/src/js/captions.js
index bafcf87e..732b2e38 100644
--- a/src/js/captions.js
+++ b/src/js/captions.js
@@ -6,7 +6,21 @@
import controls from './controls';
import i18n from './i18n';
import support from './support';
-import utils from './utils';
+import { dedupe } from './utils/arrays';
+import browser from './utils/browser';
+import {
+ createElement,
+ emptyElement,
+ getAttributesFromSelector,
+ insertAfter,
+ removeElement,
+ toggleClass,
+} from './utils/elements';
+import { on, triggerEvent } from './utils/events';
+import fetch from './utils/fetch';
+import is from './utils/is';
+import { getHTML } from './utils/strings';
+import { parseUrl } from './utils/urls';
const captions = {
// Setup captions
@@ -19,7 +33,11 @@ const captions = {
// Only Vimeo and HTML5 video supported at this point
if (!this.isVideo || this.isYouTube || (this.isHTML5 && !support.textTracks)) {
// Clear menu and hide
- if (utils.is.array(this.config.controls) && this.config.controls.includes('settings') && this.config.settings.includes('captions')) {
+ if (
+ is.array(this.config.controls) &&
+ this.config.controls.includes('settings') &&
+ this.config.settings.includes('captions')
+ ) {
controls.setCaptionsMenu.call(this);
}
@@ -27,15 +45,12 @@ const captions = {
}
// Inject the container
- if (!utils.is.element(this.elements.captions)) {
- this.elements.captions = utils.createElement('div', utils.getAttributesFromSelector(this.config.selectors.captions));
+ if (!is.element(this.elements.captions)) {
+ this.elements.captions = createElement('div', getAttributesFromSelector(this.config.selectors.captions));
- utils.insertAfter(this.elements.captions, this.elements.wrapper);
+ insertAfter(this.elements.captions, this.elements.wrapper);
}
- // Get browser info
- const browser = utils.getBrowser();
-
// Fix IE captions if CORS is used
// Fetch captions and inject as blobs instead (data URIs not supported!)
if (browser.isIE && window.URL) {
@@ -43,84 +58,96 @@ const captions = {
Array.from(elements).forEach(track => {
const src = track.getAttribute('src');
- const href = utils.parseUrl(src);
-
- if (href.hostname !== window.location.href.hostname && [
- 'http:',
- 'https:',
- ].includes(href.protocol)) {
- utils
- .fetch(src, 'blob')
+ const url = parseUrl(src);
+
+ if (
+ url !== null &&
+ url.hostname !== window.location.href.hostname &&
+ ['http:', 'https:'].includes(url.protocol)
+ ) {
+ fetch(src, 'blob')
.then(blob => {
track.setAttribute('src', window.URL.createObjectURL(blob));
})
.catch(() => {
- utils.removeElement(track);
+ removeElement(track);
});
}
});
}
- // Try to load the value from storage
- let active = this.storage.get('captions');
+ // Get and set initial data
+ // The "preferred" options are not realized unless / until the wanted language has a match
+ // * languages: Array of user's browser languages.
+ // * language: The language preferred by user settings or config
+ // * active: The state preferred by user settings or config
+ // * toggled: The real captions state
- // Otherwise fall back to the default config
- if (!utils.is.boolean(active)) {
- ({ active } = this.config.captions);
- }
+ const languages = dedupe(
+ Array.from(navigator.languages || navigator.userLanguage).map(language => language.split('-')[0]),
+ );
+
+ let language = (this.storage.get('language') || this.config.captions.language || 'auto').toLowerCase();
- // Get language from storage, fallback to config
- let language = this.storage.get('language') || this.config.captions.language;
+ // Use first browser language when language is 'auto'
if (language === 'auto') {
- [ language ] = (navigator.language || navigator.userLanguage).split('-');
+ [language] = languages;
}
- // Set language and show if active
- captions.setLanguage.call(this, language, active);
+
+ let active = this.storage.get('captions');
+ if (!is.boolean(active)) {
+ ({ active } = this.config.captions);
+ }
+
+ Object.assign(this.captions, {
+ toggled: false,
+ active,
+ language,
+ languages,
+ });
// Watch changes to textTracks and update captions menu
if (this.isHTML5) {
const trackEvents = this.config.captions.update ? 'addtrack removetrack' : 'removetrack';
- utils.on(this.media.textTracks, trackEvents, captions.update.bind(this));
+ on.call(this, this.media.textTracks, trackEvents, captions.update.bind(this));
}
// Update available languages in list next tick (the event must not be triggered before the listeners)
setTimeout(captions.update.bind(this), 0);
},
+ // Update available language options in settings based on tracks
update() {
const tracks = captions.getTracks.call(this, true);
// Get the wanted language
- const { language, meta } = this.captions;
+ const { active, language, meta, currentTrackNode } = this.captions;
+ const languageExists = Boolean(tracks.find(track => track.language === language));
// Handle tracks (add event listener and "pseudo"-default)
if (this.isHTML5 && this.isVideo) {
- tracks
- .filter(track => !meta.get(track))
- .forEach(track => {
- this.debug.log('Track added', track);
- // Attempt to store if the original dom element was "default"
- meta.set(track, {
- default: track.mode === 'showing',
- });
-
- // Turn off native caption rendering to avoid double captions
- track.mode = 'hidden';
-
- // Add event listener for cue changes
- utils.on(track, 'cuechange', () => captions.updateCues.call(this));
+ tracks.filter(track => !meta.get(track)).forEach(track => {
+ this.debug.log('Track added', track);
+ // Attempt to store if the original dom element was "default"
+ meta.set(track, {
+ default: track.mode === 'showing',
});
- }
- const trackRemoved = !tracks.find(track => track === this.captions.currentTrackNode);
- const firstMatch = this.language !== language && tracks.find(track => track.language === language);
+ // Turn off native caption rendering to avoid double captions
+ track.mode = 'hidden';
- // Update language if removed or first matching track added
- if (trackRemoved || firstMatch) {
- captions.setLanguage.call(this, language, this.config.captions.active);
+ // Add event listener for cue changes
+ on.call(this, track, 'cuechange', () => captions.updateCues.call(this));
+ });
+ }
+
+ // Update language first time it matches, or if the previous matching track was removed
+ if ((languageExists && this.language !== language) || !tracks.includes(currentTrackNode)) {
+ captions.setLanguage.call(this, language);
+ captions.toggle.call(this, active && languageExists);
}
// Enable or disable captions based on track length
- utils.toggleClass(this.elements.container, this.config.classNames.captions.enabled, !utils.is.empty(tracks));
+ toggleClass(this.elements.container, this.config.classNames.captions.enabled, !is.empty(tracks));
// Update available languages in list
if ((this.config.controls || []).includes('settings') && this.config.settings.includes('captions')) {
@@ -128,16 +155,70 @@ const captions = {
}
},
- set(index, setLanguage = true, show = true) {
+ // Toggle captions display
+ // Used internally for the toggleCaptions method, with the passive option forced to false
+ toggle(input, passive = true) {
+ // If there's no full support
+ if (!this.supported.ui) {
+ return;
+ }
+
+ const { toggled } = this.captions; // Current state
+ const activeClass = this.config.classNames.captions.active;
+
+ // Get the next state
+ // If the method is called without parameter, toggle based on current value
+ const active = is.nullOrUndefined(input) ? !toggled : input;
+
+ // Update state and trigger event
+ if (active !== toggled) {
+ // When passive, don't override user preferences
+ if (!passive) {
+ this.captions.active = active;
+ this.storage.set({ captions: active });
+ }
+
+ // Force language if the call isn't passive and there is no matching language to toggle to
+ if (!this.language && active && !passive) {
+ const tracks = captions.getTracks.call(this);
+ const track = captions.findTrack.call(this, [this.captions.language, ...this.captions.languages], true);
+
+ // Override user preferences to avoid switching languages if a matching track is added
+ this.captions.language = track.language;
+
+ // Set caption, but don't store in localStorage as user preference
+ captions.set.call(this, tracks.indexOf(track));
+ return;
+ }
+
+ // Toggle state
+ this.elements.buttons.captions.pressed = active;
+
+ // Add class hook
+ toggleClass(this.elements.container, activeClass, active);
+
+ this.captions.toggled = active;
+
+ // Update settings menu
+ controls.updateSetting.call(this, 'captions');
+
+ // Trigger event (not used internally)
+ triggerEvent.call(this, this.media, active ? 'captionsenabled' : 'captionsdisabled');
+ }
+ },
+
+ // Set captions by track index
+ // Used internally for the currentTrack setter with the passive option forced to false
+ set(index, passive = true) {
const tracks = captions.getTracks.call(this);
// Disable captions if setting to -1
if (index === -1) {
- this.toggleCaptions(false);
+ captions.toggle.call(this, false, passive);
return;
}
- if (!utils.is.number(index)) {
+ if (!is.number(index)) {
this.debug.warn('Invalid caption argument', index);
return;
}
@@ -149,15 +230,19 @@ const captions = {
if (this.captions.currentTrack !== index) {
this.captions.currentTrack = index;
- const track = captions.getCurrentTrack.call(this);
+ const track = tracks[index];
const { language } = track || {};
// Store reference to node for invalidation on remove
this.captions.currentTrackNode = track;
- // Prevent setting language in some cases, since it can violate user's intentions
- if (setLanguage) {
+ // Update settings menu
+ controls.updateSetting.call(this, 'captions');
+
+ // When passive, don't override user preferences
+ if (!passive) {
this.captions.language = language;
+ this.storage.set({ language });
}
// Handle Vimeo captions
@@ -166,32 +251,33 @@ const captions = {
}
// Trigger event
- utils.dispatchEvent.call(this, this.media, 'languagechange');
+ triggerEvent.call(this, this.media, 'languagechange');
}
+ // Show captions
+ captions.toggle.call(this, true, passive);
+
if (this.isHTML5 && this.isVideo) {
// If we change the active track while a cue is already displayed we need to update it
captions.updateCues.call(this);
}
-
- // Show captions
- if (show) {
- this.toggleCaptions(true);
- }
},
- setLanguage(language, show = true) {
- if (!utils.is.string(language)) {
- this.debug.warn('Invalid language argument', language);
+ // Set captions by language
+ // Used internally for the language setter with the passive option forced to false
+ setLanguage(input, passive = true) {
+ if (!is.string(input)) {
+ this.debug.warn('Invalid language argument', input);
return;
}
// Normalize
- this.captions.language = language.toLowerCase();
+ const language = input.toLowerCase();
+ this.captions.language = language;
// Set currentTrack
const tracks = captions.getTracks.call(this);
- const track = captions.getCurrentTrack.call(this, true);
- captions.set.call(this, tracks.indexOf(track), false, show);
+ const track = captions.findTrack.call(this, [language]);
+ captions.set.call(this, tracks.indexOf(track), passive);
},
// Get current valid caption tracks
@@ -204,34 +290,42 @@ const captions = {
// Filter out removed tracks and tracks that aren't captions/subtitles (for example metadata)
return tracks
.filter(track => !this.isHTML5 || update || this.captions.meta.has(track))
- .filter(track => [
- 'captions',
- 'subtitles',
- ].includes(track.kind));
+ .filter(track => ['captions', 'subtitles'].includes(track.kind));
},
- // Get the current track for the current language
- getCurrentTrack(fromLanguage = false) {
+ // Match tracks based on languages and get the first
+ findTrack(languages, force = false) {
const tracks = captions.getTracks.call(this);
const sortIsDefault = track => Number((this.captions.meta.get(track) || {}).default);
const sorted = Array.from(tracks).sort((a, b) => sortIsDefault(b) - sortIsDefault(a));
- return (!fromLanguage && tracks[this.currentTrack]) || sorted.find(track => track.language === this.captions.language) || sorted[0];
+ let track;
+ languages.every(language => {
+ track = sorted.find(track => track.language === language);
+ return !track; // Break iteration if there is a match
+ });
+ // If no match is found but is required, get first
+ return track || (force ? sorted[0] : undefined);
+ },
+
+ // Get the current track
+ getCurrentTrack() {
+ return captions.getTracks.call(this)[this.currentTrack];
},
// Get UI label for track
getLabel(track) {
let currentTrack = track;
- if (!utils.is.track(currentTrack) && support.textTracks && this.captions.active) {
+ if (!is.track(currentTrack) && support.textTracks && this.captions.toggled) {
currentTrack = captions.getCurrentTrack.call(this);
}
- if (utils.is.track(currentTrack)) {
- if (!utils.is.empty(currentTrack.label)) {
+ if (is.track(currentTrack)) {
+ if (!is.empty(currentTrack.label)) {
return currentTrack.label;
}
- if (!utils.is.empty(currentTrack.language)) {
+ if (!is.empty(currentTrack.language)) {
return track.language.toUpperCase();
}
@@ -249,13 +343,13 @@ const captions = {
return;
}
- if (!utils.is.element(this.elements.captions)) {
+ if (!is.element(this.elements.captions)) {
this.debug.warn('No captions element to render to');
return;
}
// Only accept array or empty input
- if (!utils.is.nullOrUndefined(input) && !Array.isArray(input)) {
+ if (!is.nullOrUndefined(input) && !Array.isArray(input)) {
this.debug.warn('updateCues: Invalid input', input);
return;
}
@@ -267,7 +361,7 @@ const captions = {
const track = captions.getCurrentTrack.call(this);
cues = Array.from((track || {}).activeCues || [])
.map(cue => cue.getCueAsHTML())
- .map(utils.getHTML);
+ .map(getHTML);
}
// Set new caption text
@@ -276,13 +370,13 @@ const captions = {
if (changed) {
// Empty the container and create a new child element
- utils.emptyElement(this.elements.captions);
- const caption = utils.createElement('span', utils.getAttributesFromSelector(this.config.selectors.caption));
+ emptyElement(this.elements.captions);
+ const caption = createElement('span', getAttributesFromSelector(this.config.selectors.caption));
caption.innerHTML = content;
this.elements.captions.appendChild(caption);
// Trigger event
- utils.dispatchEvent.call(this, this.media, 'cuechange');
+ triggerEvent.call(this, this.media, 'cuechange');
}
},
};
diff --git a/src/js/defaults.js b/src/js/config/defaults.js
index a31d0002..1e90a4f0 100644
--- a/src/js/defaults.js
+++ b/src/js/config/defaults.js
@@ -93,15 +93,7 @@ const defaults = {
// Speed default and options to display
speed: {
selected: 1,
- options: [
- 0.5,
- 0.75,
- 1,
- 1.25,
- 1.5,
- 1.75,
- 2,
- ],
+ options: [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2],
},
// Keyboard shortcut settings
@@ -155,11 +147,7 @@ const defaults = {
'airplay',
'fullscreen',
],
- settings: [
- 'captions',
- 'quality',
- 'speed',
- ],
+ settings: ['captions', 'quality', 'speed'],
// Localisation
i18n: {
@@ -215,7 +203,8 @@ const defaults = {
},
youtube: {
sdk: 'https://www.youtube.com/iframe_api',
- api: 'https://www.googleapis.com/youtube/v3/videos?id={0}&key={1}&fields=items(snippet(title))&part=snippet',
+ api:
+ 'https://www.googleapis.com/youtube/v3/videos?id={0}&key={1}&fields=items(snippet(title))&part=snippet',
},
googleIMA: {
sdk: 'https://imasdk.googleapis.com/js/sdkloader/ima3.js',
diff --git a/src/js/types.js b/src/js/config/types.js
index 35716c3c..13303573 100644
--- a/src/js/types.js
+++ b/src/js/config/types.js
@@ -13,4 +13,22 @@ export const types = {
video: 'video',
};
+/**
+ * Get provider by URL
+ * @param {string} url
+ */
+export function getProviderByUrl(url) {
+ // YouTube
+ if (/^(https?:\/\/)?(www\.)?(youtube\.com|youtu\.?be)\/.+$/.test(url)) {
+ return providers.youtube;
+ }
+
+ // Vimeo
+ if (/^https?:\/\/player.vimeo.com\/video\/\d{0,9}(?=\b|\/)/.test(url)) {
+ return providers.vimeo;
+ }
+
+ return null;
+}
+
export default { providers, types };
diff --git a/src/js/controls.js b/src/js/controls.js
index d386bc76..d79aaee7 100644
--- a/src/js/controls.js
+++ b/src/js/controls.js
@@ -6,11 +6,30 @@ import captions from './captions';
import html5 from './html5';
import i18n from './i18n';
import support from './support';
-import utils from './utils';
-
-// Sniff out the browser
-const browser = utils.getBrowser();
-
+import { repaint, transitionEndEvent } from './utils/animation';
+import { dedupe } from './utils/arrays';
+import browser from './utils/browser';
+import {
+ createElement,
+ emptyElement,
+ getAttributesFromSelector,
+ getElement,
+ getElements,
+ hasClass,
+ removeElement,
+ setAttributes,
+ toggleClass,
+ toggleHidden,
+ matches,
+} from './utils/elements';
+import { off, on } from './utils/events';
+import is from './utils/is';
+import loadSprite from './utils/loadSprite';
+import { extend } from './utils/objects';
+import { getPercentage, replaceAll, toCamelCase, toTitleCase } from './utils/strings';
+import { formatTime, getHours } from './utils/time';
+
+// TODO: Don't export a massive object - break down and create class
const controls = {
// Get icon URL
getIconUrl() {
@@ -23,46 +42,47 @@ const controls = {
};
},
- // Find the UI controls and store references in custom controls
- // TODO: Allow settings menus with custom controls
+ // Find the UI controls
findElements() {
try {
- this.elements.controls = utils.getElement.call(this, this.config.selectors.controls.wrapper);
+ this.elements.controls = getElement.call(this, this.config.selectors.controls.wrapper);
// Buttons
this.elements.buttons = {
- play: utils.getElements.call(this, this.config.selectors.buttons.play),
- pause: utils.getElement.call(this, this.config.selectors.buttons.pause),
- restart: utils.getElement.call(this, this.config.selectors.buttons.restart),
- rewind: utils.getElement.call(this, this.config.selectors.buttons.rewind),
- fastForward: utils.getElement.call(this, this.config.selectors.buttons.fastForward),
- mute: utils.getElement.call(this, this.config.selectors.buttons.mute),
- pip: utils.getElement.call(this, this.config.selectors.buttons.pip),
- airplay: utils.getElement.call(this, this.config.selectors.buttons.airplay),
- settings: utils.getElement.call(this, this.config.selectors.buttons.settings),
- captions: utils.getElement.call(this, this.config.selectors.buttons.captions),
- fullscreen: utils.getElement.call(this, this.config.selectors.buttons.fullscreen),
+ play: getElements.call(this, this.config.selectors.buttons.play),
+ pause: getElement.call(this, this.config.selectors.buttons.pause),
+ restart: getElement.call(this, this.config.selectors.buttons.restart),
+ rewind: getElement.call(this, this.config.selectors.buttons.rewind),
+ fastForward: getElement.call(this, this.config.selectors.buttons.fastForward),
+ mute: getElement.call(this, this.config.selectors.buttons.mute),
+ pip: getElement.call(this, this.config.selectors.buttons.pip),
+ airplay: getElement.call(this, this.config.selectors.buttons.airplay),
+ settings: getElement.call(this, this.config.selectors.buttons.settings),
+ captions: getElement.call(this, this.config.selectors.buttons.captions),
+ fullscreen: getElement.call(this, this.config.selectors.buttons.fullscreen),
};
// Progress
- this.elements.progress = utils.getElement.call(this, this.config.selectors.progress);
+ this.elements.progress = getElement.call(this, this.config.selectors.progress);
// Inputs
this.elements.inputs = {
- seek: utils.getElement.call(this, this.config.selectors.inputs.seek),
- volume: utils.getElement.call(this, this.config.selectors.inputs.volume),
+ seek: getElement.call(this, this.config.selectors.inputs.seek),
+ volume: getElement.call(this, this.config.selectors.inputs.volume),
};
// Display
this.elements.display = {
- buffer: utils.getElement.call(this, this.config.selectors.display.buffer),
- currentTime: utils.getElement.call(this, this.config.selectors.display.currentTime),
- duration: utils.getElement.call(this, this.config.selectors.display.duration),
+ buffer: getElement.call(this, this.config.selectors.display.buffer),
+ currentTime: getElement.call(this, this.config.selectors.display.currentTime),
+ duration: getElement.call(this, this.config.selectors.display.duration),
};
// Seek tooltip
- if (utils.is.element(this.elements.progress)) {
- this.elements.display.seekTooltip = this.elements.progress.querySelector(`.${this.config.classNames.tooltip}`);
+ if (is.element(this.elements.progress)) {
+ this.elements.display.seekTooltip = this.elements.progress.querySelector(
+ `.${this.config.classNames.tooltip}`,
+ );
}
return true;
@@ -85,9 +105,9 @@ const controls = {
// Create <svg>
const icon = document.createElementNS(namespace, 'svg');
- utils.setAttributes(
+ setAttributes(
icon,
- utils.extend(attributes, {
+ extend(attributes, {
role: 'presentation',
focusable: 'false',
}),
@@ -113,44 +133,32 @@ const controls = {
},
// Create hidden text label
- createLabel(type, attr) {
- let text = i18n.get(type, this.config);
- const attributes = Object.assign({}, attr);
-
- switch (type) {
- case 'pip':
- text = 'PIP';
- break;
-
- case 'airplay':
- text = 'AirPlay';
- break;
-
- default:
- break;
- }
-
- if ('class' in attributes) {
- attributes.class += ` ${this.config.classNames.hidden}`;
- } else {
- attributes.class = this.config.classNames.hidden;
- }
+ createLabel(type, attr = {}) {
+ // Skip i18n for abbreviations and brand names
+ const universals = {
+ pip: 'PIP',
+ airplay: 'AirPlay',
+ };
+ const text = universals[type] || i18n.get(type, this.config);
- return utils.createElement('span', attributes, text);
+ const attributes = Object.assign({}, attr, {
+ class: [attr.class, this.config.classNames.hidden].filter(Boolean).join(' '),
+ });
+ return createElement('span', attributes, text);
},
// Create a badge
createBadge(text) {
- if (utils.is.empty(text)) {
+ if (is.empty(text)) {
return null;
}
- const badge = utils.createElement('span', {
+ const badge = createElement('span', {
class: this.config.classNames.menu.value,
});
badge.appendChild(
- utils.createElement(
+ createElement(
'span',
{
class: this.config.classNames.menu.badge,
@@ -164,9 +172,9 @@ const controls = {
// Create a <button>
createButton(buttonType, attr) {
- const button = utils.createElement('button');
+ const button = createElement('button');
const attributes = Object.assign({}, attr);
- let type = utils.toCamelCase(buttonType);
+ let type = toCamelCase(buttonType);
let toggle = false;
let label;
@@ -247,13 +255,13 @@ const controls = {
}
// Merge attributes
- utils.extend(attributes, utils.getAttributesFromSelector(this.config.selectors.buttons[type], attributes));
+ extend(attributes, getAttributesFromSelector(this.config.selectors.buttons[type], attributes));
- utils.setAttributes(button, attributes);
+ setAttributes(button, attributes);
// We have multiple play buttons
if (type === 'play') {
- if (!utils.is.array(this.elements.buttons[type])) {
+ if (!is.array(this.elements.buttons[type])) {
this.elements.buttons[type] = [];
}
@@ -267,10 +275,10 @@ const controls = {
Object.defineProperty(button, 'pressed', {
enumerable: true,
get() {
- return utils.hasClass(button, className);
+ return hasClass(button, className);
},
set(pressed = false) {
- utils.toggleClass(button, className, pressed);
+ toggleClass(button, className, pressed);
},
});
@@ -280,10 +288,10 @@ const controls = {
// Create an <input type='range'>
createRange(type, attributes) {
// Seek input
- const input = utils.createElement(
+ const input = createElement(
'input',
- utils.extend(
- utils.getAttributesFromSelector(this.config.selectors.inputs[type]),
+ extend(
+ getAttributesFromSelector(this.config.selectors.inputs[type]),
{
type: 'range',
min: 0,
@@ -312,10 +320,10 @@ const controls = {
// Create a <progress>
createProgress(type, attributes) {
- const progress = utils.createElement(
+ const progress = createElement(
'progress',
- utils.extend(
- utils.getAttributesFromSelector(this.config.selectors.display[type]),
+ extend(
+ getAttributesFromSelector(this.config.selectors.display[type]),
{
min: 0,
max: 100,
@@ -329,21 +337,13 @@ const controls = {
// Create the label inside
if (type !== 'volume') {
- progress.appendChild(utils.createElement('span', null, '0'));
+ progress.appendChild(createElement('span', null, '0'));
- let suffix = '';
- switch (type) {
- case 'played':
- suffix = i18n.get('played', this.config);
- break;
-
- case 'buffer':
- suffix = i18n.get('buffered', this.config);
- break;
-
- default:
- break;
- }
+ const suffixKey = {
+ played: 'played',
+ buffer: 'buffered',
+ }[type];
+ const suffix = suffixKey ? i18n.get(suffixKey, this.config) : '';
progress.innerText = `% ${suffix.toLowerCase()}`;
}
@@ -355,11 +355,11 @@ const controls = {
// Create time display
createTime(type) {
- const attributes = utils.getAttributesFromSelector(this.config.selectors.display[type]);
+ const attributes = getAttributesFromSelector(this.config.selectors.display[type]);
- const container = utils.createElement(
+ const container = createElement(
'div',
- utils.extend(attributes, {
+ extend(attributes, {
class: `plyr__time ${attributes.class}`,
'aria-label': i18n.get(type, this.config),
}),
@@ -373,16 +373,16 @@ const controls = {
},
// Create a settings menu item
- createMenuItem({value, list, type, title, badge = null, checked = false}) {
- const item = utils.createElement('li');
+ createMenuItem({ value, list, type, title, badge = null, checked = false }) {
+ const item = createElement('li');
- const label = utils.createElement('label', {
+ const label = createElement('label', {
class: this.config.classNames.control,
});
- const radio = utils.createElement(
+ const radio = createElement(
'input',
- utils.extend(utils.getAttributesFromSelector(this.config.selectors.inputs[type]), {
+ extend(getAttributesFromSelector(this.config.selectors.inputs[type]), {
type: 'radio',
name: `plyr-${type}`,
value,
@@ -391,13 +391,13 @@ const controls = {
}),
);
- const faux = utils.createElement('span', { hidden: '' });
+ const faux = createElement('span', { hidden: '' });
label.appendChild(radio);
label.appendChild(faux);
label.insertAdjacentHTML('beforeend', title);
- if (utils.is.element(badge)) {
+ if (is.element(badge)) {
label.appendChild(badge);
}
@@ -408,20 +408,20 @@ const controls = {
// Format a time for display
formatTime(time = 0, inverted = false) {
// Bail if the value isn't a number
- if (!utils.is.number(time)) {
+ if (!is.number(time)) {
return time;
}
// Always display hours if duration is over an hour
- const forceHours = utils.getHours(this.duration) > 0;
+ const forceHours = getHours(this.duration) > 0;
- return utils.formatTime(time, forceHours, inverted);
+ return formatTime(time, forceHours, inverted);
},
// Update the displayed time
updateTimeDisplay(target = null, time = 0, inverted = false) {
// Bail if there's no element to display or the value isn't a number
- if (!utils.is.element(target) || !utils.is.number(time)) {
+ if (!is.element(target) || !is.number(time)) {
return;
}
@@ -436,19 +436,19 @@ const controls = {
}
// Update range
- if (utils.is.element(this.elements.inputs.volume)) {
+ if (is.element(this.elements.inputs.volume)) {
controls.setRange.call(this, this.elements.inputs.volume, this.muted ? 0 : this.volume);
}
// Update mute state
- if (utils.is.element(this.elements.buttons.mute)) {
+ if (is.element(this.elements.buttons.mute)) {
this.elements.buttons.mute.pressed = this.muted || this.volume === 0;
}
},
// Update seek value and lower fill
setRange(target, value = 0) {
- if (!utils.is.element(target)) {
+ if (!is.element(target)) {
return;
}
@@ -461,23 +461,23 @@ const controls = {
// Update <progress> elements
updateProgress(event) {
- if (!this.supported.ui || !utils.is.event(event)) {
+ if (!this.supported.ui || !is.event(event)) {
return;
}
let value = 0;
const setProgress = (target, input) => {
- const value = utils.is.number(input) ? input : 0;
- const progress = utils.is.element(target) ? target : this.elements.display.buffer;
+ const value = is.number(input) ? input : 0;
+ const progress = is.element(target) ? target : this.elements.display.buffer;
// Update value and label
- if (utils.is.element(progress)) {
+ if (is.element(progress)) {
progress.value = value;
// Update text label inside
const label = progress.getElementsByTagName('span')[0];
- if (utils.is.element(label)) {
+ if (is.element(label)) {
label.childNodes[0].nodeValue = value;
}
}
@@ -489,7 +489,7 @@ const controls = {
case 'timeupdate':
case 'seeking':
case 'seeked':
- value = utils.getPercentage(this.currentTime, this.duration);
+ value = getPercentage(this.currentTime, this.duration);
// Set seek range value only if it's a 'natural' time event
if (event.type === 'timeupdate') {
@@ -514,21 +514,24 @@ const controls = {
// Webkit polyfill for lower fill range
updateRangeFill(target) {
// Get range from event if event passed
- const range = utils.is.event(target) ? target.target : target;
+ const range = is.event(target) ? target.target : target;
// Needs to be a valid <input type='range'>
- if (!utils.is.element(range) || range.getAttribute('type') !== 'range') {
+ if (!is.element(range) || range.getAttribute('type') !== 'range') {
return;
}
// Set aria values for https://github.com/sampotts/plyr/issues/905
- if (utils.matches(range, this.config.selectors.inputs.seek)) {
+ if (matches(range, this.config.selectors.inputs.seek)) {
range.setAttribute('aria-valuenow', this.currentTime);
const currentTime = controls.formatTime(this.currentTime);
const duration = controls.formatTime(this.duration);
const format = i18n.get('seekLabel', this.config);
- range.setAttribute('aria-valuetext', format.replace('{currentTime}', currentTime).replace('{duration}', duration));
- } else if (utils.matches(range, this.config.selectors.inputs.volume)) {
+ range.setAttribute(
+ 'aria-valuetext',
+ format.replace('{currentTime}', currentTime).replace('{duration}', duration),
+ );
+ } else if (matches(range, this.config.selectors.inputs.volume)) {
const percent = range.value * 100;
range.setAttribute('aria-valuenow', percent);
range.setAttribute('aria-valuetext', `${percent}%`);
@@ -550,8 +553,8 @@ const controls = {
// Bail if setting not true
if (
!this.config.tooltips.seek ||
- !utils.is.element(this.elements.inputs.seek) ||
- !utils.is.element(this.elements.display.seekTooltip) ||
+ !is.element(this.elements.inputs.seek) ||
+ !is.element(this.elements.display.seekTooltip) ||
this.duration === 0
) {
return;
@@ -563,7 +566,7 @@ const controls = {
const visible = `${this.config.classNames.tooltip}--visible`;
const toggle = toggle => {
- utils.toggleClass(this.elements.display.seekTooltip, visible, toggle);
+ toggleClass(this.elements.display.seekTooltip, visible, toggle);
};
// Hide on touch
@@ -573,9 +576,9 @@ const controls = {
}
// Determine percentage, if already visible
- if (utils.is.event(event)) {
+ if (is.event(event)) {
percent = 100 / clientRect.width * (event.pageX - clientRect.left);
- } else if (utils.hasClass(this.elements.display.seekTooltip, visible)) {
+ } else if (hasClass(this.elements.display.seekTooltip, visible)) {
percent = parseFloat(this.elements.display.seekTooltip.style.left, 10);
} else {
return;
@@ -596,10 +599,7 @@ const controls = {
// Show/hide the tooltip
// If the event is a moues in/out and percentage is inside bounds
- if (utils.is.event(event) && [
- 'mouseenter',
- 'mouseleave',
- ].includes(event.type)) {
+ if (is.event(event) && ['mouseenter', 'mouseleave'].includes(event.type)) {
toggle(event.type === 'mouseenter');
}
},
@@ -607,10 +607,15 @@ const controls = {
// Handle time change event
timeUpdate(event) {
// Only invert if only one time element is displayed and used for both duration and currentTime
- const invert = !utils.is.element(this.elements.display.duration) && this.config.invertTime;
+ const invert = !is.element(this.elements.display.duration) && this.config.invertTime;
// Duration
- controls.updateTimeDisplay.call(this, this.elements.display.currentTime, invert ? this.duration - this.currentTime : this.currentTime, invert);
+ controls.updateTimeDisplay.call(
+ this,
+ this.elements.display.currentTime,
+ invert ? this.duration - this.currentTime : this.currentTime,
+ invert,
+ );
// Ignore updates while seeking
if (event && event.type === 'timeupdate' && this.media.seeking) {
@@ -629,12 +634,12 @@ const controls = {
}
// Update ARIA values
- if (utils.is.element(this.elements.inputs.seek)) {
+ if (is.element(this.elements.inputs.seek)) {
this.elements.inputs.seek.setAttribute('aria-valuemax', this.duration);
}
// If there's a spot to display duration
- const hasDuration = utils.is.element(this.elements.display.duration);
+ const hasDuration = is.element(this.elements.display.duration);
// If there's only one time display, display duration there
if (!hasDuration && this.config.displayDuration && this.paused) {
@@ -652,27 +657,26 @@ const controls = {
// Hide/show a tab
toggleTab(setting, toggle) {
- utils.toggleHidden(this.elements.settings.tabs[setting], !toggle);
+ toggleHidden(this.elements.settings.tabs[setting], !toggle);
},
// Set the quality menu
- // TODO: Vimeo support
setQualityMenu(options) {
// Menu required
- if (!utils.is.element(this.elements.settings.panes.quality)) {
+ if (!is.element(this.elements.settings.panes.quality)) {
return;
}
const type = 'quality';
const list = this.elements.settings.panes.quality.querySelector('ul');
- // Set options if passed and filter based on config
- if (utils.is.array(options)) {
- this.options.quality = options.filter(quality => this.config.quality.options.includes(quality));
+ // Set options if passed and filter based on uniqueness and config
+ if (is.array(options)) {
+ this.options.quality = dedupe(options).filter(quality => this.config.quality.options.includes(quality));
}
// Toggle the pane and tab
- const toggle = !utils.is.empty(this.options.quality) && this.options.quality.length > 1;
+ const toggle = !is.empty(this.options.quality) && this.options.quality.length > 1;
controls.toggleTab.call(this, type, toggle);
// Check if we need to toggle the parent
@@ -684,7 +688,7 @@ const controls = {
}
// Empty the menu
- utils.emptyElement(list);
+ emptyElement(list);
// Get the badge HTML for HD, 4K etc
const getBadge = quality => {
@@ -723,7 +727,7 @@ const controls = {
return value === 1 ? i18n.get('normal', this.config) : `${value}&times;`;
case 'quality':
- if (utils.is.number(value)) {
+ if (is.number(value)) {
const label = i18n.get(`qualityLabel.${value}`, this.config);
if (!label.length) {
@@ -733,7 +737,7 @@ const controls = {
return label;
}
- return utils.toTitleCase(value);
+ return toTitleCase(value);
case 'captions':
return captions.getLabel.call(this);
@@ -749,41 +753,36 @@ const controls = {
let value = null;
let list = container;
- switch (setting) {
- case 'captions':
- value = this.currentTrack;
- break;
-
- default:
- value = !utils.is.empty(input) ? input : this[setting];
-
- // Get default
- if (utils.is.empty(value)) {
- value = this.config[setting].default;
- }
+ if (setting === 'captions') {
+ value = this.currentTrack;
+ } else {
+ value = !is.empty(input) ? input : this[setting];
- // Unsupported value
- if (!utils.is.empty(this.options[setting]) && !this.options[setting].includes(value)) {
- this.debug.warn(`Unsupported value of '${value}' for ${setting}`);
- return;
- }
+ // Get default
+ if (is.empty(value)) {
+ value = this.config[setting].default;
+ }
- // Disabled value
- if (!this.config[setting].options.includes(value)) {
- this.debug.warn(`Disabled value of '${value}' for ${setting}`);
- return;
- }
+ // Unsupported value
+ if (!is.empty(this.options[setting]) && !this.options[setting].includes(value)) {
+ this.debug.warn(`Unsupported value of '${value}' for ${setting}`);
+ return;
+ }
- break;
+ // Disabled value
+ if (!this.config[setting].options.includes(value)) {
+ this.debug.warn(`Disabled value of '${value}' for ${setting}`);
+ return;
+ }
}
// Get the list if we need to
- if (!utils.is.element(list)) {
+ if (!is.element(list)) {
list = pane && pane.querySelector('ul');
}
// If there's no list it means it's not been rendered...
- if (!utils.is.element(list)) {
+ if (!is.element(list)) {
return;
}
@@ -794,7 +793,7 @@ const controls = {
// Find the radio option and check it
const target = list && list.querySelector(`input[value="${value}"]`);
- if (utils.is.element(target)) {
+ if (is.element(target)) {
target.checked = true;
}
},
@@ -802,7 +801,7 @@ const controls = {
// Set the looping options
/* setLoopMenu() {
// Menu required
- if (!utils.is.element(this.elements.settings.panes.loop)) {
+ if (!is.element(this.elements.settings.panes.loop)) {
return;
}
@@ -810,22 +809,22 @@ const controls = {
const list = this.elements.settings.panes.loop.querySelector('ul');
// Show the pane and tab
- utils.toggleHidden(this.elements.settings.tabs.loop, false);
- utils.toggleHidden(this.elements.settings.panes.loop, false);
+ toggleHidden(this.elements.settings.tabs.loop, false);
+ toggleHidden(this.elements.settings.panes.loop, false);
// Toggle the pane and tab
- const toggle = !utils.is.empty(this.loop.options);
+ const toggle = !is.empty(this.loop.options);
controls.toggleTab.call(this, 'loop', toggle);
// Empty the menu
- utils.emptyElement(list);
+ emptyElement(list);
options.forEach(option => {
- const item = utils.createElement('li');
+ const item = createElement('li');
- const button = utils.createElement(
+ const button = createElement(
'button',
- utils.extend(utils.getAttributesFromSelector(this.config.selectors.buttons.loop), {
+ extend(getAttributesFromSelector(this.config.selectors.buttons.loop), {
type: 'button',
class: this.config.classNames.control,
'data-plyr-loop-action': option,
@@ -857,7 +856,7 @@ const controls = {
controls.toggleTab.call(this, type, tracks.length);
// Empty the menu
- utils.emptyElement(list);
+ emptyElement(list);
// Check if we need to toggle the parent
controls.checkMenu.call(this);
@@ -870,7 +869,7 @@ const controls = {
// Generate options data
const options = tracks.map((track, value) => ({
value,
- checked: this.captions.active && this.currentTrack === value,
+ checked: this.captions.toggled && this.currentTrack === value,
title: captions.getLabel.call(this, track),
badge: track.language && controls.createBadge.call(this, track.language.toUpperCase()),
list,
@@ -880,7 +879,7 @@ const controls = {
// Add the "Disabled" option to turn off captions
options.unshift({
value: -1,
- checked: !this.captions.active,
+ checked: !this.captions.toggled,
title: i18n.get('disabled', this.config),
list,
type: 'language',
@@ -900,32 +899,24 @@ const controls = {
}
// Menu required
- if (!utils.is.element(this.elements.settings.panes.speed)) {
+ if (!is.element(this.elements.settings.panes.speed)) {
return;
}
const type = 'speed';
// Set the speed options
- if (utils.is.array(options)) {
+ if (is.array(options)) {
this.options.speed = options;
} else if (this.isHTML5 || this.isVimeo) {
- this.options.speed = [
- 0.5,
- 0.75,
- 1,
- 1.25,
- 1.5,
- 1.75,
- 2,
- ];
+ this.options.speed = [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2];
}
// Set options if passed and filter based on config
this.options.speed = this.options.speed.filter(speed => this.config.speed.options.includes(speed));
// Toggle the pane and tab
- const toggle = !utils.is.empty(this.options.speed) && this.options.speed.length > 1;
+ const toggle = !is.empty(this.options.speed) && this.options.speed.length > 1;
controls.toggleTab.call(this, type, toggle);
// Check if we need to toggle the parent
@@ -940,7 +931,7 @@ const controls = {
const list = this.elements.settings.panes.speed.querySelector('ul');
// Empty the menu
- utils.emptyElement(list);
+ emptyElement(list);
// Create items
this.options.speed.forEach(speed => {
@@ -958,9 +949,9 @@ const controls = {
// Check if we need to hide/show the settings menu
checkMenu() {
const { tabs } = this.elements.settings;
- const visible = !utils.is.empty(tabs) && Object.values(tabs).some(tab => !tab.hidden);
+ const visible = !is.empty(tabs) && Object.values(tabs).some(tab => !tab.hidden);
- utils.toggleHidden(this.elements.settings.menu, !visible);
+ toggleHidden(this.elements.settings.menu, !visible);
},
// Show/hide menu
@@ -969,14 +960,14 @@ const controls = {
const button = this.elements.buttons.settings;
// Menu and button are required
- if (!utils.is.element(form) || !utils.is.element(button)) {
+ if (!is.element(form) || !is.element(button)) {
return;
}
- const show = utils.is.boolean(event) ? event : utils.is.element(form) && form.hasAttribute('hidden');
+ const show = is.boolean(event) ? event : is.element(form) && form.hasAttribute('hidden');
- if (utils.is.event(event)) {
- const isMenuItem = utils.is.element(form) && form.contains(event.target);
+ if (is.event(event)) {
+ const isMenuItem = is.element(form) && form.contains(event.target);
const isButton = event.target === this.elements.buttons.settings;
// If the click was inside the form or if the click
@@ -993,13 +984,13 @@ const controls = {
}
// Set form and button attributes
- if (utils.is.element(button)) {
+ if (is.element(button)) {
button.setAttribute('aria-expanded', show);
}
- if (utils.is.element(form)) {
- utils.toggleHidden(form, !show);
- utils.toggleClass(this.elements.container, this.config.classNames.menu.open, show);
+ if (is.element(form)) {
+ toggleHidden(form, !show);
+ toggleClass(this.elements.container, this.config.classNames.menu.open, show);
if (show) {
form.removeAttribute('tabindex');
@@ -1030,7 +1021,7 @@ const controls = {
const height = clone.scrollHeight;
// Remove from the DOM
- utils.removeElement(clone);
+ removeElement(clone);
return {
width,
@@ -1044,11 +1035,11 @@ const controls = {
const pane = document.getElementById(target);
// Nothing to show, bail
- if (!utils.is.element(pane)) {
+ if (!is.element(pane)) {
return;
}
- // Are we targetting a tab? If not, bail
+ // Are we targeting a tab? If not, bail
const isTab = pane.getAttribute('role') === 'tabpanel';
if (!isTab) {
return;
@@ -1076,10 +1067,7 @@ const controls = {
// Restore auto height/width
const restore = e => {
// We're only bothered about height and width on the container
- if (e.target !== container || ![
- 'width',
- 'height',
- ].includes(e.propertyName)) {
+ if (e.target !== container || !['width', 'height'].includes(e.propertyName)) {
return;
}
@@ -1088,11 +1076,11 @@ const controls = {
container.style.height = '';
// Only listen once
- utils.off(container, utils.transitionEndEvent, restore);
+ off.call(this, container, transitionEndEvent, restore);
};
// Listen for the transition finishing and restore auto height/width
- utils.on(container, utils.transitionEndEvent, restore);
+ on.call(this, container, transitionEndEvent, restore);
// Set dimensions to target
container.style.width = `${size.width}px`;
@@ -1100,13 +1088,13 @@ const controls = {
}
// Set attributes on current tab
- utils.toggleHidden(current, true);
+ toggleHidden(current, true);
current.setAttribute('tabindex', -1);
// Set attributes on target
- utils.toggleHidden(pane, false);
+ toggleHidden(pane, false);
- const tabs = utils.getElements.call(this, `[aria-controls="${target}"]`);
+ const tabs = getElements.call(this, `[aria-controls="${target}"]`);
Array.from(tabs).forEach(tab => {
tab.setAttribute('aria-expanded', true);
});
@@ -1120,12 +1108,12 @@ const controls = {
// TODO: Set order based on order in the config.controls array?
create(data) {
// Do nothing if we want no controls
- if (utils.is.empty(this.config.controls)) {
+ if (is.empty(this.config.controls)) {
return null;
}
// Create the container
- const container = utils.createElement('div', utils.getAttributesFromSelector(this.config.selectors.controls.wrapper));
+ const container = createElement('div', getAttributesFromSelector(this.config.selectors.controls.wrapper));
// Restart button
if (this.config.controls.includes('restart')) {
@@ -1149,7 +1137,7 @@ const controls = {
// Progress
if (this.config.controls.includes('progress')) {
- const progress = utils.createElement('div', utils.getAttributesFromSelector(this.config.selectors.progress));
+ const progress = createElement('div', getAttributesFromSelector(this.config.selectors.progress));
// Seek range slider
progress.appendChild(
@@ -1165,7 +1153,7 @@ const controls = {
// Seek tooltip
if (this.config.tooltips.seek) {
- const tooltip = utils.createElement(
+ const tooltip = createElement(
'span',
{
class: this.config.classNames.tooltip,
@@ -1198,7 +1186,7 @@ const controls = {
// Volume range control
if (this.config.controls.includes('volume')) {
- const volume = utils.createElement('div', {
+ const volume = createElement('div', {
class: 'plyr__volume',
});
@@ -1214,7 +1202,7 @@ const controls = {
controls.createRange.call(
this,
'volume',
- utils.extend(attributes, {
+ extend(attributes, {
id: `plyr-volume-${data.id}`,
}),
),
@@ -1231,8 +1219,8 @@ const controls = {
}
// Settings button / menu
- if (this.config.controls.includes('settings') && !utils.is.empty(this.config.settings)) {
- const menu = utils.createElement('div', {
+ if (this.config.controls.includes('settings') && !is.empty(this.config.settings)) {
+ const menu = createElement('div', {
class: 'plyr__menu',
hidden: '',
});
@@ -1246,7 +1234,7 @@ const controls = {
}),
);
- const form = utils.createElement('form', {
+ const form = createElement('form', {
class: 'plyr__menu__container',
id: `plyr-settings-${data.id}`,
hidden: '',
@@ -1255,29 +1243,29 @@ const controls = {
tabindex: -1,
});
- const inner = utils.createElement('div');
+ const inner = createElement('div');
- const home = utils.createElement('div', {
+ const home = createElement('div', {
id: `plyr-settings-${data.id}-home`,
'aria-labelled-by': `plyr-settings-toggle-${data.id}`,
role: 'tabpanel',
});
// Create the tab list
- const tabs = utils.createElement('ul', {
+ const tabs = createElement('ul', {
role: 'tablist',
});
// Build the tabs
this.config.settings.forEach(type => {
- const tab = utils.createElement('li', {
+ const tab = createElement('li', {
role: 'tab',
hidden: '',
});
- const button = utils.createElement(
+ const button = createElement(
'button',
- utils.extend(utils.getAttributesFromSelector(this.config.selectors.buttons.settings), {
+ extend(getAttributesFromSelector(this.config.selectors.buttons.settings), {
type: 'button',
class: `${this.config.classNames.control} ${this.config.classNames.control}--forward`,
id: `plyr-settings-${data.id}-${type}-tab`,
@@ -1288,7 +1276,7 @@ const controls = {
i18n.get(type, this.config),
);
- const value = utils.createElement('span', {
+ const value = createElement('span', {
class: this.config.classNames.menu.value,
});
@@ -1307,7 +1295,7 @@ const controls = {
// Build the panes
this.config.settings.forEach(type => {
- const pane = utils.createElement('div', {
+ const pane = createElement('div', {
id: `plyr-settings-${data.id}-${type}`,
hidden: '',
'aria-labelled-by': `plyr-settings-${data.id}-${type}-tab`,
@@ -1315,7 +1303,7 @@ const controls = {
tabindex: -1,
});
- const back = utils.createElement(
+ const back = createElement(
'button',
{
type: 'button',
@@ -1329,7 +1317,7 @@ const controls = {
pane.appendChild(back);
- const options = utils.createElement('ul');
+ const options = createElement('ul');
pane.appendChild(options);
inner.appendChild(pane);
@@ -1384,7 +1372,7 @@ const controls = {
// Only load external sprite using AJAX
if (icon.cors) {
- utils.loadSprite(icon.url, 'sprite-plyr');
+ loadSprite(icon.url, 'sprite-plyr');
}
}
@@ -1403,10 +1391,10 @@ const controls = {
};
let update = true;
- if (utils.is.string(this.config.controls) || utils.is.element(this.config.controls)) {
+ if (is.string(this.config.controls) || is.element(this.config.controls)) {
// String or HTMLElement passed as the option
container = this.config.controls;
- } else if (utils.is.function(this.config.controls)) {
+ } else if (is.function(this.config.controls)) {
// A custom function to build controls
// The function can return a HTMLElement or String
container = this.config.controls.call(this, props);
@@ -1428,11 +1416,8 @@ const controls = {
const replace = input => {
let result = input;
- Object.entries(props).forEach(([
- key,
- value,
- ]) => {
- result = utils.replaceAll(result, `{${key}}`, value);
+ Object.entries(props).forEach(([key, value]) => {
+ result = replaceAll(result, `{${key}}`, value);
});
return result;
@@ -1440,9 +1425,9 @@ const controls = {
// Update markup
if (update) {
- if (utils.is.string(this.config.controls)) {
+ if (is.string(this.config.controls)) {
container = replace(container);
- } else if (utils.is.element(container)) {
+ } else if (is.element(container)) {
container.innerHTML = replace(container.innerHTML);
}
}
@@ -1451,48 +1436,41 @@ const controls = {
let target;
// Inject to custom location
- if (utils.is.string(this.config.selectors.controls.container)) {
+ if (is.string(this.config.selectors.controls.container)) {
target = document.querySelector(this.config.selectors.controls.container);
}
// Inject into the container by default
- if (!utils.is.element(target)) {
+ if (!is.element(target)) {
target = this.elements.container;
}
// Inject controls HTML
- if (utils.is.element(container)) {
+ if (is.element(container)) {
target.appendChild(container);
} else if (container) {
target.insertAdjacentHTML('beforeend', container);
}
// Find the elements if need be
- if (!utils.is.element(this.elements.controls)) {
+ if (!is.element(this.elements.controls)) {
controls.findElements.call(this);
}
// Edge sometimes doesn't finish the paint so force a redraw
if (window.navigator.userAgent.includes('Edge')) {
- utils.repaint(target);
+ repaint(target);
}
// Setup tooltips
if (this.config.tooltips.controls) {
- const labels = utils.getElements.call(
- this,
- [
- this.config.selectors.controls.wrapper,
- ' ',
- this.config.selectors.labels,
- ' .',
- this.config.classNames.hidden,
- ].join(''),
- );
+ const { classNames, selectors } = this.config;
+ const selector = `${selectors.controls.wrapper} ${selectors.labels} .${classNames.hidden}`;
+ const labels = getElements.call(this, selector);
Array.from(labels).forEach(label => {
- utils.toggleClass(label, this.config.classNames.hidden, false);
- utils.toggleClass(label, this.config.classNames.tooltip, true);
+ toggleClass(label, this.config.classNames.hidden, false);
+ toggleClass(label, this.config.classNames.tooltip, true);
});
}
},
diff --git a/src/js/fullscreen.js b/src/js/fullscreen.js
index cc91d1a4..d9cba17f 100644
--- a/src/js/fullscreen.js
+++ b/src/js/fullscreen.js
@@ -3,9 +3,10 @@
// https://developer.mozilla.org/en-US/docs/Web/API/Fullscreen_API#prefixing
// ==========================================================================
-import utils from './utils';
-
-const browser = utils.getBrowser();
+import browser from './utils/browser';
+import { hasClass, toggleClass, trapFocus } from './utils/elements';
+import { on, triggerEvent } from './utils/events';
+import is from './utils/is';
function onChange() {
if (!this.enabled) {
@@ -14,16 +15,16 @@ function onChange() {
// Update toggle button
const button = this.player.elements.buttons.fullscreen;
- if (utils.is.element(button)) {
+ if (is.element(button)) {
button.pressed = this.active;
}
// Trigger an event
- utils.dispatchEvent.call(this.player, this.target, this.active ? 'enterfullscreen' : 'exitfullscreen', true);
+ triggerEvent.call(this.player, this.target, this.active ? 'enterfullscreen' : 'exitfullscreen', true);
// Trap focus in container
if (!browser.isIos) {
- utils.trapFocus.call(this.player, this.target, this.active);
+ trapFocus.call(this.player, this.target, this.active);
}
}
@@ -42,7 +43,7 @@ function toggleFallback(toggle = false) {
document.body.style.overflow = toggle ? 'hidden' : '';
// Toggle class hook
- utils.toggleClass(this.target, this.player.config.classNames.fullscreen.fallback, toggle);
+ toggleClass(this.target, this.player.config.classNames.fullscreen.fallback, toggle);
// Toggle button and fire events
onChange.call(this);
@@ -62,15 +63,20 @@ class Fullscreen {
// Register event listeners
// Handle event (incase user presses escape etc)
- utils.on(document, this.prefix === 'ms' ? 'MSFullscreenChange' : `${this.prefix}fullscreenchange`, () => {
+ on.call(
+ this.player,
+ document,
+ this.prefix === 'ms' ? 'MSFullscreenChange' : `${this.prefix}fullscreenchange`,
+ () => {
// TODO: Filter for target??
onChange.call(this);
- });
+ },
+ );
// Fullscreen toggle on double click
- utils.on(this.player.elements.container, 'dblclick', event => {
+ on.call(this.player, this.player.elements.container, 'dblclick', event => {
// Ignore double click in controls
- if (utils.is.element(this.player.elements.controls) && this.player.elements.controls.contains(event.target)) {
+ if (is.element(this.player.elements.controls) && this.player.elements.controls.contains(event.target)) {
return;
}
@@ -83,26 +89,27 @@ class Fullscreen {
// Determine if native supported
static get native() {
- return !!(document.fullscreenEnabled || document.webkitFullscreenEnabled || document.mozFullScreenEnabled || document.msFullscreenEnabled);
+ return !!(
+ document.fullscreenEnabled ||
+ document.webkitFullscreenEnabled ||
+ document.mozFullScreenEnabled ||
+ document.msFullscreenEnabled
+ );
}
// Get the prefix for handlers
static get prefix() {
// No prefix
- if (utils.is.function(document.exitFullscreen)) {
+ if (is.function(document.exitFullscreen)) {
return '';
}
// Check for fullscreen support by vendor prefix
let value = '';
- const prefixes = [
- 'webkit',
- 'moz',
- 'ms',
- ];
+ const prefixes = ['webkit', 'moz', 'ms'];
prefixes.some(pre => {
- if (utils.is.function(document[`${pre}ExitFullscreen`]) || utils.is.function(document[`${pre}CancelFullScreen`])) {
+ if (is.function(document[`${pre}ExitFullscreen`]) || is.function(document[`${pre}CancelFullScreen`])) {
value = pre;
return true;
}
@@ -135,7 +142,7 @@ class Fullscreen {
// Fallback using classname
if (!Fullscreen.native) {
- return utils.hasClass(this.target, this.player.config.classNames.fullscreen.fallback);
+ return hasClass(this.target, this.player.config.classNames.fullscreen.fallback);
}
const element = !this.prefix ? document.fullscreenElement : document[`${this.prefix}${this.property}Element`];
@@ -145,7 +152,9 @@ class Fullscreen {
// Get target element
get target() {
- return browser.isIos && this.player.config.fullscreen.iosNative ? this.player.media : this.player.elements.container;
+ return browser.isIos && this.player.config.fullscreen.iosNative
+ ? this.player.media
+ : this.player.elements.container;
}
// Update UI
@@ -157,7 +166,7 @@ class Fullscreen {
}
// Add styling hook to show button
- utils.toggleClass(this.player.elements.container, this.player.config.classNames.fullscreen.enabled, this.enabled);
+ toggleClass(this.player.elements.container, this.player.config.classNames.fullscreen.enabled, this.enabled);
}
// Make an element fullscreen
@@ -175,7 +184,7 @@ class Fullscreen {
toggleFallback.call(this, true);
} else if (!this.prefix) {
this.target.requestFullscreen();
- } else if (!utils.is.empty(this.prefix)) {
+ } else if (!is.empty(this.prefix)) {
this.target[`${this.prefix}Request${this.property}`]();
}
}
@@ -194,7 +203,7 @@ class Fullscreen {
toggleFallback.call(this, false);
} else if (!this.prefix) {
(document.cancelFullScreen || document.exitFullscreen).call(document);
- } else if (!utils.is.empty(this.prefix)) {
+ } else if (!is.empty(this.prefix)) {
const action = this.prefix === 'moz' ? 'Cancel' : 'Exit';
document[`${this.prefix}${action}${this.property}`]();
}
diff --git a/src/js/html5.js b/src/js/html5.js
index 63596cfc..6aa96f4c 100644
--- a/src/js/html5.js
+++ b/src/js/html5.js
@@ -3,40 +3,28 @@
// ==========================================================================
import support from './support';
-import utils from './utils';
+import { removeElement } from './utils/elements';
+import { triggerEvent } from './utils/events';
const html5 = {
getSources() {
if (!this.isHTML5) {
- return null;
+ return [];
}
- return this.media.querySelectorAll('source');
+ const sources = Array.from(this.media.querySelectorAll('source'));
+
+ // Filter out unsupported sources
+ return sources.filter(source => support.mime.call(this, source.getAttribute('type')));
},
// Get quality levels
getQualityOptions() {
- if (!this.isHTML5) {
- return null;
- }
-
- // Get sources
- const sources = html5.getSources.call(this);
-
- if (utils.is.empty(sources)) {
- return null;
- }
-
- // Get <source> with size attribute
- const sizes = Array.from(sources).filter(source => !utils.is.empty(source.getAttribute('size')));
-
- // If none, bail
- if (utils.is.empty(sizes)) {
- return null;
- }
-
- // Reduce to unique list
- return utils.dedupe(sizes.map(source => Number(source.getAttribute('size'))));
+ // Get sizes from <source> elements
+ return html5.getSources
+ .call(this)
+ .map(source => Number(source.getAttribute('size')))
+ .filter(Boolean);
},
extend() {
@@ -51,60 +39,34 @@ const html5 = {
get() {
// Get sources
const sources = html5.getSources.call(player);
+ const [source] = sources.filter(source => source.getAttribute('src') === player.source);
- if (utils.is.empty(sources)) {
- return null;
- }
-
- const matches = Array.from(sources).filter(source => source.getAttribute('src') === player.source);
-
- if (utils.is.empty(matches)) {
- return null;
- }
-
- return Number(matches[0].getAttribute('size'));
+ // Return size, if match is found
+ return source && Number(source.getAttribute('size'));
},
set(input) {
// Get sources
const sources = html5.getSources.call(player);
- if (utils.is.empty(sources)) {
- return;
- }
+ // Get first match for requested size
+ const source = sources.find(source => Number(source.getAttribute('size')) === input);
- // Get matches for requested size
- const matches = Array.from(sources).filter(source => Number(source.getAttribute('size')) === input);
-
- // No matches for requested size
- if (utils.is.empty(matches)) {
+ // No matching source found
+ if (!source) {
return;
}
- // Get supported sources
- const supported = matches.filter(source => support.mime.call(player, source.getAttribute('type')));
-
- // No supported sources
- if (utils.is.empty(supported)) {
- return;
- }
-
- // Trigger change event
- utils.dispatchEvent.call(player, player.media, 'qualityrequested', false, {
- quality: input,
- });
-
// Get current state
const { currentTime, playing } = player;
// Set new source
- player.media.src = supported[0].getAttribute('src');
+ player.media.src = source.getAttribute('src');
// Restore time
const onLoadedMetaData = () => {
player.currentTime = currentTime;
- player.off('loadedmetadata', onLoadedMetaData);
};
- player.on('loadedmetadata', onLoadedMetaData);
+ player.once('loadedmetadata', onLoadedMetaData);
// Load new source
player.media.load();
@@ -115,7 +77,7 @@ const html5 = {
}
// Trigger change event
- utils.dispatchEvent.call(player, player.media, 'qualitychange', false, {
+ triggerEvent.call(player, player.media, 'qualitychange', false, {
quality: input,
});
},
@@ -130,7 +92,7 @@ const html5 = {
}
// Remove child sources
- utils.removeElement(html5.getSources());
+ removeElement(html5.getSources.call(this));
// Set blank video src attribute
// This is to prevent a MEDIA_ERR_SRC_NOT_SUPPORTED error
diff --git a/src/js/i18n.js b/src/js/i18n.js
index 62e5bdb0..5b0ebbab 100644
--- a/src/js/i18n.js
+++ b/src/js/i18n.js
@@ -2,17 +2,19 @@
// Plyr internationalization
// ==========================================================================
-import utils from './utils';
+import is from './utils/is';
+import { getDeep } from './utils/objects';
+import { replaceAll } from './utils/strings';
const i18n = {
get(key = '', config = {}) {
- if (utils.is.empty(key) || utils.is.empty(config)) {
+ if (is.empty(key) || is.empty(config)) {
return '';
}
- let string = utils.getDeep(config.i18n, key);
+ let string = getDeep(config.i18n, key);
- if (utils.is.empty(string)) {
+ if (is.empty(string)) {
return '';
}
@@ -21,11 +23,8 @@ const i18n = {
'{title}': config.title,
};
- Object.entries(replace).forEach(([
- key,
- value,
- ]) => {
- string = utils.replaceAll(string, key, value);
+ Object.entries(replace).forEach(([key, value]) => {
+ string = replaceAll(string, key, value);
});
return string;
diff --git a/src/js/listeners.js b/src/js/listeners.js
index c391ea4c..9d987508 100644
--- a/src/js/listeners.js
+++ b/src/js/listeners.js
@@ -4,10 +4,10 @@
import controls from './controls';
import ui from './ui';
-import utils from './utils';
-
-// Sniff out the browser
-const browser = utils.getBrowser();
+import browser from './utils/browser';
+import { getElement, getElements, getFocusElement, matches, toggleClass, toggleHidden } from './utils/elements';
+import { on, once, toggleListener, triggerEvent } from './utils/events';
+import is from './utils/is';
class Listeners {
constructor(player) {
@@ -32,7 +32,7 @@ class Listeners {
// If the event is bubbled from the media element
// Firefox doesn't get the keycode for whatever reason
- if (!utils.is.number(code)) {
+ if (!is.number(code)) {
return;
}
@@ -46,37 +46,16 @@ class Listeners {
// Reset on keyup
if (pressed) {
// Which keycodes should we prevent default
- const preventDefault = [
- 48,
- 49,
- 50,
- 51,
- 52,
- 53,
- 54,
- 56,
- 57,
- 32,
- 75,
- 38,
- 40,
- 77,
- 39,
- 37,
- 70,
- 67,
- 73,
- 76,
- 79,
- ];
+ const preventDefault = [32, 37, 38, 39, 40, 48, 49, 50, 51, 52, 53, 54, 56, 57, 67, 70, 73, 75, 76, 77, 79];
// Check focused element
// and if the focused element is not editable (e.g. text input)
// and any that accept key input http://webaim.org/techniques/keyboard/
- const focused = utils.getFocusElement();
- if (utils.is.element(focused) && (
- focused !== this.player.elements.inputs.seek &&
- utils.matches(focused, this.player.config.selectors.editable))
+ const focused = getFocusElement();
+ if (
+ is.element(focused) &&
+ (focused !== this.player.elements.inputs.seek &&
+ matches(focused, this.player.config.selectors.editable))
) {
return;
}
@@ -195,41 +174,37 @@ class Listeners {
this.player.touch = true;
// Add touch class
- utils.toggleClass(this.player.elements.container, this.player.config.classNames.isTouch, true);
-
- // Clean up
- utils.off(document.body, 'touchstart', this.firstTouch);
+ toggleClass(this.player.elements.container, this.player.config.classNames.isTouch, true);
}
// Global window & document listeners
global(toggle = true) {
// Keyboard shortcuts
if (this.player.config.keyboard.global) {
- utils.toggleListener(window, 'keydown keyup', this.handleKey, toggle, false);
+ toggleListener.call(this.player, window, 'keydown keyup', this.handleKey, toggle, false);
}
// Click anywhere closes menu
- utils.toggleListener(document.body, 'click', this.toggleMenu, toggle);
+ toggleListener.call(this.player, document.body, 'click', this.toggleMenu, toggle);
// Detect touch by events
- utils.on(document.body, 'touchstart', this.firstTouch);
+ once.call(this.player, document.body, 'touchstart', this.firstTouch);
}
// Container listeners
container() {
// Keyboard shortcuts
if (!this.player.config.keyboard.global && this.player.config.keyboard.focused) {
- utils.on(this.player.elements.container, 'keydown keyup', this.handleKey, false);
+ on.call(this.player, this.player.elements.container, 'keydown keyup', this.handleKey, false);
}
// Detect tab focus
// Remove class on blur/focusout
- utils.on(this.player.elements.container, 'focusout', event => {
- utils.toggleClass(event.target, this.player.config.classNames.tabFocus, false);
+ on.call(this.player, this.player.elements.container, 'focusout', event => {
+ toggleClass(event.target, this.player.config.classNames.tabFocus, false);
});
-
// Add classname to tabbed elements
- utils.on(this.player.elements.container, 'keydown', event => {
+ on.call(this.player, this.player.elements.container, 'keydown', event => {
if (event.keyCode !== 9) {
return;
}
@@ -237,59 +212,64 @@ class Listeners {
// Delay the adding of classname until the focus has changed
// This event fires before the focusin event
setTimeout(() => {
- utils.toggleClass(utils.getFocusElement(), this.player.config.classNames.tabFocus, true);
+ toggleClass(getFocusElement(), this.player.config.classNames.tabFocus, true);
}, 0);
});
// Toggle controls on mouse events and entering fullscreen
- utils.on(this.player.elements.container, 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen', event => {
- const { controls } = this.player.elements;
+ on.call(
+ this.player,
+ this.player.elements.container,
+ 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen',
+ event => {
+ const { controls } = this.player.elements;
- // Remove button states for fullscreen
- if (event.type === 'enterfullscreen') {
- controls.pressed = false;
- controls.hover = false;
- }
+ // Remove button states for fullscreen
+ if (event.type === 'enterfullscreen') {
+ controls.pressed = false;
+ controls.hover = false;
+ }
- // Show, then hide after a timeout unless another control event occurs
- const show = [
- 'touchstart',
- 'touchmove',
- 'mousemove',
- ].includes(event.type);
+ // Show, then hide after a timeout unless another control event occurs
+ const show = ['touchstart', 'touchmove', 'mousemove'].includes(event.type);
- let delay = 0;
+ let delay = 0;
- if (show) {
- ui.toggleControls.call(this.player, true);
- // Use longer timeout for touch devices
- delay = this.player.touch ? 3000 : 2000;
- }
+ if (show) {
+ ui.toggleControls.call(this.player, true);
+ // Use longer timeout for touch devices
+ delay = this.player.touch ? 3000 : 2000;
+ }
- // Clear timer
- clearTimeout(this.player.timers.controls);
- // Timer to prevent flicker when seeking
- this.player.timers.controls = setTimeout(() => ui.toggleControls.call(this.player, false), delay);
- });
+ // Clear timer
+ clearTimeout(this.player.timers.controls);
+ // Timer to prevent flicker when seeking
+ this.player.timers.controls = setTimeout(() => ui.toggleControls.call(this.player, false), delay);
+ },
+ );
}
// Listen for media events
media() {
// Time change on media
- utils.on(this.player.media, 'timeupdate seeking seeked', event => controls.timeUpdate.call(this.player, event));
+ on.call(this.player, this.player.media, 'timeupdate seeking seeked', event =>
+ controls.timeUpdate.call(this.player, event),
+ );
// Display duration
- utils.on(this.player.media, 'durationchange loadeddata loadedmetadata', event => controls.durationUpdate.call(this.player, event));
+ on.call(this.player, this.player.media, 'durationchange loadeddata loadedmetadata', event =>
+ controls.durationUpdate.call(this.player, event),
+ );
// Check for audio tracks on load
// We can't use `loadedmetadata` as it doesn't seem to have audio tracks at that point
- utils.on(this.player.media, 'loadeddata', () => {
- utils.toggleHidden(this.player.elements.volume, !this.player.hasAudio);
- utils.toggleHidden(this.player.elements.buttons.mute, !this.player.hasAudio);
+ on.call(this.player, this.player.media, 'canplay', () => {
+ toggleHidden(this.player.elements.volume, !this.player.hasAudio);
+ toggleHidden(this.player.elements.buttons.mute, !this.player.hasAudio);
});
// Handle the media finishing
- utils.on(this.player.media, 'ended', () => {
+ on.call(this.player, this.player.media, 'ended', () => {
// Show poster on end
if (this.player.isHTML5 && this.player.isVideo && this.player.config.resetOnEnd) {
// Restart
@@ -298,20 +278,28 @@ class Listeners {
});
// Check for buffer progress
- utils.on(this.player.media, 'progress playing seeking seeked', event => controls.updateProgress.call(this.player, event));
+ on.call(this.player, this.player.media, 'progress playing seeking seeked', event =>
+ controls.updateProgress.call(this.player, event),
+ );
// Handle volume changes
- utils.on(this.player.media, 'volumechange', event => controls.updateVolume.call(this.player, event));
+ on.call(this.player, this.player.media, 'volumechange', event =>
+ controls.updateVolume.call(this.player, event),
+ );
// Handle play/pause
- utils.on(this.player.media, 'playing play pause ended emptied timeupdate', event => ui.checkPlaying.call(this.player, event));
+ on.call(this.player, this.player.media, 'playing play pause ended emptied timeupdate', event =>
+ ui.checkPlaying.call(this.player, event),
+ );
// Loading state
- utils.on(this.player.media, 'waiting canplay seeked playing', event => ui.checkLoading.call(this.player, event));
+ on.call(this.player, this.player.media, 'waiting canplay seeked playing', event =>
+ ui.checkLoading.call(this.player, event),
+ );
// If autoplay, then load advertisement if required
// TODO: Show some sort of loading state while the ad manager loads else there's a delay before ad shows
- utils.on(this.player.media, 'playing', () => {
+ on.call(this.player, this.player.media, 'playing', () => {
if (!this.player.ads) {
return;
}
@@ -326,15 +314,15 @@ class Listeners {
// Click video
if (this.player.supported.ui && this.player.config.clickToPlay && !this.player.isAudio) {
// Re-fetch the wrapper
- const wrapper = utils.getElement.call(this.player, `.${this.player.config.classNames.video}`);
+ const wrapper = getElement.call(this.player, `.${this.player.config.classNames.video}`);
// Bail if there's no wrapper (this should never happen)
- if (!utils.is.element(wrapper)) {
+ if (!is.element(wrapper)) {
return;
}
// On click play, pause ore restart
- utils.on(wrapper, 'click', () => {
+ on.call(this.player, wrapper, 'click', () => {
// Touch devices will just show controls (if we're hiding controls)
if (this.player.config.hideControls && this.player.touch && !this.player.paused) {
return;
@@ -353,7 +341,8 @@ class Listeners {
// Disable right click
if (this.player.supported.ui && this.player.config.disableContextMenu) {
- utils.on(
+ on.call(
+ this.player,
this.player.elements.wrapper,
'contextmenu',
event => {
@@ -364,13 +353,13 @@ class Listeners {
}
// Volume change
- utils.on(this.player.media, 'volumechange', () => {
+ on.call(this.player, this.player.media, 'volumechange', () => {
// Save to storage
this.player.storage.set({ volume: this.player.volume, muted: this.player.muted });
});
// Speed change
- utils.on(this.player.media, 'ratechange', () => {
+ on.call(this.player, this.player.media, 'ratechange', () => {
// Update UI
controls.updateSetting.call(this.player, 'speed');
@@ -379,49 +368,29 @@ class Listeners {
});
// Quality request
- utils.on(this.player.media, 'qualityrequested', event => {
+ on.call(this.player, this.player.media, 'qualityrequested', event => {
// Save to storage
this.player.storage.set({ quality: event.detail.quality });
});
// Quality change
- utils.on(this.player.media, 'qualitychange', event => {
+ on.call(this.player, this.player.media, 'qualitychange', event => {
// Update UI
controls.updateSetting.call(this.player, 'quality', null, event.detail.quality);
});
- // Caption language change
- utils.on(this.player.media, 'languagechange', () => {
- // Update UI
- controls.updateSetting.call(this.player, 'captions');
-
- // Save to storage
- this.player.storage.set({ language: this.player.language });
- });
-
- // Captions toggle
- utils.on(this.player.media, 'captionsenabled captionsdisabled', () => {
- // Update UI
- controls.updateSetting.call(this.player, 'captions');
-
- // Save to storage
- this.player.storage.set({ captions: this.player.captions.active });
- });
-
// Proxy events to container
// Bubble up key events for Edge
- utils.on(this.player.media, this.player.config.events.concat([
- 'keyup',
- 'keydown',
- ]).join(' '), event => {
- let {detail = {}} = event;
+ const proxyEvents = this.player.config.events.concat(['keyup', 'keydown']).join(' ');
+ on.call(this.player, this.player.media, proxyEvents, event => {
+ let { detail = {} } = event;
// Get error details from media
if (event.type === 'error') {
detail = this.player.media.error;
}
- utils.dispatchEvent.call(this.player, this.player.elements.container, event.type, true, detail);
+ triggerEvent.call(this.player, this.player.elements.container, event.type, true, detail);
});
}
@@ -433,7 +402,7 @@ class Listeners {
// Run default and custom handlers
const proxy = (event, defaultHandler, customHandlerKey) => {
const customHandler = this.player.config.listeners[customHandlerKey];
- const hasCustomHandler = utils.is.function(customHandler);
+ const hasCustomHandler = is.function(customHandler);
let returned = true;
// Execute custom handler
@@ -442,33 +411,41 @@ class Listeners {
}
// Only call default handler if not prevented in custom handler
- if (returned && utils.is.function(defaultHandler)) {
+ if (returned && is.function(defaultHandler)) {
defaultHandler.call(this.player, event);
}
};
// Trigger custom and default handlers
- const on = (element, type, defaultHandler, customHandlerKey, passive = true) => {
+ const bind = (element, type, defaultHandler, customHandlerKey, passive = true) => {
const customHandler = this.player.config.listeners[customHandlerKey];
- const hasCustomHandler = utils.is.function(customHandler);
-
- utils.on(element, type, event => proxy(event, defaultHandler, customHandlerKey), passive && !hasCustomHandler);
+ const hasCustomHandler = is.function(customHandler);
+
+ on.call(
+ this.player,
+ element,
+ type,
+ event => proxy(event, defaultHandler, customHandlerKey),
+ passive && !hasCustomHandler,
+ );
};
// Play/pause toggle
- on(this.player.elements.buttons.play, 'click', this.player.togglePlay, 'play');
+ Array.from(this.player.elements.buttons.play).forEach(button => {
+ bind(button, 'click', this.player.togglePlay, 'play');
+ });
// Pause
- on(this.player.elements.buttons.restart, 'click', this.player.restart, 'restart');
+ bind(this.player.elements.buttons.restart, 'click', this.player.restart, 'restart');
// Rewind
- on(this.player.elements.buttons.rewind, 'click', this.player.rewind, 'rewind');
+ bind(this.player.elements.buttons.rewind, 'click', this.player.rewind, 'rewind');
// Rewind
- on(this.player.elements.buttons.fastForward, 'click', this.player.forward, 'fastForward');
+ bind(this.player.elements.buttons.fastForward, 'click', this.player.forward, 'fastForward');
// Mute toggle
- on(
+ bind(
this.player.elements.buttons.mute,
'click',
() => {
@@ -478,10 +455,10 @@ class Listeners {
);
// Captions toggle
- on(this.player.elements.buttons.captions, 'click', this.player.toggleCaptions);
+ bind(this.player.elements.buttons.captions, 'click', () => this.player.toggleCaptions());
// Fullscreen toggle
- on(
+ bind(
this.player.elements.buttons.fullscreen,
'click',
() => {
@@ -491,7 +468,7 @@ class Listeners {
);
// Picture-in-Picture
- on(
+ bind(
this.player.elements.buttons.pip,
'click',
() => {
@@ -501,15 +478,15 @@ class Listeners {
);
// Airplay
- on(this.player.elements.buttons.airplay, 'click', this.player.airplay, 'airplay');
+ bind(this.player.elements.buttons.airplay, 'click', this.player.airplay, 'airplay');
// Settings menu
- on(this.player.elements.buttons.settings, 'click', event => {
+ bind(this.player.elements.buttons.settings, 'click', event => {
controls.toggleMenu.call(this.player, event);
});
// Settings menu
- on(this.player.elements.settings.form, 'click', event => {
+ bind(this.player.elements.settings.form, 'click', event => {
event.stopPropagation();
// Go back to home tab on click
@@ -519,7 +496,7 @@ class Listeners {
};
// Settings menu items - use event delegation as items are added/removed
- if (utils.matches(event.target, this.player.config.selectors.inputs.language)) {
+ if (matches(event.target, this.player.config.selectors.inputs.language)) {
proxy(
event,
() => {
@@ -528,7 +505,7 @@ class Listeners {
},
'language',
);
- } else if (utils.matches(event.target, this.player.config.selectors.inputs.quality)) {
+ } else if (matches(event.target, this.player.config.selectors.inputs.quality)) {
proxy(
event,
() => {
@@ -537,7 +514,7 @@ class Listeners {
},
'quality',
);
- } else if (utils.matches(event.target, this.player.config.selectors.inputs.speed)) {
+ } else if (matches(event.target, this.player.config.selectors.inputs.speed)) {
proxy(
event,
() => {
@@ -553,14 +530,14 @@ class Listeners {
});
// Set range input alternative "value", which matches the tooltip time (#954)
- on(this.player.elements.inputs.seek, 'mousedown mousemove', event => {
+ bind(this.player.elements.inputs.seek, 'mousedown mousemove', event => {
const clientRect = this.player.elements.progress.getBoundingClientRect();
const percent = 100 / clientRect.width * (event.pageX - clientRect.left);
event.currentTarget.setAttribute('seek-value', percent);
});
// Pause while seeking
- on(this.player.elements.inputs.seek, 'mousedown mouseup keydown keyup touchstart touchend', event => {
+ bind(this.player.elements.inputs.seek, 'mousedown mouseup keydown keyup touchstart touchend', event => {
const seek = event.currentTarget;
const code = event.keyCode ? event.keyCode : event.which;
@@ -573,11 +550,7 @@ class Listeners {
const play = seek.hasAttribute('play-on-seeked');
// Done seeking
- const done = [
- 'mouseup',
- 'touchend',
- 'keyup',
- ].includes(event.type);
+ const done = ['mouseup', 'touchend', 'keyup'].includes(event.type);
// If we're done seeking and it was playing, resume playback
if (play && done) {
@@ -590,7 +563,7 @@ class Listeners {
});
// Seek
- on(
+ bind(
this.player.elements.inputs.seek,
inputEvent,
event => {
@@ -599,7 +572,7 @@ class Listeners {
// If it exists, use seek-value instead of "value" for consistency with tooltip time (#954)
let seekTo = seek.getAttribute('seek-value');
- if (utils.is.empty(seekTo)) {
+ if (is.empty(seekTo)) {
seekTo = seek.value;
}
@@ -612,8 +585,8 @@ class Listeners {
// Current time invert
// Only if one time element is used for both currentTime and duration
- if (this.player.config.toggleInvert && !utils.is.element(this.player.elements.display.duration)) {
- on(this.player.elements.display.currentTime, 'click', () => {
+ if (this.player.config.toggleInvert && !is.element(this.player.elements.display.duration)) {
+ bind(this.player.elements.display.currentTime, 'click', () => {
// Do nothing if we're at the start
if (this.player.currentTime === 0) {
return;
@@ -626,7 +599,7 @@ class Listeners {
}
// Volume
- on(
+ bind(
this.player.elements.inputs.volume,
inputEvent,
event => {
@@ -637,33 +610,32 @@ class Listeners {
// Polyfill for lower fill in <input type="range"> for webkit
if (browser.isWebkit) {
- on(utils.getElements.call(this.player, 'input[type="range"]'), 'input', event => {
- controls.updateRangeFill.call(this.player, event.target);
+ Array.from(getElements.call(this.player, 'input[type="range"]')).forEach(element => {
+ bind(element, 'input', event => controls.updateRangeFill.call(this.player, event.target));
});
}
// Seek tooltip
- on(this.player.elements.progress, 'mouseenter mouseleave mousemove', event => controls.updateSeekTooltip.call(this.player, event));
+ bind(this.player.elements.progress, 'mouseenter mouseleave mousemove', event =>
+ controls.updateSeekTooltip.call(this.player, event),
+ );
// Update controls.hover state (used for ui.toggleControls to avoid hiding when interacting)
- on(this.player.elements.controls, 'mouseenter mouseleave', event => {
+ bind(this.player.elements.controls, 'mouseenter mouseleave', event => {
this.player.elements.controls.hover = !this.player.touch && event.type === 'mouseenter';
});
// Update controls.pressed state (used for ui.toggleControls to avoid hiding when interacting)
- on(this.player.elements.controls, 'mousedown mouseup touchstart touchend touchcancel', event => {
- this.player.elements.controls.pressed = [
- 'mousedown',
- 'touchstart',
- ].includes(event.type);
+ bind(this.player.elements.controls, 'mousedown mouseup touchstart touchend touchcancel', event => {
+ this.player.elements.controls.pressed = ['mousedown', 'touchstart'].includes(event.type);
});
// Focus in/out on controls
- on(this.player.elements.controls, 'focusin focusout', event => {
+ bind(this.player.elements.controls, 'focusin focusout', event => {
const { config, elements, timers } = this.player;
// Skip transition to prevent focus from scrolling the parent element
- utils.toggleClass(elements.controls, config.classNames.noTransition, event.type === 'focusin');
+ toggleClass(elements.controls, config.classNames.noTransition, event.type === 'focusin');
// Toggle
ui.toggleControls.call(this.player, event.type === 'focusin');
@@ -672,7 +644,7 @@ class Listeners {
if (event.type === 'focusin') {
// Restore transition
setTimeout(() => {
- utils.toggleClass(elements.controls, config.classNames.noTransition, false);
+ toggleClass(elements.controls, config.classNames.noTransition, false);
}, 0);
// Delay a little more for keyboard users
@@ -686,7 +658,7 @@ class Listeners {
});
// Mouse wheel for volume
- on(
+ bind(
this.player.elements.inputs.volume,
'wheel',
event => {
@@ -719,7 +691,10 @@ class Listeners {
}
// Don't break page scrolling at max and min
- if ((direction === 1 && this.player.media.volume < 1) || (direction === -1 && this.player.media.volume > 0)) {
+ if (
+ (direction === 1 && this.player.media.volume < 1) ||
+ (direction === -1 && this.player.media.volume > 0)
+ ) {
event.preventDefault();
}
},
@@ -727,11 +702,6 @@ class Listeners {
false,
);
}
-
- // Reset on destroy
- clear() {
- this.global(false);
- }
}
export default Listeners;
diff --git a/src/js/media.js b/src/js/media.js
index f10bea1f..eb37d441 100644
--- a/src/js/media.js
+++ b/src/js/media.js
@@ -5,7 +5,7 @@
import html5 from './html5';
import vimeo from './plugins/vimeo';
import youtube from './plugins/youtube';
-import utils from './utils';
+import { createElement, toggleClass, wrap } from './utils/elements';
const media = {
// Setup media
@@ -17,50 +17,41 @@ const media = {
}
// Add type class
- utils.toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', this.type), true);
+ toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', this.type), true);
// Add provider class
- utils.toggleClass(this.elements.container, this.config.classNames.provider.replace('{0}', this.provider), true);
+ toggleClass(this.elements.container, this.config.classNames.provider.replace('{0}', this.provider), true);
// Add video class for embeds
// This will require changes if audio embeds are added
if (this.isEmbed) {
- utils.toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', 'video'), true);
+ toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', 'video'), true);
}
// Inject the player wrapper
if (this.isVideo) {
// Create the wrapper div
- this.elements.wrapper = utils.createElement('div', {
+ this.elements.wrapper = createElement('div', {
class: this.config.classNames.video,
});
// Wrap the video in a container
- utils.wrap(this.media, this.elements.wrapper);
+ wrap(this.media, this.elements.wrapper);
// Faux poster container
- this.elements.poster = utils.createElement('div', {
+ this.elements.poster = createElement('div', {
class: this.config.classNames.poster,
});
this.elements.wrapper.appendChild(this.elements.poster);
}
- if (this.isEmbed) {
- switch (this.provider) {
- case 'youtube':
- youtube.setup.call(this);
- break;
-
- case 'vimeo':
- vimeo.setup.call(this);
- break;
-
- default:
- break;
- }
- } else if (this.isHTML5) {
+ if (this.isHTML5) {
html5.extend.call(this);
+ } else if (this.isYouTube) {
+ youtube.setup.call(this);
+ } else if (this.isVimeo) {
+ vimeo.setup.call(this);
}
},
};
diff --git a/src/js/plugins/ads.js b/src/js/plugins/ads.js
index 0246e221..e0d49265 100644
--- a/src/js/plugins/ads.js
+++ b/src/js/plugins/ads.js
@@ -7,7 +7,12 @@
/* global google */
import i18n from '../i18n';
-import utils from '../utils';
+import { createElement } from './../utils/elements';
+import { triggerEvent } from './../utils/events';
+import is from './../utils/is';
+import loadScript from './../utils/loadScript';
+import { formatTime } from './../utils/time';
+import { buildUrlParams } from './../utils/urls';
class Ads {
/**
@@ -44,7 +49,7 @@ class Ads {
}
get enabled() {
- return this.player.isVideo && this.player.config.ads.enabled && !utils.is.empty(this.publisherId);
+ return this.player.isVideo && this.player.config.ads.enabled && !is.empty(this.publisherId);
}
/**
@@ -53,9 +58,8 @@ class Ads {
load() {
if (this.enabled) {
// Check if the Google IMA3 SDK is loaded or load it ourselves
- if (!utils.is.object(window.google) || !utils.is.object(window.google.ima)) {
- utils
- .loadScript(this.player.config.urls.googleIMA.sdk)
+ if (!is.object(window.google) || !is.object(window.google.ima)) {
+ loadScript(this.player.config.urls.googleIMA.sdk)
.then(() => {
this.ready();
})
@@ -103,7 +107,7 @@ class Ads {
const base = 'https://go.aniview.com/api/adserver6/vast/';
- return `${base}?${utils.buildUrlParams(params)}`;
+ return `${base}?${buildUrlParams(params)}`;
}
/**
@@ -116,7 +120,7 @@ class Ads {
*/
setupIMA() {
// Create the container for our advertisements
- this.elements.container = utils.createElement('div', {
+ this.elements.container = createElement('div', {
class: this.player.config.classNames.ads,
});
this.player.elements.container.appendChild(this.elements.container);
@@ -146,7 +150,11 @@ class Ads {
this.loader = new google.ima.AdsLoader(this.elements.displayContainer);
// Listen and respond to ads loaded and error events
- this.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, event => this.onAdsManagerLoaded(event), false);
+ this.loader.addEventListener(
+ google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED,
+ event => this.onAdsManagerLoaded(event),
+ false,
+ );
this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, error => this.onAdError(error), false);
// Request video ads
@@ -184,7 +192,7 @@ class Ads {
}
const update = () => {
- const time = utils.formatTime(Math.max(this.manager.getRemainingTime(), 0));
+ const time = formatTime(Math.max(this.manager.getRemainingTime(), 0));
const label = `${i18n.get('advertisement', this.player.config)} - ${time}`;
this.elements.container.setAttribute('data-badge-text', label);
};
@@ -212,14 +220,14 @@ class Ads {
this.cuePoints = this.manager.getCuePoints();
// Add advertisement cue's within the time line if available
- if (!utils.is.empty(this.cuePoints)) {
+ if (!is.empty(this.cuePoints)) {
this.cuePoints.forEach(cuePoint => {
if (cuePoint !== 0 && cuePoint !== -1 && cuePoint < this.player.duration) {
const seekElement = this.player.elements.progress;
- if (utils.is.element(seekElement)) {
+ if (is.element(seekElement)) {
const cuePercentage = 100 / this.player.duration * cuePoint;
- const cue = utils.createElement('span', {
+ const cue = createElement('span', {
class: this.player.config.classNames.cues,
});
@@ -266,7 +274,7 @@ class Ads {
// Proxy event
const dispatchEvent = type => {
const event = `ads${type.replace(/_/g, '').toLowerCase()}`;
- utils.dispatchEvent.call(this.player, this.player.media, event);
+ triggerEvent.call(this.player, this.player.media, event);
};
switch (event.type) {
@@ -393,7 +401,7 @@ class Ads {
this.player.on('seeked', () => {
const seekedTime = this.player.currentTime;
- if (utils.is.empty(this.cuePoints)) {
+ if (is.empty(this.cuePoints)) {
return;
}
@@ -530,9 +538,9 @@ class Ads {
trigger(event, ...args) {
const handlers = this.events[event];
- if (utils.is.array(handlers)) {
+ if (is.array(handlers)) {
handlers.forEach(handler => {
- if (utils.is.function(handler)) {
+ if (is.function(handler)) {
handler.apply(this, args);
}
});
@@ -546,7 +554,7 @@ class Ads {
* @return {Ads}
*/
on(event, callback) {
- if (!utils.is.array(this.events[event])) {
+ if (!is.array(this.events[event])) {
this.events[event] = [];
}
@@ -577,7 +585,7 @@ class Ads {
* @param {string} from
*/
clearSafetyTimer(from) {
- if (!utils.is.nullOrUndefined(this.safetyTimer)) {
+ if (!is.nullOrUndefined(this.safetyTimer)) {
this.player.debug.log(`Safety timer cleared from: ${from}`);
clearTimeout(this.safetyTimer);
diff --git a/src/js/plugins/vimeo.js b/src/js/plugins/vimeo.js
index 652c920c..09339229 100644
--- a/src/js/plugins/vimeo.js
+++ b/src/js/plugins/vimeo.js
@@ -5,7 +5,34 @@
import captions from './../captions';
import controls from './../controls';
import ui from './../ui';
-import utils from './../utils';
+import { createElement, replaceElement, toggleClass } from './../utils/elements';
+import { triggerEvent } from './../utils/events';
+import fetch from './../utils/fetch';
+import is from './../utils/is';
+import loadScript from './../utils/loadScript';
+import { format, stripHTML } from './../utils/strings';
+import { buildUrlParams } from './../utils/urls';
+
+// Parse Vimeo ID from URL
+function parseId(url) {
+ if (is.empty(url)) {
+ return null;
+ }
+
+ if (is.number(Number(url))) {
+ return url;
+ }
+
+ const regex = /^.*(vimeo.com\/|video\/)(\d+).*/;
+ return url.match(regex) ? RegExp.$2 : url;
+}
+
+// Get aspect ratio for dimensions
+function getAspectRatio(width, height) {
+ const getRatio = (w, h) => (h === 0 ? w : getRatio(h, w % h));
+ const ratio = getRatio(width, height);
+ return `${width / ratio}:${height / ratio}`;
+}
// Set playback state and trigger change (only on actual change)
function assurePlaybackState(play) {
@@ -14,22 +41,21 @@ function assurePlaybackState(play) {
}
if (this.media.paused === play) {
this.media.paused = !play;
- utils.dispatchEvent.call(this, this.media, play ? 'play' : 'pause');
+ triggerEvent.call(this, this.media, play ? 'play' : 'pause');
}
}
const vimeo = {
setup() {
// Add embed class for responsive
- utils.toggleClass(this.elements.wrapper, this.config.classNames.embed, true);
+ toggleClass(this.elements.wrapper, this.config.classNames.embed, true);
// Set intial ratio
vimeo.setAspectRatio.call(this);
// Load the API if not already
- if (!utils.is.object(window.Vimeo)) {
- utils
- .loadScript(this.config.urls.vimeo.sdk)
+ if (!is.object(window.Vimeo)) {
+ loadScript(this.config.urls.vimeo.sdk)
.then(() => {
vimeo.ready.call(this);
})
@@ -44,8 +70,8 @@ const vimeo = {
// Set aspect ratio
// For Vimeo we have an extra 300% height <div> to hide the standard controls and UI
setAspectRatio(input) {
- const ratio = utils.is.string(input) ? input.split(':') : this.config.ratio.split(':');
- const padding = 100 / ratio[0] * ratio[1];
+ const [x, y] = (is.string(input) ? input : this.config.ratio).split(':');
+ const padding = 100 / x * y;
this.elements.wrapper.style.paddingBottom = `${padding}%`;
if (this.supported.ui) {
@@ -73,34 +99,37 @@ const vimeo = {
gesture: 'media',
playsinline: !this.config.fullscreen.iosNative,
};
- const params = utils.buildUrlParams(options);
+ const params = buildUrlParams(options);
// Get the source URL or ID
let source = player.media.getAttribute('src');
// Get from <div> if needed
- if (utils.is.empty(source)) {
+ if (is.empty(source)) {
source = player.media.getAttribute(player.config.attributes.embed.id);
}
- const id = utils.parseVimeoId(source);
+ const id = parseId(source);
// Build an iframe
- const iframe = utils.createElement('iframe');
- const src = utils.format(player.config.urls.vimeo.iframe, id, params);
+ const iframe = createElement('iframe');
+ const src = format(player.config.urls.vimeo.iframe, id, params);
iframe.setAttribute('src', src);
iframe.setAttribute('allowfullscreen', '');
iframe.setAttribute('allowtransparency', '');
iframe.setAttribute('allow', 'autoplay');
+ // Get poster, if already set
+ const { poster } = player;
+
// Inject the package
- const wrapper = utils.createElement('div', { class: player.config.classNames.embedContainer });
+ const wrapper = createElement('div', { poster, class: player.config.classNames.embedContainer });
wrapper.appendChild(iframe);
- player.media = utils.replaceElement(wrapper, player.media);
+ player.media = replaceElement(wrapper, player.media);
// Get poster image
- utils.fetch(utils.format(player.config.urls.vimeo.api, id), 'json').then(response => {
- if (utils.is.empty(response)) {
+ fetch(format(player.config.urls.vimeo.api, id), 'json').then(response => {
+ if (is.empty(response)) {
return;
}
@@ -111,7 +140,7 @@ const vimeo = {
url.pathname = `${url.pathname.split('_')[0]}.jpg`;
// Set and show poster
- ui.setPoster.call(player, url.href);
+ ui.setPoster.call(player, url.href).catch(() => {});
});
// Setup instance
@@ -160,7 +189,7 @@ const vimeo = {
// Set seeking state and trigger event
media.seeking = true;
- utils.dispatchEvent.call(player, media, 'seeking');
+ triggerEvent.call(player, media, 'seeking');
// If paused, mute until seek is complete
Promise.resolve(restorePause && embed.setVolume(0))
@@ -187,7 +216,7 @@ const vimeo = {
.setPlaybackRate(input)
.then(() => {
speed = input;
- utils.dispatchEvent.call(player, player.media, 'ratechange');
+ triggerEvent.call(player, player.media, 'ratechange');
})
.catch(error => {
// Hide menu item (and menu if empty)
@@ -207,7 +236,7 @@ const vimeo = {
set(input) {
player.embed.setVolume(input).then(() => {
volume = input;
- utils.dispatchEvent.call(player, player.media, 'volumechange');
+ triggerEvent.call(player, player.media, 'volumechange');
});
},
});
@@ -219,11 +248,11 @@ const vimeo = {
return muted;
},
set(input) {
- const toggle = utils.is.boolean(input) ? input : false;
+ const toggle = is.boolean(input) ? input : false;
player.embed.setVolume(toggle ? 0 : player.config.volume).then(() => {
muted = toggle;
- utils.dispatchEvent.call(player, player.media, 'volumechange');
+ triggerEvent.call(player, player.media, 'volumechange');
});
},
});
@@ -235,7 +264,7 @@ const vimeo = {
return loop;
},
set(input) {
- const toggle = utils.is.boolean(input) ? input : player.config.loop.active;
+ const toggle = is.boolean(input) ? input : player.config.loop.active;
player.embed.setLoop(toggle).then(() => {
loop = toggle;
@@ -268,11 +297,8 @@ const vimeo = {
});
// Set aspect ratio based on video size
- Promise.all([
- player.embed.getVideoWidth(),
- player.embed.getVideoHeight(),
- ]).then(dimensions => {
- const ratio = utils.getAspectRatio(dimensions[0], dimensions[1]);
+ Promise.all([player.embed.getVideoWidth(), player.embed.getVideoHeight()]).then(dimensions => {
+ const ratio = getAspectRatio(dimensions[0], dimensions[1]);
vimeo.setAspectRatio.call(this, ratio);
});
@@ -290,13 +316,13 @@ const vimeo = {
// Get current time
player.embed.getCurrentTime().then(value => {
currentTime = value;
- utils.dispatchEvent.call(player, player.media, 'timeupdate');
+ triggerEvent.call(player, player.media, 'timeupdate');
});
// Get duration
player.embed.getDuration().then(value => {
player.media.duration = value;
- utils.dispatchEvent.call(player, player.media, 'durationchange');
+ triggerEvent.call(player, player.media, 'durationchange');
});
// Get captions
@@ -306,7 +332,7 @@ const vimeo = {
});
player.embed.on('cuechange', ({ cues = [] }) => {
- const strippedCues = cues.map(cue => utils.stripHTML(cue.text));
+ const strippedCues = cues.map(cue => stripHTML(cue.text));
captions.updateCues.call(player, strippedCues);
});
@@ -315,11 +341,11 @@ const vimeo = {
player.embed.getPaused().then(paused => {
assurePlaybackState.call(player, !paused);
if (!paused) {
- utils.dispatchEvent.call(player, player.media, 'playing');
+ triggerEvent.call(player, player.media, 'playing');
}
});
- if (utils.is.element(player.embed.element) && player.supported.ui) {
+ if (is.element(player.embed.element) && player.supported.ui) {
const frame = player.embed.element;
// Fix keyboard focus issues
@@ -330,7 +356,7 @@ const vimeo = {
player.embed.on('play', () => {
assurePlaybackState.call(player, true);
- utils.dispatchEvent.call(player, player.media, 'playing');
+ triggerEvent.call(player, player.media, 'playing');
});
player.embed.on('pause', () => {
@@ -340,16 +366,16 @@ const vimeo = {
player.embed.on('timeupdate', data => {
player.media.seeking = false;
currentTime = data.seconds;
- utils.dispatchEvent.call(player, player.media, 'timeupdate');
+ triggerEvent.call(player, player.media, 'timeupdate');
});
player.embed.on('progress', data => {
player.media.buffered = data.percent;
- utils.dispatchEvent.call(player, player.media, 'progress');
+ triggerEvent.call(player, player.media, 'progress');
// Check all loaded
if (parseInt(data.percent, 10) === 1) {
- utils.dispatchEvent.call(player, player.media, 'canplaythrough');
+ triggerEvent.call(player, player.media, 'canplaythrough');
}
// Get duration as if we do it before load, it gives an incorrect value
@@ -357,24 +383,24 @@ const vimeo = {
player.embed.getDuration().then(value => {
if (value !== player.media.duration) {
player.media.duration = value;
- utils.dispatchEvent.call(player, player.media, 'durationchange');
+ triggerEvent.call(player, player.media, 'durationchange');
}
});
});
player.embed.on('seeked', () => {
player.media.seeking = false;
- utils.dispatchEvent.call(player, player.media, 'seeked');
+ triggerEvent.call(player, player.media, 'seeked');
});
player.embed.on('ended', () => {
player.media.paused = true;
- utils.dispatchEvent.call(player, player.media, 'ended');
+ triggerEvent.call(player, player.media, 'ended');
});
player.embed.on('error', detail => {
player.media.error = detail;
- utils.dispatchEvent.call(player, player.media, 'error');
+ triggerEvent.call(player, player.media, 'error');
});
// Rebuild UI
diff --git a/src/js/plugins/youtube.js b/src/js/plugins/youtube.js
index 9b067c8a..64b6fff7 100644
--- a/src/js/plugins/youtube.js
+++ b/src/js/plugins/youtube.js
@@ -4,64 +4,54 @@
import controls from './../controls';
import ui from './../ui';
-import utils from './../utils';
+import { dedupe } from './../utils/arrays';
+import { createElement, replaceElement, toggleClass } from './../utils/elements';
+import { triggerEvent } from './../utils/events';
+import fetch from './../utils/fetch';
+import is from './../utils/is';
+import loadImage from './../utils/loadImage';
+import loadScript from './../utils/loadScript';
+import { format, generateId } from './../utils/strings';
+
+// Parse YouTube ID from URL
+function parseId(url) {
+ if (is.empty(url)) {
+ return null;
+ }
+
+ const regex = /^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|&v=)([^#&?]*).*/;
+ return url.match(regex) ? RegExp.$2 : url;
+}
// Standardise YouTube quality unit
function mapQualityUnit(input) {
- switch (input) {
- case 'hd2160':
- return 2160;
-
- case 2160:
- return 'hd2160';
-
- case 'hd1440':
- return 1440;
-
- case 1440:
- return 'hd1440';
-
- case 'hd1080':
- return 1080;
-
- case 1080:
- return 'hd1080';
-
- case 'hd720':
- return 720;
-
- case 720:
- return 'hd720';
-
- case 'large':
- return 480;
-
- case 480:
- return 'large';
-
- case 'medium':
- return 360;
-
- case 360:
- return 'medium';
-
- case 'small':
- return 240;
-
- case 240:
- return 'small';
-
- default:
- return 'default';
+ const qualities = {
+ hd2160: 2160,
+ hd1440: 1440,
+ hd1080: 1080,
+ hd720: 720,
+ large: 480,
+ medium: 360,
+ small: 240,
+ tiny: 144,
+ };
+
+ const entry = Object.entries(qualities).find(entry => entry.includes(input));
+
+ if (entry) {
+ // Get the match corresponding to the input
+ return entry.find(value => value !== input);
}
+
+ return 'default';
}
function mapQualityUnits(levels) {
- if (utils.is.empty(levels)) {
+ if (is.empty(levels)) {
return levels;
}
- return utils.dedupe(levels.map(level => mapQualityUnit(level)));
+ return dedupe(levels.map(level => mapQualityUnit(level)));
}
// Set playback state and trigger change (only on actual change)
@@ -71,24 +61,24 @@ function assurePlaybackState(play) {
}
if (this.media.paused === play) {
this.media.paused = !play;
- utils.dispatchEvent.call(this, this.media, play ? 'play' : 'pause');
+ triggerEvent.call(this, this.media, play ? 'play' : 'pause');
}
}
const youtube = {
setup() {
// Add embed class for responsive
- utils.toggleClass(this.elements.wrapper, this.config.classNames.embed, true);
+ toggleClass(this.elements.wrapper, this.config.classNames.embed, true);
// Set aspect ratio
youtube.setAspectRatio.call(this);
// Setup API
- if (utils.is.object(window.YT) && utils.is.function(window.YT.Player)) {
+ if (is.object(window.YT) && is.function(window.YT.Player)) {
youtube.ready.call(this);
} else {
// Load the API
- utils.loadScript(this.config.urls.youtube.sdk).catch(error => {
+ loadScript(this.config.urls.youtube.sdk).catch(error => {
this.debug.warn('YouTube API failed to load', error);
});
@@ -115,10 +105,10 @@ const youtube = {
// Try via undocumented API method first
// This method disappears now and then though...
// https://github.com/sampotts/plyr/issues/709
- if (utils.is.function(this.embed.getVideoData)) {
+ if (is.function(this.embed.getVideoData)) {
const { title } = this.embed.getVideoData();
- if (utils.is.empty(title)) {
+ if (is.empty(title)) {
this.config.title = title;
ui.setTitle.call(this);
return;
@@ -127,13 +117,12 @@ const youtube = {
// Or via Google API
const key = this.config.keys.google;
- if (utils.is.string(key) && !utils.is.empty(key)) {
- const url = utils.format(this.config.urls.youtube.api, videoId, key);
+ if (is.string(key) && !is.empty(key)) {
+ const url = format(this.config.urls.youtube.api, videoId, key);
- utils
- .fetch(url)
+ fetch(url)
.then(result => {
- if (utils.is.object(result)) {
+ if (is.object(result)) {
this.config.title = result.items[0].snippet.title;
ui.setTitle.call(this);
}
@@ -154,7 +143,7 @@ const youtube = {
// Ignore already setup (race condition)
const currentId = player.media.getAttribute('id');
- if (!utils.is.empty(currentId) && currentId.startsWith('youtube-')) {
+ if (!is.empty(currentId) && currentId.startsWith('youtube-')) {
return;
}
@@ -162,30 +151,36 @@ const youtube = {
let source = player.media.getAttribute('src');
// Get from <div> if needed
- if (utils.is.empty(source)) {
+ if (is.empty(source)) {
source = player.media.getAttribute(this.config.attributes.embed.id);
}
// Replace the <iframe> with a <div> due to YouTube API issues
- const videoId = utils.parseYouTubeId(source);
- const id = utils.generateId(player.provider);
- const container = utils.createElement('div', { id });
- player.media = utils.replaceElement(container, player.media);
+ const videoId = parseId(source);
+ const id = generateId(player.provider);
+
+ // Get poster, if already set
+ const { poster } = player;
- // Set poster image
+ // Replace media element
+ const container = createElement('div', { id, poster });
+ player.media = replaceElement(container, player.media);
+
+ // Id to poster wrapper
const posterSrc = format => `https://img.youtube.com/vi/${videoId}/${format}default.jpg`;
// Check thumbnail images in order of quality, but reject fallback thumbnails (120px wide)
- utils.loadImage(posterSrc('maxres'), 121) // Higest quality and unpadded
- .catch(() => utils.loadImage(posterSrc('sd'), 121)) // 480p padded 4:3
- .catch(() => utils.loadImage(posterSrc('hq'))) // 360p padded 4:3. Always exists
+ loadImage(posterSrc('maxres'), 121) // Higest quality and unpadded
+ .catch(() => loadImage(posterSrc('sd'), 121)) // 480p padded 4:3
+ .catch(() => loadImage(posterSrc('hq'))) // 360p padded 4:3. Always exists
.then(image => ui.setPoster.call(player, image.src))
.then(posterSrc => {
// If the image is padded, use background-size "cover" instead (like youtube does too with their posters)
if (!posterSrc.includes('maxres')) {
player.elements.poster.style.backgroundSize = 'cover';
}
- });
+ })
+ .catch(() => {});
// Setup instance
// https://developers.google.com/youtube/iframe_api_reference
@@ -211,49 +206,26 @@ const youtube = {
},
events: {
onError(event) {
- // If we've already fired an error, don't do it again
- // YouTube fires onError twice
- if (utils.is.object(player.media.error)) {
- return;
+ // YouTube may fire onError twice, so only handle it once
+ if (!player.media.error) {
+ const code = event.data;
+ // Messages copied from https://developers.google.com/youtube/iframe_api_reference#onError
+ const message =
+ {
+ 2: 'The request contains an invalid parameter value. For example, this error occurs if you specify a video ID that does not have 11 characters, or if the video ID contains invalid characters, such as exclamation points or asterisks.',
+ 5: 'The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.',
+ 100: 'The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.',
+ 101: 'The owner of the requested video does not allow it to be played in embedded players.',
+ 150: 'The owner of the requested video does not allow it to be played in embedded players.',
+ }[code] || 'An unknown error occured';
+
+ player.media.error = { code, message };
+
+ triggerEvent.call(player, player.media, 'error');
}
-
- const detail = {
- code: event.data,
- };
-
- // Messages copied from https://developers.google.com/youtube/iframe_api_reference#onError
- switch (event.data) {
- case 2:
- detail.message =
- 'The request contains an invalid parameter value. For example, this error occurs if you specify a video ID that does not have 11 characters, or if the video ID contains invalid characters, such as exclamation points or asterisks.';
- break;
-
- case 5:
- detail.message =
- 'The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.';
- break;
-
- case 100:
- detail.message =
- 'The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.';
- break;
-
- case 101:
- case 150:
- detail.message = 'The owner of the requested video does not allow it to be played in embedded players.';
- break;
-
- default:
- detail.message = 'An unknown error occured';
- break;
- }
-
- player.media.error = detail;
-
- utils.dispatchEvent.call(player, player.media, 'error');
},
onPlaybackQualityChange() {
- utils.dispatchEvent.call(player, player.media, 'qualitychange', false, {
+ triggerEvent.call(player, player.media, 'qualitychange', false, {
quality: player.media.quality,
});
},
@@ -264,7 +236,7 @@ const youtube = {
// Get current speed
player.media.playbackRate = instance.getPlaybackRate();
- utils.dispatchEvent.call(player, player.media, 'ratechange');
+ triggerEvent.call(player, player.media, 'ratechange');
},
onReady(event) {
// Get the instance
@@ -305,7 +277,7 @@ const youtube = {
// Set seeking state and trigger event
player.media.seeking = true;
- utils.dispatchEvent.call(player, player.media, 'seeking');
+ triggerEvent.call(player, player.media, 'seeking');
// Seek after events sent
instance.seekTo(time);
@@ -328,15 +300,7 @@ const youtube = {
return mapQualityUnit(instance.getPlaybackQuality());
},
set(input) {
- const quality = input;
-
- // Set via API
- instance.setPlaybackQuality(mapQualityUnit(quality));
-
- // Trigger request event
- utils.dispatchEvent.call(player, player.media, 'qualityrequested', false, {
- quality,
- });
+ instance.setPlaybackQuality(mapQualityUnit(input));
},
});
@@ -349,7 +313,7 @@ const youtube = {
set(input) {
volume = input;
instance.setVolume(volume * 100);
- utils.dispatchEvent.call(player, player.media, 'volumechange');
+ triggerEvent.call(player, player.media, 'volumechange');
},
});
@@ -360,10 +324,10 @@ const youtube = {
return muted;
},
set(input) {
- const toggle = utils.is.boolean(input) ? input : muted;
+ const toggle = is.boolean(input) ? input : muted;
muted = toggle;
instance[toggle ? 'mute' : 'unMute']();
- utils.dispatchEvent.call(player, player.media, 'volumechange');
+ triggerEvent.call(player, player.media, 'volumechange');
},
});
@@ -389,8 +353,8 @@ const youtube = {
player.media.setAttribute('tabindex', -1);
}
- utils.dispatchEvent.call(player, player.media, 'timeupdate');
- utils.dispatchEvent.call(player, player.media, 'durationchange');
+ triggerEvent.call(player, player.media, 'timeupdate');
+ triggerEvent.call(player, player.media, 'durationchange');
// Reset timer
clearInterval(player.timers.buffering);
@@ -402,7 +366,7 @@ const youtube = {
// Trigger progress only when we actually buffer something
if (player.media.lastBuffered === null || player.media.lastBuffered < player.media.buffered) {
- utils.dispatchEvent.call(player, player.media, 'progress');
+ triggerEvent.call(player, player.media, 'progress');
}
// Set last buffer point
@@ -413,7 +377,7 @@ const youtube = {
clearInterval(player.timers.buffering);
// Trigger event
- utils.dispatchEvent.call(player, player.media, 'canplaythrough');
+ triggerEvent.call(player, player.media, 'canplaythrough');
}
}, 200);
@@ -427,15 +391,12 @@ const youtube = {
// Reset timer
clearInterval(player.timers.playing);
- const seeked = player.media.seeking && [
- 1,
- 2,
- ].includes(event.data);
+ const seeked = player.media.seeking && [1, 2].includes(event.data);
if (seeked) {
// Unset seeking and fire seeked event
player.media.seeking = false;
- utils.dispatchEvent.call(player, player.media, 'seeked');
+ triggerEvent.call(player, player.media, 'seeked');
}
// Handle events
@@ -448,11 +409,11 @@ const youtube = {
switch (event.data) {
case -1:
// Update scrubber
- utils.dispatchEvent.call(player, player.media, 'timeupdate');
+ triggerEvent.call(player, player.media, 'timeupdate');
// Get loaded % from YouTube
player.media.buffered = instance.getVideoLoadedFraction();
- utils.dispatchEvent.call(player, player.media, 'progress');
+ triggerEvent.call(player, player.media, 'progress');
break;
@@ -465,7 +426,7 @@ const youtube = {
instance.stopVideo();
instance.playVideo();
} else {
- utils.dispatchEvent.call(player, player.media, 'ended');
+ triggerEvent.call(player, player.media, 'ended');
}
break;
@@ -477,11 +438,11 @@ const youtube = {
} else {
assurePlaybackState.call(player, true);
- utils.dispatchEvent.call(player, player.media, 'playing');
+ triggerEvent.call(player, player.media, 'playing');
// Poll to get playback progress
player.timers.playing = setInterval(() => {
- utils.dispatchEvent.call(player, player.media, 'timeupdate');
+ triggerEvent.call(player, player.media, 'timeupdate');
}, 50);
// Check duration again due to YouTube bug
@@ -489,11 +450,14 @@ const youtube = {
// https://code.google.com/p/gdata-issues/issues/detail?id=8690
if (player.media.duration !== instance.getDuration()) {
player.media.duration = instance.getDuration();
- utils.dispatchEvent.call(player, player.media, 'durationchange');
+ triggerEvent.call(player, player.media, 'durationchange');
}
// Get quality
- controls.setQualityMenu.call(player, mapQualityUnits(instance.getAvailableQualityLevels()));
+ controls.setQualityMenu.call(
+ player,
+ mapQualityUnits(instance.getAvailableQualityLevels()),
+ );
}
break;
@@ -511,7 +475,7 @@ const youtube = {
break;
}
- utils.dispatchEvent.call(player, player.elements.container, 'statechange', false, {
+ triggerEvent.call(player, player.elements.container, 'statechange', false, {
code: event.data,
});
},
diff --git a/src/js/plyr.js b/src/js/plyr.js
index 5885f7c0..93fccbfa 100644
--- a/src/js/plyr.js
+++ b/src/js/plyr.js
@@ -6,9 +6,10 @@
// ==========================================================================
import captions from './captions';
+import defaults from './config/defaults';
+import { getProviderByUrl, providers, types } from './config/types';
import Console from './console';
import controls from './controls';
-import defaults from './defaults';
import Fullscreen from './fullscreen';
import Listeners from './listeners';
import media from './media';
@@ -16,9 +17,14 @@ import Ads from './plugins/ads';
import source from './source';
import Storage from './storage';
import support from './support';
-import { providers, types } from './types';
import ui from './ui';
-import utils from './utils';
+import { closest } from './utils/arrays';
+import { createElement, hasClass, removeElement, replaceElement, toggleClass, wrap } from './utils/elements';
+import { off, on, once, triggerEvent, unbindListeners } from './utils/events';
+import is from './utils/is';
+import loadSprite from './utils/loadSprite';
+import { cloneDeep, extend } from './utils/objects';
+import { parseUrl } from './utils/urls';
// Private properties
// TODO: Use a WeakMap for private globals
@@ -41,18 +47,18 @@ class Plyr {
this.media = target;
// String selector passed
- if (utils.is.string(this.media)) {
+ if (is.string(this.media)) {
this.media = document.querySelectorAll(this.media);
}
// jQuery, NodeList or Array passed, use first element
- if ((window.jQuery && this.media instanceof jQuery) || utils.is.nodeList(this.media) || utils.is.array(this.media)) {
+ if ((window.jQuery && this.media instanceof jQuery) || is.nodeList(this.media) || is.array(this.media)) {
// eslint-disable-next-line
this.media = this.media[0];
}
// Set config
- this.config = utils.extend(
+ this.config = extend(
{},
defaults,
Plyr.defaults,
@@ -108,7 +114,7 @@ class Plyr {
this.debug.log('Support', support);
// We need an element to setup
- if (utils.is.nullOrUndefined(this.media) || !utils.is.element(this.media)) {
+ if (is.nullOrUndefined(this.media) || !is.element(this.media)) {
this.debug.error('Setup failed: no suitable element passed');
return;
}
@@ -144,7 +150,6 @@ class Plyr {
// Embed properties
let iframe = null;
let url = null;
- let params = null;
// Different setup based on type
switch (type) {
@@ -153,10 +158,10 @@ class Plyr {
iframe = this.media.querySelector('iframe');
// <iframe> type
- if (utils.is.element(iframe)) {
+ if (is.element(iframe)) {
// Detect provider
- url = iframe.getAttribute('src');
- this.provider = utils.getProviderByUrl(url);
+ url = parseUrl(iframe.getAttribute('src'));
+ this.provider = getProviderByUrl(url.toString());
// Rework elements
this.elements.container = this.media;
@@ -166,24 +171,20 @@ class Plyr {
this.elements.container.className = '';
// Get attributes from URL and set config
- params = utils.getUrlParams(url);
- if (!utils.is.empty(params)) {
- const truthy = [
- '1',
- 'true',
- ];
-
- if (truthy.includes(params.autoplay)) {
+ if (url.searchParams.length) {
+ const truthy = ['1', 'true'];
+
+ if (truthy.includes(url.searchParams.get('autoplay'))) {
this.config.autoplay = true;
}
- if (truthy.includes(params.loop)) {
+ if (truthy.includes(url.searchParams.get('loop'))) {
this.config.loop.active = true;
}
// TODO: replace fullscreen.iosNative with this playsinline config option
// YouTube requires the playsinline in the URL
if (this.isYouTube) {
- this.config.playsinline = truthy.includes(params.playsinline);
+ this.config.playsinline = truthy.includes(url.searchParams.get('playsinline'));
} else {
this.config.playsinline = true;
}
@@ -197,7 +198,7 @@ class Plyr {
}
// Unsupported or missing provider
- if (utils.is.empty(this.provider) || !Object.keys(providers).includes(this.provider)) {
+ if (is.empty(this.provider) || !Object.keys(providers).includes(this.provider)) {
this.debug.error('Setup failed: Invalid provider');
return;
}
@@ -245,6 +246,8 @@ class Plyr {
return;
}
+ this.eventListeners = [];
+
// Create listeners
this.listeners = new Listeners(this);
@@ -255,9 +258,9 @@ class Plyr {
this.media.plyr = this;
// Wrap media
- if (!utils.is.element(this.elements.container)) {
- this.elements.container = utils.createElement('div');
- utils.wrap(this.media, this.elements.container);
+ if (!is.element(this.elements.container)) {
+ this.elements.container = createElement('div');
+ wrap(this.media, this.elements.container);
}
// Add style hook
@@ -268,7 +271,7 @@ class Plyr {
// Listen for events if debugging
if (this.config.debug) {
- utils.on(this.elements.container, this.config.events.join(' '), event => {
+ on.call(this, this.elements.container, this.config.events.join(' '), event => {
this.debug.log(`event: ${event.type}`);
});
}
@@ -327,7 +330,7 @@ class Plyr {
* Play the media, or play the advertisement (if they are not blocked)
*/
play() {
- if (!utils.is.function(this.media.play)) {
+ if (!is.function(this.media.play)) {
return null;
}
@@ -339,7 +342,7 @@ class Plyr {
* Pause the media
*/
pause() {
- if (!this.playing || !utils.is.function(this.media.pause)) {
+ if (!this.playing || !is.function(this.media.pause)) {
return;
}
@@ -380,7 +383,7 @@ class Plyr {
*/
togglePlay(input) {
// Toggle based on current state if nothing passed
- const toggle = utils.is.boolean(input) ? input : !this.playing;
+ const toggle = is.boolean(input) ? input : !this.playing;
if (toggle) {
this.play();
@@ -396,7 +399,7 @@ class Plyr {
if (this.isHTML5) {
this.pause();
this.restart();
- } else if (utils.is.function(this.media.stop)) {
+ } else if (is.function(this.media.stop)) {
this.media.stop();
}
}
@@ -413,7 +416,7 @@ class Plyr {
* @param {number} seekTime - how far to rewind in seconds. Defaults to the config.seekTime
*/
rewind(seekTime) {
- this.currentTime = this.currentTime - (utils.is.number(seekTime) ? seekTime : this.config.seekTime);
+ this.currentTime = this.currentTime - (is.number(seekTime) ? seekTime : this.config.seekTime);
}
/**
@@ -421,7 +424,7 @@ class Plyr {
* @param {number} seekTime - how far to fast forward in seconds. Defaults to the config.seekTime
*/
forward(seekTime) {
- this.currentTime = this.currentTime + (utils.is.number(seekTime) ? seekTime : this.config.seekTime);
+ this.currentTime = this.currentTime + (is.number(seekTime) ? seekTime : this.config.seekTime);
}
/**
@@ -435,7 +438,7 @@ class Plyr {
}
// Validate input
- const inputIsValid = utils.is.number(input) && input > 0;
+ const inputIsValid = is.number(input) && input > 0;
// Set
this.media.currentTime = inputIsValid ? Math.min(input, this.duration) : 0;
@@ -458,7 +461,7 @@ class Plyr {
const { buffered } = this.media;
// YouTube / Vimeo return a float between 0-1
- if (utils.is.number(buffered)) {
+ if (is.number(buffered)) {
return buffered;
}
@@ -502,17 +505,17 @@ class Plyr {
const max = 1;
const min = 0;
- if (utils.is.string(volume)) {
+ if (is.string(volume)) {
volume = Number(volume);
}
// Load volume from storage if no value specified
- if (!utils.is.number(volume)) {
+ if (!is.number(volume)) {
volume = this.storage.get('volume');
}
// Use config if all else fails
- if (!utils.is.number(volume)) {
+ if (!is.number(volume)) {
({ volume } = this.config);
}
@@ -532,7 +535,7 @@ class Plyr {
this.media.volume = volume;
// If muted, and we're increasing volume manually, reset muted state
- if (!utils.is.empty(value) && this.muted && volume > 0) {
+ if (!is.empty(value) && this.muted && volume > 0) {
this.muted = false;
}
}
@@ -550,7 +553,7 @@ class Plyr {
*/
increaseVolume(step) {
const volume = this.media.muted ? 0 : this.volume;
- this.volume = volume + (utils.is.number(step) ? step : 1);
+ this.volume = volume + (is.number(step) ? step : 1);
}
/**
@@ -559,7 +562,7 @@ class Plyr {
*/
decreaseVolume(step) {
const volume = this.media.muted ? 0 : this.volume;
- this.volume = volume - (utils.is.number(step) ? step : 1);
+ this.volume = volume - (is.number(step) ? step : 1);
}
/**
@@ -570,12 +573,12 @@ class Plyr {
let toggle = mute;
// Load muted state from storage
- if (!utils.is.boolean(toggle)) {
+ if (!is.boolean(toggle)) {
toggle = this.storage.get('muted');
}
// Use config if all else fails
- if (!utils.is.boolean(toggle)) {
+ if (!is.boolean(toggle)) {
toggle = this.config.muted;
}
@@ -621,15 +624,15 @@ class Plyr {
set speed(input) {
let speed = null;
- if (utils.is.number(input)) {
+ if (is.number(input)) {
speed = input;
}
- if (!utils.is.number(speed)) {
+ if (!is.number(speed)) {
speed = this.storage.get('speed');
}
- if (!utils.is.number(speed)) {
+ if (!is.number(speed)) {
speed = this.config.speed.selected;
}
@@ -666,36 +669,31 @@ class Plyr {
* @param {number} input - Quality level
*/
set quality(input) {
- let quality = null;
-
- if (!utils.is.empty(input)) {
- quality = Number(input);
- }
-
- if (!utils.is.number(quality)) {
- quality = this.storage.get('quality');
- }
-
- if (!utils.is.number(quality)) {
- quality = this.config.quality.selected;
- }
-
- if (!utils.is.number(quality)) {
- quality = this.config.quality.default;
- }
+ const config = this.config.quality;
+ const options = this.options.quality;
- if (!this.options.quality.length) {
+ if (!options.length) {
return;
}
- if (!this.options.quality.includes(quality)) {
- const closest = utils.closest(this.options.quality, quality);
- this.debug.warn(`Unsupported quality option: ${quality}, using ${closest} instead`);
- quality = closest;
+ let quality = [
+ !is.empty(input) && Number(input),
+ this.storage.get('quality'),
+ config.selected,
+ config.default,
+ ].find(is.number);
+
+ if (!options.includes(quality)) {
+ const value = closest(options, quality);
+ this.debug.warn(`Unsupported quality option: ${quality}, using ${value} instead`);
+ quality = value;
}
+ // Trigger request event
+ triggerEvent.call(this, this.media, 'qualityrequested', false, { quality });
+
// Update config
- this.config.quality.selected = quality;
+ config.selected = quality;
// Set quality
this.media.quality = quality;
@@ -714,7 +712,7 @@ class Plyr {
* @param {boolean} input - Whether to loop or not
*/
set loop(input) {
- const toggle = utils.is.boolean(input) ? input : this.config.loop.active;
+ const toggle = is.boolean(input) ? input : this.config.loop.active;
this.config.loop.active = toggle;
this.media.loop = toggle;
@@ -794,7 +792,7 @@ class Plyr {
return;
}
- ui.setPoster.call(this, input);
+ ui.setPoster.call(this, input, false).catch(() => {});
}
/**
@@ -813,7 +811,7 @@ class Plyr {
* @param {boolean} input - Whether to autoplay or not
*/
set autoplay(input) {
- const toggle = utils.is.boolean(input) ? input : this.config.autoplay;
+ const toggle = is.boolean(input) ? input : this.config.autoplay;
this.config.autoplay = toggle;
}
@@ -829,41 +827,23 @@ class Plyr {
* @param {boolean} input - Whether to enable captions
*/
toggleCaptions(input) {
- // If there's no full support
- if (!this.supported.ui) {
- return;
+ captions.toggle.call(this, input, false);
}
- // If the method is called without parameter, toggle based on current value
- const active = utils.is.boolean(input) ? input : !this.elements.container.classList.contains(this.config.classNames.captions.active);
-
- // Toggle state
- this.elements.buttons.captions.pressed = active;
-
- // Add class hook
- utils.toggleClass(this.elements.container, this.config.classNames.captions.active, active);
-
- // Update state and trigger event
- if (active !== this.captions.active) {
- this.captions.active = active;
- utils.dispatchEvent.call(this, this.media, this.captions.active ? 'captionsenabled' : 'captionsdisabled');
- }
- }
-
/**
* Set the caption track by index
* @param {number} - Caption index
*/
set currentTrack(input) {
- captions.set.call(this, input);
+ captions.set.call(this, input, false);
}
/**
* Get the current caption track index (-1 if disabled)
*/
get currentTrack() {
- const { active, currentTrack } = this.captions;
- return active ? currentTrack : -1;
+ const { toggled, currentTrack } = this.captions;
+ return toggled ? currentTrack : -1;
}
/**
@@ -872,7 +852,7 @@ class Plyr {
* @param {string} - Two character ISO language code (e.g. EN, FR, PT, etc)
*/
set language(input) {
- captions.setLanguage.call(this, input);
+ captions.setLanguage.call(this, input, false);
}
/**
@@ -899,7 +879,7 @@ class Plyr {
}
// Toggle based on current state if not passed
- const toggle = utils.is.boolean(input) ? input : this.pip === states.inline;
+ const toggle = is.boolean(input) ? input : this.pip === states.inline;
// Toggle based on current state
this.media.webkitSetPresentationMode(toggle ? states.pip : states.inline);
@@ -935,22 +915,22 @@ class Plyr {
// Don't toggle if missing UI support or if it's audio
if (this.supported.ui && !this.isAudio) {
// Get state before change
- const isHidden = utils.hasClass(this.elements.container, this.config.classNames.hideControls);
+ const isHidden = hasClass(this.elements.container, this.config.classNames.hideControls);
// Negate the argument if not undefined since adding the class to hides the controls
const force = typeof toggle === 'undefined' ? undefined : !toggle;
// Apply and get updated state
- const hiding = utils.toggleClass(this.elements.container, this.config.classNames.hideControls, force);
+ const hiding = toggleClass(this.elements.container, this.config.classNames.hideControls, force);
// Close menu
- if (hiding && this.config.controls.includes('settings') && !utils.is.empty(this.config.settings)) {
+ if (hiding && this.config.controls.includes('settings') && !is.empty(this.config.settings)) {
controls.toggleMenu.call(this, false);
}
// Trigger event on change
if (hiding !== isHidden) {
const eventName = hiding ? 'controlshidden' : 'controlsshown';
- utils.dispatchEvent.call(this, this.media, eventName);
+ triggerEvent.call(this, this.media, eventName);
}
return !hiding;
}
@@ -963,16 +943,23 @@ class Plyr {
* @param {function} callback - Callback for when event occurs
*/
on(event, callback) {
- utils.on(this.elements.container, event, callback);
+ on.call(this, this.elements.container, event, callback);
+ }
+ /**
+ * Add event listeners once
+ * @param {string} event - Event type
+ * @param {function} callback - Callback for when event occurs
+ */
+ once(event, callback) {
+ once.call(this, this.elements.container, event, callback);
}
-
/**
* Remove event listeners
* @param {string} event - Event type
* @param {function} callback - Callback for when event occurs
*/
off(event, callback) {
- utils.off(this.elements.container, event, callback);
+ off(this.elements.container, event, callback);
}
/**
@@ -998,10 +985,10 @@ class Plyr {
if (soft) {
if (Object.keys(this.elements).length) {
// Remove elements
- utils.removeElement(this.elements.buttons.play);
- utils.removeElement(this.elements.captions);
- utils.removeElement(this.elements.controls);
- utils.removeElement(this.elements.wrapper);
+ removeElement(this.elements.buttons.play);
+ removeElement(this.elements.captions);
+ removeElement(this.elements.controls);
+ removeElement(this.elements.wrapper);
// Clear for GC
this.elements.buttons.play = null;
@@ -1011,21 +998,21 @@ class Plyr {
}
// Callback
- if (utils.is.function(callback)) {
+ if (is.function(callback)) {
callback();
}
} else {
// Unbind listeners
- this.listeners.clear();
+ unbindListeners.call(this);
// Replace the container with the original element provided
- utils.replaceElement(this.elements.original, this.elements.container);
+ replaceElement(this.elements.original, this.elements.container);
// Event
- utils.dispatchEvent.call(this, this.elements.original, 'destroyed', true);
+ triggerEvent.call(this, this.elements.original, 'destroyed', true);
// Callback
- if (utils.is.function(callback)) {
+ if (is.function(callback)) {
callback.call(this.elements.original);
}
@@ -1043,10 +1030,8 @@ class Plyr {
// Stop playback
this.stop();
- // Type specific stuff
- switch (`${this.provider}:${this.type}`) {
- case 'html5:video':
- case 'html5:audio':
+ // Provider specific stuff
+ if (this.isHTML5) {
// Clear timeout
clearTimeout(this.timers.loading);
@@ -1055,25 +1040,19 @@ class Plyr {
// Clean up
done();
-
- break;
-
- case 'youtube:video':
+ } else if (this.isYouTube) {
// Clear timers
clearInterval(this.timers.buffering);
clearInterval(this.timers.playing);
// Destroy YouTube API
- if (this.embed !== null && utils.is.function(this.embed.destroy)) {
+ if (this.embed !== null && is.function(this.embed.destroy)) {
this.embed.destroy();
}
// Clean up
done();
-
- break;
-
- case 'vimeo:video':
+ } else if (this.isVimeo) {
// Destroy Vimeo API
// then clean up (wait, to prevent postmessage errors)
if (this.embed !== null) {
@@ -1082,11 +1061,6 @@ class Plyr {
// Vimeo does not always return
setTimeout(done, 200);
-
- break;
-
- default:
- break;
}
}
@@ -1114,7 +1088,7 @@ class Plyr {
* @param {string} [id] - Unique ID
*/
static loadSprite(url, id) {
- return utils.loadSprite(url, id);
+ return loadSprite(url, id);
}
/**
@@ -1125,15 +1099,15 @@ class Plyr {
static setup(selector, options = {}) {
let targets = null;
- if (utils.is.string(selector)) {
+ if (is.string(selector)) {
targets = Array.from(document.querySelectorAll(selector));
- } else if (utils.is.nodeList(selector)) {
+ } else if (is.nodeList(selector)) {
targets = Array.from(selector);
- } else if (utils.is.array(selector)) {
- targets = selector.filter(utils.is.element);
+ } else if (is.array(selector)) {
+ targets = selector.filter(is.element);
}
- if (utils.is.empty(targets)) {
+ if (is.empty(targets)) {
return null;
}
@@ -1141,6 +1115,6 @@ class Plyr {
}
}
-Plyr.defaults = utils.cloneDeep(defaults);
+Plyr.defaults = cloneDeep(defaults);
export default Plyr;
diff --git a/src/js/source.js b/src/js/source.js
index e9a2938e..8c9fdf44 100644
--- a/src/js/source.js
+++ b/src/js/source.js
@@ -2,23 +2,25 @@
// Plyr source update
// ==========================================================================
+import { providers } from './config/types';
import html5 from './html5';
import media from './media';
import support from './support';
-import { providers } from './types';
import ui from './ui';
-import utils from './utils';
+import { createElement, insertElement, removeElement } from './utils/elements';
+import is from './utils/is';
+import { getDeep } from './utils/objects';
const source = {
// Add elements to HTML5 media (source, tracks, etc)
insertElements(type, attributes) {
- if (utils.is.string(attributes)) {
- utils.insertElement(type, this.media, {
+ if (is.string(attributes)) {
+ insertElement(type, this.media, {
src: attributes,
});
- } else if (utils.is.array(attributes)) {
+ } else if (is.array(attributes)) {
attributes.forEach(attribute => {
- utils.insertElement(type, this.media, attribute);
+ insertElement(type, this.media, attribute);
});
}
},
@@ -26,7 +28,7 @@ const source = {
// Update source
// Sources are not checked for support so be careful
change(input) {
- if (!utils.is.object(input) || !('sources' in input) || !input.sources.length) {
+ if (!getDeep(input, 'sources.length')) {
this.debug.warn('Invalid source format');
return;
}
@@ -42,47 +44,34 @@ const source = {
this.options.quality = [];
// Remove elements
- utils.removeElement(this.media);
+ removeElement(this.media);
this.media = null;
// Reset class name
- if (utils.is.element(this.elements.container)) {
+ if (is.element(this.elements.container)) {
this.elements.container.removeAttribute('class');
}
// Set the type and provider
- this.type = input.type;
- this.provider = !utils.is.empty(input.sources[0].provider) ? input.sources[0].provider : providers.html5;
-
- // Check for support
- this.supported = support.check(this.type, this.provider, this.config.playsinline);
-
- // Create new markup
- switch (`${this.provider}:${this.type}`) {
- case 'html5:video':
- this.media = utils.createElement('video');
- break;
-
- case 'html5:audio':
- this.media = utils.createElement('audio');
- break;
-
- case 'youtube:video':
- case 'vimeo:video':
- this.media = utils.createElement('div', {
- src: input.sources[0].src,
- });
- break;
-
- default:
- break;
- }
+ const { sources, type } = input;
+ const [{ provider = providers.html5, src }] = sources;
+ const tagName = provider === 'html5' ? type : 'div';
+ const attributes = provider === 'html5' ? {} : { src };
+
+ Object.assign(this, {
+ provider,
+ type,
+ // Check for support
+ supported: support.check(type, provider, this.config.playsinline),
+ // Create new element
+ media: createElement(tagName, attributes),
+ });
// Inject the new element
this.elements.container.appendChild(this.media);
// Autoplay the new source?
- if (utils.is.boolean(input.autoplay)) {
+ if (is.boolean(input.autoplay)) {
this.config.autoplay = input.autoplay;
}
@@ -94,7 +83,7 @@ const source = {
if (this.config.autoplay) {
this.media.setAttribute('autoplay', '');
}
- if (!utils.is.empty(input.poster)) {
+ if (!is.empty(input.poster)) {
this.poster = input.poster;
}
if (this.config.loop.active) {
@@ -113,7 +102,7 @@ const source = {
// Set new sources for html5
if (this.isHTML5) {
- source.insertElements.call(this, 'source', input.sources);
+ source.insertElements.call(this, 'source', sources);
}
// Set video title
diff --git a/src/js/storage.js b/src/js/storage.js
index e4dc9e1b..27fdad9f 100644
--- a/src/js/storage.js
+++ b/src/js/storage.js
@@ -2,7 +2,8 @@
// Plyr storage
// ==========================================================================
-import utils from './utils';
+import is from './utils/is';
+import { extend } from './utils/objects';
class Storage {
constructor(player) {
@@ -37,13 +38,13 @@ class Storage {
const store = window.localStorage.getItem(this.key);
- if (utils.is.empty(store)) {
+ if (is.empty(store)) {
return null;
}
const json = JSON.parse(store);
- return utils.is.string(key) && key.length ? json[key] : json;
+ return is.string(key) && key.length ? json[key] : json;
}
set(object) {
@@ -53,7 +54,7 @@ class Storage {
}
// Can only store objectst
- if (!utils.is.object(object)) {
+ if (!is.object(object)) {
return;
}
@@ -61,12 +62,12 @@ class Storage {
let storage = this.get();
// Default to empty object
- if (utils.is.empty(storage)) {
+ if (is.empty(storage)) {
storage = {};
}
// Update the working copy of the values
- utils.extend(storage, object);
+ extend(storage, object);
// Update storage
window.localStorage.setItem(this.key, JSON.stringify(storage));
diff --git a/src/js/support.js b/src/js/support.js
index 38212d9f..6395293f 100644
--- a/src/js/support.js
+++ b/src/js/support.js
@@ -2,7 +2,19 @@
// Plyr support checks
// ==========================================================================
-import utils from './utils';
+import { transitionEndEvent } from './utils/animation';
+import browser from './utils/browser';
+import { createElement } from './utils/elements';
+import is from './utils/is';
+
+// Default codecs for checking mimetype support
+const defaultCodecs = {
+ 'audio/ogg': 'vorbis',
+ 'audio/wav': '1',
+ 'video/webm': 'vp8, vorbis',
+ 'video/mp4': 'avc1.42E01E, mp4a.40.2',
+ 'video/ogg': 'theora',
+};
// Check for feature support
const support = {
@@ -13,32 +25,9 @@ const support = {
// Check for support
// Basic functionality vs full UI
check(type, provider, playsinline) {
- let api = false;
- let ui = false;
- const browser = utils.getBrowser();
const canPlayInline = browser.isIPhone && playsinline && support.playsinline;
-
- switch (`${provider}:${type}`) {
- case 'html5:video':
- api = support.video;
- ui = api && support.rangeInput && (!browser.isIPhone || canPlayInline);
- break;
-
- case 'html5:audio':
- api = support.audio;
- ui = api && support.rangeInput;
- break;
-
- case 'youtube:video':
- case 'vimeo:video':
- api = true;
- ui = support.rangeInput && (!browser.isIPhone || canPlayInline);
- break;
-
- default:
- api = support.audio && support.video;
- ui = api && support.rangeInput;
- }
+ const api = support[type] || provider !== 'html5';
+ const ui = api && support.rangeInput && (type !== 'video' || !browser.isIPhone || canPlayInline);
return {
api,
@@ -48,14 +37,11 @@ const support = {
// Picture-in-picture support
// Safari only currently
- pip: (() => {
- const browser = utils.getBrowser();
- return !browser.isIPhone && utils.is.function(utils.createElement('video').webkitSetPresentationMode);
- })(),
+ pip: (() => !browser.isIPhone && is.function(createElement('video').webkitSetPresentationMode))(),
// Airplay support
// Safari only currently
- airplay: utils.is.function(window.WebKitPlaybackTargetAvailabilityEvent),
+ airplay: is.function(window.WebKitPlaybackTargetAvailabilityEvent),
// Inline playback support
// https://webkit.org/blog/6784/new-video-policies-for-ios/
@@ -64,83 +50,34 @@ const support = {
// Check for mime type support against a player instance
// Credits: http://diveintohtml5.info/everything.html
// Related: http://www.leanbackplayer.com/test/h5mt.html
- mime(type) {
- const { media } = this;
+ mime(inputType) {
+ const [mediaType] = inputType.split('/');
+ if (!this.isHTML5 || mediaType !== this.type) {
+ return false;
+ }
+
+ let type;
+ if (inputType && inputType.includes('codecs=')) {
+ // Use input directly
+ type = inputType;
+ } else if (inputType === 'audio/mpeg') {
+ // Skip codec
+ type = 'audio/mpeg;';
+ } else if (inputType in defaultCodecs) {
+ // Use codec
+ type = `${inputType}; codecs="${defaultCodecs[inputType]}"`;
+ }
try {
- // Bail if no checking function
- if (!this.isHTML5 || !utils.is.function(media.canPlayType)) {
- return false;
- }
-
- // Check directly if codecs specified
- if (type.includes('codecs=')) {
- return media.canPlayType(type).replace(/no/, '');
- }
-
- // Type specific checks
- if (this.isVideo) {
- switch (type) {
- case 'video/webm':
- return media.canPlayType('video/webm; codecs="vp8, vorbis"').replace(/no/, '');
-
- case 'video/mp4':
- return media.canPlayType('video/mp4; codecs="avc1.42E01E, mp4a.40.2"').replace(/no/, '');
-
- case 'video/ogg':
- return media.canPlayType('video/ogg; codecs="theora"').replace(/no/, '');
-
- default:
- return false;
- }
- } else if (this.isAudio) {
- switch (type) {
- case 'audio/mpeg':
- return media.canPlayType('audio/mpeg;').replace(/no/, '');
-
- case 'audio/ogg':
- return media.canPlayType('audio/ogg; codecs="vorbis"').replace(/no/, '');
-
- case 'audio/wav':
- return media.canPlayType('audio/wav; codecs="1"').replace(/no/, '');
-
- default:
- return false;
- }
- }
- } catch (e) {
+ return Boolean(type && this.media.canPlayType(type).replace(/no/, ''));
+ } catch (err) {
return false;
}
-
- // If we got this far, we're stuffed
- return false;
},
// Check for textTracks support
textTracks: 'textTracks' in document.createElement('video'),
- // Check for passive event listener support
- // https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md
- // https://www.youtube.com/watch?v=NPM6172J22g
- passiveListeners: (() => {
- // Test via a getter in the options object to see if the passive property is accessed
- let supported = false;
- try {
- const options = Object.defineProperty({}, 'passive', {
- get() {
- supported = true;
- return null;
- },
- });
- window.addEventListener('test', null, options);
- window.removeEventListener('test', null, options);
- } catch (e) {
- // Do nothing
- }
-
- return supported;
- })(),
-
// <input type="range"> Sliders
rangeInput: (() => {
const range = document.createElement('input');
@@ -153,7 +90,7 @@ const support = {
touch: 'ontouchstart' in document.documentElement,
// Detect transitions support
- transitions: utils.transitionEndEvent !== false,
+ transitions: transitionEndEvent !== false,
// Reduced motion iOS & MacOS setting
// https://webkit.org/blog/7551/responsive-design-for-motion/
diff --git a/src/js/ui.js b/src/js/ui.js
index 979d8341..b77ee131 100644
--- a/src/js/ui.js
+++ b/src/js/ui.js
@@ -6,15 +6,16 @@ import captions from './captions';
import controls from './controls';
import i18n from './i18n';
import support from './support';
-import utils from './utils';
-
-// Sniff out the browser
-const browser = utils.getBrowser();
+import browser from './utils/browser';
+import { getElement, toggleClass } from './utils/elements';
+import { ready, triggerEvent } from './utils/events';
+import is from './utils/is';
+import loadImage from './utils/loadImage';
const ui = {
addStyleHook() {
- utils.toggleClass(this.elements.container, this.config.selectors.container.replace('.', ''), true);
- utils.toggleClass(this.elements.container, this.config.classNames.uiSupported, this.supported.ui);
+ toggleClass(this.elements.container, this.config.selectors.container.replace('.', ''), true);
+ toggleClass(this.elements.container, this.config.classNames.uiSupported, this.supported.ui);
},
// Toggle native HTML5 media controls
@@ -44,7 +45,7 @@ const ui = {
}
// Inject custom controls if not present
- if (!utils.is.element(this.elements.controls)) {
+ if (!is.element(this.elements.controls)) {
// Inject custom controls
controls.inject.call(this);
@@ -85,31 +86,35 @@ const ui = {
ui.checkPlaying.call(this);
// Check for picture-in-picture support
- utils.toggleClass(this.elements.container, this.config.classNames.pip.supported, support.pip && this.isHTML5 && this.isVideo);
+ toggleClass(
+ this.elements.container,
+ this.config.classNames.pip.supported,
+ support.pip && this.isHTML5 && this.isVideo,
+ );
// Check for airplay support
- utils.toggleClass(this.elements.container, this.config.classNames.airplay.supported, support.airplay && this.isHTML5);
+ toggleClass(this.elements.container, this.config.classNames.airplay.supported, support.airplay && this.isHTML5);
// Add iOS class
- utils.toggleClass(this.elements.container, this.config.classNames.isIos, browser.isIos);
+ toggleClass(this.elements.container, this.config.classNames.isIos, browser.isIos);
// Add touch class
- utils.toggleClass(this.elements.container, this.config.classNames.isTouch, this.touch);
+ toggleClass(this.elements.container, this.config.classNames.isTouch, this.touch);
// Ready for API calls
this.ready = true;
// Ready event at end of execution stack
setTimeout(() => {
- utils.dispatchEvent.call(this, this.media, 'ready');
+ triggerEvent.call(this, this.media, 'ready');
}, 0);
// Set the title
ui.setTitle.call(this);
// Assure the poster image is set, if the property was added before the element was created
- if (this.poster && this.elements.poster && !this.elements.poster.style.backgroundImage) {
- ui.setPoster.call(this, this.poster);
+ if (this.poster) {
+ ui.setPoster.call(this, this.poster, false).catch(() => {});
}
// Manually set the duration if user has overridden it.
@@ -125,12 +130,12 @@ const ui = {
let label = i18n.get('play', this.config);
// If there's a media title set, use that for the label
- if (utils.is.string(this.config.title) && !utils.is.empty(this.config.title)) {
+ if (is.string(this.config.title) && !is.empty(this.config.title)) {
label += `, ${this.config.title}`;
}
// If there's a play button, set label
- if (utils.is.nodeList(this.elements.buttons.play)) {
+ if (is.nodeList(this.elements.buttons.play)) {
Array.from(this.elements.buttons.play).forEach(button => {
button.setAttribute('aria-label', label);
});
@@ -139,14 +144,14 @@ const ui = {
// Set iframe title
// https://github.com/sampotts/plyr/issues/124
if (this.isEmbed) {
- const iframe = utils.getElement.call(this, 'iframe');
+ const iframe = getElement.call(this, 'iframe');
- if (!utils.is.element(iframe)) {
+ if (!is.element(iframe)) {
return;
}
// Default to media type
- const title = !utils.is.empty(this.config.title) ? this.config.title : 'video';
+ const title = !is.empty(this.config.title) ? this.config.title : 'video';
const format = i18n.get('frameTitle', this.config);
iframe.setAttribute('title', format.replace('{title}', title));
@@ -155,44 +160,58 @@ const ui = {
// Toggle poster
togglePoster(enable) {
- utils.toggleClass(this.elements.container, this.config.classNames.posterEnabled, enable);
+ toggleClass(this.elements.container, this.config.classNames.posterEnabled, enable);
},
// Set the poster image (async)
- setPoster(poster) {
- // Set property regardless of validity
- this.media.setAttribute('poster', poster);
-
- // Bail if element is missing
- if (!utils.is.element(this.elements.poster)) {
- return Promise.reject();
+ // Used internally for the poster setter, with the passive option forced to false
+ setPoster(poster, passive = true) {
+ // Don't override if call is passive
+ if (passive && this.poster) {
+ return Promise.reject(new Error('Poster already set'));
}
- // Load the image, and set poster if successful
- const loadPromise = utils.loadImage(poster).then(() => {
- this.elements.poster.style.backgroundImage = `url('${poster}')`;
- Object.assign(this.elements.poster.style, {
- backgroundImage: `url('${poster}')`,
- // Reset backgroundSize as well (since it can be set to "cover" for padded thumbnails for youtube)
- backgroundSize: '',
- });
- ui.togglePoster.call(this, true);
- return poster;
- });
-
- // Hide the element if the poster can't be loaded (otherwise it will just be a black element covering the video)
- loadPromise.catch(() => ui.togglePoster.call(this, false));
+ // Set property synchronously to respect the call order
+ this.media.setAttribute('poster', poster);
- // Return the promise so the caller can use it as well
- return loadPromise;
+ // Wait until ui is ready
+ return (
+ ready
+ .call(this)
+ // Load image
+ .then(() => loadImage(poster))
+ .catch(err => {
+ // Hide poster on error unless it's been set by another call
+ if (poster === this.poster) {
+ ui.togglePoster.call(this, false);
+ }
+ // Rethrow
+ throw err;
+ })
+ .then(() => {
+ // Prevent race conditions
+ if (poster !== this.poster) {
+ throw new Error('setPoster cancelled by later call to setPoster');
+ }
+ })
+ .then(() => {
+ Object.assign(this.elements.poster.style, {
+ backgroundImage: `url('${poster}')`,
+ // Reset backgroundSize as well (since it can be set to "cover" for padded thumbnails for youtube)
+ backgroundSize: '',
+ });
+ ui.togglePoster.call(this, true);
+ return poster;
+ })
+ );
},
// Check playing state
checkPlaying(event) {
// Class hooks
- utils.toggleClass(this.elements.container, this.config.classNames.playing, this.playing);
- utils.toggleClass(this.elements.container, this.config.classNames.paused, this.paused);
- utils.toggleClass(this.elements.container, this.config.classNames.stopped, this.stopped);
+ toggleClass(this.elements.container, this.config.classNames.playing, this.playing);
+ toggleClass(this.elements.container, this.config.classNames.paused, this.paused);
+ toggleClass(this.elements.container, this.config.classNames.stopped, this.stopped);
// Set state
Array.from(this.elements.buttons.play).forEach(target => {
@@ -200,7 +219,7 @@ const ui = {
});
// Only update controls on non timeupdate events
- if (utils.is.event(event) && event.type === 'timeupdate') {
+ if (is.event(event) && event.type === 'timeupdate') {
return;
}
@@ -210,10 +229,7 @@ const ui = {
// Check if media is loading
checkLoading(event) {
- this.loading = [
- 'stalled',
- 'waiting',
- ].includes(event.type);
+ this.loading = ['stalled', 'waiting'].includes(event.type);
// Clear timer
clearTimeout(this.timers.loading);
@@ -221,7 +237,7 @@ const ui = {
// Timer to prevent flicker when seeking
this.timers.loading = setTimeout(() => {
// Update progress bar loading class state
- utils.toggleClass(this.elements.container, this.config.classNames.loading, this.loading);
+ toggleClass(this.elements.container, this.config.classNames.loading, this.loading);
// Update controls visibility
ui.toggleControls.call(this);
diff --git a/src/js/utils.js b/src/js/utils.js
deleted file mode 100644
index d2a37706..00000000
--- a/src/js/utils.js
+++ /dev/null
@@ -1,853 +0,0 @@
-// ==========================================================================
-// Plyr utils
-// ==========================================================================
-
-import loadjs from 'loadjs';
-import Storage from './storage';
-import support from './support';
-import { providers } from './types';
-
-const utils = {
- // Check variable types
- is: {
- object(input) {
- return utils.getConstructor(input) === Object;
- },
- number(input) {
- return utils.getConstructor(input) === Number && !Number.isNaN(input);
- },
- string(input) {
- return utils.getConstructor(input) === String;
- },
- boolean(input) {
- return utils.getConstructor(input) === Boolean;
- },
- function(input) {
- return utils.getConstructor(input) === Function;
- },
- array(input) {
- return !utils.is.nullOrUndefined(input) && Array.isArray(input);
- },
- weakMap(input) {
- return utils.is.instanceof(input, WeakMap);
- },
- nodeList(input) {
- return utils.is.instanceof(input, NodeList);
- },
- element(input) {
- return utils.is.instanceof(input, Element);
- },
- textNode(input) {
- return utils.getConstructor(input) === Text;
- },
- event(input) {
- return utils.is.instanceof(input, Event);
- },
- cue(input) {
- return utils.is.instanceof(input, window.TextTrackCue) || utils.is.instanceof(input, window.VTTCue);
- },
- track(input) {
- return utils.is.instanceof(input, TextTrack) || (!utils.is.nullOrUndefined(input) && utils.is.string(input.kind));
- },
- url(input) {
- return !utils.is.nullOrUndefined(input) && /(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-/]))?/.test(input);
- },
- nullOrUndefined(input) {
- return input === null || typeof input === 'undefined';
- },
- empty(input) {
- return (
- utils.is.nullOrUndefined(input) ||
- ((utils.is.string(input) || utils.is.array(input) || utils.is.nodeList(input)) && !input.length) ||
- (utils.is.object(input) && !Object.keys(input).length)
- );
- },
- instanceof(input, constructor) {
- return Boolean(input && constructor && input instanceof constructor);
- },
- },
-
- getConstructor(input) {
- return !utils.is.nullOrUndefined(input) ? input.constructor : null;
- },
-
- // Unfortunately, due to mixed support, UA sniffing is required
- getBrowser() {
- return {
- isIE: /* @cc_on!@ */ false || !!document.documentMode,
- isWebkit: 'WebkitAppearance' in document.documentElement.style && !/Edge/.test(navigator.userAgent),
- isIPhone: /(iPhone|iPod)/gi.test(navigator.platform),
- isIos: /(iPad|iPhone|iPod)/gi.test(navigator.platform),
- };
- },
-
- // Fetch wrapper
- // Using XHR to avoid issues with older browsers
- fetch(url, responseType = 'text') {
- return new Promise((resolve, reject) => {
- try {
- const request = new XMLHttpRequest();
-
- // Check for CORS support
- if (!('withCredentials' in request)) {
- return;
- }
-
- request.addEventListener('load', () => {
- if (responseType === 'text') {
- try {
- resolve(JSON.parse(request.responseText));
- } catch (e) {
- resolve(request.responseText);
- }
- } else {
- resolve(request.response);
- }
- });
-
- request.addEventListener('error', () => {
- throw new Error(request.statusText);
- });
-
- request.open('GET', url, true);
-
- // Set the required response type
- request.responseType = responseType;
-
- request.send();
- } catch (e) {
- reject(e);
- }
- });
- },
-
- // Load image avoiding xhr/fetch CORS issues
- // Server status can't be obtained this way unfortunately, so this uses "naturalWidth" to determine if the image has loaded.
- // By default it checks if it is at least 1px, but you can add a second argument to change this.
- loadImage(src, minWidth = 1) {
- return new Promise((resolve, reject) => {
- const image = new Image();
- const handler = () => {
- delete image.onload;
- delete image.onerror;
- (image.naturalWidth >= minWidth ? resolve : reject)(image);
- };
- Object.assign(image, {onload: handler, onerror: handler, src});
- });
- },
-
- // Load an external script
- loadScript(url) {
- return new Promise((resolve, reject) => {
- loadjs(url, {
- success: resolve,
- error: reject,
- });
- });
- },
-
- // Load an external SVG sprite
- loadSprite(url, id) {
- if (!utils.is.string(url)) {
- return;
- }
-
- const prefix = 'cache';
- const hasId = utils.is.string(id);
- let isCached = false;
-
- const exists = () => document.getElementById(id) !== null;
-
- const update = (container, data) => {
- container.innerHTML = data;
-
- // Check again incase of race condition
- if (hasId && exists()) {
- return;
- }
-
- // Inject the SVG to the body
- document.body.insertAdjacentElement('afterbegin', container);
- };
-
- // Only load once if ID set
- if (!hasId || !exists()) {
- const useStorage = Storage.supported;
-
- // Create container
- const container = document.createElement('div');
- utils.toggleHidden(container, true);
-
- if (hasId) {
- container.setAttribute('id', id);
- }
-
- // Check in cache
- if (useStorage) {
- const cached = window.localStorage.getItem(`${prefix}-${id}`);
- isCached = cached !== null;
-
- if (isCached) {
- const data = JSON.parse(cached);
- update(container, data.content);
- }
- }
-
- // Get the sprite
- utils
- .fetch(url)
- .then(result => {
- if (utils.is.empty(result)) {
- return;
- }
-
- if (useStorage) {
- window.localStorage.setItem(
- `${prefix}-${id}`,
- JSON.stringify({
- content: result,
- }),
- );
- }
-
- update(container, result);
- })
- .catch(() => {});
- }
- },
-
- // Generate a random ID
- generateId(prefix) {
- return `${prefix}-${Math.floor(Math.random() * 10000)}`;
- },
-
- // Wrap an element
- wrap(elements, wrapper) {
- // Convert `elements` to an array, if necessary.
- const targets = elements.length ? elements : [elements];
-
- // Loops backwards to prevent having to clone the wrapper on the
- // first element (see `child` below).
- Array.from(targets)
- .reverse()
- .forEach((element, index) => {
- const child = index > 0 ? wrapper.cloneNode(true) : wrapper;
-
- // Cache the current parent and sibling.
- const parent = element.parentNode;
- const sibling = element.nextSibling;
-
- // Wrap the element (is automatically removed from its current
- // parent).
- child.appendChild(element);
-
- // If the element had a sibling, insert the wrapper before
- // the sibling to maintain the HTML structure; otherwise, just
- // append it to the parent.
- if (sibling) {
- parent.insertBefore(child, sibling);
- } else {
- parent.appendChild(child);
- }
- });
- },
-
- // Create a DocumentFragment
- createElement(type, attributes, text) {
- // Create a new <element>
- const element = document.createElement(type);
-
- // Set all passed attributes
- if (utils.is.object(attributes)) {
- utils.setAttributes(element, attributes);
- }
-
- // Add text node
- if (utils.is.string(text)) {
- element.innerText = text;
- }
-
- // Return built element
- return element;
- },
-
- // Inaert an element after another
- insertAfter(element, target) {
- target.parentNode.insertBefore(element, target.nextSibling);
- },
-
- // Insert a DocumentFragment
- insertElement(type, parent, attributes, text) {
- // Inject the new <element>
- parent.appendChild(utils.createElement(type, attributes, text));
- },
-
- // Remove element(s)
- removeElement(element) {
- if (utils.is.nodeList(element) || utils.is.array(element)) {
- Array.from(element).forEach(utils.removeElement);
- return;
- }
-
- if (!utils.is.element(element) || !utils.is.element(element.parentNode)) {
- return;
- }
-
- element.parentNode.removeChild(element);
- },
-
- // Remove all child elements
- emptyElement(element) {
- let { length } = element.childNodes;
-
- while (length > 0) {
- element.removeChild(element.lastChild);
- length -= 1;
- }
- },
-
- // Replace element
- replaceElement(newChild, oldChild) {
- if (!utils.is.element(oldChild) || !utils.is.element(oldChild.parentNode) || !utils.is.element(newChild)) {
- return null;
- }
-
- oldChild.parentNode.replaceChild(newChild, oldChild);
-
- return newChild;
- },
-
- // Set attributes
- setAttributes(element, attributes) {
- if (!utils.is.element(element) || utils.is.empty(attributes)) {
- return;
- }
-
- Object.entries(attributes).forEach(([
- key,
- value,
- ]) => {
- element.setAttribute(key, value);
- });
- },
-
- // Get an attribute object from a string selector
- getAttributesFromSelector(sel, existingAttributes) {
- // For example:
- // '.test' to { class: 'test' }
- // '#test' to { id: 'test' }
- // '[data-test="test"]' to { 'data-test': 'test' }
-
- if (!utils.is.string(sel) || utils.is.empty(sel)) {
- return {};
- }
-
- const attributes = {};
- const existing = existingAttributes;
-
- sel.split(',').forEach(s => {
- // Remove whitespace
- const selector = s.trim();
- const className = selector.replace('.', '');
- const stripped = selector.replace(/[[\]]/g, '');
-
- // Get the parts and value
- const parts = stripped.split('=');
- const key = parts[0];
- const value = parts.length > 1 ? parts[1].replace(/["']/g, '') : '';
-
- // Get the first character
- const start = selector.charAt(0);
-
- switch (start) {
- case '.':
- // Add to existing classname
- if (utils.is.object(existing) && utils.is.string(existing.class)) {
- existing.class += ` ${className}`;
- }
-
- attributes.class = className;
- break;
-
- case '#':
- // ID selector
- attributes.id = selector.replace('#', '');
- break;
-
- case '[':
- // Attribute selector
- attributes[key] = value;
-
- break;
-
- default:
- break;
- }
- });
-
- return attributes;
- },
-
- // Toggle hidden
- toggleHidden(element, hidden) {
- if (!utils.is.element(element)) {
- return;
- }
-
- let hide = hidden;
-
- if (!utils.is.boolean(hide)) {
- hide = !element.hasAttribute('hidden');
- }
-
- if (hide) {
- element.setAttribute('hidden', '');
- } else {
- element.removeAttribute('hidden');
- }
- },
-
- // Mirror Element.classList.toggle, with IE compatibility for "force" argument
- toggleClass(element, className, force) {
- if (utils.is.element(element)) {
- let method = 'toggle';
- if (typeof force !== 'undefined') {
- method = force ? 'add' : 'remove';
- }
-
- element.classList[method](className);
- return element.classList.contains(className);
- }
-
- return null;
- },
-
- // Has class name
- hasClass(element, className) {
- return utils.is.element(element) && element.classList.contains(className);
- },
-
- // Element matches selector
- matches(element, selector) {
- const prototype = { Element };
-
- function match() {
- return Array.from(document.querySelectorAll(selector)).includes(this);
- }
-
- const matches = prototype.matches || prototype.webkitMatchesSelector || prototype.mozMatchesSelector || prototype.msMatchesSelector || match;
-
- return matches.call(element, selector);
- },
-
- // Find all elements
- getElements(selector) {
- return this.elements.container.querySelectorAll(selector);
- },
-
- // Find a single element
- getElement(selector) {
- return this.elements.container.querySelector(selector);
- },
-
- // Get the focused element
- getFocusElement() {
- let focused = document.activeElement;
-
- if (!focused || focused === document.body) {
- focused = null;
- } else {
- focused = document.querySelector(':focus');
- }
-
- return focused;
- },
-
- // Trap focus inside container
- trapFocus(element = null, toggle = false) {
- if (!utils.is.element(element)) {
- return;
- }
-
- const focusable = utils.getElements.call(this, 'button:not(:disabled), input:not(:disabled), [tabindex]');
- const first = focusable[0];
- const last = focusable[focusable.length - 1];
-
- const trap = event => {
- // Bail if not tab key or not fullscreen
- if (event.key !== 'Tab' || event.keyCode !== 9) {
- return;
- }
-
- // Get the current focused element
- const focused = utils.getFocusElement();
-
- if (focused === last && !event.shiftKey) {
- // Move focus to first element that can be tabbed if Shift isn't used
- first.focus();
- event.preventDefault();
- } else if (focused === first && event.shiftKey) {
- // Move focus to last element that can be tabbed if Shift is used
- last.focus();
- event.preventDefault();
- }
- };
-
- if (toggle) {
- utils.on(this.elements.container, 'keydown', trap, false);
- } else {
- utils.off(this.elements.container, 'keydown', trap, false);
- }
- },
-
- // Toggle event listener
- toggleListener(elements, event, callback, toggle = false, passive = true, capture = false) {
- // Bail if no elemetns, event, or callback
- if (utils.is.empty(elements) || utils.is.empty(event) || !utils.is.function(callback)) {
- return;
- }
-
- // If a nodelist is passed, call itself on each node
- if (utils.is.nodeList(elements) || utils.is.array(elements)) {
- // Create listener for each node
- Array.from(elements).forEach(element => {
- if (element instanceof Node) {
- utils.toggleListener.call(null, element, event, callback, toggle, passive, capture);
- }
- });
-
- return;
- }
-
- // Allow multiple events
- const events = event.split(' ');
-
- // Build options
- // Default to just the capture boolean for browsers with no passive listener support
- let options = capture;
-
- // If passive events listeners are supported
- if (support.passiveListeners) {
- options = {
- // Whether the listener can be passive (i.e. default never prevented)
- passive,
- // Whether the listener is a capturing listener or not
- capture,
- };
- }
-
- // If a single node is passed, bind the event listener
- events.forEach(type => {
- elements[toggle ? 'addEventListener' : 'removeEventListener'](type, callback, options);
- });
- },
-
- // Bind event handler
- on(element, events = '', callback, passive = true, capture = false) {
- utils.toggleListener(element, events, callback, true, passive, capture);
- },
-
- // Unbind event handler
- off(element, events = '', callback, passive = true, capture = false) {
- utils.toggleListener(element, events, callback, false, passive, capture);
- },
-
- // Trigger event
- dispatchEvent(element, type = '', bubbles = false, detail = {}) {
- // Bail if no element
- if (!utils.is.element(element) || utils.is.empty(type)) {
- return;
- }
-
- // Create and dispatch the event
- const event = new CustomEvent(type, {
- bubbles,
- detail: Object.assign({}, detail, {
- plyr: this,
- }),
- });
-
- // Dispatch the event
- element.dispatchEvent(event);
- },
-
- // Format string
- format(input, ...args) {
- if (utils.is.empty(input)) {
- return input;
- }
-
- return input.toString().replace(/{(\d+)}/g, (match, i) => (utils.is.string(args[i]) ? args[i] : ''));
- },
-
- // Get percentage
- getPercentage(current, max) {
- if (current === 0 || max === 0 || Number.isNaN(current) || Number.isNaN(max)) {
- return 0;
- }
-
- return (current / max * 100).toFixed(2);
- },
-
- // Time helpers
- getHours(value) {
- return parseInt((value / 60 / 60) % 60, 10);
- },
- getMinutes(value) {
- return parseInt((value / 60) % 60, 10);
- },
- getSeconds(value) {
- return parseInt(value % 60, 10);
- },
-
- // Format time to UI friendly string
- formatTime(time = 0, displayHours = false, inverted = false) {
- // Bail if the value isn't a number
- if (!utils.is.number(time)) {
- return utils.formatTime(null, displayHours, inverted);
- }
-
- // Format time component to add leading zero
- const format = value => `0${value}`.slice(-2);
-
- // Breakdown to hours, mins, secs
- let hours = utils.getHours(time);
- const mins = utils.getMinutes(time);
- const secs = utils.getSeconds(time);
-
- // Do we need to display hours?
- if (displayHours || hours > 0) {
- hours = `${hours}:`;
- } else {
- hours = '';
- }
-
- // Render
- return `${inverted ? '-' : ''}${hours}${format(mins)}:${format(secs)}`;
- },
-
- // Replace all occurances of a string in a string
- replaceAll(input = '', find = '', replace = '') {
- return input.replace(new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\]/\\])/g, '\\$1'), 'g'), replace.toString());
- },
-
- // Convert to title case
- toTitleCase(input = '') {
- return input.toString().replace(/\w\S*/g, text => text.charAt(0).toUpperCase() + text.substr(1).toLowerCase());
- },
-
- // Convert string to pascalCase
- toPascalCase(input = '') {
- let string = input.toString();
-
- // Convert kebab case
- string = utils.replaceAll(string, '-', ' ');
-
- // Convert snake case
- string = utils.replaceAll(string, '_', ' ');
-
- // Convert to title case
- string = utils.toTitleCase(string);
-
- // Convert to pascal case
- return utils.replaceAll(string, ' ', '');
- },
-
- // Convert string to pascalCase
- toCamelCase(input = '') {
- let string = input.toString();
-
- // Convert to pascal case
- string = utils.toPascalCase(string);
-
- // Convert first character to lowercase
- return string.charAt(0).toLowerCase() + string.slice(1);
- },
-
- // Deep extend destination object with N more objects
- extend(target = {}, ...sources) {
- if (!sources.length) {
- return target;
- }
-
- const source = sources.shift();
-
- if (!utils.is.object(source)) {
- return target;
- }
-
- Object.keys(source).forEach(key => {
- if (utils.is.object(source[key])) {
- if (!Object.keys(target).includes(key)) {
- Object.assign(target, { [key]: {} });
- }
-
- utils.extend(target[key], source[key]);
- } else {
- Object.assign(target, { [key]: source[key] });
- }
- });
-
- return utils.extend(target, ...sources);
- },
-
- // Remove duplicates in an array
- dedupe(array) {
- if (!utils.is.array(array)) {
- return array;
- }
-
- return array.filter((item, index) => array.indexOf(item) === index);
- },
-
- // Clone nested objects
- cloneDeep(object) {
- return JSON.parse(JSON.stringify(object));
- },
-
- // Get a nested value in an object
- getDeep(object, path) {
- return path.split('.').reduce((obj, key) => obj && obj[key], object);
- },
-
- // Get the closest value in an array
- closest(array, value) {
- if (!utils.is.array(array) || !array.length) {
- return null;
- }
-
- return array.reduce((prev, curr) => (Math.abs(curr - value) < Math.abs(prev - value) ? curr : prev));
- },
-
- // Get the provider for a given URL
- getProviderByUrl(url) {
- // YouTube
- if (/^(https?:\/\/)?(www\.)?(youtube\.com|youtu\.?be)\/.+$/.test(url)) {
- return providers.youtube;
- }
-
- // Vimeo
- if (/^https?:\/\/player.vimeo.com\/video\/\d{0,9}(?=\b|\/)/.test(url)) {
- return providers.vimeo;
- }
-
- return null;
- },
-
- // Parse YouTube ID from URL
- parseYouTubeId(url) {
- if (utils.is.empty(url)) {
- return null;
- }
-
- const regex = /^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|&v=)([^#&?]*).*/;
- return url.match(regex) ? RegExp.$2 : url;
- },
-
- // Parse Vimeo ID from URL
- parseVimeoId(url) {
- if (utils.is.empty(url)) {
- return null;
- }
-
- if (utils.is.number(Number(url))) {
- return url;
- }
-
- const regex = /^.*(vimeo.com\/|video\/)(\d+).*/;
- return url.match(regex) ? RegExp.$2 : url;
- },
-
- // Convert a URL to a location object
- parseUrl(url) {
- const parser = document.createElement('a');
- parser.href = url;
- return parser;
- },
-
- // Get URL query parameters
- getUrlParams(input) {
- let search = input;
-
- // Parse URL if needed
- if (input.startsWith('http://') || input.startsWith('https://')) {
- ({ search } = utils.parseUrl(input));
- }
-
- if (utils.is.empty(search)) {
- return null;
- }
-
- const hashes = search.slice(search.indexOf('?') + 1).split('&');
-
- return hashes.reduce((params, hash) => {
- const [
- key,
- val,
- ] = hash.split('=');
-
- return Object.assign(params, { [key]: decodeURIComponent(val) });
- }, {});
- },
-
- // Convert object to URL parameters
- buildUrlParams(input) {
- if (!utils.is.object(input)) {
- return '';
- }
-
- return Object.keys(input)
- .map(key => `${encodeURIComponent(key)}=${encodeURIComponent(input[key])}`)
- .join('&');
- },
-
- // Remove HTML from a string
- stripHTML(source) {
- const fragment = document.createDocumentFragment();
- const element = document.createElement('div');
- fragment.appendChild(element);
- element.innerHTML = source;
- return fragment.firstChild.innerText;
- },
-
- // Like outerHTML, but also works for DocumentFragment
- getHTML(element) {
- const wrapper = document.createElement('div');
- wrapper.appendChild(element);
- return wrapper.innerHTML;
- },
-
- // Get aspect ratio for dimensions
- getAspectRatio(width, height) {
- const getRatio = (w, h) => (h === 0 ? w : getRatio(h, w % h));
- const ratio = getRatio(width, height);
- return `${width / ratio}:${height / ratio}`;
- },
-
- // Get the transition end event
- get transitionEndEvent() {
- const element = document.createElement('span');
-
- const events = {
- WebkitTransition: 'webkitTransitionEnd',
- MozTransition: 'transitionend',
- OTransition: 'oTransitionEnd otransitionend',
- transition: 'transitionend',
- };
-
- const type = Object.keys(events).find(event => element.style[event] !== undefined);
-
- return utils.is.string(type) ? events[type] : false;
- },
-
- // Force repaint of element
- repaint(element) {
- setTimeout(() => {
- utils.toggleHidden(element, true);
- element.offsetHeight; // eslint-disable-line
- utils.toggleHidden(element, false);
- }, 0);
- },
-};
-
-export default utils;
diff --git a/src/js/utils/animation.js b/src/js/utils/animation.js
new file mode 100644
index 00000000..95e39f03
--- /dev/null
+++ b/src/js/utils/animation.js
@@ -0,0 +1,30 @@
+// ==========================================================================
+// Animation utils
+// ==========================================================================
+
+import { toggleHidden } from './elements';
+import is from './is';
+
+export const transitionEndEvent = (() => {
+ const element = document.createElement('span');
+
+ const events = {
+ WebkitTransition: 'webkitTransitionEnd',
+ MozTransition: 'transitionend',
+ OTransition: 'oTransitionEnd otransitionend',
+ transition: 'transitionend',
+ };
+
+ const type = Object.keys(events).find(event => element.style[event] !== undefined);
+
+ return is.string(type) ? events[type] : false;
+})();
+
+// Force repaint of element
+export function repaint(element) {
+ setTimeout(() => {
+ toggleHidden(element, true);
+ element.offsetHeight; // eslint-disable-line
+ toggleHidden(element, false);
+ }, 0);
+}
diff --git a/src/js/utils/arrays.js b/src/js/utils/arrays.js
new file mode 100644
index 00000000..69ef242c
--- /dev/null
+++ b/src/js/utils/arrays.js
@@ -0,0 +1,23 @@
+// ==========================================================================
+// Array utils
+// ==========================================================================
+
+import is from './is';
+
+// Remove duplicates in an array
+export function dedupe(array) {
+ if (!is.array(array)) {
+ return array;
+ }
+
+ return array.filter((item, index) => array.indexOf(item) === index);
+}
+
+// Get the closest value in an array
+export function closest(array, value) {
+ if (!is.array(array) || !array.length) {
+ return null;
+ }
+
+ return array.reduce((prev, curr) => (Math.abs(curr - value) < Math.abs(prev - value) ? curr : prev));
+}
diff --git a/src/js/utils/browser.js b/src/js/utils/browser.js
new file mode 100644
index 00000000..d574f683
--- /dev/null
+++ b/src/js/utils/browser.js
@@ -0,0 +1,13 @@
+// ==========================================================================
+// Browser sniffing
+// Unfortunately, due to mixed support, UA sniffing is required
+// ==========================================================================
+
+const browser = {
+ isIE: /* @cc_on!@ */ false || !!document.documentMode,
+ isWebkit: 'WebkitAppearance' in document.documentElement.style && !/Edge/.test(navigator.userAgent),
+ isIPhone: /(iPhone|iPod)/gi.test(navigator.platform),
+ isIos: /(iPad|iPhone|iPod)/gi.test(navigator.platform),
+};
+
+export default browser;
diff --git a/src/js/utils/elements.js b/src/js/utils/elements.js
new file mode 100644
index 00000000..69e4d46c
--- /dev/null
+++ b/src/js/utils/elements.js
@@ -0,0 +1,285 @@
+// ==========================================================================
+// Element utils
+// ==========================================================================
+
+import { toggleListener } from './events';
+import is from './is';
+
+// Wrap an element
+export function wrap(elements, wrapper) {
+ // Convert `elements` to an array, if necessary.
+ const targets = elements.length ? elements : [elements];
+
+ // Loops backwards to prevent having to clone the wrapper on the
+ // first element (see `child` below).
+ Array.from(targets)
+ .reverse()
+ .forEach((element, index) => {
+ const child = index > 0 ? wrapper.cloneNode(true) : wrapper;
+
+ // Cache the current parent and sibling.
+ const parent = element.parentNode;
+ const sibling = element.nextSibling;
+
+ // Wrap the element (is automatically removed from its current
+ // parent).
+ child.appendChild(element);
+
+ // If the element had a sibling, insert the wrapper before
+ // the sibling to maintain the HTML structure; otherwise, just
+ // append it to the parent.
+ if (sibling) {
+ parent.insertBefore(child, sibling);
+ } else {
+ parent.appendChild(child);
+ }
+ });
+}
+
+// Set attributes
+export function setAttributes(element, attributes) {
+ if (!is.element(element) || is.empty(attributes)) {
+ return;
+ }
+
+ // Assume null and undefined attributes should be left out,
+ // Setting them would otherwise convert them to "null" and "undefined"
+ Object.entries(attributes)
+ .filter(([, value]) => !is.nullOrUndefined(value))
+ .forEach(([key, value]) => element.setAttribute(key, value));
+}
+
+// Create a DocumentFragment
+export function createElement(type, attributes, text) {
+ // Create a new <element>
+ const element = document.createElement(type);
+
+ // Set all passed attributes
+ if (is.object(attributes)) {
+ setAttributes(element, attributes);
+ }
+
+ // Add text node
+ if (is.string(text)) {
+ element.innerText = text;
+ }
+
+ // Return built element
+ return element;
+}
+
+// Inaert an element after another
+export function insertAfter(element, target) {
+ target.parentNode.insertBefore(element, target.nextSibling);
+}
+
+// Insert a DocumentFragment
+export function insertElement(type, parent, attributes, text) {
+ // Inject the new <element>
+ parent.appendChild(createElement(type, attributes, text));
+}
+
+// Remove element(s)
+export function removeElement(element) {
+ if (is.nodeList(element) || is.array(element)) {
+ Array.from(element).forEach(removeElement);
+ return;
+ }
+
+ if (!is.element(element) || !is.element(element.parentNode)) {
+ return;
+ }
+
+ element.parentNode.removeChild(element);
+}
+
+// Remove all child elements
+export function emptyElement(element) {
+ let { length } = element.childNodes;
+
+ while (length > 0) {
+ element.removeChild(element.lastChild);
+ length -= 1;
+ }
+}
+
+// Replace element
+export function replaceElement(newChild, oldChild) {
+ if (!is.element(oldChild) || !is.element(oldChild.parentNode) || !is.element(newChild)) {
+ return null;
+ }
+
+ oldChild.parentNode.replaceChild(newChild, oldChild);
+
+ return newChild;
+}
+
+// Get an attribute object from a string selector
+export function getAttributesFromSelector(sel, existingAttributes) {
+ // For example:
+ // '.test' to { class: 'test' }
+ // '#test' to { id: 'test' }
+ // '[data-test="test"]' to { 'data-test': 'test' }
+
+ if (!is.string(sel) || is.empty(sel)) {
+ return {};
+ }
+
+ const attributes = {};
+ const existing = existingAttributes;
+
+ sel.split(',').forEach(s => {
+ // Remove whitespace
+ const selector = s.trim();
+ const className = selector.replace('.', '');
+ const stripped = selector.replace(/[[\]]/g, '');
+
+ // Get the parts and value
+ const parts = stripped.split('=');
+ const key = parts[0];
+ const value = parts.length > 1 ? parts[1].replace(/["']/g, '') : '';
+
+ // Get the first character
+ const start = selector.charAt(0);
+
+ switch (start) {
+ case '.':
+ // Add to existing classname
+ if (is.object(existing) && is.string(existing.class)) {
+ existing.class += ` ${className}`;
+ }
+
+ attributes.class = className;
+ break;
+
+ case '#':
+ // ID selector
+ attributes.id = selector.replace('#', '');
+ break;
+
+ case '[':
+ // Attribute selector
+ attributes[key] = value;
+
+ break;
+
+ default:
+ break;
+ }
+ });
+
+ return attributes;
+}
+
+// Toggle hidden
+export function toggleHidden(element, hidden) {
+ if (!is.element(element)) {
+ return;
+ }
+
+ let hide = hidden;
+
+ if (!is.boolean(hide)) {
+ hide = !element.hasAttribute('hidden');
+ }
+
+ if (hide) {
+ element.setAttribute('hidden', '');
+ } else {
+ element.removeAttribute('hidden');
+ }
+}
+
+// Mirror Element.classList.toggle, with IE compatibility for "force" argument
+export function toggleClass(element, className, force) {
+ if (is.element(element)) {
+ let method = 'toggle';
+ if (typeof force !== 'undefined') {
+ method = force ? 'add' : 'remove';
+ }
+
+ element.classList[method](className);
+ return element.classList.contains(className);
+ }
+
+ return null;
+}
+
+// Has class name
+export function hasClass(element, className) {
+ return is.element(element) && element.classList.contains(className);
+}
+
+// Element matches selector
+export function matches(element, selector) {
+ const prototype = { Element };
+
+ function match() {
+ return Array.from(document.querySelectorAll(selector)).includes(this);
+ }
+
+ const matches =
+ prototype.matches ||
+ prototype.webkitMatchesSelector ||
+ prototype.mozMatchesSelector ||
+ prototype.msMatchesSelector ||
+ match;
+
+ return matches.call(element, selector);
+}
+
+// Find all elements
+export function getElements(selector) {
+ return this.elements.container.querySelectorAll(selector);
+}
+
+// Find a single element
+export function getElement(selector) {
+ return this.elements.container.querySelector(selector);
+}
+
+// Get the focused element
+export function getFocusElement() {
+ let focused = document.activeElement;
+
+ if (!focused || focused === document.body) {
+ focused = null;
+ } else {
+ focused = document.querySelector(':focus');
+ }
+
+ return focused;
+}
+
+// Trap focus inside container
+export function trapFocus(element = null, toggle = false) {
+ if (!is.element(element)) {
+ return;
+ }
+
+ const focusable = getElements.call(this, 'button:not(:disabled), input:not(:disabled), [tabindex]');
+ const first = focusable[0];
+ const last = focusable[focusable.length - 1];
+
+ const trap = event => {
+ // Bail if not tab key or not fullscreen
+ if (event.key !== 'Tab' || event.keyCode !== 9) {
+ return;
+ }
+
+ // Get the current focused element
+ const focused = getFocusElement();
+
+ if (focused === last && !event.shiftKey) {
+ // Move focus to first element that can be tabbed if Shift isn't used
+ first.focus();
+ event.preventDefault();
+ } else if (focused === first && event.shiftKey) {
+ // Move focus to last element that can be tabbed if Shift is used
+ last.focus();
+ event.preventDefault();
+ }
+ };
+
+ toggleListener.call(this, this.elements.container, 'keydown', trap, toggle, false);
+}
diff --git a/src/js/utils/events.js b/src/js/utils/events.js
new file mode 100644
index 00000000..9f734f04
--- /dev/null
+++ b/src/js/utils/events.js
@@ -0,0 +1,120 @@
+// ==========================================================================
+// Event utils
+// ==========================================================================
+
+import is from './is';
+
+// Check for passive event listener support
+// https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md
+// https://www.youtube.com/watch?v=NPM6172J22g
+const supportsPassiveListeners = (() => {
+ // Test via a getter in the options object to see if the passive property is accessed
+ let supported = false;
+ try {
+ const options = Object.defineProperty({}, 'passive', {
+ get() {
+ supported = true;
+ return null;
+ },
+ });
+ window.addEventListener('test', null, options);
+ window.removeEventListener('test', null, options);
+ } catch (e) {
+ // Do nothing
+ }
+
+ return supported;
+})();
+
+// Toggle event listener
+export function toggleListener(element, event, callback, toggle = false, passive = true, capture = false) {
+ // Bail if no element, event, or callback
+ if (!element || !('addEventListener' in element) || is.empty(event) || !is.function(callback)) {
+ return;
+ }
+
+ // Allow multiple events
+ const events = event.split(' ');
+
+ // Build options
+ // Default to just the capture boolean for browsers with no passive listener support
+ let options = capture;
+
+ // If passive events listeners are supported
+ if (supportsPassiveListeners) {
+ options = {
+ // Whether the listener can be passive (i.e. default never prevented)
+ passive,
+ // Whether the listener is a capturing listener or not
+ capture,
+ };
+ }
+
+ // If a single node is passed, bind the event listener
+ events.forEach(type => {
+ if (this && this.eventListeners && toggle) {
+ // Cache event listener
+ this.eventListeners.push({ element, type, callback, options });
+ }
+
+ element[toggle ? 'addEventListener' : 'removeEventListener'](type, callback, options);
+ });
+}
+
+// Bind event handler
+export function on(element, events = '', callback, passive = true, capture = false) {
+ toggleListener.call(this, element, events, callback, true, passive, capture);
+}
+
+// Unbind event handler
+export function off(element, events = '', callback, passive = true, capture = false) {
+ toggleListener.call(this, element, events, callback, false, passive, capture);
+}
+
+// Bind once-only event handler
+export function once(element, events = '', callback, passive = true, capture = false) {
+ function onceCallback(...args) {
+ off(element, events, onceCallback, passive, capture);
+ callback.apply(this, args);
+ }
+
+ toggleListener.call(this, element, events, onceCallback, true, passive, capture);
+}
+
+// Trigger event
+export function triggerEvent(element, type = '', bubbles = false, detail = {}) {
+ // Bail if no element
+ if (!is.element(element) || is.empty(type)) {
+ return;
+ }
+
+ // Create and dispatch the event
+ const event = new CustomEvent(type, {
+ bubbles,
+ detail: Object.assign({}, detail, {
+ plyr: this,
+ }),
+ });
+
+ // Dispatch the event
+ element.dispatchEvent(event);
+}
+
+// Unbind all cached event listeners
+export function unbindListeners() {
+ if (this && this.eventListeners) {
+ this.eventListeners.forEach(item => {
+ const { element, type, callback, options } = item;
+ element.removeEventListener(type, callback, options);
+ });
+
+ this.eventListeners = [];
+ }
+}
+
+// Run method when / if player is ready
+export function ready() {
+ return new Promise(
+ resolve => (this.ready ? setTimeout(resolve, 0) : on.call(this, this.elements.container, 'ready', resolve)),
+ ).then(() => {});
+}
diff --git a/src/js/utils/fetch.js b/src/js/utils/fetch.js
new file mode 100644
index 00000000..1e506cd0
--- /dev/null
+++ b/src/js/utils/fetch.js
@@ -0,0 +1,42 @@
+// ==========================================================================
+// Fetch wrapper
+// Using XHR to avoid issues with older browsers
+// ==========================================================================
+
+export default function fetch(url, responseType = 'text') {
+ return new Promise((resolve, reject) => {
+ try {
+ const request = new XMLHttpRequest();
+
+ // Check for CORS support
+ if (!('withCredentials' in request)) {
+ return;
+ }
+
+ request.addEventListener('load', () => {
+ if (responseType === 'text') {
+ try {
+ resolve(JSON.parse(request.responseText));
+ } catch (e) {
+ resolve(request.responseText);
+ }
+ } else {
+ resolve(request.response);
+ }
+ });
+
+ request.addEventListener('error', () => {
+ throw new Error(request.statusText);
+ });
+
+ request.open('GET', url, true);
+
+ // Set the required response type
+ request.responseType = responseType;
+
+ request.send();
+ } catch (e) {
+ reject(e);
+ }
+ });
+}
diff --git a/src/js/utils/is.js b/src/js/utils/is.js
new file mode 100644
index 00000000..cb2c07c6
--- /dev/null
+++ b/src/js/utils/is.js
@@ -0,0 +1,67 @@
+// ==========================================================================
+// Type checking utils
+// ==========================================================================
+
+const getConstructor = input => (input !== null && typeof input !== 'undefined' ? input.constructor : null);
+
+const instanceOf = (input, constructor) => Boolean(input && constructor && input instanceof constructor);
+
+const is = {
+ object(input) {
+ return getConstructor(input) === Object;
+ },
+ number(input) {
+ return getConstructor(input) === Number && !Number.isNaN(input);
+ },
+ string(input) {
+ return getConstructor(input) === String;
+ },
+ boolean(input) {
+ return getConstructor(input) === Boolean;
+ },
+ function(input) {
+ return getConstructor(input) === Function;
+ },
+ array(input) {
+ return !is.nullOrUndefined(input) && Array.isArray(input);
+ },
+ weakMap(input) {
+ return instanceOf(input, WeakMap);
+ },
+ nodeList(input) {
+ return instanceOf(input, NodeList);
+ },
+ element(input) {
+ return instanceOf(input, Element);
+ },
+ textNode(input) {
+ return getConstructor(input) === Text;
+ },
+ event(input) {
+ return instanceOf(input, Event);
+ },
+ cue(input) {
+ return instanceOf(input, window.TextTrackCue) || instanceOf(input, window.VTTCue);
+ },
+ track(input) {
+ return instanceOf(input, TextTrack) || (!is.nullOrUndefined(input) && is.string(input.kind));
+ },
+ url(input) {
+ return (
+ !is.nullOrUndefined(input) &&
+ /(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-/]))?/.test(input)
+ );
+ },
+ nullOrUndefined(input) {
+ return input === null || typeof input === 'undefined';
+ },
+ empty(input) {
+ return (
+ is.nullOrUndefined(input) ||
+ ((is.string(input) || is.array(input) || is.nodeList(input)) && !input.length) ||
+ (is.object(input) && !Object.keys(input).length)
+ );
+ },
+};
+
+export default is;
diff --git a/src/js/utils/loadImage.js b/src/js/utils/loadImage.js
new file mode 100644
index 00000000..8acd2496
--- /dev/null
+++ b/src/js/utils/loadImage.js
@@ -0,0 +1,19 @@
+// ==========================================================================
+// Load image avoiding xhr/fetch CORS issues
+// Server status can't be obtained this way unfortunately, so this uses "naturalWidth" to determine if the image has loaded
+// By default it checks if it is at least 1px, but you can add a second argument to change this
+// ==========================================================================
+
+export default function loadImage(src, minWidth = 1) {
+ return new Promise((resolve, reject) => {
+ const image = new Image();
+
+ const handler = () => {
+ delete image.onload;
+ delete image.onerror;
+ (image.naturalWidth >= minWidth ? resolve : reject)(image);
+ };
+
+ Object.assign(image, { onload: handler, onerror: handler, src });
+ });
+}
diff --git a/src/js/utils/loadScript.js b/src/js/utils/loadScript.js
new file mode 100644
index 00000000..81ae36f4
--- /dev/null
+++ b/src/js/utils/loadScript.js
@@ -0,0 +1,14 @@
+// ==========================================================================
+// Load an external script
+// ==========================================================================
+
+import loadjs from 'loadjs';
+
+export default function loadScript(url) {
+ return new Promise((resolve, reject) => {
+ loadjs(url, {
+ success: resolve,
+ error: reject,
+ });
+ });
+}
diff --git a/src/js/utils/loadSprite.js b/src/js/utils/loadSprite.js
new file mode 100644
index 00000000..dbb00cf2
--- /dev/null
+++ b/src/js/utils/loadSprite.js
@@ -0,0 +1,75 @@
+// ==========================================================================
+// Sprite loader
+// ==========================================================================
+
+import Storage from './../storage';
+import is from './is';
+
+// Load an external SVG sprite
+export default function loadSprite(url, id) {
+ if (!is.string(url)) {
+ return;
+ }
+
+ const prefix = 'cache';
+ const hasId = is.string(id);
+ let isCached = false;
+
+ const exists = () => document.getElementById(id) !== null;
+
+ const update = (container, data) => {
+ container.innerHTML = data;
+
+ // Check again incase of race condition
+ if (hasId && exists()) {
+ return;
+ }
+
+ // Inject the SVG to the body
+ document.body.insertAdjacentElement('afterbegin', container);
+ };
+
+ // Only load once if ID set
+ if (!hasId || !exists()) {
+ const useStorage = Storage.supported;
+
+ // Create container
+ const container = document.createElement('div');
+ container.setAttribute('hidden', '');
+
+ if (hasId) {
+ container.setAttribute('id', id);
+ }
+
+ // Check in cache
+ if (useStorage) {
+ const cached = window.localStorage.getItem(`${prefix}-${id}`);
+ isCached = cached !== null;
+
+ if (isCached) {
+ const data = JSON.parse(cached);
+ update(container, data.content);
+ }
+ }
+
+ // Get the sprite
+ fetch(url)
+ .then(result => {
+ if (is.empty(result)) {
+ return;
+ }
+
+ if (useStorage) {
+ window.localStorage.setItem(
+ `${prefix}-${id}`,
+ JSON.stringify({
+ content: result,
+ }),
+ );
+ }
+
+ update(container, result);
+ })
+ .catch(() => {});
+ }
+}
diff --git a/src/js/utils/objects.js b/src/js/utils/objects.js
new file mode 100644
index 00000000..225bb459
--- /dev/null
+++ b/src/js/utils/objects.js
@@ -0,0 +1,42 @@
+// ==========================================================================
+// Object utils
+// ==========================================================================
+
+import is from './is';
+
+// Clone nested objects
+export function cloneDeep(object) {
+ return JSON.parse(JSON.stringify(object));
+}
+
+// Get a nested value in an object
+export function getDeep(object, path) {
+ return path.split('.').reduce((obj, key) => obj && obj[key], object);
+}
+
+// Deep extend destination object with N more objects
+export function extend(target = {}, ...sources) {
+ if (!sources.length) {
+ return target;
+ }
+
+ const source = sources.shift();
+
+ if (!is.object(source)) {
+ return target;
+ }
+
+ Object.keys(source).forEach(key => {
+ if (is.object(source[key])) {
+ if (!Object.keys(target).includes(key)) {
+ Object.assign(target, { [key]: {} });
+ }
+
+ extend(target[key], source[key]);
+ } else {
+ Object.assign(target, { [key]: source[key] });
+ }
+ });
+
+ return extend(target, ...sources);
+}
diff --git a/src/js/utils/strings.js b/src/js/utils/strings.js
new file mode 100644
index 00000000..c872498c
--- /dev/null
+++ b/src/js/utils/strings.js
@@ -0,0 +1,85 @@
+// ==========================================================================
+// String utils
+// ==========================================================================
+
+import is from './is';
+
+// Generate a random ID
+export function generateId(prefix) {
+ return `${prefix}-${Math.floor(Math.random() * 10000)}`;
+}
+
+// Format string
+export function format(input, ...args) {
+ if (is.empty(input)) {
+ return input;
+ }
+
+ return input.toString().replace(/{(\d+)}/g, (match, i) => args[i].toString());
+}
+
+// Get percentage
+export function getPercentage(current, max) {
+ if (current === 0 || max === 0 || Number.isNaN(current) || Number.isNaN(max)) {
+ return 0;
+ }
+
+ return (current / max * 100).toFixed(2);
+}
+
+// Replace all occurances of a string in a string
+export function replaceAll(input = '', find = '', replace = '') {
+ return input.replace(
+ new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\]/\\])/g, '\\$1'), 'g'),
+ replace.toString(),
+ );
+}
+
+// Convert to title case
+export function toTitleCase(input = '') {
+ return input.toString().replace(/\w\S*/g, text => text.charAt(0).toUpperCase() + text.substr(1).toLowerCase());
+}
+
+// Convert string to pascalCase
+export function toPascalCase(input = '') {
+ let string = input.toString();
+
+ // Convert kebab case
+ string = replaceAll(string, '-', ' ');
+
+ // Convert snake case
+ string = replaceAll(string, '_', ' ');
+
+ // Convert to title case
+ string = toTitleCase(string);
+
+ // Convert to pascal case
+ return replaceAll(string, ' ', '');
+}
+
+// Convert string to pascalCase
+export function toCamelCase(input = '') {
+ let string = input.toString();
+
+ // Convert to pascal case
+ string = toPascalCase(string);
+
+ // Convert first character to lowercase
+ return string.charAt(0).toLowerCase() + string.slice(1);
+}
+
+// Remove HTML from a string
+export function stripHTML(source) {
+ const fragment = document.createDocumentFragment();
+ const element = document.createElement('div');
+ fragment.appendChild(element);
+ element.innerHTML = source;
+ return fragment.firstChild.innerText;
+}
+
+// Like outerHTML, but also works for DocumentFragment
+export function getHTML(element) {
+ const wrapper = document.createElement('div');
+ wrapper.appendChild(element);
+ return wrapper.innerHTML;
+}
diff --git a/src/js/utils/time.js b/src/js/utils/time.js
new file mode 100644
index 00000000..7c9860fd
--- /dev/null
+++ b/src/js/utils/time.js
@@ -0,0 +1,36 @@
+// ==========================================================================
+// Time utils
+// ==========================================================================
+
+import is from './is';
+
+// Time helpers
+export const getHours = value => parseInt((value / 60 / 60) % 60, 10);
+export const getMinutes = value => parseInt((value / 60) % 60, 10);
+export const getSeconds = value => parseInt(value % 60, 10);
+
+// Format time to UI friendly string
+export function formatTime(time = 0, displayHours = false, inverted = false) {
+ // Bail if the value isn't a number
+ if (!is.number(time)) {
+ return formatTime(null, displayHours, inverted);
+ }
+
+ // Format time component to add leading zero
+ const format = value => `0${value}`.slice(-2);
+
+ // Breakdown to hours, mins, secs
+ let hours = getHours(time);
+ const mins = getMinutes(time);
+ const secs = getSeconds(time);
+
+ // Do we need to display hours?
+ if (displayHours || hours > 0) {
+ hours = `${hours}:`;
+ } else {
+ hours = '';
+ }
+
+ // Render
+ return `${inverted && time > 0 ? '-' : ''}${hours}${format(mins)}:${format(secs)}`;
+}
diff --git a/src/js/utils/urls.js b/src/js/utils/urls.js
new file mode 100644
index 00000000..3ebe622e
--- /dev/null
+++ b/src/js/utils/urls.js
@@ -0,0 +1,39 @@
+// ==========================================================================
+// URL utils
+// ==========================================================================
+
+import is from './is';
+
+/**
+ * Parse a string to a URL object
+ * @param {string} input - the URL to be parsed
+ * @param {boolean} safe - failsafe parsing
+ */
+export function parseUrl(input, safe = true) {
+ let url = input;
+
+ if (safe) {
+ const parser = document.createElement('a');
+ parser.href = url;
+ url = parser.href;
+ }
+
+ try {
+ return new URL(url);
+ } catch (e) {
+ return null;
+ }
+}
+
+// Convert object to URLSearchParams
+export function buildUrlParams(input) {
+ const params = new URLSearchParams();
+
+ if (is.object(input)) {
+ Object.entries(input).forEach(([key, value]) => {
+ params.set(key, value);
+ });
+ }
+
+ return params;
+}
diff --git a/yarn.lock b/yarn.lock
index 72d44f47..7ab97937 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -102,6 +102,14 @@
call-me-maybe "^1.0.1"
glob-to-regexp "^0.3.0"
+"@types/estree@0.0.39":
+ version "0.0.39"
+ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f"
+
+"@types/node@*":
+ version "10.3.3"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-10.3.3.tgz#8798d9e39af2fa604f715ee6a6b19796528e46c3"
+
abbrev@1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
@@ -2616,13 +2624,13 @@ gulp-autoprefixer@^5.0.0:
through2 "^2.0.0"
vinyl-sourcemaps-apply "^0.2.0"
-gulp-better-rollup@^3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/gulp-better-rollup/-/gulp-better-rollup-3.1.0.tgz#b226ba0c672882075472158b82d22ba9976d4ecb"
+gulp-better-rollup@^3.2.1:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/gulp-better-rollup/-/gulp-better-rollup-3.2.1.tgz#c6fc26c19cd11475c58a4be97e8a7e00f36b3ac2"
dependencies:
lodash.camelcase "^4.3.0"
- plugin-error "^0.1.2"
- rollup ">=0.48 <0.57"
+ plugin-error "^1.0.1"
+ rollup "^0.60.2"
vinyl "^2.1.0"
vinyl-sourcemaps-apply "^0.2.1"
@@ -2678,9 +2686,9 @@ gulp-postcss@^7.0.1:
postcss-load-config "^1.2.0"
vinyl-sourcemaps-apply "^0.2.1"
-gulp-rename@^1.2.3:
- version "1.2.3"
- resolved "https://registry.yarnpkg.com/gulp-rename/-/gulp-rename-1.2.3.tgz#37b75298e9d3e6c0fe9ac4eac13ce3be5434646b"
+gulp-rename@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/gulp-rename/-/gulp-rename-1.3.0.tgz#2e789d8f563ab0c924eeb62967576f37ff4cb826"
gulp-replace@^1.0.0:
version "1.0.0"
@@ -3878,6 +3886,10 @@ lodash@>=3.10.0, lodash@^4.0.0, lodash@^4.14.0, lodash@^4.17.4, lodash@^4.2.0, l
version "4.17.5"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.5.tgz#99a92d65c0272debe8c96b6057bc8fbfa3bed511"
+lodash@^4.17.10:
+ version "4.17.10"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7"
+
lodash@~1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-1.0.2.tgz#8f57560c83b59fc270bd3d561b690043430e2551"
@@ -4723,9 +4735,9 @@ postcss-html@^0.15.0:
remark "^9.0.0"
unist-util-find-all-after "^1.0.1"
-postcss-html@^0.23.6:
- version "0.23.7"
- resolved "https://registry.yarnpkg.com/postcss-html/-/postcss-html-0.23.7.tgz#47146c15e21b9c00746c40115dcff8270c439f32"
+postcss-html@^0.28.0:
+ version "0.28.0"
+ resolved "https://registry.yarnpkg.com/postcss-html/-/postcss-html-0.28.0.tgz#3dd0f5b5d7f886b8181bf844396d43a7898162cb"
dependencies:
htmlparser2 "^3.9.2"
@@ -4735,9 +4747,9 @@ postcss-less@^1.1.0:
dependencies:
postcss "^5.2.16"
-postcss-less@^1.1.5:
- version "1.1.5"
- resolved "https://registry.yarnpkg.com/postcss-less/-/postcss-less-1.1.5.tgz#a6f0ce180cf3797eeee1d4adc0e9e6d6db665609"
+postcss-less@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-less/-/postcss-less-2.0.0.tgz#5d190b8e057ca446d60fe2e2587ad791c9029fb8"
dependencies:
postcss "^5.2.16"
@@ -4764,9 +4776,9 @@ postcss-load-plugins@^2.3.0:
cosmiconfig "^2.1.1"
object-assign "^4.1.0"
-postcss-markdown@^0.23.6:
- version "0.23.7"
- resolved "https://registry.yarnpkg.com/postcss-markdown/-/postcss-markdown-0.23.7.tgz#7e3a398794295c425e51e4f0abdee6d13ad3d134"
+postcss-markdown@^0.28.0:
+ version "0.28.0"
+ resolved "https://registry.yarnpkg.com/postcss-markdown/-/postcss-markdown-0.28.0.tgz#99d1c4e74967af9e9c98acb2e2b66df4b3c6ed86"
dependencies:
remark "^9.0.0"
unist-util-find-all-after "^1.0.2"
@@ -4837,9 +4849,9 @@ postcss-sorting@^3.1.0:
lodash "^4.17.4"
postcss "^6.0.13"
-postcss-syntax@^0.9.0:
- version "0.9.1"
- resolved "https://registry.yarnpkg.com/postcss-syntax/-/postcss-syntax-0.9.1.tgz#5dbd90af1631ab8805b8f594bef2c2e8002d3758"
+postcss-syntax@^0.28.0:
+ version "0.28.0"
+ resolved "https://registry.yarnpkg.com/postcss-syntax/-/postcss-syntax-0.28.0.tgz#e17572a7dcf5388f0c9b68232d2dad48fa7f0b12"
postcss-value-parser@^3.2.3, postcss-value-parser@^3.3.0:
version "3.3.0"
@@ -4988,9 +5000,9 @@ randomatic@^1.1.3:
is-number "^3.0.0"
kind-of "^4.0.0"
-raven-js@^3.26.1:
- version "3.26.1"
- resolved "https://registry.yarnpkg.com/raven-js/-/raven-js-3.26.1.tgz#13f78804f2bed524a7283382e1bca7ab423950a3"
+raven-js@^3.26.2:
+ version "3.26.2"
+ resolved "https://registry.yarnpkg.com/raven-js/-/raven-js-3.26.2.tgz#9153af2416e96ccf4e0b9cbc6c90c34dda0d7e88"
rc@^1.0.1, rc@^1.1.6:
version "1.2.6"
@@ -5466,9 +5478,12 @@ rollup-pluginutils@^2.0.1:
estree-walker "^0.3.0"
micromatch "^2.3.11"
-"rollup@>=0.48 <0.57":
- version "0.56.5"
- resolved "https://registry.yarnpkg.com/rollup/-/rollup-0.56.5.tgz#40fe3cf0cd1659d469baad11f4d5b6336c14ce84"
+rollup@^0.60.2:
+ version "0.60.7"
+ resolved "https://registry.yarnpkg.com/rollup/-/rollup-0.60.7.tgz#2b62ef9306f719b1ab85a7814b3e6596ac51fae8"
+ dependencies:
+ "@types/estree" "0.0.39"
+ "@types/node" "*"
run-async@^2.2.0:
version "2.3.0"
@@ -5923,11 +5938,11 @@ stylelint-scss@^2.0.0:
postcss-selector-parser "^3.1.1"
postcss-value-parser "^3.3.0"
-stylelint-scss@^3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/stylelint-scss/-/stylelint-scss-3.1.0.tgz#aa46503014d1a6edb2fb4c5fefb73a7d0d5bc644"
+stylelint-scss@^3.1.2:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/stylelint-scss/-/stylelint-scss-3.1.2.tgz#3257c0600d197fe7642f3698944b47c91567f379"
dependencies:
- lodash "^4.17.4"
+ lodash "^4.17.10"
postcss-media-query-parser "^0.2.3"
postcss-resolve-nested-selector "^0.1.1"
postcss-selector-parser "^4.0.0"
@@ -6031,9 +6046,9 @@ stylelint@^8.1.1:
svg-tags "^1.0.0"
table "^4.0.1"
-stylelint@^9.2.1:
- version "9.2.1"
- resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-9.2.1.tgz#fe63c169f6cd3bc81e77f0e3c6443df3267ec211"
+stylelint@^9.3.0:
+ version "9.3.0"
+ resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-9.3.0.tgz#fe176e4e421ac10eac1a6b6d9f28e908eb58c5db"
dependencies:
autoprefixer "^8.0.0"
balanced-match "^1.0.0"
@@ -6058,9 +6073,9 @@ stylelint@^9.2.1:
normalize-selector "^0.2.0"
pify "^3.0.0"
postcss "^6.0.16"
- postcss-html "^0.23.6"
- postcss-less "^1.1.5"
- postcss-markdown "^0.23.6"
+ postcss-html "^0.28.0"
+ postcss-less "^2.0.0"
+ postcss-markdown "^0.28.0"
postcss-media-query-parser "^0.2.3"
postcss-reporter "^5.0.0"
postcss-resolve-nested-selector "^0.1.1"
@@ -6068,7 +6083,7 @@ stylelint@^9.2.1:
postcss-sass "^0.3.0"
postcss-scss "^1.0.2"
postcss-selector-parser "^3.1.0"
- postcss-syntax "^0.9.0"
+ postcss-syntax "^0.28.0"
postcss-value-parser "^3.3.0"
resolve-from "^4.0.0"
signal-exit "^3.0.2"