#include <metal_stdlib>

using namespace metal;

template<typename T, int N, int M>
inline vec<T, M> operator*(matrix<T, N, M> lhs, packed_vec<T, N> rhs) {
  return lhs * vec<T, N>(rhs);
}

template<typename T, int N, int M>
inline vec<T, N> operator*(packed_vec<T, M> lhs, matrix<T, N, M> rhs) {
  return vec<T, M>(lhs) * rhs;
}

struct tint_array_wrapper {
  /* 0x0000 */ int4 arr[4];
};
struct Inner {
  /* 0x0000 */ packed_int3 a;
  /* 0x000c */ int b;
  /* 0x0010 */ packed_uint3 c;
  /* 0x001c */ uint d;
  /* 0x0020 */ packed_float3 e;
  /* 0x002c */ float f;
  /* 0x0030 */ float2x3 g;
  /* 0x0050 */ float3x2 h;
  /* 0x0068 */ int8_t tint_pad[8];
  /* 0x0070 */ tint_array_wrapper i;
};
struct S {
  /* 0x0000 */ Inner arr[1];
};

void tint_symbol_inner(uint idx, device S* const tint_symbol_2) {
  (*(tint_symbol_2)).arr[idx].a = int3();
  (*(tint_symbol_2)).arr[idx].b = int();
  (*(tint_symbol_2)).arr[idx].c = uint3();
  (*(tint_symbol_2)).arr[idx].d = uint();
  (*(tint_symbol_2)).arr[idx].e = float3();
  (*(tint_symbol_2)).arr[idx].f = float();
  (*(tint_symbol_2)).arr[idx].g = float2x3();
  (*(tint_symbol_2)).arr[idx].h = float3x2();
  tint_array_wrapper const tint_symbol_1 = {.arr={}};
  (*(tint_symbol_2)).arr[idx].i = tint_symbol_1;
}

kernel void tint_symbol(device S* tint_symbol_3 [[buffer(0)]], uint idx [[thread_index_in_threadgroup]]) {
  tint_symbol_inner(idx, tint_symbol_3);
  return;
}

