#include <metal_stdlib>

using namespace metal;
struct ssbOut {
  /* 0x0000 */ float result[1];
};
struct ssbA {
  /* 0x0000 */ float A[1];
};
struct Uniforms {
  /* 0x0000 */ float tint_symbol;
  /* 0x0004 */ int aShape;
  /* 0x0008 */ int outShape;
  /* 0x000c */ int outShapeStrides;
  /* 0x0010 */ int size;
};

float getAAtOutCoords_(const device ssbA& x_20, thread uint3* const tint_symbol_2) {
  uint const x_42 = (*(tint_symbol_2)).x;
  float const x_44 = x_20.A[x_42];
  return x_44;
}

float unaryOperation_f1_(thread float* const a) {
  float const x_47 = *(a);
  if ((x_47 < 0.0f)) {
    return INFINITY;
  }
  float const x_55 = *(a);
  return log(x_55);
}

void setOutput_i1_f1_(device ssbOut& x_16, thread int* const flatIndex, thread float* const value) {
  int const x_27 = *(flatIndex);
  float const x_28 = *(value);
  x_16.result[x_27] = x_28;
  return;
}

void main_1(constant Uniforms& x_24, const device ssbA& x_20, device ssbOut& x_16, thread uint3* const tint_symbol_3) {
  int index = 0;
  float a_1 = 0.0f;
  float param = 0.0f;
  int param_1 = 0;
  float param_2 = 0.0f;
  uint const x_61 = (*(tint_symbol_3)).x;
  index = as_type<int>(x_61);
  int const x_63 = index;
  int const x_70 = x_24.size;
  if ((x_63 < x_70)) {
    float const x_75 = getAAtOutCoords_(x_20, tint_symbol_3);
    a_1 = x_75;
    float const x_77 = a_1;
    param = x_77;
    float const x_78 = unaryOperation_f1_(&(param));
    int const x_80 = index;
    param_1 = x_80;
    param_2 = x_78;
    setOutput_i1_f1_(x_16, &(param_1), &(param_2));
  }
  return;
}

void tint_symbol_1_inner(constant Uniforms& x_24, const device ssbA& x_20, device ssbOut& x_16, uint3 gl_GlobalInvocationID_param, thread uint3* const tint_symbol_4) {
  *(tint_symbol_4) = gl_GlobalInvocationID_param;
  main_1(x_24, x_20, x_16, tint_symbol_4);
}

kernel void tint_symbol_1(uint3 gl_GlobalInvocationID_param [[thread_position_in_grid]], constant Uniforms& x_24 [[buffer(0)]], const device ssbA& x_20 [[buffer(2)]], device ssbOut& x_16 [[buffer(1)]]) {
  thread uint3 tint_symbol_5 = 0u;
  tint_symbol_1_inner(x_24, x_20, x_16, gl_GlobalInvocationID_param, &(tint_symbol_5));
  return;
}

