struct buf0 {
  injectionSwitch : vec2<f32>,
}

@group(0) @binding(0) var<uniform> x_7 : buf0;

var<private> gv : f32;

var<private> gl_FragCoord : vec4<f32>;

var<private> x_GLF_color : vec4<f32>;

fn main_1() {
  var lv : f32;
  var x_43 : f32;
  var GLF_live5r : i32;
  var GLF_live5_looplimiter6 : i32;
  let x_45 : f32 = x_7.injectionSwitch.y;
  if ((1.0 > x_45)) {
    let x_50 : f32 = gv;
    x_43 = abs(x_50);
  } else {
    x_43 = 260.0;
  }
  let x_52 : f32 = x_43;
  lv = x_52;
  let x_53 : f32 = lv;
  if ((i32(x_53) < 250)) {
    let x_58 : f32 = lv;
    if ((i32(x_58) < 180)) {
      let x_64 : f32 = lv;
      let x_65 : f32 = clamp(x_64, 1.0, 1.0);
    } else {
      let x_67 : f32 = gl_FragCoord.y;
      if ((x_67 < 0.0)) {
        let x_71 : f32 = lv;
        if ((i32(x_71) < 210)) {
          loop {

            continuing {
              if (true) {
              } else {
                break;
              }
            }
          }
        }
        GLF_live5r = 0;
        loop {
          if (true) {
          } else {
            break;
          }
          let x_11 : i32 = GLF_live5_looplimiter6;
          if ((x_11 >= 6)) {
            break;
          }
          let x_12 : i32 = GLF_live5_looplimiter6;
          GLF_live5_looplimiter6 = (x_12 + 1);
        }
      }
    }
  }
  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
  return;
}

struct main_out {
  @location(0)
  x_GLF_color_1 : vec4<f32>,
}

@stage(fragment)
fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
  gl_FragCoord = gl_FragCoord_param;
  main_1();
  return main_out(x_GLF_color);
}
