#include <metal_stdlib>

using namespace metal;
struct buf0 {
  /* 0x0000 */ packed_float2 injectionSwitch;
};
struct buf1 {
  /* 0x0000 */ packed_float2 resolution;
};
struct tint_array_wrapper {
  int arr[10];
};
struct main_out {
  float4 x_GLF_color_1;
};
struct tint_symbol_1 {
  float4 x_GLF_color_1 [[color(0)]];
};

void merge_i1_i1_i1_(thread int* const from, thread int* const mid, thread int* const to, thread tint_array_wrapper* const tint_symbol_3, thread tint_array_wrapper* const tint_symbol_4) {
  int k = 0;
  int i = 0;
  int j = 0;
  int i_1 = 0;
  int const x_254 = *(from);
  k = x_254;
  int const x_255 = *(from);
  i = x_255;
  int const x_256 = *(mid);
  j = as_type<int>((as_type<uint>(x_256) + as_type<uint>(1)));
  while (true) {
    int const x_262 = i;
    int const x_263 = *(mid);
    int const x_265 = j;
    int const x_266 = *(to);
    if (((x_262 <= x_263) & (x_265 <= x_266))) {
    } else {
      break;
    }
    int const x_270 = i;
    int const x_272 = (*(tint_symbol_3)).arr[x_270];
    int const x_273 = j;
    int const x_275 = (*(tint_symbol_3)).arr[x_273];
    if ((x_272 < x_275)) {
      int const x_280 = k;
      k = as_type<int>((as_type<uint>(x_280) + as_type<uint>(1)));
      int const x_282 = i;
      i = as_type<int>((as_type<uint>(x_282) + as_type<uint>(1)));
      int const x_285 = (*(tint_symbol_3)).arr[x_282];
      (*(tint_symbol_4)).arr[x_280] = x_285;
    } else {
      int const x_287 = k;
      k = as_type<int>((as_type<uint>(x_287) + as_type<uint>(1)));
      int const x_289 = j;
      j = as_type<int>((as_type<uint>(x_289) + as_type<uint>(1)));
      int const x_292 = (*(tint_symbol_3)).arr[x_289];
      (*(tint_symbol_4)).arr[x_287] = x_292;
    }
  }
  while (true) {
    int const x_298 = i;
    int const x_300 = i;
    int const x_301 = *(mid);
    if (((x_298 < 10) & (x_300 <= x_301))) {
    } else {
      break;
    }
    int const x_305 = k;
    k = as_type<int>((as_type<uint>(x_305) + as_type<uint>(1)));
    int const x_307 = i;
    i = as_type<int>((as_type<uint>(x_307) + as_type<uint>(1)));
    int const x_310 = (*(tint_symbol_3)).arr[x_307];
    (*(tint_symbol_4)).arr[x_305] = x_310;
  }
  int const x_312 = *(from);
  i_1 = x_312;
  while (true) {
    int const x_317 = i_1;
    int const x_318 = *(to);
    if ((x_317 <= x_318)) {
    } else {
      break;
    }
    int const x_321 = i_1;
    int const x_322 = i_1;
    int const x_324 = (*(tint_symbol_4)).arr[x_322];
    (*(tint_symbol_3)).arr[x_321] = x_324;
    {
      int const x_326 = i_1;
      i_1 = as_type<int>((as_type<uint>(x_326) + as_type<uint>(1)));
    }
  }
  return;
}

void mergeSort_(thread tint_array_wrapper* const tint_symbol_5, thread tint_array_wrapper* const tint_symbol_6) {
  int low = 0;
  int high = 0;
  int m = 0;
  int i_2 = 0;
  int from_1 = 0;
  int mid_1 = 0;
  int to_1 = 0;
  int param = 0;
  int param_1 = 0;
  int param_2 = 0;
  low = 0;
  high = 9;
  m = 1;
  while (true) {
    int const x_333 = m;
    int const x_334 = high;
    if ((x_333 <= x_334)) {
    } else {
      break;
    }
    int const x_337 = low;
    i_2 = x_337;
    while (true) {
      int const x_342 = i_2;
      int const x_343 = high;
      if ((x_342 < x_343)) {
      } else {
        break;
      }
      int const x_346 = i_2;
      from_1 = x_346;
      int const x_347 = i_2;
      int const x_348 = m;
      mid_1 = as_type<int>((as_type<uint>(as_type<int>((as_type<uint>(x_347) + as_type<uint>(x_348)))) - as_type<uint>(1)));
      int const x_351 = i_2;
      int const x_352 = m;
      int const x_356 = high;
      to_1 = min(as_type<int>((as_type<uint>(as_type<int>((as_type<uint>(x_351) + as_type<uint>(as_type<int>((as_type<uint>(2) * as_type<uint>(x_352))))))) - as_type<uint>(1))), x_356);
      int const x_358 = from_1;
      param = x_358;
      int const x_359 = mid_1;
      param_1 = x_359;
      int const x_360 = to_1;
      param_2 = x_360;
      merge_i1_i1_i1_(&(param), &(param_1), &(param_2), tint_symbol_5, tint_symbol_6);
      {
        int const x_362 = m;
        int const x_364 = i_2;
        i_2 = as_type<int>((as_type<uint>(x_364) + as_type<uint>(as_type<int>((as_type<uint>(2) * as_type<uint>(x_362))))));
      }
    }
    {
      int const x_366 = m;
      m = as_type<int>((as_type<uint>(2) * as_type<uint>(x_366)));
    }
  }
  return;
}

void main_1(constant buf0& x_28, thread tint_array_wrapper* const tint_symbol_7, thread tint_array_wrapper* const tint_symbol_8, thread float4* const tint_symbol_9, thread float4* const tint_symbol_10) {
  int i_3 = 0;
  int j_1 = 0;
  float grey = 0.0f;
  float const x_87 = x_28.injectionSwitch.x;
  i_3 = int(x_87);
  while (true) {
    int const x_93 = i_3;
    switch(x_93) {
      case 9: {
        int const x_123 = i_3;
        (*(tint_symbol_7)).arr[x_123] = -5;
        break;
      }
      case 8: {
        int const x_121 = i_3;
        (*(tint_symbol_7)).arr[x_121] = -4;
        break;
      }
      case 7: {
        int const x_119 = i_3;
        (*(tint_symbol_7)).arr[x_119] = -3;
        break;
      }
      case 6: {
        int const x_117 = i_3;
        (*(tint_symbol_7)).arr[x_117] = -2;
        break;
      }
      case 5: {
        int const x_115 = i_3;
        (*(tint_symbol_7)).arr[x_115] = -1;
        break;
      }
      case 4: {
        int const x_113 = i_3;
        (*(tint_symbol_7)).arr[x_113] = 0;
        break;
      }
      case 3: {
        int const x_111 = i_3;
        (*(tint_symbol_7)).arr[x_111] = 1;
        break;
      }
      case 2: {
        int const x_109 = i_3;
        (*(tint_symbol_7)).arr[x_109] = 2;
        break;
      }
      case 1: {
        int const x_107 = i_3;
        (*(tint_symbol_7)).arr[x_107] = 3;
        break;
      }
      case 0: {
        int const x_105 = i_3;
        (*(tint_symbol_7)).arr[x_105] = 4;
        break;
      }
      default: {
        break;
      }
    }
    int const x_125 = i_3;
    i_3 = as_type<int>((as_type<uint>(x_125) + as_type<uint>(1)));
    {
      int const x_127 = i_3;
      if ((x_127 < 10)) {
      } else {
        break;
      }
    }
  }
  j_1 = 0;
  while (true) {
    int const x_133 = j_1;
    if ((x_133 < 10)) {
    } else {
      break;
    }
    int const x_136 = j_1;
    int const x_137 = j_1;
    int const x_139 = (*(tint_symbol_7)).arr[x_137];
    (*(tint_symbol_8)).arr[x_136] = x_139;
    {
      int const x_141 = j_1;
      j_1 = as_type<int>((as_type<uint>(x_141) + as_type<uint>(1)));
    }
  }
  mergeSort_(tint_symbol_7, tint_symbol_8);
  float const x_145 = (*(tint_symbol_9)).y;
  if ((int(x_145) < 30)) {
    int const x_152 = (*(tint_symbol_7)).arr[0];
    grey = (0.5f + (float(x_152) / 10.0f));
  } else {
    float const x_157 = (*(tint_symbol_9)).y;
    if ((int(x_157) < 60)) {
      int const x_164 = (*(tint_symbol_7)).arr[1];
      grey = (0.5f + (float(x_164) / 10.0f));
    } else {
      float const x_169 = (*(tint_symbol_9)).y;
      if ((int(x_169) < 90)) {
        int const x_176 = (*(tint_symbol_7)).arr[2];
        grey = (0.5f + (float(x_176) / 10.0f));
      } else {
        float const x_181 = (*(tint_symbol_9)).y;
        if ((int(x_181) < 120)) {
          int const x_188 = (*(tint_symbol_7)).arr[3];
          grey = (0.5f + (float(x_188) / 10.0f));
        } else {
          float const x_193 = (*(tint_symbol_9)).y;
          if ((int(x_193) < 150)) {
            discard_fragment();
          } else {
            float const x_200 = (*(tint_symbol_9)).y;
            if ((int(x_200) < 180)) {
              int const x_207 = (*(tint_symbol_7)).arr[5];
              grey = (0.5f + (float(x_207) / 10.0f));
            } else {
              float const x_212 = (*(tint_symbol_9)).y;
              if ((int(x_212) < 210)) {
                int const x_219 = (*(tint_symbol_7)).arr[6];
                grey = (0.5f + (float(x_219) / 10.0f));
              } else {
                float const x_224 = (*(tint_symbol_9)).y;
                if ((int(x_224) < 240)) {
                  int const x_231 = (*(tint_symbol_7)).arr[7];
                  grey = (0.5f + (float(x_231) / 10.0f));
                } else {
                  float const x_236 = (*(tint_symbol_9)).y;
                  if ((int(x_236) < 270)) {
                    int const x_243 = (*(tint_symbol_7)).arr[8];
                    grey = (0.5f + (float(x_243) / 10.0f));
                  } else {
                    discard_fragment();
                  }
                }
              }
            }
          }
        }
      }
    }
  }
  float const x_247 = grey;
  float3 const x_248 = float3(x_247, x_247, x_247);
  *(tint_symbol_10) = float4(x_248.x, x_248.y, x_248.z, 1.0f);
  return;
}

main_out tint_symbol_inner(constant buf0& x_28, float4 gl_FragCoord_param, thread float4* const tint_symbol_11, thread tint_array_wrapper* const tint_symbol_12, thread tint_array_wrapper* const tint_symbol_13, thread float4* const tint_symbol_14) {
  *(tint_symbol_11) = gl_FragCoord_param;
  main_1(x_28, tint_symbol_12, tint_symbol_13, tint_symbol_11, tint_symbol_14);
  main_out const tint_symbol_2 = {.x_GLF_color_1=*(tint_symbol_14)};
  return tint_symbol_2;
}

fragment tint_symbol_1 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_28 [[buffer(0)]]) {
  thread float4 tint_symbol_15 = 0.0f;
  thread tint_array_wrapper tint_symbol_16 = {};
  thread tint_array_wrapper tint_symbol_17 = {};
  thread float4 tint_symbol_18 = 0.0f;
  main_out const inner_result = tint_symbol_inner(x_28, gl_FragCoord_param, &(tint_symbol_15), &(tint_symbol_16), &(tint_symbol_17), &(tint_symbol_18));
  tint_symbol_1 wrapper_result = {};
  wrapper_result.x_GLF_color_1 = inner_result.x_GLF_color_1;
  return wrapper_result;
}

