struct QuicksortObject {
  numbers : array<i32, 10>;
};

struct buf1 {
  resolution : vec2<f32>;
};

struct buf0 {
  injectionSwitch : vec2<f32>;
};

var<private> obj : QuicksortObject;

var<private> x_GLF_FragCoord : vec4<f32>;

var<private> x_GLF_pos : vec4<f32>;

[[group(0), binding(1)]] var<uniform> x_34 : buf1;

[[group(0), binding(0)]] var<uniform> x_37 : buf0;

var<private> frag_color : vec4<f32>;

var<private> gl_Position : vec4<f32>;

fn swap_i1_i1_(i : ptr<function, i32>, j : ptr<function, i32>) {
  var temp : i32;
  let x_257 : i32 = *(i);
  let x_259 : i32 = obj.numbers[x_257];
  temp = x_259;
  let x_260 : i32 = *(i);
  let x_261 : i32 = *(j);
  let x_263 : i32 = obj.numbers[x_261];
  obj.numbers[x_260] = x_263;
  let x_265 : i32 = *(j);
  let x_266 : i32 = temp;
  obj.numbers[x_265] = x_266;
  return;
}

fn performPartition_i1_i1_(l : ptr<function, i32>, h : ptr<function, i32>) -> i32 {
  var pivot : i32;
  var i_1 : i32;
  var j_1 : i32;
  var param : i32;
  var param_1 : i32;
  var param_2 : i32;
  var param_3 : i32;
  let x_269 : i32 = *(h);
  let x_271 : i32 = obj.numbers[x_269];
  pivot = x_271;
  let x_272 : i32 = *(l);
  i_1 = (x_272 - 1);
  let x_274 : i32 = *(l);
  j_1 = x_274;
  loop {
    let x_279 : i32 = j_1;
    let x_280 : i32 = *(h);
    if ((x_279 <= (x_280 - 1))) {
    } else {
      break;
    }
    let x_284 : i32 = j_1;
    let x_286 : i32 = obj.numbers[x_284];
    let x_287 : i32 = pivot;
    if ((x_286 <= x_287)) {
      let x_291 : i32 = i_1;
      i_1 = (x_291 + 1);
      let x_293 : i32 = i_1;
      param = x_293;
      let x_294 : i32 = j_1;
      param_1 = x_294;
      swap_i1_i1_(&(param), &(param_1));
    }

    continuing {
      let x_296 : i32 = j_1;
      j_1 = (x_296 + 1);
    }
  }
  let x_298 : i32 = i_1;
  param_2 = (x_298 + 1);
  let x_300 : i32 = *(h);
  param_3 = x_300;
  swap_i1_i1_(&(param_2), &(param_3));
  let x_302 : i32 = i_1;
  return (x_302 + 1);
}

fn quicksort_() {
  var l_1 : i32;
  var h_1 : i32;
  var top : i32;
  var stack : array<i32, 10>;
  var p : i32;
  var param_4 : i32;
  var param_5 : i32;
  l_1 = 0;
  h_1 = 9;
  top = -1;
  let x_305 : i32 = top;
  let x_306 : i32 = (x_305 + 1);
  top = x_306;
  let x_307 : i32 = l_1;
  stack[x_306] = x_307;
  let x_309 : i32 = top;
  let x_310 : i32 = (x_309 + 1);
  top = x_310;
  let x_311 : i32 = h_1;
  stack[x_310] = x_311;
  loop {
    let x_317 : i32 = top;
    if ((x_317 >= 0)) {
    } else {
      break;
    }
    let x_320 : i32 = top;
    top = (x_320 - 1);
    let x_323 : i32 = stack[x_320];
    h_1 = x_323;
    let x_324 : i32 = top;
    top = (x_324 - 1);
    let x_327 : i32 = stack[x_324];
    l_1 = x_327;
    let x_328 : i32 = l_1;
    param_4 = x_328;
    let x_329 : i32 = h_1;
    param_5 = x_329;
    let x_330 : i32 = performPartition_i1_i1_(&(param_4), &(param_5));
    p = x_330;
    let x_331 : i32 = p;
    let x_333 : i32 = l_1;
    if (((x_331 - 1) > x_333)) {
      let x_337 : i32 = top;
      let x_338 : i32 = (x_337 + 1);
      top = x_338;
      let x_339 : i32 = l_1;
      stack[x_338] = x_339;
      let x_341 : i32 = top;
      let x_342 : i32 = (x_341 + 1);
      top = x_342;
      let x_343 : i32 = p;
      stack[x_342] = (x_343 - 1);
    }
    let x_346 : i32 = p;
    let x_348 : i32 = h_1;
    if (((x_346 + 1) < x_348)) {
      let x_352 : i32 = top;
      let x_353 : i32 = (x_352 + 1);
      top = x_353;
      let x_354 : i32 = p;
      stack[x_353] = (x_354 + 1);
      let x_357 : i32 = top;
      let x_358 : i32 = (x_357 + 1);
      top = x_358;
      let x_359 : i32 = h_1;
      stack[x_358] = x_359;
    }
  }
  return;
}

fn main_1() {
  var i_2 : i32;
  var uv : vec2<f32>;
  var color : vec3<f32>;
  let x_94 : vec4<f32> = x_GLF_pos;
  x_GLF_FragCoord = ((x_94 + vec4<f32>(1.0, 1.0, 0.0, 0.0)) * vec4<f32>(128.0, 128.0, 1.0, 1.0));
  i_2 = 0;
  loop {
    let x_101 : i32 = i_2;
    if ((x_101 < 10)) {
    } else {
      break;
    }
    let x_104 : i32 = i_2;
    let x_105 : i32 = i_2;
    obj.numbers[x_104] = (10 - x_105);
    let x_108 : i32 = i_2;
    let x_109 : i32 = i_2;
    let x_111 : i32 = obj.numbers[x_109];
    let x_112 : i32 = i_2;
    let x_114 : i32 = obj.numbers[x_112];
    obj.numbers[x_108] = (x_111 * x_114);

    continuing {
      let x_117 : i32 = i_2;
      i_2 = (x_117 + 1);
    }
  }
  quicksort_();
  let x_120 : vec4<f32> = x_GLF_FragCoord;
  let x_123 : vec2<f32> = x_34.resolution;
  uv = (vec2<f32>(x_120.x, x_120.y) / x_123);
  color = vec3<f32>(1.0, 2.0, 3.0);
  let x_126 : i32 = obj.numbers[0];
  let x_129 : f32 = color.x;
  color.x = (x_129 + f32(x_126));
  let x_133 : f32 = uv.x;
  if ((x_133 > 0.25)) {
    let x_138 : i32 = obj.numbers[1];
    let x_141 : f32 = color.x;
    color.x = (x_141 + f32(x_138));
  }
  let x_145 : f32 = uv.x;
  if ((x_145 > 0.5)) {
    let x_150 : f32 = x_37.injectionSwitch.y;
    let x_155 : i32 = obj.numbers[max((2 * i32(x_150)), 2)];
    let x_158 : f32 = x_37.injectionSwitch.y;
    let x_163 : i32 = obj.numbers[max((2 * i32(x_158)), 2)];
    let x_167 : f32 = color.y;
    color.y = (x_167 + max(f32(x_155), f32(x_163)));
  }
  let x_171 : f32 = uv.x;
  if ((x_171 > 0.75)) {
    let x_176 : i32 = obj.numbers[3];
    let x_179 : f32 = color.z;
    color.z = (x_179 + f32(x_176));
  }
  let x_183 : i32 = obj.numbers[4];
  let x_186 : f32 = color.y;
  color.y = (x_186 + f32(x_183));
  let x_190 : f32 = uv.y;
  if ((x_190 > 0.25)) {
    let x_195 : i32 = obj.numbers[5];
    let x_198 : f32 = color.x;
    color.x = (x_198 + f32(x_195));
  }
  let x_202 : f32 = uv.y;
  if ((x_202 > 0.5)) {
    let x_207 : i32 = obj.numbers[6];
    let x_210 : f32 = color.y;
    color.y = (x_210 + f32(x_207));
  }
  let x_214 : f32 = uv.y;
  if ((x_214 > 0.75)) {
    let x_219 : i32 = obj.numbers[7];
    let x_222 : f32 = color.z;
    color.z = (x_222 + f32(x_219));
  }
  let x_226 : i32 = obj.numbers[8];
  let x_229 : f32 = color.z;
  color.z = (x_229 + f32(x_226));
  let x_233 : f32 = uv.x;
  let x_235 : f32 = uv.y;
  if ((abs((x_233 - x_235)) < 0.25)) {
    let x_242 : i32 = obj.numbers[9];
    let x_245 : f32 = color.x;
    color.x = (x_245 + f32(x_242));
  }
  let x_248 : vec3<f32> = color;
  let x_249 : vec3<f32> = normalize(x_248);
  frag_color = vec4<f32>(x_249.x, x_249.y, x_249.z, 1.0);
  let x_254 : vec4<f32> = x_GLF_pos;
  gl_Position = x_254;
  return;
}

struct main_out {
  [[location(0)]]
  frag_color_1 : vec4<f32>;
  [[builtin(position)]]
  gl_Position : vec4<f32>;
};

[[stage(vertex)]]
fn main([[location(0)]] x_GLF_pos_param : vec4<f32>) -> main_out {
  x_GLF_pos = x_GLF_pos_param;
  main_1();
  return main_out(frag_color, gl_Position);
}
