type Arr = [[stride(16)]] array<i32, 2>;

[[block]]
struct buf0 {
  x_GLF_uniform_int_values : Arr;
};

[[group(0), binding(0)]] var<uniform> x_5 : buf0;

var<private> x_GLF_color : vec4<f32>;

fn main_1() {
  var x_23 : i32;
  var x_27 : i32;
  var x_37 : i32;
  var x_23_phi : i32;
  var x_45_phi : i32;
  x_23_phi = 0;
  loop {
    var x_24 : i32;
    x_23 = x_23_phi;
    x_27 = x_5.x_GLF_uniform_int_values[1];
    if ((x_23 < (100 - bitcast<i32>(x_27)))) {
    } else {
      break;
    }

    continuing {
      x_24 = bitcast<i32>((x_23 + bitcast<i32>(1)));
      x_23_phi = x_24;
    }
  }
  var x_37_phi : i32;
  var x_40_phi : i32;
  let x_32 : i32 = x_5.x_GLF_uniform_int_values[0];
  x_45_phi = 1;
  if ((x_32 == 0)) {
    x_37_phi = 1;
    x_40_phi = x_23;
    loop {
      var x_41 : i32;
      var x_38 : i32;
      x_37 = x_37_phi;
      let x_40 : i32 = x_40_phi;
      if ((x_40 < 100)) {
      } else {
        break;
      }

      continuing {
        x_41 = (x_40 + 1);
        x_38 = bitcast<i32>((x_37 * bitcast<i32>((1 - bitcast<i32>(x_37)))));
        x_37_phi = x_38;
        x_40_phi = x_41;
      }
    }
    x_45_phi = x_37;
  }
  let x_45 : i32 = x_45_phi;
  if ((x_45 == x_32)) {
    let x_50 : f32 = f32(x_27);
    let x_51 : f32 = f32(x_32);
    x_GLF_color = vec4<f32>(x_50, x_51, x_51, x_50);
  } else {
    let x_53 : f32 = f32(x_32);
    x_GLF_color = vec4<f32>(x_53, x_53, x_53, x_53);
  }
  return;
}

struct main_out {
  [[location(0)]]
  x_GLF_color_1 : vec4<f32>;
};

[[stage(fragment)]]
fn main() -> main_out {
  main_1();
  return main_out(x_GLF_color);
}
