struct buf0 {
  injectionSwitch : vec2<f32>,
}

var<private> gl_FragCoord : vec4<f32>;

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

var<private> x_GLF_color : vec4<f32>;

fn main_1() {
  loop {
    var x_45 : bool;
    var x_48 : i32;
    var x_49 : i32;
    var x_46 : bool;
    var x_115 : i32;
    var x_116 : i32;
    var x_45_phi : bool;
    var x_48_phi : i32;
    var x_50_phi : i32;
    var x_52_phi : i32;
    var x_111_phi : i32;
    var x_112_phi : bool;
    var x_115_phi : i32;
    var x_118_phi : i32;
    var x_120_phi : i32;
    var x_161_phi : i32;
    let x_40 : f32 = x_6.injectionSwitch.x;
    let x_41 : bool = (x_40 < -1.0);
    x_45_phi = false;
    x_48_phi = 0;
    x_50_phi = 0;
    x_52_phi = 0;
    loop {
      var x_62 : i32;
      var x_65 : i32;
      var x_66 : i32;
      var x_63 : i32;
      var x_53 : i32;
      var x_62_phi : i32;
      var x_65_phi : i32;
      var x_67_phi : i32;
      var x_51_phi : i32;
      var x_49_phi : i32;
      var x_46_phi : bool;
      x_45 = x_45_phi;
      x_48 = x_48_phi;
      let x_50 : i32 = x_50_phi;
      let x_52 : i32 = x_52_phi;
      let x_55 : f32 = gl_FragCoord.y;
      x_111_phi = x_48;
      x_112_phi = x_45;
      if ((x_52 < select(100, 10, (x_55 > -1.0)))) {
      } else {
        break;
      }
      x_62_phi = x_48;
      x_65_phi = x_50;
      x_67_phi = 0;
      loop {
        var x_97 : i32;
        var x_68 : i32;
        var x_66_phi : i32;
        x_62 = x_62_phi;
        x_65 = x_65_phi;
        let x_67 : i32 = x_67_phi;
        x_51_phi = x_65;
        x_49_phi = x_62;
        x_46_phi = x_45;
        if ((x_67 < 2)) {
        } else {
          break;
        }
        loop {
          var x_78 : bool;
          var x_86_phi : i32;
          var x_97_phi : i32;
          var x_98_phi : bool;
          let x_77 : f32 = gl_FragCoord.x;
          x_78 = (x_77 < -1.0);
          if (!((x_40 < 0.0))) {
            if (x_78) {
              x_66_phi = 0;
              break;
            }
            x_86_phi = 1;
            loop {
              var x_87 : i32;
              let x_86 : i32 = x_86_phi;
              x_97_phi = x_65;
              x_98_phi = false;
              if ((x_86 < 3)) {
              } else {
                break;
              }
              if (x_78) {
                continue;
              }
              if ((x_86 > 0)) {
                x_97_phi = 1;
                x_98_phi = true;
                break;
              }

              continuing {
                x_87 = (x_86 + 1);
                x_86_phi = x_87;
              }
            }
            x_97 = x_97_phi;
            let x_98 : bool = x_98_phi;
            x_66_phi = x_97;
            if (x_98) {
              break;
            }
          }
          x_66_phi = 0;
          break;
        }
        x_66 = x_66_phi;
        x_63 = bitcast<i32>((x_62 + x_66));
        if (x_41) {
          loop {
            if (x_41) {
            } else {
              break;
            }

            continuing {
              let x_105 : f32 = f32(x_52);
              x_GLF_color = vec4<f32>(x_105, x_105, x_105, x_105);
            }
          }
          x_51_phi = x_66;
          x_49_phi = x_63;
          x_46_phi = true;
          break;
        }

        continuing {
          x_68 = (x_67 + 1);
          x_62_phi = x_63;
          x_65_phi = x_66;
          x_67_phi = x_68;
        }
      }
      let x_51 : i32 = x_51_phi;
      x_49 = x_49_phi;
      x_46 = x_46_phi;
      x_111_phi = x_49;
      x_112_phi = x_46;
      if (x_46) {
        break;
      }
      if (!(x_41)) {
        x_111_phi = x_49;
        x_112_phi = x_46;
        break;
      }

      continuing {
        x_53 = (x_52 + 1);
        x_45_phi = x_46;
        x_48_phi = x_49;
        x_50_phi = x_51;
        x_52_phi = x_53;
      }
    }
    let x_111 : i32 = x_111_phi;
    let x_112 : bool = x_112_phi;
    if (x_112) {
      break;
    }
    x_115_phi = x_111;
    x_118_phi = 0;
    x_120_phi = 0;
    loop {
      var x_154 : i32;
      var x_121 : i32;
      var x_119_phi : i32;
      x_115 = x_115_phi;
      let x_118 : i32 = x_118_phi;
      let x_120 : i32 = x_120_phi;
      let x_123 : f32 = x_6.injectionSwitch.y;
      x_161_phi = x_115;
      if ((x_120 < i32((x_123 + 1.0)))) {
      } else {
        break;
      }
      loop {
        var x_135 : bool;
        var x_143_phi : i32;
        var x_154_phi : i32;
        var x_155_phi : bool;
        let x_134 : f32 = gl_FragCoord.x;
        x_135 = (x_134 < -1.0);
        if (!((x_40 < 0.0))) {
          if (x_135) {
            x_119_phi = 0;
            break;
          }
          x_143_phi = 1;
          loop {
            var x_144 : i32;
            let x_143 : i32 = x_143_phi;
            x_154_phi = x_118;
            x_155_phi = false;
            if ((x_143 < 3)) {
            } else {
              break;
            }
            if (x_135) {
              continue;
            }
            if ((x_143 > 0)) {
              x_154_phi = 1;
              x_155_phi = true;
              break;
            }

            continuing {
              x_144 = (x_143 + 1);
              x_143_phi = x_144;
            }
          }
          x_154 = x_154_phi;
          let x_155 : bool = x_155_phi;
          x_119_phi = x_154;
          if (x_155) {
            break;
          }
        }
        x_119_phi = 0;
        break;
      }
      var x_119 : i32;
      x_119 = x_119_phi;
      x_116 = bitcast<i32>((x_115 + x_119));
      if (select(x_41, false, !(x_41))) {
        x_161_phi = x_116;
        break;
      }

      continuing {
        x_121 = (x_120 + 1);
        x_115_phi = x_116;
        x_118_phi = x_119;
        x_120_phi = x_121;
      }
    }
    let x_161 : i32 = x_161_phi;
    if ((x_161 == 4)) {
      x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
    } else {
      x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
    }
    break;
  }
  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);
}
