#include <metal_stdlib>

using namespace metal;
struct tint_padded_array_element {
  /* 0x0000 */ float el;
  /* 0x0004 */ int8_t tint_pad[12];
};
struct tint_array_wrapper {
  /* 0x0000 */ tint_padded_array_element arr[2];
};
struct buf0 {
  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
};
struct buf1 {
  /* 0x0000 */ float zero;
};
struct main_out {
  float4 x_GLF_color_1;
};
struct tint_symbol_1 {
  float4 x_GLF_color_1 [[color(0)]];
};

void main_1(constant buf0& x_6, constant buf1& x_9, thread float4* const tint_symbol_4) {
  float2 v0 = 0.0f;
  float4 v1 = 0.0f;
  float4 x_57 = 0.0f;
  float const x_32 = x_6.x_GLF_uniform_float_values.arr[0].el;
  v0 = float2(x_32, x_32);
  float const x_35 = v0.x;
  float4 const x_36 = float4(x_35, x_35, x_35, x_35);
  v1 = x_36;
  float const x_38 = x_9.zero;
  float const x_40 = x_6.x_GLF_uniform_float_values.arr[0].el;
  if (!((x_38 == x_40))) {
    float const x_46 = x_9.zero;
    float const x_48 = x_6.x_GLF_uniform_float_values.arr[1].el;
    if ((x_46 == x_48)) {
      return;
    }
    float const x_53 = x_6.x_GLF_uniform_float_values.arr[0].el;
    float2 const x_56 = (float2(x_36.y, x_36.z) - float2(x_53, x_53));
    x_57 = float4(x_36.x, x_56.x, x_56.y, x_36.w);
    v1 = x_57;
  } else {
    discard_fragment();
  }
  *(tint_symbol_4) = x_57;
  return;
}

fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]], constant buf1& x_9 [[buffer(1)]]) {
  thread float4 tint_symbol_5 = 0.0f;
  main_1(x_6, x_9, &(tint_symbol_5));
  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
  return tint_symbol_3;
}

