{
  "version": 3,
  "sources": ["../../../../../node_modules/@cfpb/cfpb-design-system/src/utilities/event-observer.js", "../../../../../node_modules/@cfpb/cfpb-design-system/src/utilities/standard-type.js", "../../../../../node_modules/@cfpb/cfpb-design-system/src/utilities/data-hook.js", "../../../../../node_modules/@cfpb/cfpb-design-system/src/components/utilities/atomic-helpers.js", "../../../../../node_modules/@cfpb/cfpb-design-system/src/utilities/utilities.scss", "../../../../unprocessed/js/modules/util/strings.js", "../../../../unprocessed/js/modules/youtube-api.js", "../../../../unprocessed/js/organisms/VideoPlayer.js", "../../../../unprocessed/js/routes/on-demand/video-player.js"],
  "sourcesContent": ["/**\n * @typedef {(options: unknown) => void} EventCallback\n */\n\n/**\n * EventObserver\n * @class\n * @classdesc Used to create an object\n *   that can dispatch and listen to custom events.\n * @returns {object} An EventObserver instance.\n */\nfunction EventObserver() {\n  // The events registered on this instance.\n  const _events = {};\n\n  /**\n   * Register an event listener.\n   * @param {string} event - The event name to listen for.\n   * @param {EventCallback} callback - The function called when the event has fired.\n   * @returns {object} The instance this EventObserver instance is decorating.\n   */\n  function addEventListener(event, callback) {\n    if ({}.hasOwnProperty.call(_events, event)) {\n      _events[event].push(callback);\n    } else {\n      _events[event] = [callback];\n    }\n\n    return this;\n  }\n\n  /**\n   * Remove an added event listener.\n   * Must match a call made to addEventListener.\n   * @param {string} event - The event name to remove.\n   * @param {EventCallback} callback - The function attached to the event.\n   * @returns {object} The instance this EventObserver instance is decorating.\n   */\n  function removeEventListener(event, callback) {\n    if (!{}.hasOwnProperty.call(_events, event)) {\n      return this;\n    }\n\n    const index = _events[event].indexOf(callback);\n    // Check if there are any callbacks associated with a particular event.\n    if (index !== -1) {\n      _events[event].splice(index, 1);\n    }\n\n    return this;\n  }\n\n  /**\n   * Broadcast an event.\n   * @param {string} event - The type of event to broadcast.\n   * @param {object} [options] - The event object to pass to the event handler.\n   * @returns {object} The instance this EventObserver instance is decorating.\n   */\n  function dispatchEvent(event, options) {\n    if (!{}.hasOwnProperty.call(_events, event)) {\n      return this;\n    }\n\n    options = options || {};\n\n    const evts = _events[event];\n    for (let i = 0, len = evts.length; i < len; i++) {\n      evts[i].call(this, options);\n    }\n\n    return this;\n  }\n\n  this.addEventListener = addEventListener;\n  this.removeEventListener = removeEventListener;\n  this.dispatchEvent = dispatchEvent;\n  this.getRegisteredEvents = () => _events;\n\n  return this;\n}\n\nexport { EventObserver };\n", "/**\n * @constant\n * @type {string}\n * @description\n * Constant for the name of the data-* attribute set on\n * HTML DOM elements for access by JavaScript.\n */\nconst JS_HOOK = 'data-js-hook';\n\n/**\n * @constant\n * @type {string}\n * @description\n * Flag prefix for settings that describe what JavaScript\n * behaviors should be attached to a component.\n * This would be set in the markup and initialized when\n * the JavaScript loads.\n * @example\n * A component may flag that it has certain JavaScript behaviors attached,\n * such as:\n * `data-js-hook=\"behavior_flyout-menu behavior_clearable-input\"`,\n * which defines that two scripts (FlyoutMenu) and (ClearableInput)\n * should access this DOM element and initialize its behaviors.\n */\nconst BEHAVIOR_PREFIX = 'behavior_';\n\n/**\n * @constant\n * @type {string}\n * @description\n * Flag prefix for settings related to changes in a components\n * state set in the data-* JavaScript hook.\n * @example\n * A component may flag that it has been initialized by setting\n * `data-js-hook=\"state_atomic_init\"` after page load.\n * Which specifies that the init method of a atomic constructor\n * has been called, such as\n * `var globalSearch = new GlobalSearch( 'm-global-search' ).init()`.\n */\nconst STATE_PREFIX = 'state_';\n\nexport { JS_HOOK, BEHAVIOR_PREFIX, STATE_PREFIX };\n", "import { JS_HOOK } from './standard-type.js';\n\n/**\n * @param {HTMLElement} element - DOM element.\n * @param {string} value - Value to check as existing as a JS data-* hook value.\n * @returns {boolean} True if the data-* hook value exists, false otherwise.\n */\nfunction contains(element, value) {\n  if (!element) {\n    return false;\n  }\n  let values = element.getAttribute(JS_HOOK);\n  // If JS data-* hook is not set return immediately.\n  if (!values) {\n    return false;\n  }\n  values = values.split(' ');\n\n  return values.indexOf(value) > -1 ? true : false;\n}\n\n/**\n * @param {HTMLElement} element - DOM element.\n * @param {string} value - Value to add to the element's JS data-* hook.\n * @returns {string} The value that was added.\n * @throws {Error} If supplied value contains a space,\n *   meaning it would be two values, which is likely a typo.\n */\nfunction add(element, value) {\n  if (contains(element, value)) return value;\n\n  if (value.indexOf(' ') !== -1) {\n    const msg = JS_HOOK + ' values cannot contain spaces!';\n    throw new Error(msg);\n  }\n\n  const values = element.getAttribute(JS_HOOK);\n  if (values !== null) {\n    value = values + ' ' + value;\n  }\n  element.setAttribute(JS_HOOK, value);\n\n  return value;\n}\n\nexport { add, contains };\n", "/* ==========================================================================\n   Atomic Helpers.\n   Utilities for helping validate atomic design element architecture.\n   In descending order of scope, atomic components are:\n   - Page\n   - Template\n   - Organism\n   - Molecule\n   - Atom\n   ========================================================================= */\n\nimport { add, contains } from '../../utilities/data-hook.js';\nimport { STATE_PREFIX } from '../../utilities/standard-type.js';\n\n/**\n * @constant\n * @type {string}\n * @description\n * Flag that gets set on an atomic component after its .init()\n * method has been called. This is used so that an atomic\n * component won't get initialized a second time after it\n * has already been initialized.\n */\nconst INIT_FLAG = STATE_PREFIX + 'atomic_init';\n\n/**\n * @param {HTMLElement} element - The DOM element within which to search for\n *   the atomic element class.\n * @param {string} baseClass - The CSS class name for the atomic element.\n * @returns {HTMLElement} The DOM element for the atomic element.\n * @throws {Error} If DOM element passed into the atomic element is not valid.\n */\nfunction _verifyElementExists(element, baseClass) {\n  if (!element || !element.classList) {\n    const msg =\n      element +\n      ' is not valid. ' +\n      'Check that element is a DOM node with class \"' +\n      baseClass +\n      '\"';\n    throw new Error(msg);\n  }\n\n  return element;\n}\n\n/**\n * @param {HTMLElement} element - The DOM element within which to search\n *   for the atomic element class.\n * @param {string} baseClass - The CSS class name for the atomic element.\n * @returns {HTMLElement} The DOM element for the atomic element.\n * @throws {Error} If baseClass was not found on the element.\n */\nfunction _verifyClassExists(element, baseClass) {\n  const dom = element.classList.contains(baseClass)\n    ? element\n    : element.querySelector('.' + baseClass);\n  if (!dom) {\n    const msg = baseClass + ' not found on or in passed DOM node.';\n    throw new Error(msg);\n  }\n\n  return dom;\n}\n\n/**\n * Check that a particular element passed into the constructor of\n * an atomic component exists and that the correct atomic class\n * is present on the element.\n * @param {HTMLElement} element - The DOM element within which to search\n *   for the atomic element class.\n * @param {string} baseClass - The CSS class name for the atomic element.\n * @returns {HTMLElement} The DOM element for the atomic element.\n * @throws {Error} If DOM element passed into the atomic element is not valid.\n */\nfunction checkDom(element, baseClass) {\n  _verifyElementExists(element, baseClass);\n  const dom = _verifyClassExists(element, baseClass);\n\n  return dom;\n}\n\n/**\n * Set a flag on an atomic component when it is initialized.\n * Use the returned boolean to handle cases where an atomic component\n * is initializing when it has already been initialized elsewhere.\n * @param {HTMLElement} element - The DOM element for the atomic component.\n * @returns {boolean} True if the init data-js-* hook attribute was set,\n *   false otherwise.\n */\nfunction setInitFlag(element) {\n  if (contains(element, INIT_FLAG)) {\n    return false;\n  }\n\n  add(element, INIT_FLAG);\n\n  return true;\n}\n\n/**\n * @param {string} selector - Selector to search for in the document.\n * @param {new (...args: unknown[]) => object} Constructor - A constructor function.\n * @param {HTMLElement} [scope] - A dom node in which to query the selector.\n *   If not supplied, it defaults to the `document`.\n * @param {object} config - Configuration will be provided to the Constructor's init()\n * @returns {Array<object>} List of instances that were instantiated.\n */\nfunction instantiateAll(selector, Constructor, scope, config = {}) {\n  const base = scope || document;\n  const elements = base.querySelectorAll(selector);\n  const insts = [];\n  let inst;\n  let element;\n  for (let i = 0, len = elements.length; i < len; i++) {\n    element = elements[i];\n    if (contains(element, INIT_FLAG) === false) {\n      inst = new Constructor(element);\n      inst.init(config);\n      insts.push(inst);\n    }\n  }\n  return insts;\n}\n\n// Expose public methods.\nexport { checkDom, instantiateAll, setInitFlag };\n", ".no-js .u-js-only,.u-hide-if-js{display:none!important}.no-js .u-hide-if-js{display:block!important}@media screen{.u-print-only{display:none}}@media print{.u-screen-only{display:none}}.u-clearfix:after{content:\"\";display:table;clear:both}.u-visually-hidden{position:absolute;width:1px;height:1px;border:0;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0)}@media only screen and (max-width:37.5em){.u-hide-on-mobile{display:none}}@media only screen and (min-width:37.5625em){.u-show-on-mobile{display:none}}.u-hidden{display:none!important}.u-invisible{visibility:hidden}.u-right{float:right}.u-nowrap{white-space:nowrap}.u-flexible-container{position:relative;padding-bottom:56.25%;height:0}.u-flexible-container__inner{position:absolute;top:0;left:0;width:100%;height:100%}.u-flexible-container--4-3{position:relative;padding-bottom:75%;height:0}.u-mt0{margin-top:0!important}.u-mb0{margin-bottom:0!important}.u-mt5{margin-top:5px!important}.u-mb5{margin-bottom:5px!important}.u-mt10{margin-top:10px!important}.u-mb10{margin-bottom:10px!important}.u-mt15{margin-top:15px!important}.u-mb15{margin-bottom:15px!important}.u-mt20{margin-top:20px!important}.u-mb20{margin-bottom:20px!important}.u-mt30{margin-top:30px!important}.u-mb30{margin-bottom:30px!important}.u-mt45{margin-top:45px!important}.u-mb45{margin-bottom:45px!important}.u-mt60{margin-top:60px!important}.u-mb60{margin-bottom:60px!important}.u-w100pct{width:100%}.u-w90pct{width:90%}.u-w80pct{width:80%}.u-w70pct{width:70%}.u-w60pct{width:60%}.u-w50pct{width:50%}.u-w40pct{width:40%}.u-w30pct{width:30%}.u-w20pct{width:20%}.u-w10pct{width:10%}.u-w75pct{width:75%}.u-w65pct{width:65%}.u-w25pct{width:25%}.u-w15pct{width:15%}.u-w66pct{width:66.6666666667%}.u-w33pct{width:33.3333333333%}.u-small-text,small{font-size:.875em}.u-small-text--subtle,small--subtle{color:var(--gray)}", "/**\n * @param {number} totalSeconds - The time in seconds.\n * @returns {string} Time in the HH:MM:SS format.\n */\nfunction formatTimestamp(totalSeconds) {\n  let hours = Math.floor(totalSeconds / 3600);\n  let minutes = Math.floor((totalSeconds - hours * 3600) / 60);\n  let seconds = totalSeconds - hours * 3600 - minutes * 60;\n\n  let timestamp = '';\n  if (hours < 10) {\n    hours = '0' + hours;\n  }\n\n  if (String(hours) !== '00') {\n    timestamp = hours + ':';\n  }\n\n  if (minutes < 10) {\n    minutes = '0' + minutes;\n  }\n\n  if (seconds < 10) {\n    seconds = '0' + seconds;\n  }\n\n  timestamp += minutes + ':' + seconds;\n\n  return timestamp;\n}\n\nexport { formatTimestamp };\n", "/* ==========================================================================\n   YouTube API\n   ========================================================================== */\n\nconst IMAGE_URL = 'https://img.youtube.com/vi/%video_id%/maxresdefault.jpg';\n\nlet _callbacks;\nlet _scriptLoaded;\n\n/**\n * Attach a callback to be called when the YouTube API is ready.\n * @param {Function} callback - function to call when the API is ready.\n */\nfunction attachAPIReadyCallback(callback) {\n  if (_scriptLoaded) {\n    callback();\n  }\n\n  _callbacks = _callbacks || [];\n  _callbacks.push(callback);\n\n  /**\n   * The \"onYouTubeIframeAPIReady\" function is automatically called when the\n   * YouTube IFrame API is done loading.\n   * See https://developers.google.com/youtube/iframe_api_reference\n   */\n  function onYouTubeIframeAPIReady() {\n    _scriptLoaded = true;\n    _callbacks.forEach((cb) => cb());\n    _callbacks.splice(0);\n  }\n\n  window.onYouTubeIframeAPIReady = onYouTubeIframeAPIReady;\n}\n\n/**\n * Load Youtube max res image if it exists.\n * TODO: Replace this method by calling the Youtube data API.\n * https://developers.google.com/youtube/v3/getting-started#fields\n * @param {string} videoId - A YouTube video ID.\n * @returns {string} The image URL.\n */\nfunction fetchImageURL(videoId) {\n  if (!videoId) {\n    throw new Error('No Video ID provided!');\n  }\n\n  return IMAGE_URL.replace('%video_id%', videoId);\n}\n\n/**\n * Configure and load a new YouTube Player instance into a supplied <iframe>\n * from the YouTube embed API, which should have been set on the\n * global window object.\n * @param {HTMLElement} iframeContainerDom - A reference to <iframe>\n *   to embed the video.\n * @param {string} videoId - A YouTube video ID.\n * @returns {object} A YouTube Player instance (YT.Player).\n * @throws {Error} If the IFrame API has not loaded.\n */\nfunction instantiatePlayer(iframeContainerDom, videoId) {\n  if (typeof window.YT === 'undefined') {\n    throw new Error('YouTube IFrame API is not loaded!');\n  }\n\n  const YouTubePlayer = window.YT;\n  YouTubePlayer.setConfig({\n    host: 'https://www.youtube.com',\n  });\n\n  const playerOptions = {\n    videoId: videoId,\n    playerVars: {\n      autoplay: 1,\n      enablejsapi: 1,\n      origin: document.domain,\n      rel: 0,\n      suggestedQuality: 'highres',\n    },\n  };\n\n  return new YouTubePlayer.Player(iframeContainerDom, playerOptions);\n}\n\n// Expose public methods.\nexport default {\n  attachAPIReadyCallback,\n  fetchImageURL,\n  instantiatePlayer,\n};\n", "/* ==========================================================================\n   Video Player Class\n   ========================================================================== */\n\nimport { checkDom, setInitFlag, EventObserver } from '@cfpb/cfpb-design-system';\nimport { formatTimestamp } from '../modules/util/strings.js';\nimport youTubeAPI from '../modules/youtube-api.js';\n\nconst BASE_CLASS = 'o-video-player';\n\n/**\n * VideoPlayer\n * @class\n * @classdesc Initializes a new VideoPlayer organism.\n * @param {HTMLElement} element - The DOM element within which to search\n *   for the organism.\n * @returns {VideoPlayer} An instance.\n */\nfunction VideoPlayer(element) {\n  const _dom = checkDom(element, BASE_CLASS);\n\n  const _videoId = _dom.getAttribute('data-id');\n  const _showCustomThumbnail = _dom.hasAttribute('data-custom-thumbnail');\n\n  const _iframeDom = _dom.querySelector(`.${BASE_CLASS}__iframe`);\n  const _imageDom = _dom.querySelector(`.${BASE_CLASS}__image`);\n  const _closeBtnDom = _dom.querySelector(`button.${BASE_CLASS}__close-btn`);\n  const _playBtnDom = _dom.querySelector(`button.${BASE_CLASS}__play-btn`);\n  const _playLinkDom = _dom.querySelector(`a.${BASE_CLASS}__play-btn`);\n  const _durationDom = _dom.querySelector(`.${BASE_CLASS}__duration`);\n\n  const _defaultThumbnailURL = _imageDom.src;\n\n  // YouTube player object.\n  let _player = null;\n\n  /**\n   * @returns {VideoPlayer|undefined} An instance,\n   *   or undefined if it was already initialized.\n   */\n  function init() {\n    if (!setInitFlag(_dom)) {\n      return undefined;\n    }\n\n    // Load the thumbnail from YouTube if we haven't specified one in the DOM.\n    if (_videoId && !_showCustomThumbnail) {\n      _imageLoad(youTubeAPI.fetchImageURL(_videoId));\n    }\n\n    // Load the YouTube JS, triggering our callback.\n    youTubeAPI.attachAPIReadyCallback(_videoAPIReady.bind(this));\n\n    return this;\n  }\n\n  /**\n   * Handler for when the video API has loaded and is ready, in this case when the\n   * YouTube IFrame API is done loading.\n   */\n  function _videoAPIReady() {\n    _player = youTubeAPI.instantiatePlayer(_iframeDom, _videoId);\n    _player.addEventListener('onReady', _videoPlayerReadyHandler.bind(this));\n    _player.addEventListener(\n      'onStateChange',\n      _videoStateChangeHandler.bind(this),\n    );\n  }\n\n  /**\n   * Event handler for when the video is ready.\n   * @param {object} event - Event object containing target\n   *   to video player instance.\n   */\n  function _videoPlayerReadyHandler(event) {\n    // Video has loaded into the iframe, so we can show it to assistive devices.\n    _iframeDom.removeAttribute('aria-hidden');\n    _iframeDom.removeAttribute('tabindex');\n\n    // Add duration timestamp to video.\n    const player = event.target;\n    const duration = player.getDuration();\n    _durationDom.setAttribute('datetime', duration + 'S');\n    _durationDom.innerHTML = formatTimestamp(duration);\n    _durationDom.classList.remove('u-hidden');\n\n    /* On page load we show a play link that links directly to the video, so\n     * that the user can still access the video with no JavaScript. We need to\n     * hide the link and show the play button for the embedded video. */\n    _playLinkDom.classList.add('u-hidden');\n    _playBtnDom.classList.remove('u-hidden');\n\n    // Add events.\n    _playBtnDom.addEventListener('click', _playBtnClickedHandler.bind(this));\n    _closeBtnDom.addEventListener('click', _closeBtnClickedHandler.bind(this));\n\n    // The video has loaded.\n    _dom.classList.add(`${BASE_CLASS}--loaded`);\n  }\n\n  /**\n   * Handler for clicking of the play button.\n   */\n  function _playBtnClickedHandler() {\n    this.playVideo();\n  }\n\n  /**\n   * Handler for clicking of the close button.\n   */\n  function _closeBtnClickedHandler() {\n    this.stopVideo();\n  }\n\n  /**\n   * Handler for when the video changes state.\n   * @param {Event} event - Event object for the changed state,\n   *   which contains a data property for the state.\n   */\n  function _videoStateChangeHandler(event) {\n    if (event.data === window.YT.PlayerState.ENDED) {\n      this.stopVideo();\n    }\n  }\n\n  /**\n   * Load Youtube max res image if it exists.\n   * TODO: Replace this method by calling the YouTube data API.\n   * https://developers.google.com/youtube/v3/getting-started#fields\n   * @param {string} imageURL - The URL to load in the image.\n   */\n  function _imageLoad(imageURL) {\n    _imageDom.addEventListener('load', _imageLoaded);\n    _imageDom.addEventListener('error', _imageLoadFailed);\n\n    _imageDom.src = imageURL;\n  }\n\n  /**\n   * Error handler for thumbnail image loading.\n   * If for some reason we can't load the specified thumbnail image, we\n   * should try to load the default thumbnail. But don't do that if we've\n   * already tried and failed to do so once.\n   */\n  function _imageLoadFailed() {\n    if (_imageDom.src !== _defaultThumbnailURL) {\n      _imageLoadDefault();\n    }\n  }\n\n  /**\n   * Event handler for when image src attribute is set.\n   */\n  function _imageLoaded() {\n    /* 120px is the natural width of the default YouTube image.\n     * This condition will be true when there isn't a custom image set. */\n    if (_imageDom.naturalWidth === 120) {\n      _imageLoadDefault();\n    }\n\n    _imageShow();\n  }\n\n  /**\n   * Show the image by adding a class that changes its opacity.\n   */\n  function _imageShow() {\n    _imageDom.classList.add(`${BASE_CLASS}__image-loaded`);\n  }\n\n  /**\n   * Load the default image source (src) first set at load-time.\n   */\n  function _imageLoadDefault() {\n    _imageDom.src = _defaultThumbnailURL;\n  }\n\n  /**\n   * Play the video.\n   * @returns {VideoPlayer} An instance.\n   */\n  function playVideo() {\n    if (_player) {\n      _player.playVideo();\n      _dom.classList.add('video-playing');\n\n      /* Allow keyboard navigation of the close button and video iframe.\n       * Disallow keyboard navigation of the play button. */\n      _closeBtnDom.removeAttribute('tabindex');\n      _iframeDom.removeAttribute('tabindex');\n      _playBtnDom.setAttribute('tabindex', '-1');\n\n      // Set the keyboard focus to the close button.\n      _closeBtnDom.focus();\n\n      this.dispatchEvent('onPlay');\n    }\n\n    return this;\n  }\n\n  /**\n   * Stop the video from playing.\n   * @returns {VideoPlayer} An instance.\n   */\n  function stopVideo() {\n    if (_player) {\n      _player.stopVideo();\n      _dom.classList.remove('video-playing');\n\n      /* Allow keyboard navigation of the play button.\n       * Disallow keyboard navigation of the close button and video iframe. */\n      _closeBtnDom.setAttribute('tabindex', '-1');\n      _iframeDom.setAttribute('tabindex', '-1');\n      _playBtnDom.removeAttribute('tabindex');\n\n      // Set the keyboard focus to the play button.\n      _playBtnDom.focus();\n\n      this.dispatchEvent('onStop');\n    }\n\n    return this;\n  }\n\n  // Attach public events.\n  const eventObserver = new EventObserver();\n  this.addEventListener = eventObserver.addEventListener;\n  this.removeEventListener = eventObserver.removeEventListener;\n  this.dispatchEvent = eventObserver.dispatchEvent;\n\n  this.init = init;\n  this.playVideo = playVideo;\n  this.stopVideo = stopVideo;\n\n  return this;\n}\n\nVideoPlayer.BASE_CLASS = BASE_CLASS;\n\nexport default VideoPlayer;\n", "/* ==========================================================================\n   Scripts for Video Player module.\n   ========================================================================== */\n\nimport VideoPlayer from '../../organisms/VideoPlayer';\nimport { instantiateAll } from '@cfpb/cfpb-design-system';\n\ninstantiateAll(`.${VideoPlayer.BASE_CLASS}`, VideoPlayer);\n"],
  "mappings": "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",
  "names": ["EventObserver", "_events", "addEventListener", "event", "callback", "removeEventListener", "index", "dispatchEvent", "options", "evts", "i", "len", "JS_HOOK", "STATE_PREFIX", "contains", "element", "value", "values", "JS_HOOK", "add", "msg", "INIT_FLAG", "STATE_PREFIX", "_verifyElementExists", "element", "baseClass", "msg", "_verifyClassExists", "dom", "checkDom", "setInitFlag", "contains", "add", "instantiateAll", "selector", "Constructor", "scope", "config", "elements", "insts", "inst", "i", "len", "utilities_exports", "__export", "utilities_default", "formatTimestamp", "totalSeconds", "hours", "minutes", "seconds", "timestamp", "IMAGE_URL", "_callbacks", "_scriptLoaded", "attachAPIReadyCallback", "callback", "onYouTubeIframeAPIReady", "cb", "fetchImageURL", "videoId", "instantiatePlayer", "iframeContainerDom", "YouTubePlayer", "playerOptions", "youtube_api_default", "BASE_CLASS", "VideoPlayer", "element", "_dom", "checkDom", "_videoId", "_showCustomThumbnail", "_iframeDom", "_imageDom", "_closeBtnDom", "_playBtnDom", "_playLinkDom", "_durationDom", "_defaultThumbnailURL", "_player", "init", "setInitFlag", "_imageLoad", "youtube_api_default", "_videoAPIReady", "_videoPlayerReadyHandler", "_videoStateChangeHandler", "event", "duration", "formatTimestamp", "_playBtnClickedHandler", "_closeBtnClickedHandler", "imageURL", "_imageLoaded", "_imageLoadFailed", "_imageLoadDefault", "_imageShow", "playVideo", "stopVideo", "eventObserver", "EventObserver", "VideoPlayer_default", "instantiateAll", "VideoPlayer_default"]
}
