#include <stddef.h>
#include <stdio.h>
#include <stdalign.h>
#include <stdlib.h>
#include "HsFFI.h"
typedef struct C0{
} C0;

C0 * newC0(){
    C0 * ret = (C0*) malloc(sizeof(C0));
    return ret;
}

void pokeC0(C0* val){
}

int checkOffsetsC0(HsInt16 *offs){
    return 1;
}

int checkFieldsC0(C0* s1, C0* s2){
    return 1; 
}

HsInt16 getSizeC0() {
    return sizeof(C0);
}

HsInt16 getAlignmentC0() {
    return alignof(C0);
}

typedef struct C1{
    HsInt32 a;
    HsInt32 b;
} C1;

C1 * newC1(HsInt32 a, HsInt32 b){
    C1 * ret = (C1*) malloc(sizeof(C1));
    ret->a = a;
    ret->b = b;
    return ret;
}

void pokeC1(C1* val, HsInt32 a, HsInt32 b){
    val->a = a;
    val->b = b;
}

int checkOffsetsC1(HsInt16 *offs){
    int a = offsetof(C1, a) == offs[0];
    int b = offsetof(C1, b) == offs[1];
    return a && b;
}

int checkFieldsC1(C1* s1, C1* s2){
    int a = s1->a == s2->a;
    int b = s1->b == s2->b;
    return a && b;
}

HsInt16 getSizeC1() {
    return sizeof(C1);
}

HsInt16 getAlignmentC1() {
    return alignof(C1);
}

typedef struct C2{
    HsInt32 a;
    C0 b;
    HsInt16 c;
    HsInt8 d;
} C2;

C2 * newC2(HsInt32 a, C0* b, HsInt16 c, HsInt8 d){
    C2 * ret = (C2*) malloc(sizeof(C2));
    ret->a = a;
    ret->b = *b;
    ret->c = c;
    ret->d = d;
    return ret;
}

void pokeC2(C2* val, HsInt32 a, C0* b, HsInt16 c, HsInt8 d){
    val->a = a;
    val->b = *b;
    val->c = c;
    val->d = d;
}

int checkOffsetsC2(HsInt16 *offs){
    int a = offsetof(C2, a) == offs[0];
    int b = offsetof(C2, b) == offs[1];
    int c = offsetof(C2, c) == offs[2];
    int d = offsetof(C2, d) == offs[3];
    return a && b && c && d;
}

int checkFieldsC2(C2* s1, C2* s2){
    int a = s1->a == s2->a;
    int b = checkFieldsC0(&(s1->b),&(s2->b));
    int c = s1->c == s2->c;
    int d = s1->d == s2->d;
    return a && b && c && d;
}

HsInt16 getSizeC2() {
    return sizeof(C2);
}

HsInt16 getAlignmentC2() {
    return alignof(C2);
}

typedef struct C3{
    HsInt32 a;
    HsInt8 b;
    HsInt16 c;
} C3;

C3 * newC3(HsInt32 a, HsInt8 b, HsInt16 c){
    C3 * ret = (C3*) malloc(sizeof(C3));
    ret->a = a;
    ret->b = b;
    ret->c = c;
    return ret;
}

void pokeC3(C3* val, HsInt32 a, HsInt8 b, HsInt16 c){
    val->a = a;
    val->b = b;
    val->c = c;
}

int checkOffsetsC3(HsInt16 *offs){
    int a = offsetof(C3, a) == offs[0];
    int b = offsetof(C3, b) == offs[1];
    int c = offsetof(C3, c) == offs[2];
    return a && b && c;
}

int checkFieldsC3(C3* s1, C3* s2){
    int a = s1->a == s2->a;
    int b = s1->b == s2->b;
    int c = s1->c == s2->c;
    return a && b && c;
}

HsInt16 getSizeC3() {
    return sizeof(C3);
}

HsInt16 getAlignmentC3() {
    return alignof(C3);
}

typedef struct C4{
    HsInt32 a;
    HsInt8 b;
    HsInt8 c;
} C4;

C4 * newC4(HsInt32 a, HsInt8 b, HsInt8 c){
    C4 * ret = (C4*) malloc(sizeof(C4));
    ret->a = a;
    ret->b = b;
    ret->c = c;
    return ret;
}

void pokeC4(C4* val, HsInt32 a, HsInt8 b, HsInt8 c){
    val->a = a;
    val->b = b;
    val->c = c;
}

int checkOffsetsC4(HsInt16 *offs){
    int a = offsetof(C4, a) == offs[0];
    int b = offsetof(C4, b) == offs[1];
    int c = offsetof(C4, c) == offs[2];
    return a && b && c;
}

int checkFieldsC4(C4* s1, C4* s2){
    int a = s1->a == s2->a;
    int b = s1->b == s2->b;
    int c = s1->c == s2->c;
    return a && b && c;
}

HsInt16 getSizeC4() {
    return sizeof(C4);
}

HsInt16 getAlignmentC4() {
    return alignof(C4);
}

typedef struct C5{
    C0 a;
    C0 b;
    HsInt32 c;
    HsInt16 d;
    HsInt8 e;
    HsInt8 f;
    HsInt8 g;
} C5;

C5 * newC5(C0* a, C0* b, HsInt32 c, HsInt16 d, HsInt8 e, HsInt8 f, HsInt8 g){
    C5 * ret = (C5*) malloc(sizeof(C5));
    ret->a = *a;
    ret->b = *b;
    ret->c = c;
    ret->d = d;
    ret->e = e;
    ret->f = f;
    ret->g = g;
    return ret;
}

void pokeC5(C5* val, C0* a, C0* b, HsInt32 c, HsInt16 d, HsInt8 e, HsInt8 f, HsInt8 g){
    val->a = *a;
    val->b = *b;
    val->c = c;
    val->d = d;
    val->e = e;
    val->f = f;
    val->g = g;
}

int checkOffsetsC5(HsInt16 *offs){
    int a = offsetof(C5, a) == offs[0];
    int b = offsetof(C5, b) == offs[1];
    int c = offsetof(C5, c) == offs[2];
    int d = offsetof(C5, d) == offs[3];
    int e = offsetof(C5, e) == offs[4];
    int f = offsetof(C5, f) == offs[5];
    int g = offsetof(C5, g) == offs[6];
    return a && b && c && d && e && f && g;
}

int checkFieldsC5(C5* s1, C5* s2){
    int a = checkFieldsC0(&(s1->a),&(s2->a));
    int b = checkFieldsC0(&(s1->b),&(s2->b));
    int c = s1->c == s2->c;
    int d = s1->d == s2->d;
    int e = s1->e == s2->e;
    int f = s1->f == s2->f;
    int g = s1->g == s2->g;
    return a && b && c && d && e && f && g;
}

HsInt16 getSizeC5() {
    return sizeof(C5);
}

HsInt16 getAlignmentC5() {
    return alignof(C5);
}

typedef struct C6{
    HsInt64 a;
    HsInt8 b;
    HsInt64 c;
} C6;

C6 * newC6(HsInt64 a, HsInt8 b, HsInt64 c){
    C6 * ret = (C6*) malloc(sizeof(C6));
    ret->a = a;
    ret->b = b;
    ret->c = c;
    return ret;
}

void pokeC6(C6* val, HsInt64 a, HsInt8 b, HsInt64 c){
    val->a = a;
    val->b = b;
    val->c = c;
}

int checkOffsetsC6(HsInt16 *offs){
    int a = offsetof(C6, a) == offs[0];
    int b = offsetof(C6, b) == offs[1];
    int c = offsetof(C6, c) == offs[2];
    return a && b && c;
}

int checkFieldsC6(C6* s1, C6* s2){
    int a = s1->a == s2->a;
    int b = s1->b == s2->b;
    int c = s1->c == s2->c;
    return a && b && c;
}

HsInt16 getSizeC6() {
    return sizeof(C6);
}

HsInt16 getAlignmentC6() {
    return alignof(C6);
}

typedef struct C7{
    C1 a;
    HsInt32 b;
} C7;

C7 * newC7(C1* a, HsInt32 b){
    C7 * ret = (C7*) malloc(sizeof(C7));
    ret->a = *a;
    ret->b = b;
    return ret;
}

void pokeC7(C7* val, C1* a, HsInt32 b){
    val->a = *a;
    val->b = b;
}

int checkOffsetsC7(HsInt16 *offs){
    int a = offsetof(C7, a) == offs[0];
    int b = offsetof(C7, b) == offs[1];
    return a && b;
}

int checkFieldsC7(C7* s1, C7* s2){
    int a = checkFieldsC1(&(s1->a),&(s2->a));
    int b = s1->b == s2->b;
    return a && b;
}

HsInt16 getSizeC7() {
    return sizeof(C7);
}

HsInt16 getAlignmentC7() {
    return alignof(C7);
}

typedef struct C8{
    C2 a;
    HsInt8 b;
    C4 c;
} C8;

C8 * newC8(C2* a, HsInt8 b, C4* c){
    C8 * ret = (C8*) malloc(sizeof(C8));
    ret->a = *a;
    ret->b = b;
    ret->c = *c;
    return ret;
}

void pokeC8(C8* val, C2* a, HsInt8 b, C4* c){
    val->a = *a;
    val->b = b;
    val->c = *c;
}

int checkOffsetsC8(HsInt16 *offs){
    int a = offsetof(C8, a) == offs[0];
    int b = offsetof(C8, b) == offs[1];
    int c = offsetof(C8, c) == offs[2];
    return a && b && c;
}

int checkFieldsC8(C8* s1, C8* s2){
    int a = checkFieldsC2(&(s1->a),&(s2->a));
    int b = s1->b == s2->b;
    int c = checkFieldsC4(&(s1->c),&(s2->c));
    return a && b && c;
}

HsInt16 getSizeC8() {
    return sizeof(C8);
}

HsInt16 getAlignmentC8() {
    return alignof(C8);
}

typedef struct C9{
    C5 a;
    HsInt8 b;
    HsInt8 c;
    HsInt8 d;
} C9;

C9 * newC9(C5* a, HsInt8 b, HsInt8 c, HsInt8 d){
    C9 * ret = (C9*) malloc(sizeof(C9));
    ret->a = *a;
    ret->b = b;
    ret->c = c;
    ret->d = d;
    return ret;
}

void pokeC9(C9* val, C5* a, HsInt8 b, HsInt8 c, HsInt8 d){
    val->a = *a;
    val->b = b;
    val->c = c;
    val->d = d;
}

int checkOffsetsC9(HsInt16 *offs){
    int a = offsetof(C9, a) == offs[0];
    int b = offsetof(C9, b) == offs[1];
    int c = offsetof(C9, c) == offs[2];
    int d = offsetof(C9, d) == offs[3];
    return a && b && c && d;
}

int checkFieldsC9(C9* s1, C9* s2){
    int a = checkFieldsC5(&(s1->a),&(s2->a));
    int b = s1->b == s2->b;
    int c = s1->c == s2->c;
    int d = s1->d == s2->d;
    return a && b && c && d;
}

HsInt16 getSizeC9() {
    return sizeof(C9);
}

HsInt16 getAlignmentC9() {
    return alignof(C9);
}

typedef struct C10{
    C8 a;
    HsInt64 b;
    C1 c;
} C10;

C10 * newC10(C8* a, HsInt64 b, C1* c){
    C10 * ret = (C10*) malloc(sizeof(C10));
    ret->a = *a;
    ret->b = b;
    ret->c = *c;
    return ret;
}

void pokeC10(C10* val, C8* a, HsInt64 b, C1* c){
    val->a = *a;
    val->b = b;
    val->c = *c;
}

int checkOffsetsC10(HsInt16 *offs){
    int a = offsetof(C10, a) == offs[0];
    int b = offsetof(C10, b) == offs[1];
    int c = offsetof(C10, c) == offs[2];
    return a && b && c;
}

int checkFieldsC10(C10* s1, C10* s2){
    int a = checkFieldsC8(&(s1->a),&(s2->a));
    int b = s1->b == s2->b;
    int c = checkFieldsC1(&(s1->c),&(s2->c));
    return a && b && c;
}

HsInt16 getSizeC10() {
    return sizeof(C10);
}

HsInt16 getAlignmentC10() {
    return alignof(C10);
}

typedef struct C11{
    C10 a;
    C10 b;
} C11;

C11 * newC11(C10* a, C10* b){
    C11 * ret = (C11*) malloc(sizeof(C11));
    ret->a = *a;
    ret->b = *b;
    return ret;
}

void pokeC11(C11* val, C10* a, C10* b){
    val->a = *a;
    val->b = *b;
}

int checkOffsetsC11(HsInt16 *offs){
    int a = offsetof(C11, a) == offs[0];
    int b = offsetof(C11, b) == offs[1];
    return a && b;
}

int checkFieldsC11(C11* s1, C11* s2){
    int a = checkFieldsC10(&(s1->a),&(s2->a));
    int b = checkFieldsC10(&(s1->b),&(s2->b));
    return a && b;
}

HsInt16 getSizeC11() {
    return sizeof(C11);
}

HsInt16 getAlignmentC11() {
    return alignof(C11);
}

typedef struct C12{
    HsInt64 a;
    HsInt64 b;
    HsInt64 c;
    HsInt64 d;
} C12;

C12 * newC12(HsInt64 a, HsInt64 b, HsInt64 c, HsInt64 d){
    C12 * ret = (C12*) malloc(sizeof(C12));
    ret->a = a;
    ret->b = b;
    ret->c = c;
    ret->d = d;
    return ret;
}

void pokeC12(C12* val, HsInt64 a, HsInt64 b, HsInt64 c, HsInt64 d){
    val->a = a;
    val->b = b;
    val->c = c;
    val->d = d;
}

int checkOffsetsC12(HsInt16 *offs){
    int a = offsetof(C12, a) == offs[0];
    int b = offsetof(C12, b) == offs[1];
    int c = offsetof(C12, c) == offs[2];
    int d = offsetof(C12, d) == offs[3];
    return a && b && c && d;
}

int checkFieldsC12(C12* s1, C12* s2){
    int a = s1->a == s2->a;
    int b = s1->b == s2->b;
    int c = s1->c == s2->c;
    int d = s1->d == s2->d;
    return a && b && c && d;
}

HsInt16 getSizeC12() {
    return sizeof(C12);
}

HsInt16 getAlignmentC12() {
    return alignof(C12);
}

typedef struct C13{
    C12 a;
    C12 b;
    C0 c;
    C12 d;
    C12 e;
} C13;

C13 * newC13(C12* a, C12* b, C0* c, C12* d, C12* e){
    C13 * ret = (C13*) malloc(sizeof(C13));
    ret->a = *a;
    ret->b = *b;
    ret->c = *c;
    ret->d = *d;
    ret->e = *e;
    return ret;
}

void pokeC13(C13* val, C12* a, C12* b, C0* c, C12* d, C12* e){
    val->a = *a;
    val->b = *b;
    val->c = *c;
    val->d = *d;
    val->e = *e;
}

int checkOffsetsC13(HsInt16 *offs){
    int a = offsetof(C13, a) == offs[0];
    int b = offsetof(C13, b) == offs[1];
    int c = offsetof(C13, c) == offs[2];
    int d = offsetof(C13, d) == offs[3];
    int e = offsetof(C13, e) == offs[4];
    return a && b && c && d && e;
}

int checkFieldsC13(C13* s1, C13* s2){
    int a = checkFieldsC12(&(s1->a),&(s2->a));
    int b = checkFieldsC12(&(s1->b),&(s2->b));
    int c = checkFieldsC0(&(s1->c),&(s2->c));
    int d = checkFieldsC12(&(s1->d),&(s2->d));
    int e = checkFieldsC12(&(s1->e),&(s2->e));
    return a && b && c && d && e;
}

HsInt16 getSizeC13() {
    return sizeof(C13);
}

HsInt16 getAlignmentC13() {
    return alignof(C13);
}

typedef struct C14{
    C13 a;
    C13 b;
    C13 c;
    C13 d;
    HsInt8 e;
} C14;

C14 * newC14(C13* a, C13* b, C13* c, C13* d, HsInt8 e){
    C14 * ret = (C14*) malloc(sizeof(C14));
    ret->a = *a;
    ret->b = *b;
    ret->c = *c;
    ret->d = *d;
    ret->e = e;
    return ret;
}

void pokeC14(C14* val, C13* a, C13* b, C13* c, C13* d, HsInt8 e){
    val->a = *a;
    val->b = *b;
    val->c = *c;
    val->d = *d;
    val->e = e;
}

int checkOffsetsC14(HsInt16 *offs){
    int a = offsetof(C14, a) == offs[0];
    int b = offsetof(C14, b) == offs[1];
    int c = offsetof(C14, c) == offs[2];
    int d = offsetof(C14, d) == offs[3];
    int e = offsetof(C14, e) == offs[4];
    return a && b && c && d && e;
}

int checkFieldsC14(C14* s1, C14* s2){
    int a = checkFieldsC13(&(s1->a),&(s2->a));
    int b = checkFieldsC13(&(s1->b),&(s2->b));
    int c = checkFieldsC13(&(s1->c),&(s2->c));
    int d = checkFieldsC13(&(s1->d),&(s2->d));
    int e = s1->e == s2->e;
    return a && b && c && d && e;
}

HsInt16 getSizeC14() {
    return sizeof(C14);
}

HsInt16 getAlignmentC14() {
    return alignof(C14);
}

typedef struct C15{
    C12 a;
    C14 b;
} C15;

C15 * newC15(C12* a, C14* b){
    C15 * ret = (C15*) malloc(sizeof(C15));
    ret->a = *a;
    ret->b = *b;
    return ret;
}

void pokeC15(C15* val, C12* a, C14* b){
    val->a = *a;
    val->b = *b;
}

int checkOffsetsC15(HsInt16 *offs){
    int a = offsetof(C15, a) == offs[0];
    int b = offsetof(C15, b) == offs[1];
    return a && b;
}

int checkFieldsC15(C15* s1, C15* s2){
    int a = checkFieldsC12(&(s1->a),&(s2->a));
    int b = checkFieldsC14(&(s1->b),&(s2->b));
    return a && b;
}

HsInt16 getSizeC15() {
    return sizeof(C15);
}

HsInt16 getAlignmentC15() {
    return alignof(C15);
}

typedef struct C16{
    C10 a;
    C0 b;
    C15 c;
    C7 d;
} C16;

C16 * newC16(C10* a, C0* b, C15* c, C7* d){
    C16 * ret = (C16*) malloc(sizeof(C16));
    ret->a = *a;
    ret->b = *b;
    ret->c = *c;
    ret->d = *d;
    return ret;
}

void pokeC16(C16* val, C10* a, C0* b, C15* c, C7* d){
    val->a = *a;
    val->b = *b;
    val->c = *c;
    val->d = *d;
}

int checkOffsetsC16(HsInt16 *offs){
    int a = offsetof(C16, a) == offs[0];
    int b = offsetof(C16, b) == offs[1];
    int c = offsetof(C16, c) == offs[2];
    int d = offsetof(C16, d) == offs[3];
    return a && b && c && d;
}

int checkFieldsC16(C16* s1, C16* s2){
    int a = checkFieldsC10(&(s1->a),&(s2->a));
    int b = checkFieldsC0(&(s1->b),&(s2->b));
    int c = checkFieldsC15(&(s1->c),&(s2->c));
    int d = checkFieldsC7(&(s1->d),&(s2->d));
    return a && b && c && d;
}

HsInt16 getSizeC16() {
    return sizeof(C16);
}

HsInt16 getAlignmentC16() {
    return alignof(C16);
}

typedef struct C17{
    HsFloat a;
    HsDouble b;
    HsFloat c;
} C17;

C17 * newC17(HsFloat a, HsDouble b, HsFloat c){
    C17 * ret = (C17*) malloc(sizeof(C17));
    ret->a = a;
    ret->b = b;
    ret->c = c;
    return ret;
}

void pokeC17(C17* val, HsFloat a, HsDouble b, HsFloat c){
    val->a = a;
    val->b = b;
    val->c = c;
}

int checkOffsetsC17(HsInt16 *offs){
    int a = offsetof(C17, a) == offs[0];
    int b = offsetof(C17, b) == offs[1];
    int c = offsetof(C17, c) == offs[2];
    return a && b && c;
}

int checkFieldsC17(C17* s1, C17* s2){
    int a = s1->a == s2->a;
    int b = s1->b == s2->b;
    int c = s1->c == s2->c;
    return a && b && c;
}

HsInt16 getSizeC17() {
    return sizeof(C17);
}

HsInt16 getAlignmentC17() {
    return alignof(C17);
}

typedef struct C18{
    HsFloat a;
    HsFloat b;
    HsDouble c;
    HsFloat d;
} C18;

C18 * newC18(HsFloat a, HsFloat b, HsDouble c, HsFloat d){
    C18 * ret = (C18*) malloc(sizeof(C18));
    ret->a = a;
    ret->b = b;
    ret->c = c;
    ret->d = d;
    return ret;
}

void pokeC18(C18* val, HsFloat a, HsFloat b, HsDouble c, HsFloat d){
    val->a = a;
    val->b = b;
    val->c = c;
    val->d = d;
}

int checkOffsetsC18(HsInt16 *offs){
    int a = offsetof(C18, a) == offs[0];
    int b = offsetof(C18, b) == offs[1];
    int c = offsetof(C18, c) == offs[2];
    int d = offsetof(C18, d) == offs[3];
    return a && b && c && d;
}

int checkFieldsC18(C18* s1, C18* s2){
    int a = s1->a == s2->a;
    int b = s1->b == s2->b;
    int c = s1->c == s2->c;
    int d = s1->d == s2->d;
    return a && b && c && d;
}

HsInt16 getSizeC18() {
    return sizeof(C18);
}

HsInt16 getAlignmentC18() {
    return alignof(C18);
}

typedef struct C19{
    C17 a;
    HsFloat b;
    HsDouble c;
} C19;

C19 * newC19(C17* a, HsFloat b, HsDouble c){
    C19 * ret = (C19*) malloc(sizeof(C19));
    ret->a = *a;
    ret->b = b;
    ret->c = c;
    return ret;
}

void pokeC19(C19* val, C17* a, HsFloat b, HsDouble c){
    val->a = *a;
    val->b = b;
    val->c = c;
}

int checkOffsetsC19(HsInt16 *offs){
    int a = offsetof(C19, a) == offs[0];
    int b = offsetof(C19, b) == offs[1];
    int c = offsetof(C19, c) == offs[2];
    return a && b && c;
}

int checkFieldsC19(C19* s1, C19* s2){
    int a = checkFieldsC17(&(s1->a),&(s2->a));
    int b = s1->b == s2->b;
    int c = s1->c == s2->c;
    return a && b && c;
}

HsInt16 getSizeC19() {
    return sizeof(C19);
}

HsInt16 getAlignmentC19() {
    return alignof(C19);
}

typedef struct C20{
    HsDouble a;
    C18 b;
    HsDouble c;
    C19 d;
} C20;

C20 * newC20(HsDouble a, C18* b, HsDouble c, C19* d){
    C20 * ret = (C20*) malloc(sizeof(C20));
    ret->a = a;
    ret->b = *b;
    ret->c = c;
    ret->d = *d;
    return ret;
}

void pokeC20(C20* val, HsDouble a, C18* b, HsDouble c, C19* d){
    val->a = a;
    val->b = *b;
    val->c = c;
    val->d = *d;
}

int checkOffsetsC20(HsInt16 *offs){
    int a = offsetof(C20, a) == offs[0];
    int b = offsetof(C20, b) == offs[1];
    int c = offsetof(C20, c) == offs[2];
    int d = offsetof(C20, d) == offs[3];
    return a && b && c && d;
}

int checkFieldsC20(C20* s1, C20* s2){
    int a = s1->a == s2->a;
    int b = checkFieldsC18(&(s1->b),&(s2->b));
    int c = s1->c == s2->c;
    int d = checkFieldsC19(&(s1->d),&(s2->d));
    return a && b && c && d;
}

HsInt16 getSizeC20() {
    return sizeof(C20);
}

HsInt16 getAlignmentC20() {
    return alignof(C20);
}

typedef struct S0_1{
    HsInt8 a;
} S0_1;

typedef struct S0_2{
    HsInt16 a;
} S0_2;

typedef union S0_union{
    S0_1 a;
    S0_2 b;
} S0_union;

typedef struct S0 {
    HsWord8 tag;
    S0_union val;
} S0;

S0 * newS0_1(HsInt8 a){
    S0 * ret = (S0*) malloc(sizeof(S0));
    ret->tag = 0;
    ret->val.a.a = a;
    return ret;
}

S0 * newS0_2(HsInt16 a){
    S0 * ret = (S0*) malloc(sizeof(S0));
    ret->tag = 1;
    ret->val.b.a = a;
    return ret;
}

void pokeS0_1(S0* un, HsInt8 a){
    un->tag = 0;
    un->val.a.a = a;
}

void pokeS0_2(S0* un, HsInt16 a){
    un->tag = 1;
    un->val.b.a = a;
}

int checkOffsetsS0_1(HsInt16 *offs){
    int a = offsetof(S0_1, a) == offs[0];
    return a;
}

int checkOffsetsS0_2(HsInt16 *offs){
    int a = offsetof(S0_2, a) == offs[0];
    return a;
}

int checkOffsetsS0(HsInt16 *offs){
    int t = offsetof(S0, tag) == offs[0];
    int v = offsetof(S0, val) == offs[1];
    return t && v;
}

int checkFieldsS0_1(S0_1* s1, S0_1* s2){
    int a = s1->a == s2->a;
    return a;
}

int checkFieldsS0_2(S0_2* s1, S0_2* s2){
    int a = s1->a == s2->a;
    return a;
}

int checkFieldsS0(S0* s1, S0* s2){
    if (s1->tag != s2->tag) return 0;
    if (s1->tag == 0) return checkFieldsS0_1(&s1->val.a,&s2->val.a);
    if (s1->tag == 1) return checkFieldsS0_2(&s1->val.b,&s2->val.b);
    return 0;
}

HsInt16 getSizeS0() {
    return sizeof(S0);
}

HsInt16 getAlignmentS0() {
    return alignof(S0);
}

typedef struct S1_1{
    HsInt32 a;
    HsInt8 b;
} S1_1;

typedef struct S1_2{
    HsDouble a;
    HsInt32 b;
    HsInt8 c;
    HsInt8 d;
} S1_2;

typedef struct S1_3{
    HsFloat a;
} S1_3;

typedef union S1_union{
    S1_1 a;
    S1_2 b;
    S1_3 c;
} S1_union;

typedef struct S1 {
    HsWord8 tag;
    S1_union val;
} S1;

S1 * newS1_1(HsInt32 a, HsInt8 b){
    S1 * ret = (S1*) malloc(sizeof(S1));
    ret->tag = 0;
    ret->val.a.a = a;
    ret->val.a.b = b;
    return ret;
}

S1 * newS1_2(HsDouble a, HsInt32 b, HsInt8 c, HsInt8 d){
    S1 * ret = (S1*) malloc(sizeof(S1));
    ret->tag = 1;
    ret->val.b.a = a;
    ret->val.b.b = b;
    ret->val.b.c = c;
    ret->val.b.d = d;
    return ret;
}

S1 * newS1_3(HsFloat a){
    S1 * ret = (S1*) malloc(sizeof(S1));
    ret->tag = 2;
    ret->val.c.a = a;
    return ret;
}

void pokeS1_1(S1* un, HsInt32 a, HsInt8 b){
    un->tag = 0;
    un->val.a.a = a;
    un->val.a.b = b;
}

void pokeS1_2(S1* un, HsDouble a, HsInt32 b, HsInt8 c, HsInt8 d){
    un->tag = 1;
    un->val.b.a = a;
    un->val.b.b = b;
    un->val.b.c = c;
    un->val.b.d = d;
}

void pokeS1_3(S1* un, HsFloat a){
    un->tag = 2;
    un->val.c.a = a;
}

int checkOffsetsS1_1(HsInt16 *offs){
    int a = offsetof(S1_1, a) == offs[0];
    int b = offsetof(S1_1, b) == offs[1];
    return a && b;
}

int checkOffsetsS1_2(HsInt16 *offs){
    int a = offsetof(S1_2, a) == offs[0];
    int b = offsetof(S1_2, b) == offs[1];
    int c = offsetof(S1_2, c) == offs[2];
    int d = offsetof(S1_2, d) == offs[3];
    return a && b && c && d;
}

int checkOffsetsS1_3(HsInt16 *offs){
    int a = offsetof(S1_3, a) == offs[0];
    return a;
}

int checkOffsetsS1(HsInt16 *offs){
    int t = offsetof(S1, tag) == offs[0];
    int v = offsetof(S1, val) == offs[1];
    return t && v;
}

int checkFieldsS1_1(S1_1* s1, S1_1* s2){
    int a = s1->a == s2->a;
    int b = s1->b == s2->b;
    return a && b;
}

int checkFieldsS1_2(S1_2* s1, S1_2* s2){
    int a = s1->a == s2->a;
    int b = s1->b == s2->b;
    int c = s1->c == s2->c;
    int d = s1->d == s2->d;
    return a && b && c && d;
}

int checkFieldsS1_3(S1_3* s1, S1_3* s2){
    int a = s1->a == s2->a;
    return a;
}

int checkFieldsS1(S1* s1, S1* s2){
    if (s1->tag != s2->tag) return 0;
    if (s1->tag == 0) return checkFieldsS1_1(&s1->val.a,&s2->val.a);
    if (s1->tag == 1) return checkFieldsS1_2(&s1->val.b,&s2->val.b);
    if (s1->tag == 2) return checkFieldsS1_3(&s1->val.c,&s2->val.c);
    return 0;
}

HsInt16 getSizeS1() {
    return sizeof(S1);
}

HsInt16 getAlignmentS1() {
    return alignof(S1);
}

typedef struct S2_1{
    C13 a;
    HsInt8 b;
} S2_1;

typedef struct S2_2{
    C2 a;
    C1 b;
} S2_2;

typedef struct S2_3{
    C0 a;
} S2_3;

typedef union S2_union{
    S2_1 a;
    S2_2 b;
    S2_3 c;
} S2_union;

typedef struct S2 {
    HsWord8 tag;
    S2_union val;
} S2;

S2 * newS2_1(C13* a, HsInt8 b){
    S2 * ret = (S2*) malloc(sizeof(S2));
    ret->tag = 0;
    ret->val.a.a = *a;
    ret->val.a.b = b;
    return ret;
}

S2 * newS2_2(C2* a, C1* b){
    S2 * ret = (S2*) malloc(sizeof(S2));
    ret->tag = 1;
    ret->val.b.a = *a;
    ret->val.b.b = *b;
    return ret;
}

S2 * newS2_3(C0* a){
    S2 * ret = (S2*) malloc(sizeof(S2));
    ret->tag = 2;
    ret->val.c.a = *a;
    return ret;
}

void pokeS2_1(S2* un, C13* a, HsInt8 b){
    un->tag = 0;
    un->val.a.a = *a;
    un->val.a.b = b;
}

void pokeS2_2(S2* un, C2* a, C1* b){
    un->tag = 1;
    un->val.b.a = *a;
    un->val.b.b = *b;
}

void pokeS2_3(S2* un, C0* a){
    un->tag = 2;
    un->val.c.a = *a;
}

int checkOffsetsS2_1(HsInt16 *offs){
    int a = offsetof(S2_1, a) == offs[0];
    int b = offsetof(S2_1, b) == offs[1];
    return a && b;
}

int checkOffsetsS2_2(HsInt16 *offs){
    int a = offsetof(S2_2, a) == offs[0];
    int b = offsetof(S2_2, b) == offs[1];
    return a && b;
}

int checkOffsetsS2_3(HsInt16 *offs){
    int a = offsetof(S2_3, a) == offs[0];
    return a;
}

int checkOffsetsS2(HsInt16 *offs){
    int t = offsetof(S2, tag) == offs[0];
    int v = offsetof(S2, val) == offs[1];
    return t && v;
}

int checkFieldsS2_1(S2_1* s1, S2_1* s2){
    int a = checkFieldsC13(&(s1->a),&(s2->a));
    int b = s1->b == s2->b;
    return a && b;
}

int checkFieldsS2_2(S2_2* s1, S2_2* s2){
    int a = checkFieldsC2(&(s1->a),&(s2->a));
    int b = checkFieldsC1(&(s1->b),&(s2->b));
    return a && b;
}

int checkFieldsS2_3(S2_3* s1, S2_3* s2){
    int a = checkFieldsC0(&(s1->a),&(s2->a));
    return a;
}

int checkFieldsS2(S2* s1, S2* s2){
    if (s1->tag != s2->tag) return 0;
    if (s1->tag == 0) return checkFieldsS2_1(&s1->val.a,&s2->val.a);
    if (s1->tag == 1) return checkFieldsS2_2(&s1->val.b,&s2->val.b);
    if (s1->tag == 2) return checkFieldsS2_3(&s1->val.c,&s2->val.c);
    return 0;
}

HsInt16 getSizeS2() {
    return sizeof(S2);
}

HsInt16 getAlignmentS2() {
    return alignof(S2);
}

typedef struct S3_1{
    S1 a;
} S3_1;

typedef struct S3_2{
    S2 a;
} S3_2;

typedef struct S3_3{
    HsInt8 a;
} S3_3;

typedef union S3_union{
    S3_1 a;
    S3_2 b;
    S3_3 c;
} S3_union;

typedef struct S3 {
    HsWord8 tag;
    S3_union val;
} S3;

S3 * newS3_1(S1* a){
    S3 * ret = (S3*) malloc(sizeof(S3));
    ret->tag = 0;
    ret->val.a.a = *a;
    return ret;
}

S3 * newS3_2(S2* a){
    S3 * ret = (S3*) malloc(sizeof(S3));
    ret->tag = 1;
    ret->val.b.a = *a;
    return ret;
}

S3 * newS3_3(HsInt8 a){
    S3 * ret = (S3*) malloc(sizeof(S3));
    ret->tag = 2;
    ret->val.c.a = a;
    return ret;
}

void pokeS3_1(S3* un, S1* a){
    un->tag = 0;
    un->val.a.a = *a;
}

void pokeS3_2(S3* un, S2* a){
    un->tag = 1;
    un->val.b.a = *a;
}

void pokeS3_3(S3* un, HsInt8 a){
    un->tag = 2;
    un->val.c.a = a;
}

int checkOffsetsS3_1(HsInt16 *offs){
    int a = offsetof(S3_1, a) == offs[0];
    return a;
}

int checkOffsetsS3_2(HsInt16 *offs){
    int a = offsetof(S3_2, a) == offs[0];
    return a;
}

int checkOffsetsS3_3(HsInt16 *offs){
    int a = offsetof(S3_3, a) == offs[0];
    return a;
}

int checkOffsetsS3(HsInt16 *offs){
    int t = offsetof(S3, tag) == offs[0];
    int v = offsetof(S3, val) == offs[1];
    return t && v;
}

int checkFieldsS3_1(S3_1* s1, S3_1* s2){
    int a = checkFieldsS1(&(s1->a),&(s2->a));
    return a;
}

int checkFieldsS3_2(S3_2* s1, S3_2* s2){
    int a = checkFieldsS2(&(s1->a),&(s2->a));
    return a;
}

int checkFieldsS3_3(S3_3* s1, S3_3* s2){
    int a = s1->a == s2->a;
    return a;
}

int checkFieldsS3(S3* s1, S3* s2){
    if (s1->tag != s2->tag) return 0;
    if (s1->tag == 0) return checkFieldsS3_1(&s1->val.a,&s2->val.a);
    if (s1->tag == 1) return checkFieldsS3_2(&s1->val.b,&s2->val.b);
    if (s1->tag == 2) return checkFieldsS3_3(&s1->val.c,&s2->val.c);
    return 0;
}

HsInt16 getSizeS3() {
    return sizeof(S3);
}

HsInt16 getAlignmentS3() {
    return alignof(S3);
}

typedef struct S4_1{
    C0 a;
} S4_1;

typedef struct S4_2{
    C0 a;
} S4_2;

typedef struct S4_3{
    C0 a;
} S4_3;

typedef struct S4_4{
    C1 a;
} S4_4;

typedef union S4_union{
    S4_1 a;
    S4_2 b;
    S4_3 c;
    S4_4 d;
} S4_union;

typedef struct S4 {
    HsWord8 tag;
    S4_union val;
} S4;

S4 * newS4_1(C0* a){
    S4 * ret = (S4*) malloc(sizeof(S4));
    ret->tag = 0;
    ret->val.a.a = *a;
    return ret;
}

S4 * newS4_2(C0* a){
    S4 * ret = (S4*) malloc(sizeof(S4));
    ret->tag = 1;
    ret->val.b.a = *a;
    return ret;
}

S4 * newS4_3(C0* a){
    S4 * ret = (S4*) malloc(sizeof(S4));
    ret->tag = 2;
    ret->val.c.a = *a;
    return ret;
}

S4 * newS4_4(C1* a){
    S4 * ret = (S4*) malloc(sizeof(S4));
    ret->tag = 3;
    ret->val.d.a = *a;
    return ret;
}

void pokeS4_1(S4* un, C0* a){
    un->tag = 0;
    un->val.a.a = *a;
}

void pokeS4_2(S4* un, C0* a){
    un->tag = 1;
    un->val.b.a = *a;
}

void pokeS4_3(S4* un, C0* a){
    un->tag = 2;
    un->val.c.a = *a;
}

void pokeS4_4(S4* un, C1* a){
    un->tag = 3;
    un->val.d.a = *a;
}

int checkOffsetsS4_1(HsInt16 *offs){
    int a = offsetof(S4_1, a) == offs[0];
    return a;
}

int checkOffsetsS4_2(HsInt16 *offs){
    int a = offsetof(S4_2, a) == offs[0];
    return a;
}

int checkOffsetsS4_3(HsInt16 *offs){
    int a = offsetof(S4_3, a) == offs[0];
    return a;
}

int checkOffsetsS4_4(HsInt16 *offs){
    int a = offsetof(S4_4, a) == offs[0];
    return a;
}

int checkOffsetsS4(HsInt16 *offs){
    int t = offsetof(S4, tag) == offs[0];
    int v = offsetof(S4, val) == offs[1];
    return t && v;
}

int checkFieldsS4_1(S4_1* s1, S4_1* s2){
    int a = checkFieldsC0(&(s1->a),&(s2->a));
    return a;
}

int checkFieldsS4_2(S4_2* s1, S4_2* s2){
    int a = checkFieldsC0(&(s1->a),&(s2->a));
    return a;
}

int checkFieldsS4_3(S4_3* s1, S4_3* s2){
    int a = checkFieldsC0(&(s1->a),&(s2->a));
    return a;
}

int checkFieldsS4_4(S4_4* s1, S4_4* s2){
    int a = checkFieldsC1(&(s1->a),&(s2->a));
    return a;
}

int checkFieldsS4(S4* s1, S4* s2){
    if (s1->tag != s2->tag) return 0;
    if (s1->tag == 0) return checkFieldsS4_1(&s1->val.a,&s2->val.a);
    if (s1->tag == 1) return checkFieldsS4_2(&s1->val.b,&s2->val.b);
    if (s1->tag == 2) return checkFieldsS4_3(&s1->val.c,&s2->val.c);
    if (s1->tag == 3) return checkFieldsS4_4(&s1->val.d,&s2->val.d);
    return 0;
}

HsInt16 getSizeS4() {
    return sizeof(S4);
}

HsInt16 getAlignmentS4() {
    return alignof(S4);
}