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

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

[[block]]
struct buf2 {
  one : f32;
};

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

[[block]]
struct buf1 {
  x_GLF_uniform_int_values : Arr_1;
};

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

[[group(0), binding(2)]] var<uniform> x_11 : buf2;

[[group(0), binding(1)]] var<uniform> x_13 : buf1;

var<private> x_GLF_color : vec4<f32>;

fn main_1() {
  var f0 : f32;
  var f1 : f32;
  var f2 : f32;
  var f3 : f32;
  let x_36 : f32 = x_6.x_GLF_uniform_float_values[0];
  f0 = x_36;
  let x_38 : f32 = x_6.x_GLF_uniform_float_values[1];
  let x_39 : f32 = f0;
  f1 = (x_38 * pow(x_39, 4.0));
  let x_43 : f32 = x_6.x_GLF_uniform_float_values[1];
  let x_44 : f32 = f0;
  f2 = (x_43 * pow(x_44, 4.0));
  let x_47 : f32 = f1;
  let x_48 : f32 = f2;
  let x_51 : f32 = x_11.one;
  let x_53 : f32 = f0;
  f3 = sqrt((((x_47 - x_48) - x_51) + x_53));
  let x_56 : f32 = f3;
  let x_59 : i32 = x_13.x_GLF_uniform_int_values[0];
  if ((i32(x_56) == x_59)) {
    let x_65 : i32 = x_13.x_GLF_uniform_int_values[0];
    let x_68 : i32 = x_13.x_GLF_uniform_int_values[1];
    let x_71 : i32 = x_13.x_GLF_uniform_int_values[1];
    let x_74 : i32 = x_13.x_GLF_uniform_int_values[0];
    x_GLF_color = vec4<f32>(f32(x_65), f32(x_68), f32(x_71), f32(x_74));
  } else {
    let x_78 : i32 = x_13.x_GLF_uniform_int_values[1];
    let x_79 : f32 = f32(x_78);
    x_GLF_color = vec4<f32>(x_79, x_79, x_79, x_79);
  }
  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);
}
