#include <metal_stdlib>

using namespace metal;
struct buf1 {
  /* 0x0000 */ packed_float2 resolution;
};
struct buf0 {
  /* 0x0000 */ packed_float2 injectionSwitch;
};
struct tint_array_wrapper {
  float arr[10];
};
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_9, constant buf1& x_6, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
  tint_array_wrapper data = {};
  int x_40_phi = 0;
  int x_52_phi = 0;
  x_40_phi = 0;
  while (true) {
    int x_41 = 0;
    int const x_40 = x_40_phi;
    if ((x_40 < 10)) {
    } else {
      break;
    }
    {
      float const x_48 = x_9.injectionSwitch.y;
      data.arr[x_40] = (float((10 - x_40)) * x_48);
      x_41 = (x_40 + 1);
      x_40_phi = x_41;
    }
  }
  x_52_phi = 0;
  while (true) {
    int x_53 = 0;
    int x_59_phi = 0;
    int const x_52 = x_52_phi;
    if ((x_52 < 9)) {
    } else {
      break;
    }
    x_59_phi = 0;
    while (true) {
      bool x_82 = false;
      bool x_83 = false;
      int x_60 = 0;
      bool x_84_phi = false;
      int const x_59 = x_59_phi;
      if ((x_59 < 10)) {
      } else {
        break;
      }
      if ((x_59 < (x_52 + 1))) {
        {
          x_60 = (x_59 + 1);
          x_59_phi = x_60;
        }
        continue;
      }
      int const x_69_save = x_52;
      float const x_70 = data.arr[x_69_save];
      int const x_71_save = x_59;
      float const x_72 = data.arr[x_71_save];
      float const x_74 = (*(tint_symbol_5)).y;
      float const x_76 = x_6.resolution.y;
      if ((x_74 < (x_76 * 0.5f))) {
        x_82 = (x_70 > x_72);
        x_84_phi = x_82;
      } else {
        x_83 = (x_70 < x_72);
        x_84_phi = x_83;
      }
      bool const x_84 = x_84_phi;
      if (x_84) {
        float const x_87 = data.arr[x_69_save];
        float const x_88 = data.arr[x_71_save];
        data.arr[x_69_save] = x_88;
        data.arr[x_71_save] = x_87;
      }
      {
        x_60 = (x_59 + 1);
        x_59_phi = x_60;
      }
    }
    {
      x_53 = (x_52 + 1);
      x_52_phi = x_53;
    }
  }
  float const x_90 = (*(tint_symbol_5)).x;
  float const x_92 = x_6.resolution.x;
  if ((x_90 < (x_92 * 0.5f))) {
    float const x_99 = data.arr[0];
    float const x_102 = data.arr[5];
    float const x_105 = data.arr[9];
    *(tint_symbol_6) = float4((x_99 * 0.100000001f), (x_102 * 0.100000001f), (x_105 * 0.100000001f), 1.0f);
  } else {
    float const x_109 = data.arr[5];
    float const x_112 = data.arr[9];
    float const x_115 = data.arr[0];
    *(tint_symbol_6) = float4((x_109 * 0.100000001f), (x_112 * 0.100000001f), (x_115 * 0.100000001f), 1.0f);
  }
  return;
}

fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_9 [[buffer(0)]], constant buf1& x_6 [[buffer(1)]]) {
  thread float4 tint_symbol_7 = 0.0f;
  thread float4 tint_symbol_8 = 0.0f;
  tint_symbol_7 = gl_FragCoord_param;
  main_1(x_9, x_6, &(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;
}

