#include <metal_stdlib>

using namespace metal;

template<typename T, size_t N>
struct tint_array {
    const constant T& operator[](size_t i) const constant { return elements[i]; }
    device T& operator[](size_t i) device { return elements[i]; }
    const device T& operator[](size_t i) const device { return elements[i]; }
    thread T& operator[](size_t i) thread { return elements[i]; }
    const thread T& operator[](size_t i) const thread { return elements[i]; }
    threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
    const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
    T elements[N];
};

struct S {
  /* 0x0000 */ tint_array<int4, 4> a;
};

int idx1(thread uint* const tint_symbol_10) {
  *(tint_symbol_10) = (*(tint_symbol_10) - 1u);
  return 1;
}

int idx2(thread uint* const tint_symbol_11) {
  *(tint_symbol_11) = (*(tint_symbol_11) - 1u);
  return 2;
}

int idx3(thread uint* const tint_symbol_12) {
  *(tint_symbol_12) = (*(tint_symbol_12) - 1u);
  return 3;
}

int idx4(thread uint* const tint_symbol_13) {
  *(tint_symbol_13) = (*(tint_symbol_13) - 1u);
  return 4;
}

int idx5(thread uint* const tint_symbol_14) {
  *(tint_symbol_14) = (*(tint_symbol_14) - 1u);
  return 0;
}

int idx6(thread uint* const tint_symbol_15) {
  *(tint_symbol_15) = (*(tint_symbol_15) - 1u);
  return 2;
}

void tint_symbol_1(thread uint* const tint_symbol_16, device tint_array<S, 1>* const tint_symbol_17) {
  int const tint_symbol_6 = idx1(tint_symbol_16);
  int const tint_symbol_7 = idx2(tint_symbol_16);
  int const tint_symbol_2_save = tint_symbol_6;
  int const tint_symbol_2_save_1 = tint_symbol_7;
  int const tint_symbol_3 = idx3(tint_symbol_16);
  {
    (*(tint_symbol_17))[tint_symbol_2_save].a[tint_symbol_2_save_1][tint_symbol_3] = as_type<int>((as_type<uint>((*(tint_symbol_17))[tint_symbol_2_save].a[tint_symbol_2_save_1][tint_symbol_3]) - as_type<uint>(1)));
    while (true) {
      if (!((*(tint_symbol_16) < 10u))) {
        break;
      }
      {
      }
      {
        int const tint_symbol_8 = idx4(tint_symbol_16);
        int const tint_symbol_9 = idx5(tint_symbol_16);
        int const tint_symbol_4_save = tint_symbol_8;
        int const tint_symbol_4_save_1 = tint_symbol_9;
        int const tint_symbol_5 = idx6(tint_symbol_16);
        (*(tint_symbol_17))[tint_symbol_4_save].a[tint_symbol_4_save_1][tint_symbol_5] = as_type<int>((as_type<uint>((*(tint_symbol_17))[tint_symbol_4_save].a[tint_symbol_4_save_1][tint_symbol_5]) - as_type<uint>(1)));
      }
    }
  }
}

