YouTube EXPERIMENT_FLAGS Tamer

Adjust EXPERIMENT_FLAGS

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

// ==UserScript==
// @name        YouTube EXPERIMENT_FLAGS Tamer
// @namespace   UserScripts
// @match       https://www.youtube.com/*
// @version     1.6.13
// @license     MIT
// @author      CY Fung
// @icon        https://raw.githubusercontent.com/cyfung1031/userscript-supports/main/icons/yt-engine.png
// @description Adjust EXPERIMENT_FLAGS
// @grant       none
// @unwrap
// @run-at      document-start
// @allFrames   true
// @inject-into page
// @require     https://update.greasyfork.org/scripts/475632/1361351/ytConfigHacks.js
// ==/UserScript==

(() => {

  // Purpose 1: Remove Obsolete Flags
  // Purpose 2: Remove Flags bring no visual difference
  // Purpose 3: Enable Flags bring performance boost

  const DISABLE_CINEMATICS = false; // standard design
  const NO_SerializedExperiment = false;
  const KEEP_PLAYER_QUALITY_STICKY = true; // see https://greasyfork.org/scripts/471033/
  const DISABLE_serializedExperimentIds = true;
  const DISABLE_serializedExperimentFlags = true;
  const IGNORE_VIDEO_SOURCE_RELATED = true;
  const NO_REFRESH = true;
  const ENABLE_MINOR_CHAT_FEATURE_UPGRADE = true;
  const ENABLE_EMOJI_PICKER_NEW_STYLE = false;
  const ENABLE_BADGE_STYLE = false;
  const NO_DESKTOP_DELAY_PLAYER_RESIZING = false;
  const NO_ANIMATED_LIKE = false;
  const KEEP_MIDDLEWAVE = true;
  const NO_CINEMATIC_LIGHTING_LABEL = false; // set true to show "Ambient Mode" label instead of "Cinematic lighting" Label
  const KEEP_unified_player = true; // for YouTube Audio Only

  const SET_POLYMER_FLAGS = true;
  const FLAG_STRATEGY_01 = true; // ignore ads related flags

  const FLAG_STRATEGY_02 = true; // ignore player related flags

  const FLAG_STRATEGY_03 = true; // ignore adblock related flags

  const FLAG_STRATEGY_20240413 = true; // ignore adblock related flags

  const FLAG_STRATEGY_20240503 = true; // AD FLAG

  const NO_DEBUG_FLAG = true;

  const FLAG_SKIP_CHAT_BUTTON = true;

  const ALLOW_FLAGS_202404 = true;

  const DISABLE_FLAGS_SHADYDOM_FREE = true;

  const ENABLE_EXPERIMENT_FLAGS_MAINTAIN_STABLE_LIST = {
    defaultValue: true, // performance boost
    useExternal: () => typeof localStorage.EXPERIMENT_FLAGS_MAINTAIN_STABLE_LIST !== 'undefined',
    externalValue: () => (+localStorage.EXPERIMENT_FLAGS_MAINTAIN_STABLE_LIST ? true : false)
  };
  const ENABLE_EXPERIMENT_FLAGS_MAINTAIN_REUSE_COMPONENTS = {
    defaultValue: true, // not sure
    useExternal: () => typeof localStorage.EXPERIMENT_FLAGS_MAINTAIN_REUSE_COMPONENTS !== 'undefined',
    externalValue: () => (+localStorage.EXPERIMENT_FLAGS_MAINTAIN_REUSE_COMPONENTS ? true : false)
  };
  const ENABLE_EXPERIMENT_FLAGS_DEFER_DETACH = {
    defaultValue: true, // not sure
    useExternal: () => typeof localStorage.ENABLE_EXPERIMENT_FLAGS_DEFER_DETACH !== 'undefined',
    externalValue: () => (+localStorage.ENABLE_EXPERIMENT_FLAGS_DEFER_DETACH ? true : false)
  };

  const ENABLE_EXPERIMENT_FLAGS_NO_AUTOPLAY_TOGGLE = {
    defaultValue: false, // true to remove autoplay toggle button
    useExternal: () => typeof localStorage.ENABLE_EXPERIMENT_FLAGS_NO_AUTOPLAY_TOGGLE !== 'undefined',
    externalValue: () => (+localStorage.ENABLE_EXPERIMENT_FLAGS_NO_AUTOPLAY_TOGGLE ? true : false)
  };

  const ALLOW_ALL_LIVE_CHATS_FLAGS = false;

  const USE_MAINTAIN_STABLE_LIST_ONLY_WHEN_KS_FLAG_IS_SET = false;

  const COMMENTS_NO_DELAY = true;

  const SPACEBAR_CONTROL = -1; // 0 - only scroll down; 1 - global pause; 2 - speed control pause;
  // -1 = by pass

  const ALLOW_THEATER_PLAYER_SHORTCUT_KEY_T = true;

  const USE_byPassConditionAnalyzer = false;

  // ----------------------------- FOR FINDING OUT THE NEW FLAG -------------------------------
  const byPassConditionAnalyzer = (() => {

    // This is to find the flags disabled by this script would cause your issue.
    // Goal: find the flag name to whitelist

    const testFn = (key, isVideoPlayerParams) => {

      const kl = key.length;
      const kl7 = kl % 7;
      const kl5 = kl % 5;
      const kl3 = kl % 3;
      const kl2 = kl % 2;


      // ture for by pass
      const byConditions = [
        !kl2,
        kl3 <= 1,
        kl5 >= 3,
        kl7 >= 4,
        kl >= 20,
        kl <= 40,
        [
          "clean_up_manual_attribution_header",
          "empty_attributed_string_killswitch",
          "enable_profile_cards_cairo_updates",
          "enable_teaser_framework_web_client",
          "enable_tectonic_ad_ux_for_halftime",
          "enable_web_shorts_save_audio_pivot",
          "kevlar_clear_duplicate_pref_cookie",
          "kevlar_disable_background_prefetch",
          "kevlar_transcript_engagement_panel",
          "kevlar_watch_flexy_theater_manager",
          "mdx_load_cast_api_bootstrap_script",
          "web_collab_playlist_thumbnail_size",
          "web_fix_back_button_player_loading",
          "web_fix_dynamic_metadata_diacritic",
          "web_kevlar_enable_adaptive_signals",
          "web_move_autoplay_video_under_chip",
          "web_player_small_hbp_settings_menu",
          "web_rendererstamper_event_listener",
          "web_shorts_skip_loading_same_index",
          "web_shorts_suggested_action_no_bvm",
          "web_use_updated_icon_for_oac_badge",
          "wiz_prevent_watched_double_logging"
        ]
      ];

      // const byConditions = [
      //   !kl2,
      //   kl3 <= 1,
      //   kl5 >= 3,
      //   kl7 >= 4,
      //   kl >= 20,
      //   kl <= 40,
      //   [
      //     "clean_up_manual_attribution_header",
      //     "empty_attributed_string_killswitch",
      //     "enable_profile_cards_cairo_updates",
      //     "enable_teaser_framework_web_client",
      //     "enable_tectonic_ad_ux_for_halftime",
      //     "enable_web_shorts_save_audio_pivot",
      //     "kevlar_clear_duplicate_pref_cookie",
      //     "kevlar_disable_background_prefetch",
      //     "kevlar_transcript_engagement_panel",
      //     "kevlar_watch_flexy_theater_manager",
      //     "mdx_load_cast_api_bootstrap_script",
      //     "web_collab_playlist_thumbnail_size",
      //     "web_fix_back_button_player_loading",
      //     "web_fix_dynamic_metadata_diacritic",
      //     "web_kevlar_enable_adaptive_signals",
      //     "web_move_autoplay_video_under_chip",
      //     "web_player_small_hbp_settings_menu",
      //     "web_rendererstamper_event_listener",
      //     "web_shorts_skip_loading_same_index",
      //     "web_shorts_suggested_action_no_bvm",
      //     "web_use_updated_icon_for_oac_badge",
      //     "wiz_prevent_watched_double_logging"
      //   ]
      // ];

      return byConditions;

    };

    let u = 0;
    let cache1 = new Set();
    let cache2 = new Set();

    const disp = () => {
      const q = cache1.size < 50 ? [...cache1] : [];
      const a = [];
      const b = [];
      for (const m of q) {
        if (cache2.has(m)) b.push(m); else a.push(m);
      }
      console.log('[yt-flags-tamer]', 'filtered keys {eflags}', a.length, a);
      console.log('[yt-flags-tamer]', 'filtered keys {vflags}', b.length, b);
    }

    const res = {

      testFn_: (key, isVideoPlayerParams) => {

        if (!u) {
          u = 1;
          u = setTimeout(disp, 400);
        }
        let q = testFn(key, isVideoPlayerParams).every(e => {

          if (typeof e === 'object' && Symbol.iterator in Object(e)) {
            return e.includes(key);
          } else if (typeof e === 'string') {
            return e.includes(key);
          } else {
            return !!e
          }

        });
        if (q) {

          cache1.add(key);
          return true;

        }
        return false;


      }

    }


    return res;






  })();
  // ----------------------------- FOR FINDING OUT THE NEW FLAG -------------------------------

  // TBC
  // kevlar_tuner_should_always_use_device_pixel_ratio
  // kevlar_tuner_should_clamp_device_pixel_ratio
  // kevlar_tuner_clamp_device_pixel_ratio
  // kevlar_tuner_should_use_thumbnail_factor
  // kevlar_tuner_thumbnail_factor
  // kevlar_tuner_min_thumbnail_quality
  // kevlar_tuner_max_thumbnail_quality

  // kevlar_tuner_should_test_visibility_time_between_jobs
  // kevlar_tuner_visibility_time_between_jobs_ms

  // kevlar_tuner_default_comments_delay
  // kevlar_tuner_run_default_comments_delay

  // cinematic feature is no longer an experimental feature.
  // It has been officially implemented.
  // To disable cinematics, the user shall use other userscripts or just turn off the option in the video options.

  const getSettingValue = (fm) => fm.useExternal() ? fm.externalValue() : fm.defaultValue;

  const win = this instanceof Window ? this : window;

  // Create a unique key for the script and check if it is already running
  const hkey_script = 'jmimcvowrlzl';
  if (win[hkey_script]) throw new Error('Duplicated Userscript Calling'); // avoid duplicated scripting
  win[hkey_script] = true;

  /** @type {globalThis.PromiseConstructor} */
  const Promise = ((async () => { })()).constructor;

  let isMainWindow = false;
  const mzFlagDetected1 = new Set();
  const mzFlagDetected2 = new Set();
  let zPlayerKevlar = false;
  try {
    isMainWindow = window.document === window.top.document
  } catch (e) { }

  const fOperAccept = Symbol();
  const fOperReject = Symbol();

  // h5 flags
  const fOperAcceptList = new Set([

    'json_condensed_response', // https://greasyfork.org/en/scripts/470428-youtube-experiment-flags-tamer/discussions/264999

    ...(NO_CINEMATIC_LIGHTING_LABEL ? [
      'web_player_use_cinematic_label', // fallback
      'web_player_use_cinematic_label_0', // fallback
      'web_player_use_cinematic_label_1', // fallback
      'web_player_use_cinematic_label_2',
      'web_player_use_cinematic_label_3', // fallback
    ] : []),

    ...(FLAG_STRATEGY_03 ? [
      // do it with your separate script please
      'ab_pl_man', // https://www.uedbox.com/post/69238/
      'ab_fk_sk_cl', // https://www.youtube.com/s/desktop/28b0985e/jsbin/desktop_polymer.vflset/desktop_polymer.js
      'ab_det_apb_b',
      'ab_det_el_h',
      'ab_det_fet_wr',
      'ab_det_fet_wr_en',
      'ab_det_gen_re',
      'web_enable_ab_rsp_cl',
      'enable_ab_rp_int',
      'enable_ab_report_on_errorscreen',
      'enable_pl_r_si_fa',
      'ab_det_sc_inj_enf',
      'service_worker_enabled', // https://gist.github.com/BrokenGabe/51d55a11c2090d9402e40f12a6ece275
      'ab_deg_unex_thr', // https://www.youtube.com/s/desktop/28b0985e/jsbin/desktop_polymer.vflset/desktop_polymer.js
      'ab_net_tp_e', // https://www.youtube.com/s/desktop/28b0985e/jsbin/desktop_polymer.vflset/desktop_polymer.js
      'ad_net_pb_ab', // https://www.youtube.com/s/desktop/28b0985e/jsbin/desktop_polymer.vflset/desktop_polymer.js
      'ab_mis_log_err', // https://www.youtube.com/s/desktop/28b0985e/jsbin/desktop_polymer.vflset/desktop_polymer.js
      'ad_net_pb_pbp',

      'ab_det_sc_inj',
      'ab_det_sc_inj_val',
      'disable_enf_isd',
      'ks_det_gpbl',
      'ks_get_o_pp',
      'ab_deg_unex_thr',
      'enable_pl_r_si_fa',
      'debug_sk_em_precheck',

    ] : []),



    ...(FLAG_STRATEGY_01 ? [
      'web_player_defer_modules',
      'html5_defer_modules_on_ads_only',
      'web_player_defer_ad',
      'disable_defer_admodule_on_advertiser_video',
      'html5_onesie_defer_content_loader_ms',
      'html5_defer_fetch_att_ms',
      'embeds_web_enable_defer_loading_remote_js',
    ] : []),

    ...(KEEP_MIDDLEWAVE ? [
      'web_player_entities_middleware'
    ] : []),


    'web_settings_menu_icons',
    // see https://github.com/cyfung1031/userscript-supports/issues/27
    // see https://greasyfork.org/scripts/470428/discussions/216363


    // 'disable_new_pause_state3',
    // 'enable_cast_on_music_web',
    // 'gcf_config_store_enabled',
    // 'gel_queue_timeout_max_ms',
    // 'network_polling_interval',
    'player_doubletap_to_seek',
    // 'polymer_bad_build_labels',
    // 'skip_invalid_ytcsi_ticks',
    // 'use_player_cue_range_set',
    // 'woffle_used_state_report',

  ]);

  const fOperMapFn = (o) => new Map(Object.entries({
    // 1 true 2 false 3

    ...((o.no_autoplay_toggle !== true) ? {

      // 'player_allow_autonav_after_playlist',
      'web_player_autonav_toggle_always_listen': 1,
      // 'web_player_offline_playlist_auto_refresh',

      // 'allow_live_autoplay',
      // 'allow_poltergust_autoplay',
      // 'autoplay_time',
      // 'autoplay_time_for_fullscreen',
      // 'autoplay_time_for_music_content',
      'client_respect_autoplay_switch_button_renderer': 1,
      // 'embeds_enable_muted_autoplay',
      // 'embeds_web_enable_autoplay_not_supported_logging_fix',
      // 'embeds_web_enable_log_splay_as_autoplay',
      // 'embeds_web_enable_mobile_autoplay',
      // 'html5_autoplay_default_quality_cap',
      // 'mweb_muted_autoplay_animation',

      // 'html5_player_autonav_logging',
      // 'web_player_always_enable_auto_translation',
      // 'web_player_autonav_empty_suggestions_fix',
      // 'web_player_autonav_use_server_provided_state',
      'web_player_decouple_autonav': 1,
      'web_player_move_autonav_toggle': 1,

    } : {}),

    ...(IGNORE_VIDEO_SOURCE_RELATED ? {

      'html5_live_use_alternate_bandwidth_window_sizes': 1,
      'html5_live_ultra_low_latency_bandwidth_window': 1,
      'html5_live_low_latency_bandwidth_window': 1,
      'html5_live_normal_latency_bandwidth_window': 1,
      // 'html5_skip_slow_ad_delay_ms': 1,
      'html5_player_preload_ad_fix': 1,
      // if (key.includes('_ad_') || key.includes('_ads_')) {
      'html5_ssdai_adfetch_dynamic_timeout_ms': 2,
      'html5_log_ssdai_fallback_ads': 2,
      'html5_deprecate_adservice': 2,
      // !key.includes('deprecat')) keep = true;


      //  if (key.startsWith('enable_h5_player_ad_block_')) keep = false;
      'fix_h5_toggle_button_a11y': 1,
      'h5_companion_enable_adcpn_macro_substitution_for_click_pings': 2,
      'h5_enable_generic_error_logging_event': 2,
      'h5_enable_unified_csi_preroll': 1,
      'h5_reset_cache_and_filter_before_update_masthead': 1,
      'web_player_enable_premium_hbr_in_h5_api': 1,
      // !key.includes('deprecat')) keep = true;

    } : {}),


    ...(KEEP_PLAYER_QUALITY_STICKY ? {

      html5_onesie_sticky_server_side: 2,
      html5_perf_cap_override_sticky: 1,
      html5_ustreamer_cap_override_sticky: 1,
      html5_exponential_memory_for_sticky: 1

    } : {}),


    'html5_streaming_xhr_time_based_consolidation_ms': 1,
    'html5_bypass_contention_secs': 1,

    'vp9_drm_live': 1,
    'html5_log_rebuffer_reason': 2,
    'html5_enable_audio_track_log': 2,


    'html5_safari_desktop_eme_min_version': 1,

    'html5_disable_av1': 1,
    'html5_disable_av1_hdr': 1,
    'html5_disable_hfr_when_vp9_encrypted_2k4k_unsupported': 1,
    'html5_account_onesie_format_selection_during_format_filter': 1,
    'html5_prefer_hbr_vp9_over_av1': 1,

    ...(!DISABLE_CINEMATICS ? {
      'web_cinematic_watch_settings': 1
    } : {}),

    'html5_apply_start_time_within_ads_for_ssdai_transitions': 2,
    'html5_enable_ads_client_monitoring_log_tv': 2,
    'html5_ignore_interruptive_ads_for_server_stitched': 1,

    'html5_no_video_to_ad_on_preroll': 1,
    'html5_no_video_to_ad_on_preroll_reset': 1,
    'html5_rebase_video_to_ad_timeline': 1,
    'html5_report_slow_ads_as_error': 1,

    'html5_default_ad_gain': 1, // just keep
    'html5_min_startup_buffered_ad_media_duration_secs': 1, // just keep

    'html5_skip_slow_ad_delay_ms': 7,
    'check_navigator_accuracy_timeout_ms': 8,
    'html5_ad_timeout_ms': 8,
    'html5_ads_preroll_lock_timeout_delay_ms': 9,
    'html5_slow_start_timeout_delay_ms': 8,
    'variable_buffer_timeout_ms': 9,

    'h5_expr_b9Nkc': 1,

  }));

  var fOperMap;

  const valur = (value, k) => {
    if (+value === 0) value = k;
    else if (+value > +k) value = k;
    return value;
  }

  function fOper(key, value) {

    if (fOperAcceptList.has(key)) return fOperAccept;
    if (USE_byPassConditionAnalyzer && byPassConditionAnalyzer.testFn_(key, true)) return fOperAccept;
    if (key.length === 22 || key.length === 27 || key.length === 32) {

      if (SPACEBAR_CONTROL < 0) {

        if (key === 'disable_space_scroll_fix' || key === 'global_spacebar_pause' || key === 'web_speedmaster_spacebar_control') {
          return fOperAccept;
        }
        if (key.includes('speedmaster')) return fOperAccept;
      }

      if (SPACEBAR_CONTROL === 2 && key.includes('speedmaster')) {
        return fOperAccept;
      }

    }
    // if(key.length < 30)continue;
    // const kl = key.length;

    let keep = false;
    let nv = undefined;

    const no_autoplay_toggle = ENABLE_EXPERIMENT_FLAGS_NO_AUTOPLAY_TOGGLE.currentValue;

    fOperMap = fOperMap || fOperMapFn({ no_autoplay_toggle });

    const fm1 = fOperMap.get(key);

    switch (fm1) {
      case 1:
        keep = true;
        break;
      case 2:
        keep = false;
        break;
      case 7:
        const kv = typeof value === 'string' && +value > 2;
        keep = kv;
        if (kv && +value > 4) nv = '4';
        break;
      case 8:
        nv = valur(value, '4');
        keep = true;
        break;
      case 9:
        keep = false;
        break;
      default:

        if (FLAG_STRATEGY_20240413 && key.includes('network')) keep = true;
        else if (FLAG_STRATEGY_20240413 && key.includes('less')) keep = true;
        else if (FLAG_STRATEGY_20240413 && key.includes('latency')) keep = true;
        else if (FLAG_STRATEGY_20240413 && key.includes('slow')) keep = true;
        else if (FLAG_STRATEGY_20240413 && key.includes('steam')) keep = true;
        else if (key.includes('deprecat')) {
          keep = false;
        } else if (IGNORE_VIDEO_SOURCE_RELATED && key.includes('html5_') && !key.includes('_ad_') && !key.includes('_ads_')) {
          keep = true;
        } else if (IGNORE_VIDEO_SOURCE_RELATED && key.includes('h5_')) {
          keep = true;
        } else if (key.includes('_timeout') && typeof value === 'string') {
          if (+value > 3000) nv = '3000';
          keep = true;
        } else if (KEEP_PLAYER_QUALITY_STICKY && key.includes('_sticky')) {
          keep = true;
        } else if (key.startsWith('h5_expr_')) {
          // by userscript
          keep = true;
        }
    }

    if (!keep) {
      return fOperReject;
      // vRes.delete(key);
    } else if (nv !== undefined && nv !== value) {
      return nv;
      // vRes.set(key, nv)
    } else {
      return fOperAccept;
    }

  }
  function deSerialized(str, fOper) {

    const map = new Map();
    let start = 0;

    while (start < str.length) {
      // Find the next '&' or the end of the string
      const nextAmpersand = str.indexOf('&', start);
      const end = nextAmpersand === -1 ? str.length : nextAmpersand;

      // Extract the key-value pair
      const equalsSign = str.indexOf('=', start);
      if (equalsSign !== -1 && equalsSign < end) {
        const key = str.substring(start, equalsSign);
        const value = str.substring(equalsSign + 1, end);

        const r = fOper(key, value);
        if (typeof r !== 'symbol') {
          map.set(key, r)
        } else if (r === fOperAccept) {
          map.set(key, value);
        }

      }

      // Move to the next key-value pair
      start = end + 1;
    }

    map.toString = function () {
      const res = new Array(map.size);
      let i = 0;
      this.forEach((value, key) => {
        res[i++] = `${key}=${value}`;
      });
      return res.join('&');
    }
    return map;
  }

  function fixSerializedExperiment(conf) {

    const supportAV1 = window.MediaSource.isTypeSupported('video/webm; codecs=av01.0.05M.08');
    const supportVP9 = window.MediaSource.isTypeSupported('video/webm; codecs=vp09.01.20.08.01.01.01.01.00');

    if (DISABLE_serializedExperimentIds && typeof conf.serializedExperimentIds === 'string') {
      let ids = conf.serializedExperimentIds.split(',');
      let newIds = [];
      for (const id of ids) {
        let keep = false;
        if (keep) {
          newIds.push(id);
        }
      }
      conf.serializedExperimentIds = newIds.join(',');
    }

    const mez = (mRes) => {

      mRes.set('html5_disable_low_pipeline', 'false');
      mRes.set('html5_min_startup_buffered_ad_media_duration_secs', '0')

      if (supportAV1 === false && localStorage['yt-player-av1-pref'] === '-1') {

        mRes.set('html5_disable_av1', 'true');
        mRes.set('html5_disable_av1_hdr', 'true');
        mRes.set('html5_prefer_hbr_vp9_over_av1', 'true');

      } else if (supportAV1 === true && supportVP9 === true && localStorage['yt-player-av1-pref'] === '8192') {

        mRes.set('html5_disable_av1', 'false');
        mRes.set('html5_disable_av1_hdr', 'false');
        mRes.set('html5_prefer_hbr_vp9_over_av1', 'false');
      }


      // html5_perf_cap_override_sticky = true;
      // html5_perserve_av1_perf_cap = true;


      mRes.set('html5_enable_server_format_filter', 'true')
      mRes.set('html5_use_ump', 'true')

      mRes.set('html5_live_defrag_only_h264_playbacks', 'true')
      mRes.set('html5_live_defrag_only_h264_formats', 'true')

      mRes.set('html5_disable_protected_hdr', 'false')
      mRes.set('html5_disable_vp9_encrypted', 'false')
      mRes.set('html5_ignore_h264_framerate_cap', 'true')

      mRes.set('html5_allow_asmjs', 'true')
      // mRes.set('html5_defer_modules_on_ads_only', 'true')
      mRes.set('html5_use_drm_retry', 'true')
      mRes.set('html5_delta_encode_fexp', 'true')
      mRes.set('html5_only_send_cas_health_pings', 'true')

      mRes.set('html5_modify_caption_vss_logging', 'true')
      // mRes.set('html5_allow_zero_duration_ads_on_timeline', 'true')
      mRes.set('html5_reset_daistate_on_audio_codec_change', 'true')
      mRes.set('html5_enable_safari_fairplay', 'true')

      mRes.set('html5_safari_fairplay_ignore_hdcp', 'true')

      mRes.set('html5_enable_vp9_fairplay', 'true')
      mRes.set('html5_eme_loader_sync', 'true')

      mRes.set('html5_enable_same_language_id_matching', 'true');
      mRes.set('html5_enable_new_hvc_enc', 'true')
      mRes.set('html5_enable_ssap', 'true')
      mRes.set('html5_enable_short_gapless', 'true')
      mRes.set('html5_enable_aac51', 'true')
      mRes.set('html5_enable_ssap_entity_id', 'true')

      mRes.set('html5_high_res_logging_always', 'true')
      mRes.set('html5_local_playsinline', 'true')
      mRes.set('html5_disable_media_element_loop_on_tv', 'true')
      mRes.set('html5_native_audio_track_switching', 'true')

      mRes.set('html5_format_hybridization', 'true')
      mRes.set('html5_disable_encrypted_vp9_live_non_2k_4k', 'false')

      // mRes.set('html5_default_ad_gain', 'false')
      mRes.set('html5_use_sabr_requests_for_debugging', 'false')
      // mRes.set('html5_enable_sabr_live_streaming_xhr', 'true')
      // mRes.set('html5_sabr_live_ultra_low_latency', 'true')

      // mRes.set('html5_sabr_live_low_latency', 'true')
      // mRes.set('html5_sabr_live', 'true') // sabr_live for audio only
      mRes.set('html5_sabr_post_live', 'true')
      mRes.set('html5_sabr_premiere', 'true')

      // mRes.set('html5_enable_sabr_live_streaming_xhr', 'true')
      // mRes.set('html5_enable_sabr_live_non_streaming_xhr', 'true')

      mRes.set('html5_enable_subsegment_readahead_v3', 'true')
      mRes.set('html5_ultra_low_latency_subsegment_readahead', 'true')
      mRes.set('html5_disable_move_pssh_to_moov', 'true')

      mRes.set('html5_modern_vp9_mime_type', 'true')

    }

    if (DISABLE_serializedExperimentFlags && typeof conf.serializedExperimentFlags === 'string') {
      const fg = conf.serializedExperimentFlags;

      const vRes = deSerialized(fg, fOper);

      mez(vRes);

      const kg = vRes.toString();

      conf.serializedExperimentFlags = kg;

    }

  }


  let brc = 1000;

  if (typeof AbortSignal !== 'undefined') {
    document.addEventListener('yt-action', function () {
      if (brc > 8) looperFn();
      brc = 0;
    }, { capture: true, passive: true, once: true });
  }


  // yt flags
  const cachedSetFn = (o) => {

    const { use_maintain_stable_list, use_maintain_reuse_components, use_defer_detach } = o;

    const BY_PASS = [

      'wp_lat_b', // https://greasyfork.org/en/scripts/470428-youtube-experiment-flags-tamer/discussions/302399
      'json_condensed_response', // https://greasyfork.org/en/scripts/470428-youtube-experiment-flags-tamer/discussions/264999

      'enable_profile_cards_on_comments',

      ... (SPACEBAR_CONTROL < 0 ? [
        'disable_space_scroll_fix',
        'global_spacebar_pause',
        'web_speedmaster_spacebar_control'
      ] : []),

      ...(ALLOW_FLAGS_202404 ? [

        'suppress_error_204_logging',
        'use_request_time_ms_header',

        'remove_masthead_channel_banner_on_refresh',
        'action_companion_center_align_description',
        'disable_child_node_auto_formatted_strings',
        // 'enable_native_bridge_view_saved_playables',
        'enable_shadydom_free_scoped_query_methods',
        // 'enable_skippable_ads_for_unplugged_ad_pod',
        'enable_sparkles_web_clickable_description',
        'enable_window_constrained_buy_flow_dialog',
        // 'html5_enable_ads_client_monitoring_log_tv',
        'is_part_of_any_user_engagement_experiment',
        // 'kevlar_chapters_list_view_seek_by_chapter',
        // 'kevlar_enable_shorts_prefetch_in_sequence',
        // 'kevlar_resolve_command_for_confirm_dialog',
        // 'kevlar_shorts_seedless_retry_initial_load',
        // 'live_chat_enable_send_button_in_slow_mode',
        // 'live_chat_web_use_emoji_manager_singleton',
        'remove_masthead_channel_banner_on_refresh',
        // 'web_deprecate_service_ajax_map_dependency',
        'web_modern_player_settings_quality_bottom',
        // 'web_player_always_enable_auto_translation',
        // 'web_player_enable_cultural_moment_overlay',
        // 'ytidb_fetch_datasync_ids_for_data_cleanup',
        'kevlar_tuner_should_test_reuse_components',

        'web_player_ve_conversion_fixes_for_channel_info',
        'web_watch_updated_metadata_server_initial_delay',
        // 'trigger_impression_pings_on_view_search_desktop',

        'defer_menus',

      ] : []),

      ...(FLAG_SKIP_CHAT_BUTTON ? [
        'live_chat_overflow_hide_chat',
        'web_watch_chat_hide_button_killswitch',
      ] : []),


      ...(KEEP_unified_player ? [
        'kevlar_unified_player',
        'kevlar_non_watch_unified_player',
      ] : []),



      ...(FLAG_STRATEGY_03 ? [
        // do it with your separate script please
        'ab_pl_man', // https://www.uedbox.com/post/69238/
        'ab_fk_sk_cl', // https://www.youtube.com/s/desktop/28b0985e/jsbin/desktop_polymer.vflset/desktop_polymer.js
        'ab_det_apb_b',
        'ab_det_el_h',
        'ab_det_fet_wr',
        'ab_det_fet_wr_en',
        'ab_det_gen_re',
        'web_enable_ab_rsp_cl',
        'enable_ab_rp_int',
        'enable_ab_report_on_errorscreen',
        'enable_pl_r_si_fa',
        'ab_det_sc_inj_enf',
        'service_worker_enabled', // https://gist.github.com/BrokenGabe/51d55a11c2090d9402e40f12a6ece275
        'ab_deg_unex_thr', // https://www.youtube.com/s/desktop/28b0985e/jsbin/desktop_polymer.vflset/desktop_polymer.js
        'ab_net_tp_e', // https://www.youtube.com/s/desktop/28b0985e/jsbin/desktop_polymer.vflset/desktop_polymer.js
        'ad_net_pb_ab', // https://www.youtube.com/s/desktop/28b0985e/jsbin/desktop_polymer.vflset/desktop_polymer.js
        'ab_mis_log_err', // https://www.youtube.com/s/desktop/28b0985e/jsbin/desktop_polymer.vflset/desktop_polymer.js

        'ab_det_sc_inj',
        'ab_det_sc_inj_val',
        'disable_enf_isd',
        'ks_det_gpbl',
        'ks_get_o_pp',
        'ab_deg_unex_thr',
        'enable_pl_r_si_fa',
        'debug_sk_em_precheck',

      ] : []),


      ...(FLAG_STRATEGY_02 ? [
        // do it with your separate script please
        'kevlar_client_enable_shorts_player_bootstrap',
        'kevlar_early_popup_close',
        'kevlar_hide_pp_url_param',
        'kevlar_touch_gesture_ves',
        'player_doubletap_to_seek',
        'shorts_controller_retrieve_seedless_sequence',
        'shorts_overlay_reshuffle',
      ] : []),


      ...(SET_POLYMER_FLAGS ? [
        'polymer_enable_mdx_queue',
        'polymer_on_demand_shady_dom',
      ] : []),

      ...(FLAG_STRATEGY_01 ? [
        'web_player_defer_modules',
        'html5_defer_modules_on_ads_only',
        'web_player_defer_ad',
        'disable_defer_admodule_on_advertiser_video',
        'html5_onesie_defer_content_loader_ms',
        'html5_defer_fetch_att_ms',
        'embeds_web_enable_defer_loading_remote_js',
      ] : []),

      ...(KEEP_MIDDLEWAVE ? [
        'web_player_entities_middleware'
      ] : []),

      'desktop_keyboard_capture_keydown_killswitch', // TBC
      'kevlar_autofocus_menu_on_keyboard_nav', // TBC
      'kevlar_keyboard_button_focus', // TBC
      'kevlar_macro_markers_keyboard_shortcut', // required

      // 'kevlar_appbehavior_attach_startup_tasks'
      // 'kevlar_clear_non_displayable_url_params'
      'kevlar_command_handler_formatted_string', // see https://github.com/cyfung1031/userscript-supports/issues/20
      'kevlar_miniplayer_queue_user_activation',
      'kevlar_player_watch_endpoint_navigation',
      // 'kevlar_watch_focus_on_engagement_panels'

      // playlist related flags
      "shorts_in_playlists_web",
      "live_chat_over_playlist",
      "web_amsterdam_playlists",
      "browse_next_continuations_migration_playlist",
      "desktop_add_to_playlist_renderer_dialog_popup",
      "enable_horizontal_list_renderer_scroll_based_on_items_visibility",
      "enable_pass_sdc_get_accounts_list",
      "enable_programmed_playlist_color_sample",
      "enable_programmed_playlist_redesign",
      "enable_section_list_scroll_to_item_section_web",
      "gda_enable_playlist_download",
      "include_autoplay_count_in_playlists",
      "kevlar_chapters_list_view_seek_by_chapter",
      "kevlar_enable_editable_playlists",
      "kevlar_enable_reorderable_playlists",
      "kevlar_fix_playlist_continuation",
      "kevlar_hide_playlist_playback_status",
      "kevlar_lazy_list_resume_for_autofill",
      "kevlar_no_autoscroll_on_playlist_hover",
      "kevlar_passive_event_listeners",
      "kevlar_player_playlist_use_local_index",
      "kevlar_playlist_drag_handles",
      "kevlar_playlist_use_x_close_button",
      "kevlar_rendererstamper_event_listener",
      "kevlar_should_maintain_stable_list",
      "kevlar_show_playlist_dl_btn",
      "music_on_main_open_playlist_recommended_videos_in_miniplayer",
      "player_allow_autonav_after_playlist",
      "player_enable_playback_playlist_change",
      "web_amsterdam_post_mvp_playlists",

      // not sure
      // "check_user_lact_at_prompt_shown_time_on_web",
      "clear_user_partitioned_ls",
      "desktop_notification_high_priority_ignore_push",
      "desktop_notification_set_title_bar",
      "enable_first_user_action_csi_logging",
      "enable_get_account_switcher_endpoint_on_webfe",
      "enable_handles_account_menu_switcher",
      "enable_names_handles_account_switcher", // TBC
      "enable_pass_sdc_get_accounts_list",
      "enable_server_stitched_dai",
      "enable_yt_ata_iframe_authuser",
      // "fill_single_video_with_notify_to_lasr",
      "html5_server_stitched_dai_group",
      // "is_part_of_any_user_engagement_experiment",
      "kevlar_miniplayer_queue_user_activation",
      // "rich_grid_resize_observer",
      // "rich_grid_resize_observer_only",

      'desktop_add_to_playlist_renderer_dialog_popup',

      ...(!DISABLE_CINEMATICS ? [

        'kevlar_measure_ambient_mode_idle',
        'kevlar_watch_cinematics_invisible',
        'web_cinematic_theater_mode',
        'web_cinematic_fullscreen',

        'enable_cinematic_blur_desktop_loading',
        'kevlar_watch_cinematics',
        'web_cinematic_masthead',
        'web_watch_cinematics_preferred_reduced_motion_default_disabled'

      ] : []),



      'kevlar_rendererstamper_event_listener', // https://github.com/cyfung1031/userscript-supports/issues/11




      'live_chat_web_enable_command_handler',
      'live_chat_channel_activity',
      'live_chat_web_input_update',

      'live_chat_web_enable_command_handler',

      ...(ALLOW_ALL_LIVE_CHATS_FLAGS ? [

        'live_chat_banner_expansion_fix',
        'live_chat_enable_mod_view',
        'live_chat_enable_qna_banner_overflow_menu_actions',
        'live_chat_enable_qna_channel',
        'live_chat_enable_send_button_in_slow_mode',
        'live_chat_filter_emoji_suggestions',
        'live_chat_increased_min_height',
        'live_chat_over_playlist',
        'live_chat_web_use_emoji_manager_singleton',
        'live_chat_whole_message_clickable',

        'live_chat_emoji_picker_toggle_state',
        'live_chat_enable_command_handler_resolver_map',
        'live_chat_enable_controller_extraction',
        'live_chat_enable_rta_manager',
        'live_chat_require_space_for_autocomplete_emoji',
        'live_chat_unclickable_message',

      ] : []),

      'kevlar_rendererstamper_event_listener', // https://github.com/cyfung1031/userscript-supports/issues/11

      // kevlar_enable_up_arrow - no use
      // kevlar_help_use_locale - might use
      // kevlar_refresh_gesture - might use
      // kevlar_smart_downloads - might use
      // kevlar_thumbnail_fluid
      'kevlar_ytb_live_badges',

      ...(!use_maintain_stable_list ? [
        'kevlar_tuner_should_test_maintain_stable_list',
        'kevlar_should_maintain_stable_list',
        'kevlar_tuner_should_maintain_stable_list', // fallback


      ] : []),


      ...(!use_maintain_reuse_components ? [

        'kevlar_tuner_should_test_reuse_components',
        'kevlar_tuner_should_reuse_components',
        'kevlar_should_reuse_components' // fallback

      ] : []),


      'kevlar_system_icons',

      // 'kevlar_prefetch_data_augments_network_data' continue;

      // home page / watch page icons
      'kevlar_three_dot_ink',
      'kevlar_use_wil_icons',
      'kevlar_home_skeleton',

      'kevlar_fluid_touch_scroll',
      'kevlar_watch_color_update',
      'kevlar_use_vimio_behavior', // home page - channel icon

      // collapsed meta; no teaser, use latest collapsed meta design
      'kevlar_structured_description_content_inline',
      'kevlar_watch_metadata_refresh',

      'kevlar_watch_js_panel_height', // affect Tabview Youtube

      'shorts_desktop_watch_while_p2',
      'web_button_rework',
      'web_darker_dark_theme_live_chat',
      'web_darker_dark_theme', // it also affect cinemtaics

      // modern menu
      'web_button_rework_with_live',
      'web_fix_fine_scrubbing_drag',

      // full screen -buggy
      'external_fullscreen',

      // minimize menu
      'web_modern_buttons',
      'web_modern_dialogs',

      // Tabview Youtube - multiline transcript
      'enable_mixed_direction_formatted_strings',

      // Notification Menu
      "kevlar_service_command_check",

      // Live ChatRoom Visibility
      "live_chat_cow_visibility_set_up",

      'enable_unknown_lact_fix_on_html5',




      'live_chat_chunk_across_update_interval',

      'enable_native_live_chat_on_kevlar',

      'live_chat_author_name_color_usernames',
      'live_chat_seed_color_usernames',
      'live_chat_colored_usernames',
      'live_chat_simple_color_usernames',
      'web_button_rework_with_live',
      'live_chat_hide_avatars',
      'live_chat_enable_qna_replay',
      'live_chat_aggregation',
      'live_chat_web_use_emoji_manager_singleton',
      'enable_docked_chat_messages',
      'live_chat_taller_emoji_picker',
      'live_chat_emoji_picker_restyle',
      'live_chat_emoji_picker_restyle_remain_open_on_send',
      'live_chat_web_input_update',
      'live_chat_enable_send_button_in_slow_mode',

      'kevlar_watch_metadata_refresh_no_old_primary_data',
      // 'kevlar_watch_metadata_refresh_no_old_secondary_data', // for Tabview Youtube
      'enable_web_cosmetic_refresh_hashtag_page',
      'kevlar_watch_metadata_refresh_description_lines',




      'enable_service_ajax_csn',

      'kevlar_use_vimio_behavior',

      'web_use_cache_for_image_fallback',
      'kevlar_woffle_fallback_image',
      'yt_img_shadow_trigger_show_on_visible',
      'kevlar_thumbnail_bg',
      'web_rounded_thumbnails',



      'kevlar_rendererstamper_event_listener',

      'dialog_behavior_no_tap_killswitch',

      'handle_service_request_actions',

      'live_chat_whole_message_clickable',

      'live_chat_require_space_for_autocomplete_emoji',

      'kevlar_keyboard_button_focus',

      'live_chat_emoji_picker_toggle_state',
      'super_sticker_emoji_picker_category_button_icon_filled',
      'enable_super_chat_buy_flow_revamp_web',


      'web_modern_buttons',


      'web_modern_dialogs',
      'live_chat_disable_chat_feed_animation',
      'live_chat_overflow_hide_chat',
      'web_darker_dark_theme_live_chat',
      'live_chat_channel_activity',
      'live_chat_emoji_picker_restyle_remain_open_on_click_to_input_area',
      'live_chat_top_chat_sampling_enabled',

      'live_chat_enable_mod_view',
      'live_chat_web_enable_command_handler_action_handling',
      'web_modern_dialogs',
      'web_modern_dialog_layout',
      'web_modern_typography',

      'kevlar_disable_component_resizing_support',
      'web_rounded_thumbnails',
      'enable_quiz_desktop_animation',
      'kevlar_thumbnail_fluid',
      'web_enable_playlist_video_lockup_equalizer',
      'web_modern_collections_v2',
      'animated_live_badge_icon',
      'use_color_palettes_modern_collections_v2',
      'web_amsterdam_post_mvp_playlists',
      'enable_desktop_search_bigger_thumbs',
      'web_animated_actions',
      'mweb_animated_actions',
      'enable_desktop_amsterdam_info_panels',

      'kevlar_modern_sd',
      'problem_walkthrough_sd',
      'polymer_video_renderer_defer_menu',


      'enable_html5_teal_ad_badge',
      'kevlar_ytb_live_badges',
      'live_chat_enable_new_moderator_badge',
      'live_chat_prepend_badges',
      'live_chat_bold_color_usernames',
      'render_custom_emojis_as_small_images',

      'web_enable_dynamic_metadata',

      'web_animated_like',
      'web_animated_like_lazy_load',
      'desktop_delay_player_resizing',


      ...(ALLOW_THEATER_PLAYER_SHORTCUT_KEY_T ? [

        // 'clean_up_manual_attribution_header',
        // 'empty_attributed_string_killswitch',
        // 'enable_profile_cards_cairo_updates',
        // 'enable_teaser_framework_web_client',
        // 'enable_tectonic_ad_ux_for_halftime',
        // 'enable_web_shorts_save_audio_pivot',
        // 'kevlar_clear_duplicate_pref_cookie',
        // 'kevlar_disable_background_prefetch',
        // 'kevlar_transcript_engagement_panel',
        'kevlar_watch_flexy_theater_manager',
        // 'mdx_load_cast_api_bootstrap_script',
        // 'web_collab_playlist_thumbnail_size',
        // 'web_fix_back_button_player_loading',
        // 'web_fix_dynamic_metadata_diacritic',
        // 'web_kevlar_enable_adaptive_signals',
        // 'web_move_autoplay_video_under_chip',
        // 'web_player_small_hbp_settings_menu',
        // 'web_rendererstamper_event_listener',
        // 'web_shorts_skip_loading_same_index',
        // 'web_shorts_suggested_action_no_bvm',
        // 'web_use_updated_icon_for_oac_badge',
        // 'wiz_prevent_watched_double_logging',

      ] : []),

    ].concat(
      [
      ]
    );


    const s = new Set(BY_PASS);

    return s;

  };
  let cachedSet = null;

  const hExperimentFlagsFn = () => {

    if (brc > 4) brc = 4;

    const use_maintain_stable_list = getSettingValue(ENABLE_EXPERIMENT_FLAGS_MAINTAIN_STABLE_LIST);
    const use_maintain_reuse_components = getSettingValue(ENABLE_EXPERIMENT_FLAGS_MAINTAIN_REUSE_COMPONENTS);
    const use_defer_detach = getSettingValue(ENABLE_EXPERIMENT_FLAGS_DEFER_DETACH);
    const no_autoplay_toggle = getSettingValue(ENABLE_EXPERIMENT_FLAGS_NO_AUTOPLAY_TOGGLE);
    ENABLE_EXPERIMENT_FLAGS_NO_AUTOPLAY_TOGGLE.currentValue = no_autoplay_toggle;

    if (use_maintain_stable_list) Promise.resolve().then(() => console.debug("use_maintain_stable_list"));
    if (use_maintain_reuse_components) Promise.resolve().then(() => console.debug("use_maintain_reuse_components"));
    if (use_defer_detach) Promise.resolve().then(() => console.debug("use_defer_detach"));
    if (no_autoplay_toggle) Promise.resolve().then(() => console.debug("no_autoplay_toggle"));

    cachedSet = cachedSet || cachedSetFn({ use_maintain_stable_list, use_maintain_reuse_components, use_defer_detach, no_autoplay_toggle });

    const mps = [];

    setTimeout(async () => {

      if (!mps.length) return;
      let ezz = new Set();
      let e1 = 999;
      let e2 = -999;
      for (const mp of mps) {
        for (const k of mp) {
          ezz.add(k);
          const kl = k.length;
          if (kl < e1) e1 = kl;
          if (kl > e2) e2 = kl;
        }
      }
      mps.length = 0;

      if (!ezz.size) return;

      await new Promise(r => window.setTimeout(r, 1));
      let qt = Date.now();

      console.log('EXPERIMENT_FLAGS', [e1, e2, ezz.size]);

      let mf = false;
      const obj = JSON.parse(localStorage['bpghn02'] || '{}');
      for (const e of ezz) {
        if (obj[e]) continue;
        obj[e] = qt;
        mf = true;
      }
      if (mf) {

        localStorage['bpghn02'] = JSON.stringify(obj);
      }

      // await new Promise(r => window.setTimeout(r, 1));

      const getEFT = function (after, offset) {


        after = typeof after === 'string' ? new Date(after) : after;
        let afterValue = +after;


        let arr = Object.entries(obj).map(e => {
          return { key: e[0], date: e[1], len: e[0].length };
        }).sort((a, b) => {
          return a.date < b.date ? 1 : a.date > b.date ? -1 : a.len < b.len ? 1 : a.len > b.len ? -1 : `${a.key}`.localeCompare(`${b.key}`);
        });

        if (afterValue > 0) {
          arr = arr.filter(e => {
            return e.date >= afterValue + offset;
          })
        }

        return [arr, after, afterValue];

      }

      window.log_EXPERIMENT_FLAGS_Tamer = function (after, toString) {

        let [arr, after_, afterValue] = getEFT(after, -86400000);

        const r = {
          "!log": arr,
          after: afterValue > 0 ? new Date(afterValue) : null
        };
        console.log("log_EXPERIMENT_FLAGS_Tamer", toString ? JSON.stringify(r) : r);

      }

      window.kl_EXPERIMENT_FLAGS_Tamer = function (after, kl) {


        let [arr, after_, afterValue] = getEFT(after, -86400000);

        arr = arr.filter(e => {
          return e.len === kl
        });

        return arr.map(e => e.key).join('|')


      }


    }, 800);

    // I don't know why it requires to be extracted function.
    const mex = (EXPERIMENT_FLAGS, mzFlagDetected, fEntries) => {

      let ezz = new Set();

      for (const [key, value] of fEntries) {


        if (value === true) {

          // if(key.indexOf('modern')>=0 || key.indexOf('enable')>=0 || key.indexOf('theme')>=0 || key.indexOf('skip')>=0  || key.indexOf('ui')>=0 || key.indexOf('observer')>=0 || key.indexOf('polymer')>=0 )continue;

          if (mzFlagDetected.has(key)) continue;
          mzFlagDetected.add(key);

          if (cachedSet.has(key)) continue; // const BY_PASS = [

          if (SPACEBAR_CONTROL < 0 && key.includes('speedmaster')) continue;

          if (FLAG_STRATEGY_20240413 && key.includes('network')) continue;
          if (FLAG_STRATEGY_20240413 && key.includes('less')) continue;
          if (FLAG_STRATEGY_20240413 && key.includes('latency')) continue;
          if (FLAG_STRATEGY_20240413 && key.includes('slow')) continue;
          if (FLAG_STRATEGY_20240413 && key.includes('steam')) continue;

          // const kl = key.length;
          // const kl7 = kl % 7;
          // const kl5 = kl % 5;
          // const kl3 = kl % 3;
          // const kl2 = kl % 2;

          if (USE_byPassConditionAnalyzer && byPassConditionAnalyzer.testFn_(key, false)) continue;


          if (key.startsWith('html5_')) {

            if (IGNORE_VIDEO_SOURCE_RELATED) {
              continue;
            }

            // if(IGNORE_VIDEO_SOURCE_RELATED){
            //   if(key ==='html5_enable_vp9_fairplay') continue;
            //   if(key ==='html5_disable_av1_hdr') continue;
            //   if(key ==='html5_disable_hfr_when_vp9_encrypted_2k4k_unsupported') continue;
            //   if(key ==='html5_account_onesie_format_selection_during_format_filter') continue;
            //   if(key ==='html5_prefer_hbr_vp9_over_av1') continue;
            // }

          } else if (key.startsWith('kevlar_')) {

          } else {

          }

          ezz.add(key);

          // console.log(key)
          EXPERIMENT_FLAGS[key] = false;
        }
      }

      mps.push(ezz);
      ezz = null;
    }

    const mey = (EXPERIMENT_FLAGS, mzFlagDetected) => {
      // return;

      if (FLAG_STRATEGY_20240503) {
        EXPERIMENT_FLAGS.disable_enf_isd = true;
        EXPERIMENT_FLAGS.ab_det_el_h = false;
        EXPERIMENT_FLAGS.ks_det_gpbl = true;
        EXPERIMENT_FLAGS.ks_get_o_pp = true;
        EXPERIMENT_FLAGS.ab_deg_unex_thr = true;
        EXPERIMENT_FLAGS.ab_det_sc_inj_enf = false;
        EXPERIMENT_FLAGS.debug_sk_em_precheck = false;
      }

      if (NO_DEBUG_FLAG) {
        EXPERIMENT_FLAGS.debug_forward_web_query_parameters = false;
        EXPERIMENT_FLAGS.debug_handle_relative_url_for_query_forward_killswitch = false;
        EXPERIMENT_FLAGS.debug_web_ve_data = false;
      }


      if (DISABLE_FLAGS_SHADYDOM_FREE) {
        EXPERIMENT_FLAGS.enable_shadydom_free_scoped_node_methods = false;
        EXPERIMENT_FLAGS.enable_shadydom_free_scoped_query_methods = false;
        EXPERIMENT_FLAGS.enable_shadydom_free_scoped_readonly_properties_batch_one = false;
        EXPERIMENT_FLAGS.enable_shadydom_free_parent_node = false;
        EXPERIMENT_FLAGS.enable_shadydom_free_children = false;
        EXPERIMENT_FLAGS.enable_shadydom_free_last_child = false;
      }

      if (SPACEBAR_CONTROL === 0) {
        EXPERIMENT_FLAGS.disable_space_scroll_fix = false;
        EXPERIMENT_FLAGS.global_spacebar_pause = false;
        EXPERIMENT_FLAGS.web_speedmaster_spacebar_control = false;
      } else if (SPACEBAR_CONTROL === 1) {

        EXPERIMENT_FLAGS.disable_space_scroll_fix = false;
        EXPERIMENT_FLAGS.global_spacebar_pause = true;
        EXPERIMENT_FLAGS.web_speedmaster_spacebar_control = false;
      } else if (SPACEBAR_CONTROL === 2) {

        EXPERIMENT_FLAGS.disable_space_scroll_fix = false;
        EXPERIMENT_FLAGS.global_spacebar_pause = true;
        EXPERIMENT_FLAGS.web_speedmaster_spacebar_control = true;
      }

      EXPERIMENT_FLAGS.use_cfr_monitor = false;
      EXPERIMENT_FLAGS.skip_network_check_if_cfr = false;

      if (FLAG_STRATEGY_20240413) {
        EXPERIMENT_FLAGS.kevlar_watch_grid = false;
        EXPERIMENT_FLAGS.kevlar_watch_grid_hide_chips = false;
        EXPERIMENT_FLAGS.kevlar_watch_grid_reduced_top_margin_rich_grid = false;
        EXPERIMENT_FLAGS.kevlar_watch_grid_top_companion = false;
        EXPERIMENT_FLAGS.kevlar_watch_fixie = false;
        EXPERIMENT_FLAGS.kevlar_watch_grid_auto_open_playlist = false;
        EXPERIMENT_FLAGS.action_companion_center_align_description = false;
        EXPERIMENT_FLAGS.action_companion_truncate_domain = false;
      }

      if (ENABLE_MINOR_CHAT_FEATURE_UPGRADE) {


        EXPERIMENT_FLAGS.web_supports_animations_api = true;
        EXPERIMENT_FLAGS.smartimation_background = true;
        // EXPERIMENT_FLAGS.register_web_smartimations_component = true;

        EXPERIMENT_FLAGS.enable_native_live_chat_on_kevlar = true;

        EXPERIMENT_FLAGS.live_chat_enable_qna_replay = true;
        EXPERIMENT_FLAGS.live_chat_aggregation = true;
        EXPERIMENT_FLAGS.live_chat_web_use_emoji_manager_singleton = true;
        // EXPERIMENT_FLAGS.enable_docked_chat_messages = true;

        EXPERIMENT_FLAGS.live_chat_mention_regex_update = true;

      }

      // EXPERIMENT_FLAGS.live_chat_taller_emoji_picker = true;
      // EXPERIMENT_FLAGS.live_chat_web_input_update = true;

      if (ENABLE_EMOJI_PICKER_NEW_STYLE) {

        EXPERIMENT_FLAGS.live_chat_emoji_picker_restyle = true;
        EXPERIMENT_FLAGS.live_chat_emoji_picker_restyle_remain_open_on_send = true;
        EXPERIMENT_FLAGS.live_chat_taller_emoji_picker = false;

      }

      if (ENABLE_BADGE_STYLE) {

        EXPERIMENT_FLAGS.enable_html5_teal_ad_badge = true;
        EXPERIMENT_FLAGS.kevlar_ytb_live_badges = true;
        EXPERIMENT_FLAGS.live_chat_enable_new_moderator_badge = true;
        EXPERIMENT_FLAGS.live_chat_prepend_badges = true;

        EXPERIMENT_FLAGS.live_chat_bold_color_usernames = true;
        EXPERIMENT_FLAGS.render_custom_emojis_as_small_images = true;


      }

      // EXPERIMENT_FLAGS.kevlar_wiz_prototype_enable_all_components = true;


      EXPERIMENT_FLAGS.html5_allow_asmjs = true;
      EXPERIMENT_FLAGS.html5_honor_caption_availabilities_in_audio_track = true;
      EXPERIMENT_FLAGS.web_player_hide_nitrate_promo_tooltip = true;
      EXPERIMENT_FLAGS.html5_enable_vod_slar_with_notify_pacf = true;
      EXPERIMENT_FLAGS.html5_recognize_predict_start_cue_point = true;
      EXPERIMENT_FLAGS.enable_player_logging_lr_home_infeed_ads = false;

      EXPERIMENT_FLAGS.log_gel_compression_latency = true;
      EXPERIMENT_FLAGS.log_gel_compression_latency_lr = true;
      EXPERIMENT_FLAGS.log_jspb_serialize_latency = true;

      if (NO_REFRESH) {

        EXPERIMENT_FLAGS.kevlar_watch_metadata_refresh_standardized_body_typography = false;
        EXPERIMENT_FLAGS.kevlar_refresh_gesture = false;

      }


      if (NO_DESKTOP_DELAY_PLAYER_RESIZING) {

        EXPERIMENT_FLAGS.desktop_delay_player_resizing = false;
      }
      if (NO_ANIMATED_LIKE) {
        EXPERIMENT_FLAGS.web_animated_like = false;
        EXPERIMENT_FLAGS.web_animated_like_lazy_load = false;
      }

      if (use_maintain_stable_list) {
        if (USE_MAINTAIN_STABLE_LIST_ONLY_WHEN_KS_FLAG_IS_SET ? EXPERIMENT_FLAGS.kevlar_should_maintain_stable_list === true : true) {
          // EXPERIMENT_FLAGS.kevlar_tuner_should_test_maintain_stable_list = true; // timestamp toggle issue
          EXPERIMENT_FLAGS.kevlar_should_maintain_stable_list = true;
          // EXPERIMENT_FLAGS.kevlar_tuner_should_maintain_stable_list = true; // fallback // timestamp toggle issue
        }
      }

      if (use_maintain_reuse_components) {
        EXPERIMENT_FLAGS.kevlar_tuner_should_test_reuse_components = true;
        EXPERIMENT_FLAGS.kevlar_tuner_should_reuse_components = true;
        EXPERIMENT_FLAGS.kevlar_should_reuse_components = true; // fallback
      }

      if (use_defer_detach) {
        EXPERIMENT_FLAGS.kevlar_tuner_should_defer_detach = true;
      }

      // EXPERIMENT_FLAGS.kevlar_prefetch_data_augments_network_data = true; // TBC

      EXPERIMENT_FLAGS.kevlar_clear_non_displayable_url_params = true;
      EXPERIMENT_FLAGS.kevlar_clear_duplicate_pref_cookie = true;
      // EXPERIMENT_FLAGS.kevlar_unified_player_clear_watch_next_killswitch = true;
      EXPERIMENT_FLAGS.kevlar_player_playlist_use_local_index = true;
      // EXPERIMENT_FLAGS.kevlar_non_watch_unified_player = true;
      // EXPERIMENT_FLAGS.kevlar_player_update_killswitch = true;

      EXPERIMENT_FLAGS.web_secure_pref_cookie_killswitch = true;
      EXPERIMENT_FLAGS.ytidb_clear_optimizations_killswitch = true;
      // EXPERIMENT_FLAGS.defer_overlays = true;


      if (COMMENTS_NO_DELAY) {
        EXPERIMENT_FLAGS.kevlar_tuner_default_comments_delay = 0;
        EXPERIMENT_FLAGS.kevlar_tuner_run_default_comments_delay = false;
      }

    }
    const setterFn = (EXPERIMENT_FLAGS, mzFlagDetected) => {

      const fEntries = Object.entries(EXPERIMENT_FLAGS);
      mex(EXPERIMENT_FLAGS, mzFlagDetected, fEntries);
      mey(EXPERIMENT_FLAGS, mzFlagDetected);

    };

    return setterFn;


  };

  let _setterFn = null;

  const setupConfig = (config_) => {

    if (config_.EXPERIMENT_FLAGS) {

      const setterFn = _setterFn || (_setterFn = hExperimentFlagsFn());

      setterFn(config_.EXPERIMENT_FLAGS, mzFlagDetected1);

      if (config_.EXPERIMENTS_FORCED_FLAGS) setterFn(config_.EXPERIMENTS_FORCED_FLAGS, mzFlagDetected2);
    }

    const playerKevlar = (config_.WEB_PLAYER_CONTEXT_CONFIGS || 0).WEB_PLAYER_CONTEXT_CONFIG_ID_KEVLAR_WATCH || 0;

    if (playerKevlar && !zPlayerKevlar) {
      zPlayerKevlar = true;

      if (NO_SerializedExperiment && typeof playerKevlar.serializedExperimentFlags === 'string' && typeof playerKevlar.serializedExperimentIds === 'string') {
        fixSerializedExperiment(playerKevlar);
      }

    }

  }


  const looperFn = (config_) => {
    if (--brc < 0) return;

    if (!config_) {
      try {
        config_ = yt.config_ || ytcfg.data_;
      } catch (e) { }
    }
    if (config_) setupConfig(config_);

  };


  window._ytConfigHacks.add((config_) => {
    looperFn(config_);
  });
  looperFn();

  if (isMainWindow) {

    console.groupCollapsed(
      "%cYouTube EXPERIMENT_FLAGS Tamer",
      "background-color: #EDE43B ; color: #000 ; font-weight: bold ; padding: 4px ;"
    );

    console.log("Script is loaded.");
    console.log("This might affect the new features when YouTube rolls them out to general users.");
    console.log("If you found any issue in using YouTube, please disable this script to check whether the issue is due to this script or not.");

    console.groupEnd();

  }

})();