whole_func_string: function ready() {
  	    var _this2 = this;
  
  	    var player = this;
  	    var config = player.config.vimeo; // Get Vimeo params for the iframe
  
  	    var params = buildUrlParams(extend({}, {
  	      loop: player.config.loop.active,
  	      autoplay: player.autoplay,
  	      muted: player.muted,
  	      gesture: 'media',
  	      playsinline: !this.config.fullscreen.iosNative
  	    }, config)); // 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(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 = "".concat(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;
  	    player.embed.getVideoUrl().then(function (value) {
  	      currentSrc = value;
  	      controls.setDownloadUrl.call(player);
  	    }).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 _dimensions = _slicedToArray(dimensions, 2),
  	          width = _dimensions[0],
  	          height = _dimensions[1];
  
  	      player.embed.ratio = [width, height];
  	      setAspectRatio.call(_this2);
  	    }); // 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 === void 0 ? [] : _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);
  	  }
func_code_string: function ready() {
  	    var _this2 = this;
  
  	    var player = this;
  	    var config = player.config.vimeo; // Get Vimeo params for the iframe
  
  	    var params = buildUrlParams(extend({}, {
  	      loop: player.config.loop.active,
  	      autoplay: player.autoplay,
  	      muted: player.muted,
  	      gesture: 'media',
  	      playsinline: !this.config.fullscreen.iosNative
  	    }, config)); // 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(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 = "".concat(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;
  	    player.embed.getVideoUrl().then(function (value) {
  	      currentSrc = value;
  	      controls.setDownloadUrl.call(player);
  	    }).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 _dimensions = _slicedToArray(dimensions, 2),
  	          width = _dimensions[0],
  	          height = _dimensions[1];
  
  	      player.embed.ratio = [width, height];
  	      setAspectRatio.call(_this2);
  	    }); // 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 === void 0 ? [] : _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);
  	  }
func_documentation_string: API Ready