// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// Code generated by tools/fidl/gidl-conformance-suite/regen.sh; DO NOT EDIT.

// +build fuchsia

//
// Code generated by fidlgen; DO NOT EDIT.

package conformance

import (
	_zx "syscall/zx"
	_bindings "syscall/zx/fidl"
)

type EmptyStruct struct {
	_ struct{} `fidl:"s,1,1" fidl_size_v1:"1" fidl_alignment_v1:"1" fidl_size_v1_no_ee:"1" fidl_alignment_v1_no_ee:"1"`
}

var _mEmptyStruct = _bindings.CreateLazyMarshaler(EmptyStruct{})

func (msg *EmptyStruct) Marshaler() _bindings.Marshaler {
	return _mEmptyStruct
}

type EmptyStructSandwich struct {
	_      struct{}    `fidl:"s,40,8" fidl_size_v1:"40" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"40" fidl_alignment_v1_no_ee:"8"`
	Before string      `fidl:"0," fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
	Es     EmptyStruct `fidl:"16" fidl_offset_v1:"16" fidl_offset_v1_no_ee:"16"`
	After  string      `fidl:"24," fidl_offset_v1:"24" fidl_offset_v1_no_ee:"24"`
}

var _mEmptyStructSandwich = _bindings.CreateLazyMarshaler(EmptyStructSandwich{})

func (msg *EmptyStructSandwich) Marshaler() _bindings.Marshaler {
	return _mEmptyStructSandwich
}

type Uint8Uint16Uint32Uint64 struct {
	_  struct{} `fidl:"s,16,8" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
	F1 uint8    `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
	F2 uint16   `fidl:"2" fidl_offset_v1:"2" fidl_offset_v1_no_ee:"2"`
	F3 uint32   `fidl:"4" fidl_offset_v1:"4" fidl_offset_v1_no_ee:"4"`
	F4 uint64   `fidl:"8" fidl_offset_v1:"8" fidl_offset_v1_no_ee:"8"`
}

var _mUint8Uint16Uint32Uint64 = _bindings.CreateLazyMarshaler(Uint8Uint16Uint32Uint64{})

func (msg *Uint8Uint16Uint32Uint64) Marshaler() _bindings.Marshaler {
	return _mUint8Uint16Uint32Uint64
}

type Uint64Uint32Uint16Uint8 struct {
	_  struct{} `fidl:"s,16,8" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
	F1 uint64   `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
	F2 uint32   `fidl:"8" fidl_offset_v1:"8" fidl_offset_v1_no_ee:"8"`
	F3 uint16   `fidl:"12" fidl_offset_v1:"12" fidl_offset_v1_no_ee:"12"`
	F4 uint8    `fidl:"14" fidl_offset_v1:"14" fidl_offset_v1_no_ee:"14"`
}

var _mUint64Uint32Uint16Uint8 = _bindings.CreateLazyMarshaler(Uint64Uint32Uint16Uint8{})

func (msg *Uint64Uint32Uint16Uint8) Marshaler() _bindings.Marshaler {
	return _mUint64Uint32Uint16Uint8
}

type UnionWithBoundStringStruct struct {
	_ struct{}             `fidl:"s,24,8" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
	V UnionWithBoundString `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
}

var _mUnionWithBoundStringStruct = _bindings.CreateLazyMarshaler(UnionWithBoundStringStruct{})

func (msg *UnionWithBoundStringStruct) Marshaler() _bindings.Marshaler {
	return _mUnionWithBoundStringStruct
}

type SingleVariantUnionStruct struct {
	_ struct{}           `fidl:"s,8,4" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
	U SingleVariantUnion `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
}

var _mSingleVariantUnionStruct = _bindings.CreateLazyMarshaler(SingleVariantUnionStruct{})

func (msg *SingleVariantUnionStruct) Marshaler() _bindings.Marshaler {
	return _mSingleVariantUnionStruct
}

type SandwichUnionSize8Alignment4 struct {
	_      struct{}             `fidl:"s,16,4" fidl_size_v1:"40" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"40" fidl_alignment_v1_no_ee:"8"`
	Before uint32               `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
	Value  UnionSize8Alignment4 `fidl:"4" fidl_offset_v1:"8" fidl_offset_v1_no_ee:"8"`
	After  uint32               `fidl:"12" fidl_offset_v1:"32" fidl_offset_v1_no_ee:"32"`
}

var _mSandwichUnionSize8Alignment4 = _bindings.CreateLazyMarshaler(SandwichUnionSize8Alignment4{})

func (msg *SandwichUnionSize8Alignment4) Marshaler() _bindings.Marshaler {
	return _mSandwichUnionSize8Alignment4
}

type SandwichUnionSize12Alignment4 struct {
	_      struct{}              `fidl:"s,20,4" fidl_size_v1:"40" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"40" fidl_alignment_v1_no_ee:"8"`
	Before uint32                `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
	Value  UnionSize12Alignment4 `fidl:"4" fidl_offset_v1:"8" fidl_offset_v1_no_ee:"8"`
	After  uint32                `fidl:"16" fidl_offset_v1:"32" fidl_offset_v1_no_ee:"32"`
}

var _mSandwichUnionSize12Alignment4 = _bindings.CreateLazyMarshaler(SandwichUnionSize12Alignment4{})

func (msg *SandwichUnionSize12Alignment4) Marshaler() _bindings.Marshaler {
	return _mSandwichUnionSize12Alignment4
}

type StructSize16Alignment8 struct {
	_  struct{} `fidl:"s,16,8" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
	F1 uint64   `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
	F2 uint64   `fidl:"8" fidl_offset_v1:"8" fidl_offset_v1_no_ee:"8"`
}

var _mStructSize16Alignment8 = _bindings.CreateLazyMarshaler(StructSize16Alignment8{})

func (msg *StructSize16Alignment8) Marshaler() _bindings.Marshaler {
	return _mStructSize16Alignment8
}

type SandwichUnionSize24Alignment8 struct {
	_      struct{}              `fidl:"s,40,8" fidl_size_v1:"40" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"40" fidl_alignment_v1_no_ee:"8"`
	Before uint32                `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
	Value  UnionSize24Alignment8 `fidl:"8" fidl_offset_v1:"8" fidl_offset_v1_no_ee:"8"`
	After  uint32                `fidl:"32" fidl_offset_v1:"32" fidl_offset_v1_no_ee:"32"`
}

var _mSandwichUnionSize24Alignment8 = _bindings.CreateLazyMarshaler(SandwichUnionSize24Alignment8{})

func (msg *SandwichUnionSize24Alignment8) Marshaler() _bindings.Marshaler {
	return _mSandwichUnionSize24Alignment8
}

type SandwichUnionSize36Alignment4 struct {
	_      struct{}              `fidl:"s,44,4" fidl_size_v1:"40" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"40" fidl_alignment_v1_no_ee:"8"`
	Before uint32                `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
	Value  UnionSize36Alignment4 `fidl:"4" fidl_offset_v1:"8" fidl_offset_v1_no_ee:"8"`
	After  uint32                `fidl:"40" fidl_offset_v1:"32" fidl_offset_v1_no_ee:"32"`
}

var _mSandwichUnionSize36Alignment4 = _bindings.CreateLazyMarshaler(SandwichUnionSize36Alignment4{})

func (msg *SandwichUnionSize36Alignment4) Marshaler() _bindings.Marshaler {
	return _mSandwichUnionSize36Alignment4
}

type StructWithOptionals struct {
	_   struct{}               `fidl:"s,104,8" fidl_size_v1:"128" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"128" fidl_alignment_v1_no_ee:"8"`
	S   EmptyStruct            `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
	S2  *EmptyStruct           `fidl:"8" fidl_offset_v1:"8" fidl_offset_v1_no_ee:"8"`
	T   TableWithEmptyStruct   `fidl:"16" fidl_offset_v1:"16" fidl_offset_v1_no_ee:"16"`
	Xu  XUnionWithEmptyStruct  `fidl:"32" fidl_offset_v1:"32" fidl_offset_v1_no_ee:"32"`
	Xu2 *XUnionWithEmptyStruct `fidl:"56" fidl_offset_v1:"56" fidl_offset_v1_no_ee:"56"`
	U   UnionWithEmptyStruct   `fidl:"80" fidl_offset_v1:"80" fidl_offset_v1_no_ee:"80"`
	U2  *UnionWithEmptyStruct  `fidl:"96" fidl_offset_v1:"104" fidl_offset_v1_no_ee:"104"`
}

var _mStructWithOptionals = _bindings.CreateLazyMarshaler(StructWithOptionals{})

func (msg *StructWithOptionals) Marshaler() _bindings.Marshaler {
	return _mStructWithOptionals
}

type ThreeByte struct {
	_     struct{} `fidl:"s,3,1" fidl_size_v1:"3" fidl_alignment_v1:"1" fidl_size_v1_no_ee:"3" fidl_alignment_v1_no_ee:"1"`
	Elem1 uint8    `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
	Elem2 uint8    `fidl:"1" fidl_offset_v1:"1" fidl_offset_v1_no_ee:"1"`
	Elem3 uint8    `fidl:"2" fidl_offset_v1:"2" fidl_offset_v1_no_ee:"2"`
}

var _mThreeByte = _bindings.CreateLazyMarshaler(ThreeByte{})

func (msg *ThreeByte) Marshaler() _bindings.Marshaler {
	return _mThreeByte
}

type FiveByte struct {
	_     struct{} `fidl:"s,8,4" fidl_size_v1:"8" fidl_alignment_v1:"4" fidl_size_v1_no_ee:"8" fidl_alignment_v1_no_ee:"4"`
	Elem1 uint32   `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
	Elem2 uint8    `fidl:"4" fidl_offset_v1:"4" fidl_offset_v1_no_ee:"4"`
}

var _mFiveByte = _bindings.CreateLazyMarshaler(FiveByte{})

func (msg *FiveByte) Marshaler() _bindings.Marshaler {
	return _mFiveByte
}

type ThreeByteInStruct struct {
	_     struct{}  `fidl:"s,9,1" fidl_size_v1:"9" fidl_alignment_v1:"1" fidl_size_v1_no_ee:"9" fidl_alignment_v1_no_ee:"1"`
	Elem1 ThreeByte `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
	Elem2 ThreeByte `fidl:"3" fidl_offset_v1:"3" fidl_offset_v1_no_ee:"3"`
	Elem3 ThreeByte `fidl:"6" fidl_offset_v1:"6" fidl_offset_v1_no_ee:"6"`
}

var _mThreeByteInStruct = _bindings.CreateLazyMarshaler(ThreeByteInStruct{})

func (msg *ThreeByteInStruct) Marshaler() _bindings.Marshaler {
	return _mThreeByteInStruct
}

type FiveByteInStruct struct {
	_     struct{} `fidl:"s,24,4" fidl_size_v1:"24" fidl_alignment_v1:"4" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"4"`
	Elem1 FiveByte `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
	Elem2 FiveByte `fidl:"8" fidl_offset_v1:"8" fidl_offset_v1_no_ee:"8"`
	Elem3 FiveByte `fidl:"16" fidl_offset_v1:"16" fidl_offset_v1_no_ee:"16"`
}

var _mFiveByteInStruct = _bindings.CreateLazyMarshaler(FiveByteInStruct{})

func (msg *FiveByteInStruct) Marshaler() _bindings.Marshaler {
	return _mFiveByteInStruct
}

type ThreeByteInVector struct {
	_     struct{}    `fidl:"s,16,8" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
	Elems []ThreeByte `fidl:"0," fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
}

var _mThreeByteInVector = _bindings.CreateLazyMarshaler(ThreeByteInVector{})

func (msg *ThreeByteInVector) Marshaler() _bindings.Marshaler {
	return _mThreeByteInVector
}

type FiveByteInVector struct {
	_     struct{}   `fidl:"s,16,8" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
	Elems []FiveByte `fidl:"0," fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
}

var _mFiveByteInVector = _bindings.CreateLazyMarshaler(FiveByteInVector{})

func (msg *FiveByteInVector) Marshaler() _bindings.Marshaler {
	return _mFiveByteInVector
}

type ThreeByteInArray struct {
	_     struct{}     `fidl:"s,9,1" fidl_size_v1:"9" fidl_alignment_v1:"1" fidl_size_v1_no_ee:"9" fidl_alignment_v1_no_ee:"1"`
	Elems [3]ThreeByte `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
}

var _mThreeByteInArray = _bindings.CreateLazyMarshaler(ThreeByteInArray{})

func (msg *ThreeByteInArray) Marshaler() _bindings.Marshaler {
	return _mThreeByteInArray
}

type FiveByteInArray struct {
	_     struct{}    `fidl:"s,24,4" fidl_size_v1:"24" fidl_alignment_v1:"4" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"4"`
	Elems [3]FiveByte `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
}

var _mFiveByteInArray = _bindings.CreateLazyMarshaler(FiveByteInArray{})

func (msg *FiveByteInArray) Marshaler() _bindings.Marshaler {
	return _mFiveByteInArray
}

type StructOfSimpleTable struct {
	_     struct{}    `fidl:"s,16,8" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
	Table SimpleTable `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
}

var _mStructOfSimpleTable = _bindings.CreateLazyMarshaler(StructOfSimpleTable{})

func (msg *StructOfSimpleTable) Marshaler() _bindings.Marshaler {
	return _mStructOfSimpleTable
}

type SimpleTableThenUint64 struct {
	_      struct{}    `fidl:"s,24,8" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
	Table  SimpleTable `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
	Number uint64      `fidl:"16" fidl_offset_v1:"16" fidl_offset_v1_no_ee:"16"`
}

var _mSimpleTableThenUint64 = _bindings.CreateLazyMarshaler(SimpleTableThenUint64{})

func (msg *SimpleTableThenUint64) Marshaler() _bindings.Marshaler {
	return _mSimpleTableThenUint64
}

type StructOfTableWithStringAndVector struct {
	_     struct{}                 `fidl:"s,16,8" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
	Table TableWithStringAndVector `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
}

var _mStructOfTableWithStringAndVector = _bindings.CreateLazyMarshaler(StructOfTableWithStringAndVector{})

func (msg *StructOfTableWithStringAndVector) Marshaler() _bindings.Marshaler {
	return _mStructOfTableWithStringAndVector
}

type Int64Struct struct {
	_ struct{} `fidl:"s,8,8" fidl_size_v1:"8" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"8" fidl_alignment_v1_no_ee:"8"`
	X int64    `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
}

var _mInt64Struct = _bindings.CreateLazyMarshaler(Int64Struct{})

func (msg *Int64Struct) Marshaler() _bindings.Marshaler {
	return _mInt64Struct
}

type TestInlineXUnionInStruct struct {
	_      struct{}     `fidl:"s,56,8" fidl_size_v1:"56" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"56" fidl_alignment_v1_no_ee:"8"`
	Before string       `fidl:"0," fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
	Xu     SampleXUnion `fidl:"16" fidl_offset_v1:"16" fidl_offset_v1_no_ee:"16"`
	After  string       `fidl:"40," fidl_offset_v1:"40" fidl_offset_v1_no_ee:"40"`
}

var _mTestInlineXUnionInStruct = _bindings.CreateLazyMarshaler(TestInlineXUnionInStruct{})

func (msg *TestInlineXUnionInStruct) Marshaler() _bindings.Marshaler {
	return _mTestInlineXUnionInStruct
}

type TestOptionalXUnionInStruct struct {
	_      struct{}      `fidl:"s,56,8" fidl_size_v1:"56" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"56" fidl_alignment_v1_no_ee:"8"`
	Before string        `fidl:"0," fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
	Xu     *SampleXUnion `fidl:"16" fidl_offset_v1:"16" fidl_offset_v1_no_ee:"16"`
	After  string        `fidl:"40," fidl_offset_v1:"40" fidl_offset_v1_no_ee:"40"`
}

var _mTestOptionalXUnionInStruct = _bindings.CreateLazyMarshaler(TestOptionalXUnionInStruct{})

func (msg *TestOptionalXUnionInStruct) Marshaler() _bindings.Marshaler {
	return _mTestOptionalXUnionInStruct
}

type TestStrictXUnionInStruct struct {
	_  struct{}           `fidl:"s,24,8" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
	Xu SampleStrictXUnion `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
}

var _mTestStrictXUnionInStruct = _bindings.CreateLazyMarshaler(TestStrictXUnionInStruct{})

func (msg *TestStrictXUnionInStruct) Marshaler() _bindings.Marshaler {
	return _mTestStrictXUnionInStruct
}

type TestFlexibleXUnionInStruct struct {
	_  struct{}     `fidl:"s,24,8" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
	Xu SampleXUnion `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
}

var _mTestFlexibleXUnionInStruct = _bindings.CreateLazyMarshaler(TestFlexibleXUnionInStruct{})

func (msg *TestFlexibleXUnionInStruct) Marshaler() _bindings.Marshaler {
	return _mTestFlexibleXUnionInStruct
}

type MyBool struct {
	_     struct{} `fidl:"s,1,1" fidl_size_v1:"1" fidl_alignment_v1:"1" fidl_size_v1_no_ee:"1" fidl_alignment_v1_no_ee:"1"`
	Value bool     `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
}

var _mMyBool = _bindings.CreateLazyMarshaler(MyBool{})

func (msg *MyBool) Marshaler() _bindings.Marshaler {
	return _mMyBool
}

type MyByte struct {
	_     struct{} `fidl:"s,1,1" fidl_size_v1:"1" fidl_alignment_v1:"1" fidl_size_v1_no_ee:"1" fidl_alignment_v1_no_ee:"1"`
	Value uint8    `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
}

var _mMyByte = _bindings.CreateLazyMarshaler(MyByte{})

func (msg *MyByte) Marshaler() _bindings.Marshaler {
	return _mMyByte
}

type MyInt8 struct {
	_     struct{} `fidl:"s,1,1" fidl_size_v1:"1" fidl_alignment_v1:"1" fidl_size_v1_no_ee:"1" fidl_alignment_v1_no_ee:"1"`
	Value int8     `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
}

var _mMyInt8 = _bindings.CreateLazyMarshaler(MyInt8{})

func (msg *MyInt8) Marshaler() _bindings.Marshaler {
	return _mMyInt8
}

type MyInt16 struct {
	_     struct{} `fidl:"s,2,2" fidl_size_v1:"2" fidl_alignment_v1:"2" fidl_size_v1_no_ee:"2" fidl_alignment_v1_no_ee:"2"`
	Value int16    `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
}

var _mMyInt16 = _bindings.CreateLazyMarshaler(MyInt16{})

func (msg *MyInt16) Marshaler() _bindings.Marshaler {
	return _mMyInt16
}

type MyInt32 struct {
	_     struct{} `fidl:"s,4,4" fidl_size_v1:"4" fidl_alignment_v1:"4" fidl_size_v1_no_ee:"4" fidl_alignment_v1_no_ee:"4"`
	Value int32    `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
}

var _mMyInt32 = _bindings.CreateLazyMarshaler(MyInt32{})

func (msg *MyInt32) Marshaler() _bindings.Marshaler {
	return _mMyInt32
}

type MyInt64 struct {
	_     struct{} `fidl:"s,8,8" fidl_size_v1:"8" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"8" fidl_alignment_v1_no_ee:"8"`
	Value int64    `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
}

var _mMyInt64 = _bindings.CreateLazyMarshaler(MyInt64{})

func (msg *MyInt64) Marshaler() _bindings.Marshaler {
	return _mMyInt64
}

type MyUint8 struct {
	_     struct{} `fidl:"s,1,1" fidl_size_v1:"1" fidl_alignment_v1:"1" fidl_size_v1_no_ee:"1" fidl_alignment_v1_no_ee:"1"`
	Value uint8    `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
}

var _mMyUint8 = _bindings.CreateLazyMarshaler(MyUint8{})

func (msg *MyUint8) Marshaler() _bindings.Marshaler {
	return _mMyUint8
}

type MyUint16 struct {
	_     struct{} `fidl:"s,2,2" fidl_size_v1:"2" fidl_alignment_v1:"2" fidl_size_v1_no_ee:"2" fidl_alignment_v1_no_ee:"2"`
	Value uint16   `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
}

var _mMyUint16 = _bindings.CreateLazyMarshaler(MyUint16{})

func (msg *MyUint16) Marshaler() _bindings.Marshaler {
	return _mMyUint16
}

type MyUint32 struct {
	_     struct{} `fidl:"s,4,4" fidl_size_v1:"4" fidl_alignment_v1:"4" fidl_size_v1_no_ee:"4" fidl_alignment_v1_no_ee:"4"`
	Value uint32   `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
}

var _mMyUint32 = _bindings.CreateLazyMarshaler(MyUint32{})

func (msg *MyUint32) Marshaler() _bindings.Marshaler {
	return _mMyUint32
}

type MyUint64 struct {
	_     struct{} `fidl:"s,8,8" fidl_size_v1:"8" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"8" fidl_alignment_v1_no_ee:"8"`
	Value uint64   `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
}

var _mMyUint64 = _bindings.CreateLazyMarshaler(MyUint64{})

func (msg *MyUint64) Marshaler() _bindings.Marshaler {
	return _mMyUint64
}

type MyFloat32 struct {
	_     struct{} `fidl:"s,4,4" fidl_size_v1:"4" fidl_alignment_v1:"4" fidl_size_v1_no_ee:"4" fidl_alignment_v1_no_ee:"4"`
	Value float32  `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
}

var _mMyFloat32 = _bindings.CreateLazyMarshaler(MyFloat32{})

func (msg *MyFloat32) Marshaler() _bindings.Marshaler {
	return _mMyFloat32
}

type MyFloat64 struct {
	_     struct{} `fidl:"s,8,8" fidl_size_v1:"8" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"8" fidl_alignment_v1_no_ee:"8"`
	Value float64  `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
}

var _mMyFloat64 = _bindings.CreateLazyMarshaler(MyFloat64{})

func (msg *MyFloat64) Marshaler() _bindings.Marshaler {
	return _mMyFloat64
}

type StructSize16Align8 struct {
	_  struct{} `fidl:"s,16,8" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
	F1 uint64   `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
	F2 uint64   `fidl:"8" fidl_offset_v1:"8" fidl_offset_v1_no_ee:"8"`
}

var _mStructSize16Align8 = _bindings.CreateLazyMarshaler(StructSize16Align8{})

func (msg *StructSize16Align8) Marshaler() _bindings.Marshaler {
	return _mStructSize16Align8
}

type Sandwich1 struct {
	_        struct{}         `fidl:"s,16,4" fidl_size_v1:"40" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"40" fidl_alignment_v1_no_ee:"8"`
	Before   uint32           `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
	TheUnion UnionSize8Align4 `fidl:"4" fidl_offset_v1:"8" fidl_offset_v1_no_ee:"8"`
	After    uint32           `fidl:"12" fidl_offset_v1:"32" fidl_offset_v1_no_ee:"32"`
}

var _mSandwich1 = _bindings.CreateLazyMarshaler(Sandwich1{})

func (msg *Sandwich1) Marshaler() _bindings.Marshaler {
	return _mSandwich1
}

type Sandwich1WithOptUnion struct {
	_        struct{}          `fidl:"s,24,8" fidl_size_v1:"40" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"40" fidl_alignment_v1_no_ee:"8"`
	Before   uint32            `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
	OptUnion *UnionSize8Align4 `fidl:"8" fidl_offset_v1:"8" fidl_offset_v1_no_ee:"8"`
	After    uint32            `fidl:"16" fidl_offset_v1:"32" fidl_offset_v1_no_ee:"32"`
}

var _mSandwich1WithOptUnion = _bindings.CreateLazyMarshaler(Sandwich1WithOptUnion{})

func (msg *Sandwich1WithOptUnion) Marshaler() _bindings.Marshaler {
	return _mSandwich1WithOptUnion
}

type Sandwich2 struct {
	_        struct{}          `fidl:"s,20,4" fidl_size_v1:"40" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"40" fidl_alignment_v1_no_ee:"8"`
	Before   uint32            `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
	TheUnion UnionSize12Align4 `fidl:"4" fidl_offset_v1:"8" fidl_offset_v1_no_ee:"8"`
	After    uint32            `fidl:"16" fidl_offset_v1:"32" fidl_offset_v1_no_ee:"32"`
}

var _mSandwich2 = _bindings.CreateLazyMarshaler(Sandwich2{})

func (msg *Sandwich2) Marshaler() _bindings.Marshaler {
	return _mSandwich2
}

type Sandwich3 struct {
	_        struct{}          `fidl:"s,40,8" fidl_size_v1:"40" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"40" fidl_alignment_v1_no_ee:"8"`
	Before   uint32            `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
	TheUnion UnionSize24Align8 `fidl:"8" fidl_offset_v1:"8" fidl_offset_v1_no_ee:"8"`
	After    uint32            `fidl:"32" fidl_offset_v1:"32" fidl_offset_v1_no_ee:"32"`
}

var _mSandwich3 = _bindings.CreateLazyMarshaler(Sandwich3{})

func (msg *Sandwich3) Marshaler() _bindings.Marshaler {
	return _mSandwich3
}

type Sandwich4 struct {
	_        struct{}          `fidl:"s,44,4" fidl_size_v1:"40" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"40" fidl_alignment_v1_no_ee:"8"`
	Before   uint32            `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
	TheUnion UnionSize36Align4 `fidl:"4" fidl_offset_v1:"8" fidl_offset_v1_no_ee:"8"`
	After    uint32            `fidl:"40" fidl_offset_v1:"32" fidl_offset_v1_no_ee:"32"`
}

var _mSandwich4 = _bindings.CreateLazyMarshaler(Sandwich4{})

func (msg *Sandwich4) Marshaler() _bindings.Marshaler {
	return _mSandwich4
}

type Sandwich5 struct {
	_            struct{}     `fidl:"s,48,8" fidl_size_v1:"40" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"40" fidl_alignment_v1_no_ee:"8"`
	Before       uint32       `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
	UnionOfUnion UnionOfUnion `fidl:"8" fidl_offset_v1:"8" fidl_offset_v1_no_ee:"8"`
	After        uint32       `fidl:"40" fidl_offset_v1:"32" fidl_offset_v1_no_ee:"32"`
}

var _mSandwich5 = _bindings.CreateLazyMarshaler(Sandwich5{})

func (msg *Sandwich5) Marshaler() _bindings.Marshaler {
	return _mSandwich5
}

type StructSize3Align1 struct {
	_          struct{} `fidl:"s,3,1" fidl_size_v1:"3" fidl_alignment_v1:"1" fidl_size_v1_no_ee:"3" fidl_alignment_v1_no_ee:"1"`
	ThreeBytes [3]uint8 `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
}

var _mStructSize3Align1 = _bindings.CreateLazyMarshaler(StructSize3Align1{})

func (msg *StructSize3Align1) Marshaler() _bindings.Marshaler {
	return _mStructSize3Align1
}

type StructSize3Align2 struct {
	_  struct{} `fidl:"s,4,2" fidl_size_v1:"4" fidl_alignment_v1:"2" fidl_size_v1_no_ee:"4" fidl_alignment_v1_no_ee:"2"`
	F1 uint16   `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
	F2 uint8    `fidl:"2" fidl_offset_v1:"2" fidl_offset_v1_no_ee:"2"`
}

var _mStructSize3Align2 = _bindings.CreateLazyMarshaler(StructSize3Align2{})

func (msg *StructSize3Align2) Marshaler() _bindings.Marshaler {
	return _mStructSize3Align2
}

type Sandwich6 struct {
	_        struct{}        `fidl:"s,40,8" fidl_size_v1:"40" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"40" fidl_alignment_v1_no_ee:"8"`
	Before   uint32          `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
	TheUnion UnionWithVector `fidl:"8" fidl_offset_v1:"8" fidl_offset_v1_no_ee:"8"`
	After    uint32          `fidl:"32" fidl_offset_v1:"32" fidl_offset_v1_no_ee:"32"`
}

var _mSandwich6 = _bindings.CreateLazyMarshaler(Sandwich6{})

func (msg *Sandwich6) Marshaler() _bindings.Marshaler {
	return _mSandwich6
}

type Sandwich7 struct {
	_            struct{}   `fidl:"s,24,8" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
	Before       uint32     `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
	OptSandwich1 *Sandwich1 `fidl:"8" fidl_offset_v1:"8" fidl_offset_v1_no_ee:"8"`
	After        uint32     `fidl:"16" fidl_offset_v1:"16" fidl_offset_v1_no_ee:"16"`
}

var _mSandwich7 = _bindings.CreateLazyMarshaler(Sandwich7{})

func (msg *Sandwich7) Marshaler() _bindings.Marshaler {
	return _mSandwich7
}

type Sandwich8 struct {
	_            struct{}     `fidl:"s,48,8" fidl_size_v1:"40" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"40" fidl_alignment_v1_no_ee:"8"`
	Before       uint64       `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
	UnionOfUnion UnionOfUnion `fidl:"8" fidl_offset_v1:"8" fidl_offset_v1_no_ee:"8"`
	After        uint32       `fidl:"40" fidl_offset_v1:"32" fidl_offset_v1_no_ee:"32"`
}

var _mSandwich8 = _bindings.CreateLazyMarshaler(Sandwich8{})

func (msg *Sandwich8) Marshaler() _bindings.Marshaler {
	return _mSandwich8
}

type Regression1 struct {
	_  struct{} `fidl:"s,32,8" fidl_size_v1:"32" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"32" fidl_alignment_v1_no_ee:"8"`
	F1 uint8    `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
	F2 uint32   `fidl:"4" fidl_offset_v1:"4" fidl_offset_v1_no_ee:"4"`
	F3 uint8    `fidl:"8" fidl_offset_v1:"8" fidl_offset_v1_no_ee:"8"`
	F4 uint16   `fidl:"10" fidl_offset_v1:"10" fidl_offset_v1_no_ee:"10"`
	F5 uint64   `fidl:"16" fidl_offset_v1:"16" fidl_offset_v1_no_ee:"16"`
	F6 uint8    `fidl:"24" fidl_offset_v1:"24" fidl_offset_v1_no_ee:"24"`
}

var _mRegression1 = _bindings.CreateLazyMarshaler(Regression1{})

func (msg *Regression1) Marshaler() _bindings.Marshaler {
	return _mRegression1
}

type Regression2 struct {
	_    struct{}    `fidl:"s,40,8" fidl_size_v1:"40" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"40" fidl_alignment_v1_no_ee:"8"`
	Head Regression1 `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
	F7   uint8       `fidl:"32" fidl_offset_v1:"32" fidl_offset_v1_no_ee:"32"`
}

var _mRegression2 = _bindings.CreateLazyMarshaler(Regression2{})

func (msg *Regression2) Marshaler() _bindings.Marshaler {
	return _mRegression2
}

type Regression3 struct {
	_        struct{}     `fidl:"s,8,8" fidl_size_v1:"8" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"8" fidl_alignment_v1_no_ee:"8"`
	OptValue *Regression2 `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
}

var _mRegression3 = _bindings.CreateLazyMarshaler(Regression3{})

func (msg *Regression3) Marshaler() _bindings.Marshaler {
	return _mRegression3
}

type TableStructWithReservedSandwichStruct struct {
	_     struct{}                        `fidl:"s,16,8" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
	Table TableStructWithReservedSandwich `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
}

var _mTableStructWithReservedSandwichStruct = _bindings.CreateLazyMarshaler(TableStructWithReservedSandwichStruct{})

func (msg *TableStructWithReservedSandwichStruct) Marshaler() _bindings.Marshaler {
	return _mTableStructWithReservedSandwichStruct
}

type TableStructWithUint32SandwichStruct struct {
	_     struct{}                      `fidl:"s,16,8" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
	Table TableStructWithUint32Sandwich `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
}

var _mTableStructWithUint32SandwichStruct = _bindings.CreateLazyMarshaler(TableStructWithUint32SandwichStruct{})

func (msg *TableStructWithUint32SandwichStruct) Marshaler() _bindings.Marshaler {
	return _mTableStructWithUint32SandwichStruct
}

type TableUnionWithVectorReservedSandwichStruct struct {
	_     struct{}                             `fidl:"s,16,8" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
	Table TableUnionWithVectorReservedSandwich `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
}

var _mTableUnionWithVectorReservedSandwichStruct = _bindings.CreateLazyMarshaler(TableUnionWithVectorReservedSandwichStruct{})

func (msg *TableUnionWithVectorReservedSandwichStruct) Marshaler() _bindings.Marshaler {
	return _mTableUnionWithVectorReservedSandwichStruct
}

type TableUnionWithVectorStructSandwichStruct struct {
	_     struct{}                           `fidl:"s,16,8" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
	Table TableUnionWithVectorStructSandwich `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
}

var _mTableUnionWithVectorStructSandwichStruct = _bindings.CreateLazyMarshaler(TableUnionWithVectorStructSandwichStruct{})

func (msg *TableUnionWithVectorStructSandwichStruct) Marshaler() _bindings.Marshaler {
	return _mTableUnionWithVectorStructSandwichStruct
}

type XUnionWithStructStruct struct {
	_  struct{}         `fidl:"s,24,8" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
	Xu XUnionWithStruct `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
}

var _mXUnionWithStructStruct = _bindings.CreateLazyMarshaler(XUnionWithStructStruct{})

func (msg *XUnionWithStructStruct) Marshaler() _bindings.Marshaler {
	return _mXUnionWithStructStruct
}

type XUnionWithXUnionStruct struct {
	_  struct{}         `fidl:"s,24,8" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
	Xu XUnionWithXUnion `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
}

var _mXUnionWithXUnionStruct = _bindings.CreateLazyMarshaler(XUnionWithXUnionStruct{})

func (msg *XUnionWithXUnionStruct) Marshaler() _bindings.Marshaler {
	return _mXUnionWithXUnionStruct
}

type Size5Alignment1 struct {
	_    struct{} `fidl:"s,5,1" fidl_size_v1:"5" fidl_alignment_v1:"1" fidl_size_v1_no_ee:"5" fidl_alignment_v1_no_ee:"1"`
	Data [5]uint8 `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
}

var _mSize5Alignment1 = _bindings.CreateLazyMarshaler(Size5Alignment1{})

func (msg *Size5Alignment1) Marshaler() _bindings.Marshaler {
	return _mSize5Alignment1
}

type Size5Alignment4 struct {
	_    struct{} `fidl:"s,8,4" fidl_size_v1:"8" fidl_alignment_v1:"4" fidl_size_v1_no_ee:"8" fidl_alignment_v1_no_ee:"4"`
	Four uint32   `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
	One  uint8    `fidl:"4" fidl_offset_v1:"4" fidl_offset_v1_no_ee:"4"`
}

var _mSize5Alignment4 = _bindings.CreateLazyMarshaler(Size5Alignment4{})

func (msg *Size5Alignment4) Marshaler() _bindings.Marshaler {
	return _mSize5Alignment4
}

type Size5Alignment1Vector struct {
	_ struct{}          `fidl:"s,16,8" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
	V []Size5Alignment1 `fidl:"0," fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
}

var _mSize5Alignment1Vector = _bindings.CreateLazyMarshaler(Size5Alignment1Vector{})

func (msg *Size5Alignment1Vector) Marshaler() _bindings.Marshaler {
	return _mSize5Alignment1Vector
}

type Size5Alignment4Vector struct {
	_ struct{}          `fidl:"s,16,8" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
	V []Size5Alignment4 `fidl:"0," fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
}

var _mSize5Alignment4Vector = _bindings.CreateLazyMarshaler(Size5Alignment4Vector{})

func (msg *Size5Alignment4Vector) Marshaler() _bindings.Marshaler {
	return _mSize5Alignment4Vector
}

type Size5Alignment1Array struct {
	_ struct{}           `fidl:"s,15,1" fidl_size_v1:"15" fidl_alignment_v1:"1" fidl_size_v1_no_ee:"15" fidl_alignment_v1_no_ee:"1"`
	A [3]Size5Alignment1 `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
}

var _mSize5Alignment1Array = _bindings.CreateLazyMarshaler(Size5Alignment1Array{})

func (msg *Size5Alignment1Array) Marshaler() _bindings.Marshaler {
	return _mSize5Alignment1Array
}

type Size5Alignment4Array struct {
	_ struct{}           `fidl:"s,24,4" fidl_size_v1:"24" fidl_alignment_v1:"4" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"4"`
	A [3]Size5Alignment4 `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
}

var _mSize5Alignment4Array = _bindings.CreateLazyMarshaler(Size5Alignment4Array{})

func (msg *Size5Alignment4Array) Marshaler() _bindings.Marshaler {
	return _mSize5Alignment4Array
}

type ArrayStruct struct {
	_              struct{}        `fidl:"s,96,8" fidl_size_v1:"144" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"144" fidl_alignment_v1_no_ee:"8"`
	Unions         [3]StringUnion  `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
	OptionalUnions [3]*StringUnion `fidl:"72" fidl_offset_v1:"72" fidl_offset_v1_no_ee:"72"`
}

var _mArrayStruct = _bindings.CreateLazyMarshaler(ArrayStruct{})

func (msg *ArrayStruct) Marshaler() _bindings.Marshaler {
	return _mArrayStruct
}

type StructWithInt struct {
	_ struct{} `fidl:"s,4,4" fidl_size_v1:"4" fidl_alignment_v1:"4" fidl_size_v1_no_ee:"4" fidl_alignment_v1_no_ee:"4"`
	X int32    `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
}

var _mStructWithInt = _bindings.CreateLazyMarshaler(StructWithInt{})

func (msg *StructWithInt) Marshaler() _bindings.Marshaler {
	return _mStructWithInt
}

type StructWithArrays struct {
	_                 struct{}          `fidl:"s,120,8" fidl_size_v1:"120" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"120" fidl_alignment_v1_no_ee:"8"`
	ArrInt            [2]int32          `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
	ArrString         [2]string         `fidl:"8," fidl_offset_v1:"8" fidl_offset_v1_no_ee:"8"`
	ArrNullableString [2]*string        `fidl:"40," fidl_offset_v1:"40" fidl_offset_v1_no_ee:"40"`
	ArrStruct         [2]StructWithInt  `fidl:"72" fidl_offset_v1:"72" fidl_offset_v1_no_ee:"72"`
	ArrNullableStruct [2]*StructWithInt `fidl:"80" fidl_offset_v1:"80" fidl_offset_v1_no_ee:"80"`
	ArrArrInt         [2][3]int32       `fidl:"96" fidl_offset_v1:"96" fidl_offset_v1_no_ee:"96"`
}

var _mStructWithArrays = _bindings.CreateLazyMarshaler(StructWithArrays{})

func (msg *StructWithArrays) Marshaler() _bindings.Marshaler {
	return _mStructWithArrays
}

type StructWithVectors struct {
	_                 struct{}         `fidl:"s,112,8" fidl_size_v1:"112" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"112" fidl_alignment_v1_no_ee:"8"`
	VecEmpty          []int32          `fidl:"0," fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
	VecInt            []int32          `fidl:"16," fidl_offset_v1:"16" fidl_offset_v1_no_ee:"16"`
	VecString         []string         `fidl:"32,," fidl_offset_v1:"32" fidl_offset_v1_no_ee:"32"`
	VecNullableString []*string        `fidl:"48,," fidl_offset_v1:"48" fidl_offset_v1_no_ee:"48"`
	VecStruct         []StructWithInt  `fidl:"64," fidl_offset_v1:"64" fidl_offset_v1_no_ee:"64"`
	VecNullableStruct []*StructWithInt `fidl:"80," fidl_offset_v1:"80" fidl_offset_v1_no_ee:"80"`
	VecVecInt         [][]int32        `fidl:"96,," fidl_offset_v1:"96" fidl_offset_v1_no_ee:"96"`
}

var _mStructWithVectors = _bindings.CreateLazyMarshaler(StructWithVectors{})

func (msg *StructWithVectors) Marshaler() _bindings.Marshaler {
	return _mStructWithVectors
}

type Length2StringWrapper struct {
	_             struct{} `fidl:"s,16,8" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
	Length2String string   `fidl:"0,2" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
}

var _mLength2StringWrapper = _bindings.CreateLazyMarshaler(Length2StringWrapper{})

func (msg *Length2StringWrapper) Marshaler() _bindings.Marshaler {
	return _mLength2StringWrapper
}

type StringWrapper struct {
	_   struct{} `fidl:"s,16,8" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
	Str string   `fidl:"0," fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
}

var _mStringWrapper = _bindings.CreateLazyMarshaler(StringWrapper{})

func (msg *StringWrapper) Marshaler() _bindings.Marshaler {
	return _mStringWrapper
}

type TestXUnionInTable struct {
	_     struct{}      `fidl:"s,16,8" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
	Value XUnionInTable `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
}

var _mTestXUnionInTable = _bindings.CreateLazyMarshaler(TestXUnionInTable{})

func (msg *TestXUnionInTable) Marshaler() _bindings.Marshaler {
	return _mTestXUnionInTable
}

type InterfaceConfig struct {
	_               struct{}        `fidl:"s,48,8" fidl_size_v1:"40" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"40" fidl_alignment_v1_no_ee:"8"`
	Name            string          `fidl:"0," fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
	IpAddressConfig IpAddressConfig `fidl:"16" fidl_offset_v1:"16" fidl_offset_v1_no_ee:"16"`
}

var _mInterfaceConfig = _bindings.CreateLazyMarshaler(InterfaceConfig{})

func (msg *InterfaceConfig) Marshaler() _bindings.Marshaler {
	return _mInterfaceConfig
}

type TestAddEthernetDeviceRequest struct {
	_                   struct{}        `fidl:"s,72,8" fidl_size_v1:"64" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"64" fidl_alignment_v1_no_ee:"8"`
	TopologicalPath     string          `fidl:"0," fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
	Config              InterfaceConfig `fidl:"16" fidl_offset_v1:"16" fidl_offset_v1_no_ee:"16"`
	ThisShouldBeAHandle uint32          `fidl:"64" fidl_offset_v1:"56" fidl_offset_v1_no_ee:"56"`
}

var _mTestAddEthernetDeviceRequest = _bindings.CreateLazyMarshaler(TestAddEthernetDeviceRequest{})

func (msg *TestAddEthernetDeviceRequest) Marshaler() _bindings.Marshaler {
	return _mTestAddEthernetDeviceRequest
}

type NodeAttributes struct {
	_                struct{} `fidl:"s,56,8" fidl_size_v1:"56" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"56" fidl_alignment_v1_no_ee:"8"`
	Mode             uint32   `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
	Id               uint64   `fidl:"8" fidl_offset_v1:"8" fidl_offset_v1_no_ee:"8"`
	ContentSize      uint64   `fidl:"16" fidl_offset_v1:"16" fidl_offset_v1_no_ee:"16"`
	StorageSize      uint64   `fidl:"24" fidl_offset_v1:"24" fidl_offset_v1_no_ee:"24"`
	LinkCount        uint64   `fidl:"32" fidl_offset_v1:"32" fidl_offset_v1_no_ee:"32"`
	CreationTime     uint64   `fidl:"40" fidl_offset_v1:"40" fidl_offset_v1_no_ee:"40"`
	ModificationTime uint64   `fidl:"48" fidl_offset_v1:"48" fidl_offset_v1_no_ee:"48"`
}

var _mNodeAttributes = _bindings.CreateLazyMarshaler(NodeAttributes{})

func (msg *NodeAttributes) Marshaler() _bindings.Marshaler {
	return _mNodeAttributes
}

type FileGetAttrResponse struct {
	_          struct{}       `fidl:"s,64,8" fidl_size_v1:"64" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"64" fidl_alignment_v1_no_ee:"8"`
	S          int32          `fidl:"0" fidl_offset_v1:"0" fidl_offset_v1_no_ee:"0"`
	Attributes NodeAttributes `fidl:"8" fidl_offset_v1:"8" fidl_offset_v1_no_ee:"8"`
}

var _mFileGetAttrResponse = _bindings.CreateLazyMarshaler(FileGetAttrResponse{})

func (msg *FileGetAttrResponse) Marshaler() _bindings.Marshaler {
	return _mFileGetAttrResponse
}

type I_unionWithBoundStringTag uint32

const (
	_ I_unionWithBoundStringTag = iota
	UnionWithBoundStringBoundFiveStr
)

type UnionWithBoundString struct {
	I_unionWithBoundStringTag `fidl:"u,24,8" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
	BoundFiveStr              string `fidl:"1,5"`
}

func (u *UnionWithBoundString) Which() I_unionWithBoundStringTag {
	return u.I_unionWithBoundStringTag
}

func (u *UnionWithBoundString) SetBoundFiveStr(boundFiveStr string) {
	u.I_unionWithBoundStringTag = UnionWithBoundStringBoundFiveStr
	u.BoundFiveStr = boundFiveStr
}

func UnionWithBoundStringWithBoundFiveStr(boundFiveStr string) UnionWithBoundString {
	var _u UnionWithBoundString
	_u.SetBoundFiveStr(boundFiveStr)
	return _u
}

type I_singleVariantUnionTag uint32

const (
	_ I_singleVariantUnionTag = iota
	SingleVariantUnionX
)

type SingleVariantUnion struct {
	I_singleVariantUnionTag `fidl:"u,8,4" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
	X                       uint32 `fidl:"1"`
}

func (u *SingleVariantUnion) Which() I_singleVariantUnionTag {
	return u.I_singleVariantUnionTag
}

func (u *SingleVariantUnion) SetX(x uint32) {
	u.I_singleVariantUnionTag = SingleVariantUnionX
	u.X = x
}

func SingleVariantUnionWithX(x uint32) SingleVariantUnion {
	var _u SingleVariantUnion
	_u.SetX(x)
	return _u
}

type I_unionSize8Alignment4Tag uint32

const (
	_ I_unionSize8Alignment4Tag = iota
	UnionSize8Alignment4Unused1
	UnionSize8Alignment4Unused2
	UnionSize8Alignment4Variant
)

type UnionSize8Alignment4 struct {
	I_unionSize8Alignment4Tag `fidl:"u,8,4" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
	Unused1                   uint8  `fidl:"1"`
	Unused2                   uint8  `fidl:"2"`
	Variant                   uint32 `fidl:"3"`
}

func (u *UnionSize8Alignment4) Which() I_unionSize8Alignment4Tag {
	return u.I_unionSize8Alignment4Tag
}

func (u *UnionSize8Alignment4) SetUnused1(unused1 uint8) {
	u.I_unionSize8Alignment4Tag = UnionSize8Alignment4Unused1
	u.Unused1 = unused1
}

func UnionSize8Alignment4WithUnused1(unused1 uint8) UnionSize8Alignment4 {
	var _u UnionSize8Alignment4
	_u.SetUnused1(unused1)
	return _u
}

func (u *UnionSize8Alignment4) SetUnused2(unused2 uint8) {
	u.I_unionSize8Alignment4Tag = UnionSize8Alignment4Unused2
	u.Unused2 = unused2
}

func UnionSize8Alignment4WithUnused2(unused2 uint8) UnionSize8Alignment4 {
	var _u UnionSize8Alignment4
	_u.SetUnused2(unused2)
	return _u
}

func (u *UnionSize8Alignment4) SetVariant(variant uint32) {
	u.I_unionSize8Alignment4Tag = UnionSize8Alignment4Variant
	u.Variant = variant
}

func UnionSize8Alignment4WithVariant(variant uint32) UnionSize8Alignment4 {
	var _u UnionSize8Alignment4
	_u.SetVariant(variant)
	return _u
}

type I_unionSize12Alignment4Tag uint32

const (
	_ I_unionSize12Alignment4Tag = iota
	UnionSize12Alignment4Unused1
	UnionSize12Alignment4Unused2
	UnionSize12Alignment4Unused3
	UnionSize12Alignment4Variant
)

type UnionSize12Alignment4 struct {
	I_unionSize12Alignment4Tag `fidl:"u,12,4" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
	Unused1                    uint8    `fidl:"1"`
	Unused2                    uint8    `fidl:"2"`
	Unused3                    uint8    `fidl:"3"`
	Variant                    [6]uint8 `fidl:"4"`
}

func (u *UnionSize12Alignment4) Which() I_unionSize12Alignment4Tag {
	return u.I_unionSize12Alignment4Tag
}

func (u *UnionSize12Alignment4) SetUnused1(unused1 uint8) {
	u.I_unionSize12Alignment4Tag = UnionSize12Alignment4Unused1
	u.Unused1 = unused1
}

func UnionSize12Alignment4WithUnused1(unused1 uint8) UnionSize12Alignment4 {
	var _u UnionSize12Alignment4
	_u.SetUnused1(unused1)
	return _u
}

func (u *UnionSize12Alignment4) SetUnused2(unused2 uint8) {
	u.I_unionSize12Alignment4Tag = UnionSize12Alignment4Unused2
	u.Unused2 = unused2
}

func UnionSize12Alignment4WithUnused2(unused2 uint8) UnionSize12Alignment4 {
	var _u UnionSize12Alignment4
	_u.SetUnused2(unused2)
	return _u
}

func (u *UnionSize12Alignment4) SetUnused3(unused3 uint8) {
	u.I_unionSize12Alignment4Tag = UnionSize12Alignment4Unused3
	u.Unused3 = unused3
}

func UnionSize12Alignment4WithUnused3(unused3 uint8) UnionSize12Alignment4 {
	var _u UnionSize12Alignment4
	_u.SetUnused3(unused3)
	return _u
}

func (u *UnionSize12Alignment4) SetVariant(variant [6]uint8) {
	u.I_unionSize12Alignment4Tag = UnionSize12Alignment4Variant
	u.Variant = variant
}

func UnionSize12Alignment4WithVariant(variant [6]uint8) UnionSize12Alignment4 {
	var _u UnionSize12Alignment4
	_u.SetVariant(variant)
	return _u
}

type I_unionSize24Alignment8Tag uint32

const (
	_ I_unionSize24Alignment8Tag = iota
	UnionSize24Alignment8Unused1
	UnionSize24Alignment8Unused2
	UnionSize24Alignment8Unused3
	UnionSize24Alignment8Variant
)

type UnionSize24Alignment8 struct {
	I_unionSize24Alignment8Tag `fidl:"u,24,8" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
	Unused1                    uint8                  `fidl:"1"`
	Unused2                    uint8                  `fidl:"2"`
	Unused3                    uint8                  `fidl:"3"`
	Variant                    StructSize16Alignment8 `fidl:"4"`
}

func (u *UnionSize24Alignment8) Which() I_unionSize24Alignment8Tag {
	return u.I_unionSize24Alignment8Tag
}

func (u *UnionSize24Alignment8) SetUnused1(unused1 uint8) {
	u.I_unionSize24Alignment8Tag = UnionSize24Alignment8Unused1
	u.Unused1 = unused1
}

func UnionSize24Alignment8WithUnused1(unused1 uint8) UnionSize24Alignment8 {
	var _u UnionSize24Alignment8
	_u.SetUnused1(unused1)
	return _u
}

func (u *UnionSize24Alignment8) SetUnused2(unused2 uint8) {
	u.I_unionSize24Alignment8Tag = UnionSize24Alignment8Unused2
	u.Unused2 = unused2
}

func UnionSize24Alignment8WithUnused2(unused2 uint8) UnionSize24Alignment8 {
	var _u UnionSize24Alignment8
	_u.SetUnused2(unused2)
	return _u
}

func (u *UnionSize24Alignment8) SetUnused3(unused3 uint8) {
	u.I_unionSize24Alignment8Tag = UnionSize24Alignment8Unused3
	u.Unused3 = unused3
}

func UnionSize24Alignment8WithUnused3(unused3 uint8) UnionSize24Alignment8 {
	var _u UnionSize24Alignment8
	_u.SetUnused3(unused3)
	return _u
}

func (u *UnionSize24Alignment8) SetVariant(variant StructSize16Alignment8) {
	u.I_unionSize24Alignment8Tag = UnionSize24Alignment8Variant
	u.Variant = variant
}

func UnionSize24Alignment8WithVariant(variant StructSize16Alignment8) UnionSize24Alignment8 {
	var _u UnionSize24Alignment8
	_u.SetVariant(variant)
	return _u
}

type I_unionSize36Alignment4Tag uint32

const (
	_ I_unionSize36Alignment4Tag = iota
	UnionSize36Alignment4Unused1
	UnionSize36Alignment4Unused2
	UnionSize36Alignment4Unused3
	UnionSize36Alignment4Variant
)

type UnionSize36Alignment4 struct {
	I_unionSize36Alignment4Tag `fidl:"u,36,4" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
	Unused1                    uint8     `fidl:"1"`
	Unused2                    uint8     `fidl:"2"`
	Unused3                    uint8     `fidl:"3"`
	Variant                    [32]uint8 `fidl:"4"`
}

func (u *UnionSize36Alignment4) Which() I_unionSize36Alignment4Tag {
	return u.I_unionSize36Alignment4Tag
}

func (u *UnionSize36Alignment4) SetUnused1(unused1 uint8) {
	u.I_unionSize36Alignment4Tag = UnionSize36Alignment4Unused1
	u.Unused1 = unused1
}

func UnionSize36Alignment4WithUnused1(unused1 uint8) UnionSize36Alignment4 {
	var _u UnionSize36Alignment4
	_u.SetUnused1(unused1)
	return _u
}

func (u *UnionSize36Alignment4) SetUnused2(unused2 uint8) {
	u.I_unionSize36Alignment4Tag = UnionSize36Alignment4Unused2
	u.Unused2 = unused2
}

func UnionSize36Alignment4WithUnused2(unused2 uint8) UnionSize36Alignment4 {
	var _u UnionSize36Alignment4
	_u.SetUnused2(unused2)
	return _u
}

func (u *UnionSize36Alignment4) SetUnused3(unused3 uint8) {
	u.I_unionSize36Alignment4Tag = UnionSize36Alignment4Unused3
	u.Unused3 = unused3
}

func UnionSize36Alignment4WithUnused3(unused3 uint8) UnionSize36Alignment4 {
	var _u UnionSize36Alignment4
	_u.SetUnused3(unused3)
	return _u
}

func (u *UnionSize36Alignment4) SetVariant(variant [32]uint8) {
	u.I_unionSize36Alignment4Tag = UnionSize36Alignment4Variant
	u.Variant = variant
}

func UnionSize36Alignment4WithVariant(variant [32]uint8) UnionSize36Alignment4 {
	var _u UnionSize36Alignment4
	_u.SetVariant(variant)
	return _u
}

type I_unionWithEmptyStructTag uint32

const (
	_ I_unionWithEmptyStructTag = iota
	UnionWithEmptyStructS
	UnionWithEmptyStructForceAlignmentOf8
)

type UnionWithEmptyStruct struct {
	I_unionWithEmptyStructTag `fidl:"u,16,8" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
	S                         EmptyStruct `fidl:"1"`
	ForceAlignmentOf8         uint64      `fidl:"2"`
}

func (u *UnionWithEmptyStruct) Which() I_unionWithEmptyStructTag {
	return u.I_unionWithEmptyStructTag
}

func (u *UnionWithEmptyStruct) SetS(s EmptyStruct) {
	u.I_unionWithEmptyStructTag = UnionWithEmptyStructS
	u.S = s
}

func UnionWithEmptyStructWithS(s EmptyStruct) UnionWithEmptyStruct {
	var _u UnionWithEmptyStruct
	_u.SetS(s)
	return _u
}

func (u *UnionWithEmptyStruct) SetForceAlignmentOf8(forceAlignmentOf8 uint64) {
	u.I_unionWithEmptyStructTag = UnionWithEmptyStructForceAlignmentOf8
	u.ForceAlignmentOf8 = forceAlignmentOf8
}

func UnionWithEmptyStructWithForceAlignmentOf8(forceAlignmentOf8 uint64) UnionWithEmptyStruct {
	var _u UnionWithEmptyStruct
	_u.SetForceAlignmentOf8(forceAlignmentOf8)
	return _u
}

type I_simpleUnionTag uint32

const (
	_ I_simpleUnionTag = iota
	SimpleUnionI32
	SimpleUnionI64
	SimpleUnionS
	SimpleUnionStr
)

type SimpleUnion struct {
	I_simpleUnionTag `fidl:"u,24,8" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
	I32              int32       `fidl:"1"`
	I64              int64       `fidl:"2"`
	S                Int64Struct `fidl:"3"`
	Str              string      `fidl:"4,"`
}

func (u *SimpleUnion) Which() I_simpleUnionTag {
	return u.I_simpleUnionTag
}

func (u *SimpleUnion) SetI32(i32 int32) {
	u.I_simpleUnionTag = SimpleUnionI32
	u.I32 = i32
}

func SimpleUnionWithI32(i32 int32) SimpleUnion {
	var _u SimpleUnion
	_u.SetI32(i32)
	return _u
}

func (u *SimpleUnion) SetI64(i64 int64) {
	u.I_simpleUnionTag = SimpleUnionI64
	u.I64 = i64
}

func SimpleUnionWithI64(i64 int64) SimpleUnion {
	var _u SimpleUnion
	_u.SetI64(i64)
	return _u
}

func (u *SimpleUnion) SetS(s Int64Struct) {
	u.I_simpleUnionTag = SimpleUnionS
	u.S = s
}

func SimpleUnionWithS(s Int64Struct) SimpleUnion {
	var _u SimpleUnion
	_u.SetS(s)
	return _u
}

func (u *SimpleUnion) SetStr(str string) {
	u.I_simpleUnionTag = SimpleUnionStr
	u.Str = str
}

func SimpleUnionWithStr(str string) SimpleUnion {
	var _u SimpleUnion
	_u.SetStr(str)
	return _u
}

type I_unionSize8Align4Tag uint32

const (
	_ I_unionSize8Align4Tag = iota
	UnionSize8Align4Unused1
	UnionSize8Align4Unused2
	UnionSize8Align4Variant
)

type UnionSize8Align4 struct {
	I_unionSize8Align4Tag `fidl:"u,8,4" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
	Unused1               uint8  `fidl:"1"`
	Unused2               uint8  `fidl:"2"`
	Variant               uint32 `fidl:"3"`
}

func (u *UnionSize8Align4) Which() I_unionSize8Align4Tag {
	return u.I_unionSize8Align4Tag
}

func (u *UnionSize8Align4) SetUnused1(unused1 uint8) {
	u.I_unionSize8Align4Tag = UnionSize8Align4Unused1
	u.Unused1 = unused1
}

func UnionSize8Align4WithUnused1(unused1 uint8) UnionSize8Align4 {
	var _u UnionSize8Align4
	_u.SetUnused1(unused1)
	return _u
}

func (u *UnionSize8Align4) SetUnused2(unused2 uint8) {
	u.I_unionSize8Align4Tag = UnionSize8Align4Unused2
	u.Unused2 = unused2
}

func UnionSize8Align4WithUnused2(unused2 uint8) UnionSize8Align4 {
	var _u UnionSize8Align4
	_u.SetUnused2(unused2)
	return _u
}

func (u *UnionSize8Align4) SetVariant(variant uint32) {
	u.I_unionSize8Align4Tag = UnionSize8Align4Variant
	u.Variant = variant
}

func UnionSize8Align4WithVariant(variant uint32) UnionSize8Align4 {
	var _u UnionSize8Align4
	_u.SetVariant(variant)
	return _u
}

type I_unionSize12Align4Tag uint32

const (
	_ I_unionSize12Align4Tag = iota
	UnionSize12Align4Unused1
	UnionSize12Align4Unused2
	UnionSize12Align4Unused3
	UnionSize12Align4Variant
)

type UnionSize12Align4 struct {
	I_unionSize12Align4Tag `fidl:"u,12,4" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
	Unused1                uint8    `fidl:"1"`
	Unused2                uint8    `fidl:"2"`
	Unused3                uint8    `fidl:"3"`
	Variant                [6]uint8 `fidl:"4"`
}

func (u *UnionSize12Align4) Which() I_unionSize12Align4Tag {
	return u.I_unionSize12Align4Tag
}

func (u *UnionSize12Align4) SetUnused1(unused1 uint8) {
	u.I_unionSize12Align4Tag = UnionSize12Align4Unused1
	u.Unused1 = unused1
}

func UnionSize12Align4WithUnused1(unused1 uint8) UnionSize12Align4 {
	var _u UnionSize12Align4
	_u.SetUnused1(unused1)
	return _u
}

func (u *UnionSize12Align4) SetUnused2(unused2 uint8) {
	u.I_unionSize12Align4Tag = UnionSize12Align4Unused2
	u.Unused2 = unused2
}

func UnionSize12Align4WithUnused2(unused2 uint8) UnionSize12Align4 {
	var _u UnionSize12Align4
	_u.SetUnused2(unused2)
	return _u
}

func (u *UnionSize12Align4) SetUnused3(unused3 uint8) {
	u.I_unionSize12Align4Tag = UnionSize12Align4Unused3
	u.Unused3 = unused3
}

func UnionSize12Align4WithUnused3(unused3 uint8) UnionSize12Align4 {
	var _u UnionSize12Align4
	_u.SetUnused3(unused3)
	return _u
}

func (u *UnionSize12Align4) SetVariant(variant [6]uint8) {
	u.I_unionSize12Align4Tag = UnionSize12Align4Variant
	u.Variant = variant
}

func UnionSize12Align4WithVariant(variant [6]uint8) UnionSize12Align4 {
	var _u UnionSize12Align4
	_u.SetVariant(variant)
	return _u
}

type I_unionSize24Align8Tag uint32

const (
	_ I_unionSize24Align8Tag = iota
	UnionSize24Align8Unused1
	UnionSize24Align8Unused2
	UnionSize24Align8Unused3
	UnionSize24Align8Variant
)

type UnionSize24Align8 struct {
	I_unionSize24Align8Tag `fidl:"u,24,8" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
	Unused1                uint8              `fidl:"1"`
	Unused2                uint8              `fidl:"2"`
	Unused3                uint8              `fidl:"3"`
	Variant                StructSize16Align8 `fidl:"4"`
}

func (u *UnionSize24Align8) Which() I_unionSize24Align8Tag {
	return u.I_unionSize24Align8Tag
}

func (u *UnionSize24Align8) SetUnused1(unused1 uint8) {
	u.I_unionSize24Align8Tag = UnionSize24Align8Unused1
	u.Unused1 = unused1
}

func UnionSize24Align8WithUnused1(unused1 uint8) UnionSize24Align8 {
	var _u UnionSize24Align8
	_u.SetUnused1(unused1)
	return _u
}

func (u *UnionSize24Align8) SetUnused2(unused2 uint8) {
	u.I_unionSize24Align8Tag = UnionSize24Align8Unused2
	u.Unused2 = unused2
}

func UnionSize24Align8WithUnused2(unused2 uint8) UnionSize24Align8 {
	var _u UnionSize24Align8
	_u.SetUnused2(unused2)
	return _u
}

func (u *UnionSize24Align8) SetUnused3(unused3 uint8) {
	u.I_unionSize24Align8Tag = UnionSize24Align8Unused3
	u.Unused3 = unused3
}

func UnionSize24Align8WithUnused3(unused3 uint8) UnionSize24Align8 {
	var _u UnionSize24Align8
	_u.SetUnused3(unused3)
	return _u
}

func (u *UnionSize24Align8) SetVariant(variant StructSize16Align8) {
	u.I_unionSize24Align8Tag = UnionSize24Align8Variant
	u.Variant = variant
}

func UnionSize24Align8WithVariant(variant StructSize16Align8) UnionSize24Align8 {
	var _u UnionSize24Align8
	_u.SetVariant(variant)
	return _u
}

type I_unionSize36Align4Tag uint32

const (
	_ I_unionSize36Align4Tag = iota
	UnionSize36Align4Unused1
	UnionSize36Align4Unused2
	UnionSize36Align4Unused3
	UnionSize36Align4Variant
)

type UnionSize36Align4 struct {
	I_unionSize36Align4Tag `fidl:"u,36,4" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
	Unused1                uint8     `fidl:"1"`
	Unused2                uint8     `fidl:"2"`
	Unused3                uint8     `fidl:"3"`
	Variant                [32]uint8 `fidl:"4"`
}

func (u *UnionSize36Align4) Which() I_unionSize36Align4Tag {
	return u.I_unionSize36Align4Tag
}

func (u *UnionSize36Align4) SetUnused1(unused1 uint8) {
	u.I_unionSize36Align4Tag = UnionSize36Align4Unused1
	u.Unused1 = unused1
}

func UnionSize36Align4WithUnused1(unused1 uint8) UnionSize36Align4 {
	var _u UnionSize36Align4
	_u.SetUnused1(unused1)
	return _u
}

func (u *UnionSize36Align4) SetUnused2(unused2 uint8) {
	u.I_unionSize36Align4Tag = UnionSize36Align4Unused2
	u.Unused2 = unused2
}

func UnionSize36Align4WithUnused2(unused2 uint8) UnionSize36Align4 {
	var _u UnionSize36Align4
	_u.SetUnused2(unused2)
	return _u
}

func (u *UnionSize36Align4) SetUnused3(unused3 uint8) {
	u.I_unionSize36Align4Tag = UnionSize36Align4Unused3
	u.Unused3 = unused3
}

func UnionSize36Align4WithUnused3(unused3 uint8) UnionSize36Align4 {
	var _u UnionSize36Align4
	_u.SetUnused3(unused3)
	return _u
}

func (u *UnionSize36Align4) SetVariant(variant [32]uint8) {
	u.I_unionSize36Align4Tag = UnionSize36Align4Variant
	u.Variant = variant
}

func UnionSize36Align4WithVariant(variant [32]uint8) UnionSize36Align4 {
	var _u UnionSize36Align4
	_u.SetVariant(variant)
	return _u
}

type I_unionOfUnionTag uint32

const (
	_ I_unionOfUnionTag = iota
	UnionOfUnionUnused1
	UnionOfUnionSize8align4
	UnionOfUnionSize12align4
	UnionOfUnionUnused2
	UnionOfUnionSize24align8
)

type UnionOfUnion struct {
	I_unionOfUnionTag `fidl:"u,32,8" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
	Unused1           uint8             `fidl:"1"`
	Size8align4       UnionSize8Align4  `fidl:"2"`
	Size12align4      UnionSize12Align4 `fidl:"3"`
	Unused2           uint8             `fidl:"4"`
	Size24align8      UnionSize24Align8 `fidl:"5"`
}

func (u *UnionOfUnion) Which() I_unionOfUnionTag {
	return u.I_unionOfUnionTag
}

func (u *UnionOfUnion) SetUnused1(unused1 uint8) {
	u.I_unionOfUnionTag = UnionOfUnionUnused1
	u.Unused1 = unused1
}

func UnionOfUnionWithUnused1(unused1 uint8) UnionOfUnion {
	var _u UnionOfUnion
	_u.SetUnused1(unused1)
	return _u
}

func (u *UnionOfUnion) SetSize8align4(size8align4 UnionSize8Align4) {
	u.I_unionOfUnionTag = UnionOfUnionSize8align4
	u.Size8align4 = size8align4
}

func UnionOfUnionWithSize8align4(size8align4 UnionSize8Align4) UnionOfUnion {
	var _u UnionOfUnion
	_u.SetSize8align4(size8align4)
	return _u
}

func (u *UnionOfUnion) SetSize12align4(size12align4 UnionSize12Align4) {
	u.I_unionOfUnionTag = UnionOfUnionSize12align4
	u.Size12align4 = size12align4
}

func UnionOfUnionWithSize12align4(size12align4 UnionSize12Align4) UnionOfUnion {
	var _u UnionOfUnion
	_u.SetSize12align4(size12align4)
	return _u
}

func (u *UnionOfUnion) SetUnused2(unused2 uint8) {
	u.I_unionOfUnionTag = UnionOfUnionUnused2
	u.Unused2 = unused2
}

func UnionOfUnionWithUnused2(unused2 uint8) UnionOfUnion {
	var _u UnionOfUnion
	_u.SetUnused2(unused2)
	return _u
}

func (u *UnionOfUnion) SetSize24align8(size24align8 UnionSize24Align8) {
	u.I_unionOfUnionTag = UnionOfUnionSize24align8
	u.Size24align8 = size24align8
}

func UnionOfUnionWithSize24align8(size24align8 UnionSize24Align8) UnionOfUnion {
	var _u UnionOfUnion
	_u.SetSize24align8(size24align8)
	return _u
}

type I_unionWithVectorTag uint32

const (
	_ I_unionWithVectorTag = iota
	UnionWithVectorUnused
	UnionWithVectorVectorOfUint8
	UnionWithVectorS
	UnionWithVectorVectorS3A1
	UnionWithVectorVectorS3A2
	UnionWithVectorHandles
	UnionWithVectorArrayS3A1
	UnionWithVectorArrayS3A2
	UnionWithVectorVectorUnion
)

type UnionWithVector struct {
	I_unionWithVectorTag `fidl:"u,24,8" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
	Unused               uint8                `fidl:"1"`
	VectorOfUint8        []uint8              `fidl:"2,"`
	S                    string               `fidl:"3,"`
	VectorS3A1           []StructSize3Align1  `fidl:"4,"`
	VectorS3A2           []StructSize3Align2  `fidl:"5,"`
	Handles              []uint32             `fidl:"6,"`
	ArrayS3A1            [2]StructSize3Align1 `fidl:"7"`
	ArrayS3A2            [2]StructSize3Align2 `fidl:"8"`
	VectorUnion          []UnionSize8Align4   `fidl:"9,"`
}

func (u *UnionWithVector) Which() I_unionWithVectorTag {
	return u.I_unionWithVectorTag
}

func (u *UnionWithVector) SetUnused(unused uint8) {
	u.I_unionWithVectorTag = UnionWithVectorUnused
	u.Unused = unused
}

func UnionWithVectorWithUnused(unused uint8) UnionWithVector {
	var _u UnionWithVector
	_u.SetUnused(unused)
	return _u
}

func (u *UnionWithVector) SetVectorOfUint8(vectorOfUint8 []uint8) {
	u.I_unionWithVectorTag = UnionWithVectorVectorOfUint8
	u.VectorOfUint8 = vectorOfUint8
}

func UnionWithVectorWithVectorOfUint8(vectorOfUint8 []uint8) UnionWithVector {
	var _u UnionWithVector
	_u.SetVectorOfUint8(vectorOfUint8)
	return _u
}

func (u *UnionWithVector) SetS(s string) {
	u.I_unionWithVectorTag = UnionWithVectorS
	u.S = s
}

func UnionWithVectorWithS(s string) UnionWithVector {
	var _u UnionWithVector
	_u.SetS(s)
	return _u
}

func (u *UnionWithVector) SetVectorS3A1(vectorS3A1 []StructSize3Align1) {
	u.I_unionWithVectorTag = UnionWithVectorVectorS3A1
	u.VectorS3A1 = vectorS3A1
}

func UnionWithVectorWithVectorS3A1(vectorS3A1 []StructSize3Align1) UnionWithVector {
	var _u UnionWithVector
	_u.SetVectorS3A1(vectorS3A1)
	return _u
}

func (u *UnionWithVector) SetVectorS3A2(vectorS3A2 []StructSize3Align2) {
	u.I_unionWithVectorTag = UnionWithVectorVectorS3A2
	u.VectorS3A2 = vectorS3A2
}

func UnionWithVectorWithVectorS3A2(vectorS3A2 []StructSize3Align2) UnionWithVector {
	var _u UnionWithVector
	_u.SetVectorS3A2(vectorS3A2)
	return _u
}

func (u *UnionWithVector) SetHandles(handles []uint32) {
	u.I_unionWithVectorTag = UnionWithVectorHandles
	u.Handles = handles
}

func UnionWithVectorWithHandles(handles []uint32) UnionWithVector {
	var _u UnionWithVector
	_u.SetHandles(handles)
	return _u
}

func (u *UnionWithVector) SetArrayS3A1(arrayS3A1 [2]StructSize3Align1) {
	u.I_unionWithVectorTag = UnionWithVectorArrayS3A1
	u.ArrayS3A1 = arrayS3A1
}

func UnionWithVectorWithArrayS3A1(arrayS3A1 [2]StructSize3Align1) UnionWithVector {
	var _u UnionWithVector
	_u.SetArrayS3A1(arrayS3A1)
	return _u
}

func (u *UnionWithVector) SetArrayS3A2(arrayS3A2 [2]StructSize3Align2) {
	u.I_unionWithVectorTag = UnionWithVectorArrayS3A2
	u.ArrayS3A2 = arrayS3A2
}

func UnionWithVectorWithArrayS3A2(arrayS3A2 [2]StructSize3Align2) UnionWithVector {
	var _u UnionWithVector
	_u.SetArrayS3A2(arrayS3A2)
	return _u
}

func (u *UnionWithVector) SetVectorUnion(vectorUnion []UnionSize8Align4) {
	u.I_unionWithVectorTag = UnionWithVectorVectorUnion
	u.VectorUnion = vectorUnion
}

func UnionWithVectorWithVectorUnion(vectorUnion []UnionSize8Align4) UnionWithVector {
	var _u UnionWithVector
	_u.SetVectorUnion(vectorUnion)
	return _u
}

type I_stringUnionTag uint32

const (
	_ I_stringUnionTag = iota
	StringUnionUnused
	StringUnionS
)

type StringUnion struct {
	I_stringUnionTag `fidl:"u,24,8" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
	Unused           uint8  `fidl:"1"`
	S                string `fidl:"2,"`
}

func (u *StringUnion) Which() I_stringUnionTag {
	return u.I_stringUnionTag
}

func (u *StringUnion) SetUnused(unused uint8) {
	u.I_stringUnionTag = StringUnionUnused
	u.Unused = unused
}

func StringUnionWithUnused(unused uint8) StringUnion {
	var _u StringUnion
	_u.SetUnused(unused)
	return _u
}

func (u *StringUnion) SetS(s string) {
	u.I_stringUnionTag = StringUnionS
	u.S = s
}

func StringUnionWithS(s string) StringUnion {
	var _u StringUnion
	_u.SetS(s)
	return _u
}

type I_ipAddressConfigTag uint32

const (
	_ I_ipAddressConfigTag = iota
	IpAddressConfigPaddingSize24Align4
	IpAddressConfigDhcp
)

type IpAddressConfig struct {
	I_ipAddressConfigTag `fidl:"u,28,4" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
	PaddingSize24Align4  [6]uint32 `fidl:"1"`
	Dhcp                 bool      `fidl:"2"`
}

func (u *IpAddressConfig) Which() I_ipAddressConfigTag {
	return u.I_ipAddressConfigTag
}

func (u *IpAddressConfig) SetPaddingSize24Align4(paddingSize24Align4 [6]uint32) {
	u.I_ipAddressConfigTag = IpAddressConfigPaddingSize24Align4
	u.PaddingSize24Align4 = paddingSize24Align4
}

func IpAddressConfigWithPaddingSize24Align4(paddingSize24Align4 [6]uint32) IpAddressConfig {
	var _u IpAddressConfig
	_u.SetPaddingSize24Align4(paddingSize24Align4)
	return _u
}

func (u *IpAddressConfig) SetDhcp(dhcp bool) {
	u.I_ipAddressConfigTag = IpAddressConfigDhcp
	u.Dhcp = dhcp
}

func IpAddressConfigWithDhcp(dhcp bool) IpAddressConfig {
	var _u IpAddressConfig
	_u.SetDhcp(dhcp)
	return _u
}

type I_xUnionWithEmptyStructTag uint32

const (
	XUnionWithEmptyStruct_unknownData = 0          // 0x00000000
	XUnionWithEmptyStructS            = 1956241662 // 0x7499e0fe
)

type XUnionWithEmptyStruct struct {
	I_xUnionWithEmptyStructTag `fidl:"x,24,8" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
	I_unknownData              []byte
	S                          EmptyStruct `fidl:"1956241662"`
}

func (_m *XUnionWithEmptyStruct) Which() I_xUnionWithEmptyStructTag {
	switch _m.I_xUnionWithEmptyStructTag {
	case 1956241662:
		return XUnionWithEmptyStructS
	default:
		return XUnionWithEmptyStruct_unknownData
	}
}

func (_m *XUnionWithEmptyStruct) Ordinal() uint32 {
	return uint32(_m.I_xUnionWithEmptyStructTag)
}

func (_m *XUnionWithEmptyStruct) SetS(s EmptyStruct) {
	_m.I_xUnionWithEmptyStructTag = XUnionWithEmptyStructS
	_m.S = s
}

func XUnionWithEmptyStructWithS(s EmptyStruct) XUnionWithEmptyStruct {
	var _u XUnionWithEmptyStruct
	_u.SetS(s)
	return _u
}

type I_sampleXUnionTag uint32

const (
	SampleXUnion_unknownData = 0          // 0x00000000
	SampleXUnionU            = 949769906  // 0x389c56b2
	SampleXUnionSu           = 2033143581 // 0x792f4f1d
	SampleXUnionSt           = 35514581   // 0x021de8d5
)

type SampleXUnion struct {
	I_sampleXUnionTag `fidl:"x,24,8" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
	I_unknownData     []byte
	U                 uint32      `fidl:"949769906"`
	Su                SimpleUnion `fidl:"2033143581"`
	St                SimpleTable `fidl:"35514581"`
}

func (_m *SampleXUnion) Which() I_sampleXUnionTag {
	switch _m.I_sampleXUnionTag {
	case 949769906:
		return SampleXUnionU
	case 2033143581:
		return SampleXUnionSu
	case 35514581:
		return SampleXUnionSt
	default:
		return SampleXUnion_unknownData
	}
}

func (_m *SampleXUnion) Ordinal() uint32 {
	return uint32(_m.I_sampleXUnionTag)
}

func (_m *SampleXUnion) SetU(u uint32) {
	_m.I_sampleXUnionTag = SampleXUnionU
	_m.U = u
}

func SampleXUnionWithU(u uint32) SampleXUnion {
	var _u SampleXUnion
	_u.SetU(u)
	return _u
}

func (_m *SampleXUnion) SetSu(su SimpleUnion) {
	_m.I_sampleXUnionTag = SampleXUnionSu
	_m.Su = su
}

func SampleXUnionWithSu(su SimpleUnion) SampleXUnion {
	var _u SampleXUnion
	_u.SetSu(su)
	return _u
}

func (_m *SampleXUnion) SetSt(st SimpleTable) {
	_m.I_sampleXUnionTag = SampleXUnionSt
	_m.St = st
}

func SampleXUnionWithSt(st SimpleTable) SampleXUnion {
	var _u SampleXUnion
	_u.SetSt(st)
	return _u
}

type I_sampleStrictXUnionTag uint32

const (
	SampleStrictXUnionU  = 149088882 // 0x08e2ea72
	SampleStrictXUnionSu = 670279483 // 0x27f3a73b
	SampleStrictXUnionSt = 925062383 // 0x372354ef
)

type SampleStrictXUnion struct {
	I_sampleStrictXUnionTag `fidl:"x!,24,8" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
	U                       uint32      `fidl:"149088882"`
	Su                      SimpleUnion `fidl:"670279483"`
	St                      SimpleTable `fidl:"925062383"`
}

func (_m *SampleStrictXUnion) Which() I_sampleStrictXUnionTag {
	return _m.I_sampleStrictXUnionTag
}

func (_m *SampleStrictXUnion) Ordinal() uint32 {
	return uint32(_m.I_sampleStrictXUnionTag)
}

func (_m *SampleStrictXUnion) SetU(u uint32) {
	_m.I_sampleStrictXUnionTag = SampleStrictXUnionU
	_m.U = u
}

func SampleStrictXUnionWithU(u uint32) SampleStrictXUnion {
	var _u SampleStrictXUnion
	_u.SetU(u)
	return _u
}

func (_m *SampleStrictXUnion) SetSu(su SimpleUnion) {
	_m.I_sampleStrictXUnionTag = SampleStrictXUnionSu
	_m.Su = su
}

func SampleStrictXUnionWithSu(su SimpleUnion) SampleStrictXUnion {
	var _u SampleStrictXUnion
	_u.SetSu(su)
	return _u
}

func (_m *SampleStrictXUnion) SetSt(st SimpleTable) {
	_m.I_sampleStrictXUnionTag = SampleStrictXUnionSt
	_m.St = st
}

func SampleStrictXUnionWithSt(st SimpleTable) SampleStrictXUnion {
	var _u SampleStrictXUnion
	_u.SetSt(st)
	return _u
}

type I_xUnionWithStructTag uint32

const (
	XUnionWithStruct_unknownData = 0         // 0x00000000
	XUnionWithStructS            = 423517204 // 0x193e5c14
)

type XUnionWithStruct struct {
	I_xUnionWithStructTag `fidl:"x,24,8" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
	I_unknownData         []byte
	S                     StructSize3Align1 `fidl:"423517204"`
}

func (_m *XUnionWithStruct) Which() I_xUnionWithStructTag {
	switch _m.I_xUnionWithStructTag {
	case 423517204:
		return XUnionWithStructS
	default:
		return XUnionWithStruct_unknownData
	}
}

func (_m *XUnionWithStruct) Ordinal() uint32 {
	return uint32(_m.I_xUnionWithStructTag)
}

func (_m *XUnionWithStruct) SetS(s StructSize3Align1) {
	_m.I_xUnionWithStructTag = XUnionWithStructS
	_m.S = s
}

func XUnionWithStructWithS(s StructSize3Align1) XUnionWithStruct {
	var _u XUnionWithStruct
	_u.SetS(s)
	return _u
}

type I_xUnionWithXUnionTag uint32

const (
	XUnionWithXUnion_unknownData = 0          // 0x00000000
	XUnionWithXUnionXu           = 1812359455 // 0x6c06691f
)

type XUnionWithXUnion struct {
	I_xUnionWithXUnionTag `fidl:"x,24,8" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
	I_unknownData         []byte
	Xu                    XUnionWithStruct `fidl:"1812359455"`
}

func (_m *XUnionWithXUnion) Which() I_xUnionWithXUnionTag {
	switch _m.I_xUnionWithXUnionTag {
	case 1812359455:
		return XUnionWithXUnionXu
	default:
		return XUnionWithXUnion_unknownData
	}
}

func (_m *XUnionWithXUnion) Ordinal() uint32 {
	return uint32(_m.I_xUnionWithXUnionTag)
}

func (_m *XUnionWithXUnion) SetXu(xu XUnionWithStruct) {
	_m.I_xUnionWithXUnionTag = XUnionWithXUnionXu
	_m.Xu = xu
}

func XUnionWithXUnionWithXu(xu XUnionWithStruct) XUnionWithXUnion {
	var _u XUnionWithXUnion
	_u.SetXu(xu)
	return _u
}

type I_xUnionWithUnionsTag uint32

const (
	XUnionWithUnions_unknownData = 0          // 0x00000000
	XUnionWithUnionsU1           = 684009751  // 0x28c52917
	XUnionWithUnionsU2           = 1971727256 // 0x75862b98
)

type XUnionWithUnions struct {
	I_xUnionWithUnionsTag `fidl:"x,24,8" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
	I_unknownData         []byte
	U1                    UnionSize8Align4  `fidl:"684009751"`
	U2                    UnionSize12Align4 `fidl:"1971727256"`
}

func (_m *XUnionWithUnions) Which() I_xUnionWithUnionsTag {
	switch _m.I_xUnionWithUnionsTag {
	case 684009751:
		return XUnionWithUnionsU1
	case 1971727256:
		return XUnionWithUnionsU2
	default:
		return XUnionWithUnions_unknownData
	}
}

func (_m *XUnionWithUnions) Ordinal() uint32 {
	return uint32(_m.I_xUnionWithUnionsTag)
}

func (_m *XUnionWithUnions) SetU1(u1 UnionSize8Align4) {
	_m.I_xUnionWithUnionsTag = XUnionWithUnionsU1
	_m.U1 = u1
}

func XUnionWithUnionsWithU1(u1 UnionSize8Align4) XUnionWithUnions {
	var _u XUnionWithUnions
	_u.SetU1(u1)
	return _u
}

func (_m *XUnionWithUnions) SetU2(u2 UnionSize12Align4) {
	_m.I_xUnionWithUnionsTag = XUnionWithUnionsU2
	_m.U2 = u2
}

func XUnionWithUnionsWithU2(u2 UnionSize12Align4) XUnionWithUnions {
	var _u XUnionWithUnions
	_u.SetU2(u2)
	return _u
}

type TableWithEmptyStruct struct {
	_        struct{}    `fidl:"t,16,8" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
	S        EmptyStruct `fidl:"1"`
	SPresent bool
}

func (u *TableWithEmptyStruct) SetS(s EmptyStruct) {
	u.S = s
	u.SPresent = true
}

func (u *TableWithEmptyStruct) GetS() EmptyStruct {
	return u.S
}

func (u *TableWithEmptyStruct) GetSWithDefault(_default EmptyStruct) EmptyStruct {
	if !u.HasS() {
		return _default
	}
	return u.S
}

func (u *TableWithEmptyStruct) HasS() bool {
	return u.SPresent
}

func (u *TableWithEmptyStruct) ClearS() {
	u.SPresent = false
}

type SimpleTable struct {
	_        struct{} `fidl:"t,16,8" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
	X        int64    `fidl:"1"`
	XPresent bool
	Y        int64 `fidl:"5"`
	YPresent bool
}

func (u *SimpleTable) SetX(x int64) {
	u.X = x
	u.XPresent = true
}

func (u *SimpleTable) GetX() int64 {
	return u.X
}

func (u *SimpleTable) GetXWithDefault(_default int64) int64 {
	if !u.HasX() {
		return _default
	}
	return u.X
}

func (u *SimpleTable) HasX() bool {
	return u.XPresent
}

func (u *SimpleTable) ClearX() {
	u.XPresent = false
}

func (u *SimpleTable) SetY(y int64) {
	u.Y = y
	u.YPresent = true
}

func (u *SimpleTable) GetY() int64 {
	return u.Y
}

func (u *SimpleTable) GetYWithDefault(_default int64) int64 {
	if !u.HasY() {
		return _default
	}
	return u.Y
}

func (u *SimpleTable) HasY() bool {
	return u.YPresent
}

func (u *SimpleTable) ClearY() {
	u.YPresent = false
}

type TableWithStringAndVector struct {
	_          struct{} `fidl:"t,16,8" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
	Foo        string   `fidl:"1,"`
	FooPresent bool
	Bar        int32 `fidl:"2"`
	BarPresent bool
	Baz        []uint8 `fidl:"3,"`
	BazPresent bool
}

func (u *TableWithStringAndVector) SetFoo(foo string) {
	u.Foo = foo
	u.FooPresent = true
}

func (u *TableWithStringAndVector) GetFoo() string {
	return u.Foo
}

func (u *TableWithStringAndVector) GetFooWithDefault(_default string) string {
	if !u.HasFoo() {
		return _default
	}
	return u.Foo
}

func (u *TableWithStringAndVector) HasFoo() bool {
	return u.FooPresent
}

func (u *TableWithStringAndVector) ClearFoo() {
	u.FooPresent = false
}

func (u *TableWithStringAndVector) SetBar(bar int32) {
	u.Bar = bar
	u.BarPresent = true
}

func (u *TableWithStringAndVector) GetBar() int32 {
	return u.Bar
}

func (u *TableWithStringAndVector) GetBarWithDefault(_default int32) int32 {
	if !u.HasBar() {
		return _default
	}
	return u.Bar
}

func (u *TableWithStringAndVector) HasBar() bool {
	return u.BarPresent
}

func (u *TableWithStringAndVector) ClearBar() {
	u.BarPresent = false
}

func (u *TableWithStringAndVector) SetBaz(baz []uint8) {
	u.Baz = baz
	u.BazPresent = true
}

func (u *TableWithStringAndVector) GetBaz() []uint8 {
	return u.Baz
}

func (u *TableWithStringAndVector) GetBazWithDefault(_default []uint8) []uint8 {
	if !u.HasBaz() {
		return _default
	}
	return u.Baz
}

func (u *TableWithStringAndVector) HasBaz() bool {
	return u.BazPresent
}

func (u *TableWithStringAndVector) ClearBaz() {
	u.BazPresent = false
}

type TableStructWithReservedSandwich struct {
	_         struct{}          `fidl:"t,16,8" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
	S1        StructSize3Align1 `fidl:"2"`
	S1Present bool
	S2        StructSize3Align1 `fidl:"3"`
	S2Present bool
}

func (u *TableStructWithReservedSandwich) SetS1(s1 StructSize3Align1) {
	u.S1 = s1
	u.S1Present = true
}

func (u *TableStructWithReservedSandwich) GetS1() StructSize3Align1 {
	return u.S1
}

func (u *TableStructWithReservedSandwich) GetS1WithDefault(_default StructSize3Align1) StructSize3Align1 {
	if !u.HasS1() {
		return _default
	}
	return u.S1
}

func (u *TableStructWithReservedSandwich) HasS1() bool {
	return u.S1Present
}

func (u *TableStructWithReservedSandwich) ClearS1() {
	u.S1Present = false
}

func (u *TableStructWithReservedSandwich) SetS2(s2 StructSize3Align1) {
	u.S2 = s2
	u.S2Present = true
}

func (u *TableStructWithReservedSandwich) GetS2() StructSize3Align1 {
	return u.S2
}

func (u *TableStructWithReservedSandwich) GetS2WithDefault(_default StructSize3Align1) StructSize3Align1 {
	if !u.HasS2() {
		return _default
	}
	return u.S2
}

func (u *TableStructWithReservedSandwich) HasS2() bool {
	return u.S2Present
}

func (u *TableStructWithReservedSandwich) ClearS2() {
	u.S2Present = false
}

type TableStructWithUint32Sandwich struct {
	_         struct{} `fidl:"t,16,8" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
	I         uint32   `fidl:"1"`
	IPresent  bool
	S1        StructSize3Align1 `fidl:"2"`
	S1Present bool
	S2        StructSize3Align1 `fidl:"3"`
	S2Present bool
	I2        uint32 `fidl:"4"`
	I2Present bool
}

func (u *TableStructWithUint32Sandwich) SetI(i uint32) {
	u.I = i
	u.IPresent = true
}

func (u *TableStructWithUint32Sandwich) GetI() uint32 {
	return u.I
}

func (u *TableStructWithUint32Sandwich) GetIWithDefault(_default uint32) uint32 {
	if !u.HasI() {
		return _default
	}
	return u.I
}

func (u *TableStructWithUint32Sandwich) HasI() bool {
	return u.IPresent
}

func (u *TableStructWithUint32Sandwich) ClearI() {
	u.IPresent = false
}

func (u *TableStructWithUint32Sandwich) SetS1(s1 StructSize3Align1) {
	u.S1 = s1
	u.S1Present = true
}

func (u *TableStructWithUint32Sandwich) GetS1() StructSize3Align1 {
	return u.S1
}

func (u *TableStructWithUint32Sandwich) GetS1WithDefault(_default StructSize3Align1) StructSize3Align1 {
	if !u.HasS1() {
		return _default
	}
	return u.S1
}

func (u *TableStructWithUint32Sandwich) HasS1() bool {
	return u.S1Present
}

func (u *TableStructWithUint32Sandwich) ClearS1() {
	u.S1Present = false
}

func (u *TableStructWithUint32Sandwich) SetS2(s2 StructSize3Align1) {
	u.S2 = s2
	u.S2Present = true
}

func (u *TableStructWithUint32Sandwich) GetS2() StructSize3Align1 {
	return u.S2
}

func (u *TableStructWithUint32Sandwich) GetS2WithDefault(_default StructSize3Align1) StructSize3Align1 {
	if !u.HasS2() {
		return _default
	}
	return u.S2
}

func (u *TableStructWithUint32Sandwich) HasS2() bool {
	return u.S2Present
}

func (u *TableStructWithUint32Sandwich) ClearS2() {
	u.S2Present = false
}

func (u *TableStructWithUint32Sandwich) SetI2(i2 uint32) {
	u.I2 = i2
	u.I2Present = true
}

func (u *TableStructWithUint32Sandwich) GetI2() uint32 {
	return u.I2
}

func (u *TableStructWithUint32Sandwich) GetI2WithDefault(_default uint32) uint32 {
	if !u.HasI2() {
		return _default
	}
	return u.I2
}

func (u *TableStructWithUint32Sandwich) HasI2() bool {
	return u.I2Present
}

func (u *TableStructWithUint32Sandwich) ClearI2() {
	u.I2Present = false
}

type TableUnionWithVectorReservedSandwich struct {
	_         struct{}        `fidl:"t,16,8" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
	Uv        UnionWithVector `fidl:"2"`
	UvPresent bool
}

func (u *TableUnionWithVectorReservedSandwich) SetUv(uv UnionWithVector) {
	u.Uv = uv
	u.UvPresent = true
}

func (u *TableUnionWithVectorReservedSandwich) GetUv() UnionWithVector {
	return u.Uv
}

func (u *TableUnionWithVectorReservedSandwich) GetUvWithDefault(_default UnionWithVector) UnionWithVector {
	if !u.HasUv() {
		return _default
	}
	return u.Uv
}

func (u *TableUnionWithVectorReservedSandwich) HasUv() bool {
	return u.UvPresent
}

func (u *TableUnionWithVectorReservedSandwich) ClearUv() {
	u.UvPresent = false
}

type TableUnionWithVectorStructSandwich struct {
	_         struct{}          `fidl:"t,16,8" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
	S1        StructSize3Align1 `fidl:"1"`
	S1Present bool
	Uv        UnionWithVector `fidl:"2"`
	UvPresent bool
	S2        StructSize3Align1 `fidl:"3"`
	S2Present bool
}

func (u *TableUnionWithVectorStructSandwich) SetS1(s1 StructSize3Align1) {
	u.S1 = s1
	u.S1Present = true
}

func (u *TableUnionWithVectorStructSandwich) GetS1() StructSize3Align1 {
	return u.S1
}

func (u *TableUnionWithVectorStructSandwich) GetS1WithDefault(_default StructSize3Align1) StructSize3Align1 {
	if !u.HasS1() {
		return _default
	}
	return u.S1
}

func (u *TableUnionWithVectorStructSandwich) HasS1() bool {
	return u.S1Present
}

func (u *TableUnionWithVectorStructSandwich) ClearS1() {
	u.S1Present = false
}

func (u *TableUnionWithVectorStructSandwich) SetUv(uv UnionWithVector) {
	u.Uv = uv
	u.UvPresent = true
}

func (u *TableUnionWithVectorStructSandwich) GetUv() UnionWithVector {
	return u.Uv
}

func (u *TableUnionWithVectorStructSandwich) GetUvWithDefault(_default UnionWithVector) UnionWithVector {
	if !u.HasUv() {
		return _default
	}
	return u.Uv
}

func (u *TableUnionWithVectorStructSandwich) HasUv() bool {
	return u.UvPresent
}

func (u *TableUnionWithVectorStructSandwich) ClearUv() {
	u.UvPresent = false
}

func (u *TableUnionWithVectorStructSandwich) SetS2(s2 StructSize3Align1) {
	u.S2 = s2
	u.S2Present = true
}

func (u *TableUnionWithVectorStructSandwich) GetS2() StructSize3Align1 {
	return u.S2
}

func (u *TableUnionWithVectorStructSandwich) GetS2WithDefault(_default StructSize3Align1) StructSize3Align1 {
	if !u.HasS2() {
		return _default
	}
	return u.S2
}

func (u *TableUnionWithVectorStructSandwich) HasS2() bool {
	return u.S2Present
}

func (u *TableUnionWithVectorStructSandwich) ClearS2() {
	u.S2Present = false
}

type XUnionInTable struct {
	_             struct{} `fidl:"t,16,8" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
	Before        string   `fidl:"1,"`
	BeforePresent bool
	Xu            SampleXUnion `fidl:"2"`
	XuPresent     bool
	After         string `fidl:"3,"`
	AfterPresent  bool
}

func (u *XUnionInTable) SetBefore(before string) {
	u.Before = before
	u.BeforePresent = true
}

func (u *XUnionInTable) GetBefore() string {
	return u.Before
}

func (u *XUnionInTable) GetBeforeWithDefault(_default string) string {
	if !u.HasBefore() {
		return _default
	}
	return u.Before
}

func (u *XUnionInTable) HasBefore() bool {
	return u.BeforePresent
}

func (u *XUnionInTable) ClearBefore() {
	u.BeforePresent = false
}

func (u *XUnionInTable) SetXu(xu SampleXUnion) {
	u.Xu = xu
	u.XuPresent = true
}

func (u *XUnionInTable) GetXu() SampleXUnion {
	return u.Xu
}

func (u *XUnionInTable) GetXuWithDefault(_default SampleXUnion) SampleXUnion {
	if !u.HasXu() {
		return _default
	}
	return u.Xu
}

func (u *XUnionInTable) HasXu() bool {
	return u.XuPresent
}

func (u *XUnionInTable) ClearXu() {
	u.XuPresent = false
}

func (u *XUnionInTable) SetAfter(after string) {
	u.After = after
	u.AfterPresent = true
}

func (u *XUnionInTable) GetAfter() string {
	return u.After
}

func (u *XUnionInTable) GetAfterWithDefault(_default string) string {
	if !u.HasAfter() {
		return _default
	}
	return u.After
}

func (u *XUnionInTable) HasAfter() bool {
	return u.AfterPresent
}

func (u *XUnionInTable) ClearAfter() {
	u.AfterPresent = false
}

type EthernetDeviceInterface _bindings.ChannelProxy

type EthernetDevice interface {
}

type EthernetDeviceTransitionalBase struct{}

type EthernetDeviceInterfaceRequest _bindings.InterfaceRequest

func NewEthernetDeviceInterfaceRequest() (EthernetDeviceInterfaceRequest, *EthernetDeviceInterface, error) {
	req, cli, err := _bindings.NewInterfaceRequest()
	return EthernetDeviceInterfaceRequest(req), (*EthernetDeviceInterface)(cli), err
}

type EthernetDeviceStub struct {
	Impl EthernetDevice
}

func (s_ *EthernetDeviceStub) DispatchImpl(ordinal_ uint64, data_ []byte, handles_ []_zx.Handle) (_bindings.Message, bool, error) {
	switch ordinal_ {
	}
	return nil, false, _bindings.ErrUnknownOrdinal
}

type EthernetDeviceService struct {
	_bindings.BindingSet
}

func (s *EthernetDeviceService) Add(impl EthernetDevice, c _zx.Channel, onError func(error)) (_bindings.BindingKey, error) {
	return s.BindingSet.Add(&EthernetDeviceStub{Impl: impl}, c, onError)
}

func (s *EthernetDeviceService) EventProxyFor(key _bindings.BindingKey) (*EthernetDeviceEventProxy, bool) {
	pxy, err := s.BindingSet.ProxyFor(key)
	return (*EthernetDeviceEventProxy)(pxy), err
}

type EthernetDeviceEventProxy _bindings.ChannelProxy
