struct buf0 {
  injectionSwitch : vec2<f32>;
}

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

var<private> gl_FragCoord : vec4<f32>;

var<private> x_GLF_color : vec4<f32>;

fn main_1() {
  var loop_count : i32;
  loop_count = 0;
  let x_33 : f32 = x_7.injectionSwitch.x;
  let x_35 : f32 = x_7.injectionSwitch.y;
  let x_36 : bool = (x_33 > x_35);
  if (x_36) {
    return;
  }
  let x_40 : f32 = gl_FragCoord.x;
  let x_41 : bool = (x_40 < 0.0);
  loop {
    let x_43 : i32 = loop_count;
    if ((x_43 < 100)) {
    } else {
      break;
    }
    if (x_36) {
      break;
    }
    if (x_36) {
      x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
    } else {
      if (x_41) {
        return;
      }
    }
    if (x_36) {
      x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
    } else {
      x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
    }
    if (x_36) {
      return;
    }
    if (x_41) {
      loop {
        let x_63 : i32 = loop_count;
        if ((x_63 < 100)) {
        } else {
          break;
        }

        continuing {
          let x_67 : i32 = loop_count;
          loop_count = (x_67 + 1);
        }
      }
    }

    continuing {
      let x_69 : i32 = loop_count;
      loop_count = (x_69 + 1);
    }
  }
  let x_71 : i32 = loop_count;
  if ((x_71 >= 100)) {
    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
  } else {
    x_GLF_color = vec4<f32>(1.0, 1.0, 1.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);
}
