static int data[10] = (int[10])0;
static int temp[10] = (int[10])0;
cbuffer cbuffer_x_28 : register(b0, space0) {
  uint4 x_28[1];
};
static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);

void merge_i1_i1_i1_(inout int from, inout int mid, inout int to) {
  int k = 0;
  int i = 0;
  int j = 0;
  int i_1 = 0;
  const int x_262 = from;
  k = x_262;
  const int x_263 = from;
  i = x_263;
  const int x_264 = mid;
  j = (x_264 + 1);
  while (true) {
    const int x_270 = i;
    const int x_271 = mid;
    const int x_273 = j;
    const int x_274 = to;
    if (((x_270 <= x_271) & (x_273 <= x_274))) {
    } else {
      break;
    }
    const int x_280 = data[i];
    const int x_283 = data[j];
    if ((x_280 < x_283)) {
      const int x_288 = k;
      k = (x_288 + 1);
      const int x_290 = i;
      i = (x_290 + 1);
      const int x_293 = data[x_290];
      temp[x_288] = x_293;
    } else {
      const int x_295 = k;
      k = (x_295 + 1);
      const int x_297 = j;
      j = (x_297 + 1);
      const int x_300 = data[x_297];
      temp[x_295] = x_300;
    }
  }
  while (true) {
    const int x_306 = i;
    const int x_308 = i;
    const int x_309 = mid;
    if (((x_306 < 10) & (x_308 <= x_309))) {
    } else {
      break;
    }
    const int x_313 = k;
    k = (x_313 + 1);
    const int x_315 = i;
    i = (x_315 + 1);
    const int x_318 = data[x_315];
    temp[x_313] = x_318;
  }
  const int x_320 = from;
  i_1 = x_320;
  while (true) {
    const int x_325 = i_1;
    const int x_326 = to;
    if ((x_325 <= x_326)) {
    } else {
      break;
    }
    const int x_329 = i_1;
    const int x_332 = temp[i_1];
    data[x_329] = x_332;
    {
      i_1 = (i_1 + 1);
    }
  }
  return;
}

void mergeSort_() {
  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;
  {
    for(; (m <= high); m = (2 * m)) {
      i_2 = low;
      {
        for(; (i_2 < high); i_2 = (i_2 + (2 * m))) {
          from_1 = i_2;
          mid_1 = ((i_2 + m) - 1);
          to_1 = min(((i_2 + (2 * m)) - 1), high);
          param = from_1;
          param_1 = mid_1;
          param_2 = to_1;
          merge_i1_i1_i1_(param, param_1, param_2);
        }
      }
    }
  }
  return;
}

void main_1() {
  int i_3 = 0;
  int j_1 = 0;
  float grey = 0.0f;
  int int_i = 0;
  const float x_85 = asfloat(x_28[0].x);
  i_3 = int(x_85);
  while (true) {
    switch(i_3) {
      case 9: {
        data[i_3] = -5;
        break;
      }
      case 8: {
        data[i_3] = -4;
        break;
      }
      case 7: {
        data[i_3] = -3;
        break;
      }
      case 6: {
        data[i_3] = -2;
        break;
      }
      case 5: {
        data[i_3] = -1;
        break;
      }
      case 4: {
        data[i_3] = 0;
        break;
      }
      case 3: {
        data[i_3] = 1;
        break;
      }
      case 2: {
        data[i_3] = 2;
        break;
      }
      case 1: {
        data[i_3] = 3;
        break;
      }
      case 0: {
        data[i_3] = 4;
        break;
      }
      default: {
        break;
      }
    }
    i_3 = (i_3 + 1);
    {
      if ((i_3 < 10)) {
      } else {
        break;
      }
    }
  }
  j_1 = 0;
  {
    for(; (j_1 < 10); j_1 = (j_1 + 1)) {
      const int x_134 = j_1;
      const int x_137 = data[j_1];
      temp[x_134] = x_137;
    }
  }
  mergeSort_();
  const float x_143 = gl_FragCoord.y;
  if ((int(x_143) < 30)) {
    const int x_150 = data[0];
    grey = (0.5f + (float(x_150) / 10.0f));
  } else {
    const float x_155 = gl_FragCoord.y;
    if ((int(x_155) < 60)) {
      const int x_162 = data[1];
      grey = (0.5f + (float(x_162) / 10.0f));
    } else {
      const float x_167 = gl_FragCoord.y;
      if ((int(x_167) < 90)) {
        const int x_174 = data[2];
        grey = (0.5f + (float(x_174) / 10.0f));
      } else {
        const float x_179 = gl_FragCoord.y;
        if ((int(x_179) < 120)) {
          const int x_186 = data[3];
          grey = (0.5f + (float(x_186) / 10.0f));
        } else {
          const float x_191 = gl_FragCoord.y;
          if ((int(x_191) < 150)) {
            int_i = 1;
            while (true) {
              const int x_201 = int_i;
              const float x_203 = asfloat(x_28[0].x);
              if ((x_201 > int(x_203))) {
              } else {
                break;
              }
              discard;
            }
          } else {
            const float x_208 = gl_FragCoord.y;
            if ((int(x_208) < 180)) {
              const int x_215 = data[5];
              grey = (0.5f + (float(x_215) / 10.0f));
            } else {
              const float x_220 = gl_FragCoord.y;
              if ((int(x_220) < 210)) {
                const int x_227 = data[6];
                grey = (0.5f + (float(x_227) / 10.0f));
              } else {
                const float x_232 = gl_FragCoord.y;
                if ((int(x_232) < 240)) {
                  const int x_239 = data[7];
                  grey = (0.5f + (float(x_239) / 10.0f));
                } else {
                  const float x_244 = gl_FragCoord.y;
                  if ((int(x_244) < 270)) {
                    const int x_251 = data[8];
                    grey = (0.5f + (float(x_251) / 10.0f));
                  } else {
                    discard;
                  }
                }
              }
            }
          }
        }
      }
    }
  }
  const float x_255 = grey;
  const float3 x_256 = float3(x_255, x_255, x_255);
  x_GLF_color = float4(x_256.x, x_256.y, x_256.z, 1.0f);
  return;
}

struct main_out {
  float4 x_GLF_color_1;
};
struct tint_symbol_1 {
  float4 gl_FragCoord_param : SV_Position;
};
struct tint_symbol_2 {
  float4 x_GLF_color_1 : SV_Target0;
};

tint_symbol_2 main(tint_symbol_1 tint_symbol) {
  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
  gl_FragCoord = gl_FragCoord_param;
  main_1();
  const main_out tint_symbol_3 = {x_GLF_color};
  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
  return tint_symbol_5;
}
