#include <metal_stdlib>

using namespace metal;
struct buf0 {
  /* 0x0000 */ float one;
};
struct main_out {
  float4 x_GLF_color_1;
};
struct tint_symbol_2 {
  float4 x_GLF_color_1 [[color(0)]];
};

void main_1(constant buf0& x_7, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
  float4x4 m44 = float4x4(0.0f);
  int x_10_phi = 0;
  m44 = float4x4(float4(1.0f, 2.0f, 3.0f, 4.0f), float4(5.0f, 6.0f, 7.0f, 8.0f), float4(9.0f, 10.0f, 11.0f, 12.0f), float4(13.0f, 14.0f, 15.0f, 16.0f));
  x_10_phi = 0;
  while (true) {
    int x_9 = 0;
    int x_11_phi = 0;
    int const x_10 = x_10_phi;
    if ((x_10 < 4)) {
    } else {
      break;
    }
    float const x_63 = (*(tint_symbol_5)).y;
    if ((x_63 < 0.0f)) {
      break;
    }
    x_11_phi = 0;
    while (true) {
      int x_8 = 0;
      int const x_11 = x_11_phi;
      if ((x_11 < 4)) {
      } else {
        break;
      }
      {
        float const x_72 = x_7.one;
        int const x_73_save = x_10;
        int const x_73_save_1 = x_11;
        float const x_74 = m44[x_73_save][x_73_save_1];
        m44[x_73_save][x_73_save_1] = (x_74 + x_72);
        x_8 = as_type<int>((as_type<uint>(x_11) + as_type<uint>(1)));
        x_11_phi = x_8;
      }
    }
    {
      x_9 = as_type<int>((as_type<uint>(x_10) + as_type<uint>(1)));
      x_10_phi = x_9;
    }
  }
  float const x_77 = m44[1].y;
  float4 x_79_1 = float4(0.0f, 0.0f, 0.0f, 0.0f);
  x_79_1.x = (x_77 - 6.0f);
  float4 const x_79 = x_79_1;
  float const x_81 = m44[2].z;
  float4 x_83_1 = x_79;
  x_83_1.w = (x_81 - 11.0f);
  float4 const x_83 = x_83_1;
  *(tint_symbol_6) = x_83;
  return;
}

fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_7 [[buffer(0)]]) {
  thread float4 tint_symbol_7 = 0.0f;
  thread float4 tint_symbol_8 = 0.0f;
  tint_symbol_7 = gl_FragCoord_param;
  main_1(x_7, &(tint_symbol_7), &(tint_symbol_8));
  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
  return tint_symbol_4;
}

