text: import includes from 'core-js/library/fn/array/includes';
  import * as utils from './utils';
  
  const _requestCache = {};
  const _vendorWhitelist = [
    'criteo',
  ]
  
  /**
   * Loads external javascript. Can only be used if external JS is approved by Prebid. See https://github.com/prebid/prebid-js-external-js-template#policy
   * Each unique URL will be loaded at most 1 time.
   * @param {string} url the url to load
   * @param {string} moduleCode bidderCode or module code of the module requesting this resource
   */
  exports.loadExternalScript = function(url, moduleCode) {
    if (!moduleCode || !url) {
      //utils.logError('cannot load external script without url and moduleCode');
      return;
    }
    if (!includes(_vendorWhitelist, moduleCode)) {
      //utils.logError(`${moduleCode} not whitelisted for loading external JavaScript`);
      return;
    }
    // only load each asset once
    if (_requestCache[url]) {
      return;
    }
  
    //utils.logWarn(`module ${moduleCode} is loading external JavaScript`);
    const script = document.createElement('script');
    script.type = 'text/javascript';
    script.async = true;
    script.src = url;
  
    utils.insertElement(script);
    _requestCache[url] = true;
  };
  
  /**
   *
   * @deprecated
   * Do not use this function. Will be removed in the next release. If external resources are required, use #loadExternalScript instead.
   */
  exports.loadScript = function (tagSrc, callback, cacheRequest) {
    // var noop = () => {};
    //
    // callback = callback || noop;
    if (!tagSrc) {
      //utils.logError('Error attempting to request empty URL', 'adloader.js:loadScript');
      return;
    }
  
    if (cacheRequest) {
      if (_requestCache[tagSrc]) {
        if (callback && typeof callback === 'function') {
          if (_requestCache[tagSrc].loaded) {
            // invokeCallbacks immediately
            callback();
          } else {
            // queue the callback
            _requestCache[tagSrc].callbacks.push(callback);
          }
        }
      } else {
        _requestCache[tagSrc] = {
          loaded: false,
          callbacks: []
        };
        if (callback && typeof callback === 'function') {
          _requestCache[tagSrc].callbacks.push(callback);
        }
  
        requestResource(tagSrc, function () {
          _requestCache[tagSrc].loaded = true;
          try {
            for (let i = 0; i < _requestCache[tagSrc].callbacks.length; i++) {
              _requestCache[tagSrc].callbacks[i]();
            }
          } catch (e) {
            //utils.logError('Error executing callback', 'adloader.js:loadScript', e);
          }
        });
      }
    } else {
      // trigger one time request
      requestResource(tagSrc, callback);
    }
  };
  
  function requestResource(tagSrc, callback) {
    var jptScript = document.createElement('script');
    jptScript.type = 'text/javascript';
    jptScript.async = true;
  
    // Execute a callback if necessary
    if (callback && typeof callback === 'function') {
      if (jptScript.readyState) {
        jptScript.onreadystatechange = function () {
          if (jptScript.readyState === 'loaded' || jptScript.readyState === 'complete') {
            jptScript.onreadystatechange = null;
            callback();
          }
        };
      } else {
        jptScript.onload = function () {
          callback();
        };
      }
    }
  
    jptScript.src = tagSrc;
  
    // add the new script tag to the page
    var elToAppend = document.getElementsByTagName('head');
    elToAppend = elToAppend.length ? elToAppend : document.getElementsByTagName('body');
    if (elToAppend.length) {
      elToAppend = elToAppend[0];
      elToAppend.insertBefore(jptScript, elToAppend.firstChild);
    }
  }
  