// Code generated by internal/cmd/generator. DO NOT EDIT!
package encoder

import (
	"strings"
)

type CodeType int

const (
	CodeOp          CodeType = 0
	CodeArrayHead   CodeType = 1
	CodeArrayElem   CodeType = 2
	CodeSliceHead   CodeType = 3
	CodeSliceElem   CodeType = 4
	CodeMapHead     CodeType = 5
	CodeMapKey      CodeType = 6
	CodeMapValue    CodeType = 7
	CodeMapEnd      CodeType = 8
	CodeRecursive   CodeType = 9
	CodeStructField CodeType = 10
	CodeStructEnd   CodeType = 11
)

var opTypeStrings = [416]string{
	"End",
	"Interface",
	"Ptr",
	"SliceElem",
	"SliceEnd",
	"ArrayElem",
	"ArrayEnd",
	"MapKey",
	"MapValue",
	"MapEnd",
	"Recursive",
	"RecursivePtr",
	"RecursiveEnd",
	"StructAnonymousEnd",
	"Int",
	"Uint",
	"Float32",
	"Float64",
	"Bool",
	"String",
	"Bytes",
	"Number",
	"Array",
	"Map",
	"Slice",
	"Struct",
	"MarshalJSON",
	"MarshalText",
	"IntString",
	"UintString",
	"IntPtr",
	"UintPtr",
	"Float32Ptr",
	"Float64Ptr",
	"BoolPtr",
	"StringPtr",
	"BytesPtr",
	"NumberPtr",
	"ArrayPtr",
	"MapPtr",
	"SlicePtr",
	"MarshalJSONPtr",
	"MarshalTextPtr",
	"InterfacePtr",
	"StructHeadInt",
	"StructHeadOmitEmptyInt",
	"StructHeadStringTagInt",
	"StructPtrHeadInt",
	"StructPtrHeadOmitEmptyInt",
	"StructPtrHeadStringTagInt",
	"StructHeadUint",
	"StructHeadOmitEmptyUint",
	"StructHeadStringTagUint",
	"StructPtrHeadUint",
	"StructPtrHeadOmitEmptyUint",
	"StructPtrHeadStringTagUint",
	"StructHeadFloat32",
	"StructHeadOmitEmptyFloat32",
	"StructHeadStringTagFloat32",
	"StructPtrHeadFloat32",
	"StructPtrHeadOmitEmptyFloat32",
	"StructPtrHeadStringTagFloat32",
	"StructHeadFloat64",
	"StructHeadOmitEmptyFloat64",
	"StructHeadStringTagFloat64",
	"StructPtrHeadFloat64",
	"StructPtrHeadOmitEmptyFloat64",
	"StructPtrHeadStringTagFloat64",
	"StructHeadBool",
	"StructHeadOmitEmptyBool",
	"StructHeadStringTagBool",
	"StructPtrHeadBool",
	"StructPtrHeadOmitEmptyBool",
	"StructPtrHeadStringTagBool",
	"StructHeadString",
	"StructHeadOmitEmptyString",
	"StructHeadStringTagString",
	"StructPtrHeadString",
	"StructPtrHeadOmitEmptyString",
	"StructPtrHeadStringTagString",
	"StructHeadBytes",
	"StructHeadOmitEmptyBytes",
	"StructHeadStringTagBytes",
	"StructPtrHeadBytes",
	"StructPtrHeadOmitEmptyBytes",
	"StructPtrHeadStringTagBytes",
	"StructHeadNumber",
	"StructHeadOmitEmptyNumber",
	"StructHeadStringTagNumber",
	"StructPtrHeadNumber",
	"StructPtrHeadOmitEmptyNumber",
	"StructPtrHeadStringTagNumber",
	"StructHeadArray",
	"StructHeadOmitEmptyArray",
	"StructHeadStringTagArray",
	"StructPtrHeadArray",
	"StructPtrHeadOmitEmptyArray",
	"StructPtrHeadStringTagArray",
	"StructHeadMap",
	"StructHeadOmitEmptyMap",
	"StructHeadStringTagMap",
	"StructPtrHeadMap",
	"StructPtrHeadOmitEmptyMap",
	"StructPtrHeadStringTagMap",
	"StructHeadSlice",
	"StructHeadOmitEmptySlice",
	"StructHeadStringTagSlice",
	"StructPtrHeadSlice",
	"StructPtrHeadOmitEmptySlice",
	"StructPtrHeadStringTagSlice",
	"StructHeadStruct",
	"StructHeadOmitEmptyStruct",
	"StructHeadStringTagStruct",
	"StructPtrHeadStruct",
	"StructPtrHeadOmitEmptyStruct",
	"StructPtrHeadStringTagStruct",
	"StructHeadMarshalJSON",
	"StructHeadOmitEmptyMarshalJSON",
	"StructHeadStringTagMarshalJSON",
	"StructPtrHeadMarshalJSON",
	"StructPtrHeadOmitEmptyMarshalJSON",
	"StructPtrHeadStringTagMarshalJSON",
	"StructHeadMarshalText",
	"StructHeadOmitEmptyMarshalText",
	"StructHeadStringTagMarshalText",
	"StructPtrHeadMarshalText",
	"StructPtrHeadOmitEmptyMarshalText",
	"StructPtrHeadStringTagMarshalText",
	"StructHeadIntString",
	"StructHeadOmitEmptyIntString",
	"StructHeadStringTagIntString",
	"StructPtrHeadIntString",
	"StructPtrHeadOmitEmptyIntString",
	"StructPtrHeadStringTagIntString",
	"StructHeadUintString",
	"StructHeadOmitEmptyUintString",
	"StructHeadStringTagUintString",
	"StructPtrHeadUintString",
	"StructPtrHeadOmitEmptyUintString",
	"StructPtrHeadStringTagUintString",
	"StructHeadIntPtr",
	"StructHeadOmitEmptyIntPtr",
	"StructHeadStringTagIntPtr",
	"StructPtrHeadIntPtr",
	"StructPtrHeadOmitEmptyIntPtr",
	"StructPtrHeadStringTagIntPtr",
	"StructHeadUintPtr",
	"StructHeadOmitEmptyUintPtr",
	"StructHeadStringTagUintPtr",
	"StructPtrHeadUintPtr",
	"StructPtrHeadOmitEmptyUintPtr",
	"StructPtrHeadStringTagUintPtr",
	"StructHeadFloat32Ptr",
	"StructHeadOmitEmptyFloat32Ptr",
	"StructHeadStringTagFloat32Ptr",
	"StructPtrHeadFloat32Ptr",
	"StructPtrHeadOmitEmptyFloat32Ptr",
	"StructPtrHeadStringTagFloat32Ptr",
	"StructHeadFloat64Ptr",
	"StructHeadOmitEmptyFloat64Ptr",
	"StructHeadStringTagFloat64Ptr",
	"StructPtrHeadFloat64Ptr",
	"StructPtrHeadOmitEmptyFloat64Ptr",
	"StructPtrHeadStringTagFloat64Ptr",
	"StructHeadBoolPtr",
	"StructHeadOmitEmptyBoolPtr",
	"StructHeadStringTagBoolPtr",
	"StructPtrHeadBoolPtr",
	"StructPtrHeadOmitEmptyBoolPtr",
	"StructPtrHeadStringTagBoolPtr",
	"StructHeadStringPtr",
	"StructHeadOmitEmptyStringPtr",
	"StructHeadStringTagStringPtr",
	"StructPtrHeadStringPtr",
	"StructPtrHeadOmitEmptyStringPtr",
	"StructPtrHeadStringTagStringPtr",
	"StructHeadBytesPtr",
	"StructHeadOmitEmptyBytesPtr",
	"StructHeadStringTagBytesPtr",
	"StructPtrHeadBytesPtr",
	"StructPtrHeadOmitEmptyBytesPtr",
	"StructPtrHeadStringTagBytesPtr",
	"StructHeadNumberPtr",
	"StructHeadOmitEmptyNumberPtr",
	"StructHeadStringTagNumberPtr",
	"StructPtrHeadNumberPtr",
	"StructPtrHeadOmitEmptyNumberPtr",
	"StructPtrHeadStringTagNumberPtr",
	"StructHeadArrayPtr",
	"StructHeadOmitEmptyArrayPtr",
	"StructHeadStringTagArrayPtr",
	"StructPtrHeadArrayPtr",
	"StructPtrHeadOmitEmptyArrayPtr",
	"StructPtrHeadStringTagArrayPtr",
	"StructHeadMapPtr",
	"StructHeadOmitEmptyMapPtr",
	"StructHeadStringTagMapPtr",
	"StructPtrHeadMapPtr",
	"StructPtrHeadOmitEmptyMapPtr",
	"StructPtrHeadStringTagMapPtr",
	"StructHeadSlicePtr",
	"StructHeadOmitEmptySlicePtr",
	"StructHeadStringTagSlicePtr",
	"StructPtrHeadSlicePtr",
	"StructPtrHeadOmitEmptySlicePtr",
	"StructPtrHeadStringTagSlicePtr",
	"StructHeadMarshalJSONPtr",
	"StructHeadOmitEmptyMarshalJSONPtr",
	"StructHeadStringTagMarshalJSONPtr",
	"StructPtrHeadMarshalJSONPtr",
	"StructPtrHeadOmitEmptyMarshalJSONPtr",
	"StructPtrHeadStringTagMarshalJSONPtr",
	"StructHeadMarshalTextPtr",
	"StructHeadOmitEmptyMarshalTextPtr",
	"StructHeadStringTagMarshalTextPtr",
	"StructPtrHeadMarshalTextPtr",
	"StructPtrHeadOmitEmptyMarshalTextPtr",
	"StructPtrHeadStringTagMarshalTextPtr",
	"StructHeadInterfacePtr",
	"StructHeadOmitEmptyInterfacePtr",
	"StructHeadStringTagInterfacePtr",
	"StructPtrHeadInterfacePtr",
	"StructPtrHeadOmitEmptyInterfacePtr",
	"StructPtrHeadStringTagInterfacePtr",
	"StructHead",
	"StructHeadOmitEmpty",
	"StructHeadStringTag",
	"StructPtrHead",
	"StructPtrHeadOmitEmpty",
	"StructPtrHeadStringTag",
	"StructFieldInt",
	"StructFieldOmitEmptyInt",
	"StructFieldStringTagInt",
	"StructEndInt",
	"StructEndOmitEmptyInt",
	"StructEndStringTagInt",
	"StructFieldUint",
	"StructFieldOmitEmptyUint",
	"StructFieldStringTagUint",
	"StructEndUint",
	"StructEndOmitEmptyUint",
	"StructEndStringTagUint",
	"StructFieldFloat32",
	"StructFieldOmitEmptyFloat32",
	"StructFieldStringTagFloat32",
	"StructEndFloat32",
	"StructEndOmitEmptyFloat32",
	"StructEndStringTagFloat32",
	"StructFieldFloat64",
	"StructFieldOmitEmptyFloat64",
	"StructFieldStringTagFloat64",
	"StructEndFloat64",
	"StructEndOmitEmptyFloat64",
	"StructEndStringTagFloat64",
	"StructFieldBool",
	"StructFieldOmitEmptyBool",
	"StructFieldStringTagBool",
	"StructEndBool",
	"StructEndOmitEmptyBool",
	"StructEndStringTagBool",
	"StructFieldString",
	"StructFieldOmitEmptyString",
	"StructFieldStringTagString",
	"StructEndString",
	"StructEndOmitEmptyString",
	"StructEndStringTagString",
	"StructFieldBytes",
	"StructFieldOmitEmptyBytes",
	"StructFieldStringTagBytes",
	"StructEndBytes",
	"StructEndOmitEmptyBytes",
	"StructEndStringTagBytes",
	"StructFieldNumber",
	"StructFieldOmitEmptyNumber",
	"StructFieldStringTagNumber",
	"StructEndNumber",
	"StructEndOmitEmptyNumber",
	"StructEndStringTagNumber",
	"StructFieldArray",
	"StructFieldOmitEmptyArray",
	"StructFieldStringTagArray",
	"StructEndArray",
	"StructEndOmitEmptyArray",
	"StructEndStringTagArray",
	"StructFieldMap",
	"StructFieldOmitEmptyMap",
	"StructFieldStringTagMap",
	"StructEndMap",
	"StructEndOmitEmptyMap",
	"StructEndStringTagMap",
	"StructFieldSlice",
	"StructFieldOmitEmptySlice",
	"StructFieldStringTagSlice",
	"StructEndSlice",
	"StructEndOmitEmptySlice",
	"StructEndStringTagSlice",
	"StructFieldStruct",
	"StructFieldOmitEmptyStruct",
	"StructFieldStringTagStruct",
	"StructEndStruct",
	"StructEndOmitEmptyStruct",
	"StructEndStringTagStruct",
	"StructFieldMarshalJSON",
	"StructFieldOmitEmptyMarshalJSON",
	"StructFieldStringTagMarshalJSON",
	"StructEndMarshalJSON",
	"StructEndOmitEmptyMarshalJSON",
	"StructEndStringTagMarshalJSON",
	"StructFieldMarshalText",
	"StructFieldOmitEmptyMarshalText",
	"StructFieldStringTagMarshalText",
	"StructEndMarshalText",
	"StructEndOmitEmptyMarshalText",
	"StructEndStringTagMarshalText",
	"StructFieldIntString",
	"StructFieldOmitEmptyIntString",
	"StructFieldStringTagIntString",
	"StructEndIntString",
	"StructEndOmitEmptyIntString",
	"StructEndStringTagIntString",
	"StructFieldUintString",
	"StructFieldOmitEmptyUintString",
	"StructFieldStringTagUintString",
	"StructEndUintString",
	"StructEndOmitEmptyUintString",
	"StructEndStringTagUintString",
	"StructFieldIntPtr",
	"StructFieldOmitEmptyIntPtr",
	"StructFieldStringTagIntPtr",
	"StructEndIntPtr",
	"StructEndOmitEmptyIntPtr",
	"StructEndStringTagIntPtr",
	"StructFieldUintPtr",
	"StructFieldOmitEmptyUintPtr",
	"StructFieldStringTagUintPtr",
	"StructEndUintPtr",
	"StructEndOmitEmptyUintPtr",
	"StructEndStringTagUintPtr",
	"StructFieldFloat32Ptr",
	"StructFieldOmitEmptyFloat32Ptr",
	"StructFieldStringTagFloat32Ptr",
	"StructEndFloat32Ptr",
	"StructEndOmitEmptyFloat32Ptr",
	"StructEndStringTagFloat32Ptr",
	"StructFieldFloat64Ptr",
	"StructFieldOmitEmptyFloat64Ptr",
	"StructFieldStringTagFloat64Ptr",
	"StructEndFloat64Ptr",
	"StructEndOmitEmptyFloat64Ptr",
	"StructEndStringTagFloat64Ptr",
	"StructFieldBoolPtr",
	"StructFieldOmitEmptyBoolPtr",
	"StructFieldStringTagBoolPtr",
	"StructEndBoolPtr",
	"StructEndOmitEmptyBoolPtr",
	"StructEndStringTagBoolPtr",
	"StructFieldStringPtr",
	"StructFieldOmitEmptyStringPtr",
	"StructFieldStringTagStringPtr",
	"StructEndStringPtr",
	"StructEndOmitEmptyStringPtr",
	"StructEndStringTagStringPtr",
	"StructFieldBytesPtr",
	"StructFieldOmitEmptyBytesPtr",
	"StructFieldStringTagBytesPtr",
	"StructEndBytesPtr",
	"StructEndOmitEmptyBytesPtr",
	"StructEndStringTagBytesPtr",
	"StructFieldNumberPtr",
	"StructFieldOmitEmptyNumberPtr",
	"StructFieldStringTagNumberPtr",
	"StructEndNumberPtr",
	"StructEndOmitEmptyNumberPtr",
	"StructEndStringTagNumberPtr",
	"StructFieldArrayPtr",
	"StructFieldOmitEmptyArrayPtr",
	"StructFieldStringTagArrayPtr",
	"StructEndArrayPtr",
	"StructEndOmitEmptyArrayPtr",
	"StructEndStringTagArrayPtr",
	"StructFieldMapPtr",
	"StructFieldOmitEmptyMapPtr",
	"StructFieldStringTagMapPtr",
	"StructEndMapPtr",
	"StructEndOmitEmptyMapPtr",
	"StructEndStringTagMapPtr",
	"StructFieldSlicePtr",
	"StructFieldOmitEmptySlicePtr",
	"StructFieldStringTagSlicePtr",
	"StructEndSlicePtr",
	"StructEndOmitEmptySlicePtr",
	"StructEndStringTagSlicePtr",
	"StructFieldMarshalJSONPtr",
	"StructFieldOmitEmptyMarshalJSONPtr",
	"StructFieldStringTagMarshalJSONPtr",
	"StructEndMarshalJSONPtr",
	"StructEndOmitEmptyMarshalJSONPtr",
	"StructEndStringTagMarshalJSONPtr",
	"StructFieldMarshalTextPtr",
	"StructFieldOmitEmptyMarshalTextPtr",
	"StructFieldStringTagMarshalTextPtr",
	"StructEndMarshalTextPtr",
	"StructEndOmitEmptyMarshalTextPtr",
	"StructEndStringTagMarshalTextPtr",
	"StructFieldInterfacePtr",
	"StructFieldOmitEmptyInterfacePtr",
	"StructFieldStringTagInterfacePtr",
	"StructEndInterfacePtr",
	"StructEndOmitEmptyInterfacePtr",
	"StructEndStringTagInterfacePtr",
	"StructField",
	"StructFieldOmitEmpty",
	"StructFieldStringTag",
	"StructEnd",
	"StructEndOmitEmpty",
	"StructEndStringTag",
}

type OpType int

const (
	OpEnd                                  OpType = 0
	OpInterface                            OpType = 1
	OpPtr                                  OpType = 2
	OpSliceElem                            OpType = 3
	OpSliceEnd                             OpType = 4
	OpArrayElem                            OpType = 5
	OpArrayEnd                             OpType = 6
	OpMapKey                               OpType = 7
	OpMapValue                             OpType = 8
	OpMapEnd                               OpType = 9
	OpRecursive                            OpType = 10
	OpRecursivePtr                         OpType = 11
	OpRecursiveEnd                         OpType = 12
	OpStructAnonymousEnd                   OpType = 13
	OpInt                                  OpType = 14
	OpUint                                 OpType = 15
	OpFloat32                              OpType = 16
	OpFloat64                              OpType = 17
	OpBool                                 OpType = 18
	OpString                               OpType = 19
	OpBytes                                OpType = 20
	OpNumber                               OpType = 21
	OpArray                                OpType = 22
	OpMap                                  OpType = 23
	OpSlice                                OpType = 24
	OpStruct                               OpType = 25
	OpMarshalJSON                          OpType = 26
	OpMarshalText                          OpType = 27
	OpIntString                            OpType = 28
	OpUintString                           OpType = 29
	OpIntPtr                               OpType = 30
	OpUintPtr                              OpType = 31
	OpFloat32Ptr                           OpType = 32
	OpFloat64Ptr                           OpType = 33
	OpBoolPtr                              OpType = 34
	OpStringPtr                            OpType = 35
	OpBytesPtr                             OpType = 36
	OpNumberPtr                            OpType = 37
	OpArrayPtr                             OpType = 38
	OpMapPtr                               OpType = 39
	OpSlicePtr                             OpType = 40
	OpMarshalJSONPtr                       OpType = 41
	OpMarshalTextPtr                       OpType = 42
	OpInterfacePtr                         OpType = 43
	OpStructHeadInt                        OpType = 44
	OpStructHeadOmitEmptyInt               OpType = 45
	OpStructHeadStringTagInt               OpType = 46
	OpStructPtrHeadInt                     OpType = 47
	OpStructPtrHeadOmitEmptyInt            OpType = 48
	OpStructPtrHeadStringTagInt            OpType = 49
	OpStructHeadUint                       OpType = 50
	OpStructHeadOmitEmptyUint              OpType = 51
	OpStructHeadStringTagUint              OpType = 52
	OpStructPtrHeadUint                    OpType = 53
	OpStructPtrHeadOmitEmptyUint           OpType = 54
	OpStructPtrHeadStringTagUint           OpType = 55
	OpStructHeadFloat32                    OpType = 56
	OpStructHeadOmitEmptyFloat32           OpType = 57
	OpStructHeadStringTagFloat32           OpType = 58
	OpStructPtrHeadFloat32                 OpType = 59
	OpStructPtrHeadOmitEmptyFloat32        OpType = 60
	OpStructPtrHeadStringTagFloat32        OpType = 61
	OpStructHeadFloat64                    OpType = 62
	OpStructHeadOmitEmptyFloat64           OpType = 63
	OpStructHeadStringTagFloat64           OpType = 64
	OpStructPtrHeadFloat64                 OpType = 65
	OpStructPtrHeadOmitEmptyFloat64        OpType = 66
	OpStructPtrHeadStringTagFloat64        OpType = 67
	OpStructHeadBool                       OpType = 68
	OpStructHeadOmitEmptyBool              OpType = 69
	OpStructHeadStringTagBool              OpType = 70
	OpStructPtrHeadBool                    OpType = 71
	OpStructPtrHeadOmitEmptyBool           OpType = 72
	OpStructPtrHeadStringTagBool           OpType = 73
	OpStructHeadString                     OpType = 74
	OpStructHeadOmitEmptyString            OpType = 75
	OpStructHeadStringTagString            OpType = 76
	OpStructPtrHeadString                  OpType = 77
	OpStructPtrHeadOmitEmptyString         OpType = 78
	OpStructPtrHeadStringTagString         OpType = 79
	OpStructHeadBytes                      OpType = 80
	OpStructHeadOmitEmptyBytes             OpType = 81
	OpStructHeadStringTagBytes             OpType = 82
	OpStructPtrHeadBytes                   OpType = 83
	OpStructPtrHeadOmitEmptyBytes          OpType = 84
	OpStructPtrHeadStringTagBytes          OpType = 85
	OpStructHeadNumber                     OpType = 86
	OpStructHeadOmitEmptyNumber            OpType = 87
	OpStructHeadStringTagNumber            OpType = 88
	OpStructPtrHeadNumber                  OpType = 89
	OpStructPtrHeadOmitEmptyNumber         OpType = 90
	OpStructPtrHeadStringTagNumber         OpType = 91
	OpStructHeadArray                      OpType = 92
	OpStructHeadOmitEmptyArray             OpType = 93
	OpStructHeadStringTagArray             OpType = 94
	OpStructPtrHeadArray                   OpType = 95
	OpStructPtrHeadOmitEmptyArray          OpType = 96
	OpStructPtrHeadStringTagArray          OpType = 97
	OpStructHeadMap                        OpType = 98
	OpStructHeadOmitEmptyMap               OpType = 99
	OpStructHeadStringTagMap               OpType = 100
	OpStructPtrHeadMap                     OpType = 101
	OpStructPtrHeadOmitEmptyMap            OpType = 102
	OpStructPtrHeadStringTagMap            OpType = 103
	OpStructHeadSlice                      OpType = 104
	OpStructHeadOmitEmptySlice             OpType = 105
	OpStructHeadStringTagSlice             OpType = 106
	OpStructPtrHeadSlice                   OpType = 107
	OpStructPtrHeadOmitEmptySlice          OpType = 108
	OpStructPtrHeadStringTagSlice          OpType = 109
	OpStructHeadStruct                     OpType = 110
	OpStructHeadOmitEmptyStruct            OpType = 111
	OpStructHeadStringTagStruct            OpType = 112
	OpStructPtrHeadStruct                  OpType = 113
	OpStructPtrHeadOmitEmptyStruct         OpType = 114
	OpStructPtrHeadStringTagStruct         OpType = 115
	OpStructHeadMarshalJSON                OpType = 116
	OpStructHeadOmitEmptyMarshalJSON       OpType = 117
	OpStructHeadStringTagMarshalJSON       OpType = 118
	OpStructPtrHeadMarshalJSON             OpType = 119
	OpStructPtrHeadOmitEmptyMarshalJSON    OpType = 120
	OpStructPtrHeadStringTagMarshalJSON    OpType = 121
	OpStructHeadMarshalText                OpType = 122
	OpStructHeadOmitEmptyMarshalText       OpType = 123
	OpStructHeadStringTagMarshalText       OpType = 124
	OpStructPtrHeadMarshalText             OpType = 125
	OpStructPtrHeadOmitEmptyMarshalText    OpType = 126
	OpStructPtrHeadStringTagMarshalText    OpType = 127
	OpStructHeadIntString                  OpType = 128
	OpStructHeadOmitEmptyIntString         OpType = 129
	OpStructHeadStringTagIntString         OpType = 130
	OpStructPtrHeadIntString               OpType = 131
	OpStructPtrHeadOmitEmptyIntString      OpType = 132
	OpStructPtrHeadStringTagIntString      OpType = 133
	OpStructHeadUintString                 OpType = 134
	OpStructHeadOmitEmptyUintString        OpType = 135
	OpStructHeadStringTagUintString        OpType = 136
	OpStructPtrHeadUintString              OpType = 137
	OpStructPtrHeadOmitEmptyUintString     OpType = 138
	OpStructPtrHeadStringTagUintString     OpType = 139
	OpStructHeadIntPtr                     OpType = 140
	OpStructHeadOmitEmptyIntPtr            OpType = 141
	OpStructHeadStringTagIntPtr            OpType = 142
	OpStructPtrHeadIntPtr                  OpType = 143
	OpStructPtrHeadOmitEmptyIntPtr         OpType = 144
	OpStructPtrHeadStringTagIntPtr         OpType = 145
	OpStructHeadUintPtr                    OpType = 146
	OpStructHeadOmitEmptyUintPtr           OpType = 147
	OpStructHeadStringTagUintPtr           OpType = 148
	OpStructPtrHeadUintPtr                 OpType = 149
	OpStructPtrHeadOmitEmptyUintPtr        OpType = 150
	OpStructPtrHeadStringTagUintPtr        OpType = 151
	OpStructHeadFloat32Ptr                 OpType = 152
	OpStructHeadOmitEmptyFloat32Ptr        OpType = 153
	OpStructHeadStringTagFloat32Ptr        OpType = 154
	OpStructPtrHeadFloat32Ptr              OpType = 155
	OpStructPtrHeadOmitEmptyFloat32Ptr     OpType = 156
	OpStructPtrHeadStringTagFloat32Ptr     OpType = 157
	OpStructHeadFloat64Ptr                 OpType = 158
	OpStructHeadOmitEmptyFloat64Ptr        OpType = 159
	OpStructHeadStringTagFloat64Ptr        OpType = 160
	OpStructPtrHeadFloat64Ptr              OpType = 161
	OpStructPtrHeadOmitEmptyFloat64Ptr     OpType = 162
	OpStructPtrHeadStringTagFloat64Ptr     OpType = 163
	OpStructHeadBoolPtr                    OpType = 164
	OpStructHeadOmitEmptyBoolPtr           OpType = 165
	OpStructHeadStringTagBoolPtr           OpType = 166
	OpStructPtrHeadBoolPtr                 OpType = 167
	OpStructPtrHeadOmitEmptyBoolPtr        OpType = 168
	OpStructPtrHeadStringTagBoolPtr        OpType = 169
	OpStructHeadStringPtr                  OpType = 170
	OpStructHeadOmitEmptyStringPtr         OpType = 171
	OpStructHeadStringTagStringPtr         OpType = 172
	OpStructPtrHeadStringPtr               OpType = 173
	OpStructPtrHeadOmitEmptyStringPtr      OpType = 174
	OpStructPtrHeadStringTagStringPtr      OpType = 175
	OpStructHeadBytesPtr                   OpType = 176
	OpStructHeadOmitEmptyBytesPtr          OpType = 177
	OpStructHeadStringTagBytesPtr          OpType = 178
	OpStructPtrHeadBytesPtr                OpType = 179
	OpStructPtrHeadOmitEmptyBytesPtr       OpType = 180
	OpStructPtrHeadStringTagBytesPtr       OpType = 181
	OpStructHeadNumberPtr                  OpType = 182
	OpStructHeadOmitEmptyNumberPtr         OpType = 183
	OpStructHeadStringTagNumberPtr         OpType = 184
	OpStructPtrHeadNumberPtr               OpType = 185
	OpStructPtrHeadOmitEmptyNumberPtr      OpType = 186
	OpStructPtrHeadStringTagNumberPtr      OpType = 187
	OpStructHeadArrayPtr                   OpType = 188
	OpStructHeadOmitEmptyArrayPtr          OpType = 189
	OpStructHeadStringTagArrayPtr          OpType = 190
	OpStructPtrHeadArrayPtr                OpType = 191
	OpStructPtrHeadOmitEmptyArrayPtr       OpType = 192
	OpStructPtrHeadStringTagArrayPtr       OpType = 193
	OpStructHeadMapPtr                     OpType = 194
	OpStructHeadOmitEmptyMapPtr            OpType = 195
	OpStructHeadStringTagMapPtr            OpType = 196
	OpStructPtrHeadMapPtr                  OpType = 197
	OpStructPtrHeadOmitEmptyMapPtr         OpType = 198
	OpStructPtrHeadStringTagMapPtr         OpType = 199
	OpStructHeadSlicePtr                   OpType = 200
	OpStructHeadOmitEmptySlicePtr          OpType = 201
	OpStructHeadStringTagSlicePtr          OpType = 202
	OpStructPtrHeadSlicePtr                OpType = 203
	OpStructPtrHeadOmitEmptySlicePtr       OpType = 204
	OpStructPtrHeadStringTagSlicePtr       OpType = 205
	OpStructHeadMarshalJSONPtr             OpType = 206
	OpStructHeadOmitEmptyMarshalJSONPtr    OpType = 207
	OpStructHeadStringTagMarshalJSONPtr    OpType = 208
	OpStructPtrHeadMarshalJSONPtr          OpType = 209
	OpStructPtrHeadOmitEmptyMarshalJSONPtr OpType = 210
	OpStructPtrHeadStringTagMarshalJSONPtr OpType = 211
	OpStructHeadMarshalTextPtr             OpType = 212
	OpStructHeadOmitEmptyMarshalTextPtr    OpType = 213
	OpStructHeadStringTagMarshalTextPtr    OpType = 214
	OpStructPtrHeadMarshalTextPtr          OpType = 215
	OpStructPtrHeadOmitEmptyMarshalTextPtr OpType = 216
	OpStructPtrHeadStringTagMarshalTextPtr OpType = 217
	OpStructHeadInterfacePtr               OpType = 218
	OpStructHeadOmitEmptyInterfacePtr      OpType = 219
	OpStructHeadStringTagInterfacePtr      OpType = 220
	OpStructPtrHeadInterfacePtr            OpType = 221
	OpStructPtrHeadOmitEmptyInterfacePtr   OpType = 222
	OpStructPtrHeadStringTagInterfacePtr   OpType = 223
	OpStructHead                           OpType = 224
	OpStructHeadOmitEmpty                  OpType = 225
	OpStructHeadStringTag                  OpType = 226
	OpStructPtrHead                        OpType = 227
	OpStructPtrHeadOmitEmpty               OpType = 228
	OpStructPtrHeadStringTag               OpType = 229
	OpStructFieldInt                       OpType = 230
	OpStructFieldOmitEmptyInt              OpType = 231
	OpStructFieldStringTagInt              OpType = 232
	OpStructEndInt                         OpType = 233
	OpStructEndOmitEmptyInt                OpType = 234
	OpStructEndStringTagInt                OpType = 235
	OpStructFieldUint                      OpType = 236
	OpStructFieldOmitEmptyUint             OpType = 237
	OpStructFieldStringTagUint             OpType = 238
	OpStructEndUint                        OpType = 239
	OpStructEndOmitEmptyUint               OpType = 240
	OpStructEndStringTagUint               OpType = 241
	OpStructFieldFloat32                   OpType = 242
	OpStructFieldOmitEmptyFloat32          OpType = 243
	OpStructFieldStringTagFloat32          OpType = 244
	OpStructEndFloat32                     OpType = 245
	OpStructEndOmitEmptyFloat32            OpType = 246
	OpStructEndStringTagFloat32            OpType = 247
	OpStructFieldFloat64                   OpType = 248
	OpStructFieldOmitEmptyFloat64          OpType = 249
	OpStructFieldStringTagFloat64          OpType = 250
	OpStructEndFloat64                     OpType = 251
	OpStructEndOmitEmptyFloat64            OpType = 252
	OpStructEndStringTagFloat64            OpType = 253
	OpStructFieldBool                      OpType = 254
	OpStructFieldOmitEmptyBool             OpType = 255
	OpStructFieldStringTagBool             OpType = 256
	OpStructEndBool                        OpType = 257
	OpStructEndOmitEmptyBool               OpType = 258
	OpStructEndStringTagBool               OpType = 259
	OpStructFieldString                    OpType = 260
	OpStructFieldOmitEmptyString           OpType = 261
	OpStructFieldStringTagString           OpType = 262
	OpStructEndString                      OpType = 263
	OpStructEndOmitEmptyString             OpType = 264
	OpStructEndStringTagString             OpType = 265
	OpStructFieldBytes                     OpType = 266
	OpStructFieldOmitEmptyBytes            OpType = 267
	OpStructFieldStringTagBytes            OpType = 268
	OpStructEndBytes                       OpType = 269
	OpStructEndOmitEmptyBytes              OpType = 270
	OpStructEndStringTagBytes              OpType = 271
	OpStructFieldNumber                    OpType = 272
	OpStructFieldOmitEmptyNumber           OpType = 273
	OpStructFieldStringTagNumber           OpType = 274
	OpStructEndNumber                      OpType = 275
	OpStructEndOmitEmptyNumber             OpType = 276
	OpStructEndStringTagNumber             OpType = 277
	OpStructFieldArray                     OpType = 278
	OpStructFieldOmitEmptyArray            OpType = 279
	OpStructFieldStringTagArray            OpType = 280
	OpStructEndArray                       OpType = 281
	OpStructEndOmitEmptyArray              OpType = 282
	OpStructEndStringTagArray              OpType = 283
	OpStructFieldMap                       OpType = 284
	OpStructFieldOmitEmptyMap              OpType = 285
	OpStructFieldStringTagMap              OpType = 286
	OpStructEndMap                         OpType = 287
	OpStructEndOmitEmptyMap                OpType = 288
	OpStructEndStringTagMap                OpType = 289
	OpStructFieldSlice                     OpType = 290
	OpStructFieldOmitEmptySlice            OpType = 291
	OpStructFieldStringTagSlice            OpType = 292
	OpStructEndSlice                       OpType = 293
	OpStructEndOmitEmptySlice              OpType = 294
	OpStructEndStringTagSlice              OpType = 295
	OpStructFieldStruct                    OpType = 296
	OpStructFieldOmitEmptyStruct           OpType = 297
	OpStructFieldStringTagStruct           OpType = 298
	OpStructEndStruct                      OpType = 299
	OpStructEndOmitEmptyStruct             OpType = 300
	OpStructEndStringTagStruct             OpType = 301
	OpStructFieldMarshalJSON               OpType = 302
	OpStructFieldOmitEmptyMarshalJSON      OpType = 303
	OpStructFieldStringTagMarshalJSON      OpType = 304
	OpStructEndMarshalJSON                 OpType = 305
	OpStructEndOmitEmptyMarshalJSON        OpType = 306
	OpStructEndStringTagMarshalJSON        OpType = 307
	OpStructFieldMarshalText               OpType = 308
	OpStructFieldOmitEmptyMarshalText      OpType = 309
	OpStructFieldStringTagMarshalText      OpType = 310
	OpStructEndMarshalText                 OpType = 311
	OpStructEndOmitEmptyMarshalText        OpType = 312
	OpStructEndStringTagMarshalText        OpType = 313
	OpStructFieldIntString                 OpType = 314
	OpStructFieldOmitEmptyIntString        OpType = 315
	OpStructFieldStringTagIntString        OpType = 316
	OpStructEndIntString                   OpType = 317
	OpStructEndOmitEmptyIntString          OpType = 318
	OpStructEndStringTagIntString          OpType = 319
	OpStructFieldUintString                OpType = 320
	OpStructFieldOmitEmptyUintString       OpType = 321
	OpStructFieldStringTagUintString       OpType = 322
	OpStructEndUintString                  OpType = 323
	OpStructEndOmitEmptyUintString         OpType = 324
	OpStructEndStringTagUintString         OpType = 325
	OpStructFieldIntPtr                    OpType = 326
	OpStructFieldOmitEmptyIntPtr           OpType = 327
	OpStructFieldStringTagIntPtr           OpType = 328
	OpStructEndIntPtr                      OpType = 329
	OpStructEndOmitEmptyIntPtr             OpType = 330
	OpStructEndStringTagIntPtr             OpType = 331
	OpStructFieldUintPtr                   OpType = 332
	OpStructFieldOmitEmptyUintPtr          OpType = 333
	OpStructFieldStringTagUintPtr          OpType = 334
	OpStructEndUintPtr                     OpType = 335
	OpStructEndOmitEmptyUintPtr            OpType = 336
	OpStructEndStringTagUintPtr            OpType = 337
	OpStructFieldFloat32Ptr                OpType = 338
	OpStructFieldOmitEmptyFloat32Ptr       OpType = 339
	OpStructFieldStringTagFloat32Ptr       OpType = 340
	OpStructEndFloat32Ptr                  OpType = 341
	OpStructEndOmitEmptyFloat32Ptr         OpType = 342
	OpStructEndStringTagFloat32Ptr         OpType = 343
	OpStructFieldFloat64Ptr                OpType = 344
	OpStructFieldOmitEmptyFloat64Ptr       OpType = 345
	OpStructFieldStringTagFloat64Ptr       OpType = 346
	OpStructEndFloat64Ptr                  OpType = 347
	OpStructEndOmitEmptyFloat64Ptr         OpType = 348
	OpStructEndStringTagFloat64Ptr         OpType = 349
	OpStructFieldBoolPtr                   OpType = 350
	OpStructFieldOmitEmptyBoolPtr          OpType = 351
	OpStructFieldStringTagBoolPtr          OpType = 352
	OpStructEndBoolPtr                     OpType = 353
	OpStructEndOmitEmptyBoolPtr            OpType = 354
	OpStructEndStringTagBoolPtr            OpType = 355
	OpStructFieldStringPtr                 OpType = 356
	OpStructFieldOmitEmptyStringPtr        OpType = 357
	OpStructFieldStringTagStringPtr        OpType = 358
	OpStructEndStringPtr                   OpType = 359
	OpStructEndOmitEmptyStringPtr          OpType = 360
	OpStructEndStringTagStringPtr          OpType = 361
	OpStructFieldBytesPtr                  OpType = 362
	OpStructFieldOmitEmptyBytesPtr         OpType = 363
	OpStructFieldStringTagBytesPtr         OpType = 364
	OpStructEndBytesPtr                    OpType = 365
	OpStructEndOmitEmptyBytesPtr           OpType = 366
	OpStructEndStringTagBytesPtr           OpType = 367
	OpStructFieldNumberPtr                 OpType = 368
	OpStructFieldOmitEmptyNumberPtr        OpType = 369
	OpStructFieldStringTagNumberPtr        OpType = 370
	OpStructEndNumberPtr                   OpType = 371
	OpStructEndOmitEmptyNumberPtr          OpType = 372
	OpStructEndStringTagNumberPtr          OpType = 373
	OpStructFieldArrayPtr                  OpType = 374
	OpStructFieldOmitEmptyArrayPtr         OpType = 375
	OpStructFieldStringTagArrayPtr         OpType = 376
	OpStructEndArrayPtr                    OpType = 377
	OpStructEndOmitEmptyArrayPtr           OpType = 378
	OpStructEndStringTagArrayPtr           OpType = 379
	OpStructFieldMapPtr                    OpType = 380
	OpStructFieldOmitEmptyMapPtr           OpType = 381
	OpStructFieldStringTagMapPtr           OpType = 382
	OpStructEndMapPtr                      OpType = 383
	OpStructEndOmitEmptyMapPtr             OpType = 384
	OpStructEndStringTagMapPtr             OpType = 385
	OpStructFieldSlicePtr                  OpType = 386
	OpStructFieldOmitEmptySlicePtr         OpType = 387
	OpStructFieldStringTagSlicePtr         OpType = 388
	OpStructEndSlicePtr                    OpType = 389
	OpStructEndOmitEmptySlicePtr           OpType = 390
	OpStructEndStringTagSlicePtr           OpType = 391
	OpStructFieldMarshalJSONPtr            OpType = 392
	OpStructFieldOmitEmptyMarshalJSONPtr   OpType = 393
	OpStructFieldStringTagMarshalJSONPtr   OpType = 394
	OpStructEndMarshalJSONPtr              OpType = 395
	OpStructEndOmitEmptyMarshalJSONPtr     OpType = 396
	OpStructEndStringTagMarshalJSONPtr     OpType = 397
	OpStructFieldMarshalTextPtr            OpType = 398
	OpStructFieldOmitEmptyMarshalTextPtr   OpType = 399
	OpStructFieldStringTagMarshalTextPtr   OpType = 400
	OpStructEndMarshalTextPtr              OpType = 401
	OpStructEndOmitEmptyMarshalTextPtr     OpType = 402
	OpStructEndStringTagMarshalTextPtr     OpType = 403
	OpStructFieldInterfacePtr              OpType = 404
	OpStructFieldOmitEmptyInterfacePtr     OpType = 405
	OpStructFieldStringTagInterfacePtr     OpType = 406
	OpStructEndInterfacePtr                OpType = 407
	OpStructEndOmitEmptyInterfacePtr       OpType = 408
	OpStructEndStringTagInterfacePtr       OpType = 409
	OpStructField                          OpType = 410
	OpStructFieldOmitEmpty                 OpType = 411
	OpStructFieldStringTag                 OpType = 412
	OpStructEnd                            OpType = 413
	OpStructEndOmitEmpty                   OpType = 414
	OpStructEndStringTag                   OpType = 415
)

func (t OpType) String() string {
	if int(t) >= 416 {
		return ""
	}
	return opTypeStrings[int(t)]
}

func (t OpType) CodeType() CodeType {
	if strings.Contains(t.String(), "Struct") {
		if strings.Contains(t.String(), "End") {
			return CodeStructEnd
		}
		return CodeStructField
	}
	switch t {
	case OpArray, OpArrayPtr:
		return CodeArrayHead
	case OpArrayElem:
		return CodeArrayElem
	case OpSlice, OpSlicePtr:
		return CodeSliceHead
	case OpSliceElem:
		return CodeSliceElem
	case OpMap, OpMapPtr:
		return CodeMapHead
	case OpMapKey:
		return CodeMapKey
	case OpMapValue:
		return CodeMapValue
	case OpMapEnd:
		return CodeMapEnd
	}

	return CodeOp
}

func (t OpType) HeadToPtrHead() OpType {
	if strings.Index(t.String(), "PtrHead") > 0 {
		return t
	}

	idx := strings.Index(t.String(), "Head")
	if idx == -1 {
		return t
	}
	suffix := "PtrHead" + t.String()[idx+len("Head"):]

	const toPtrOffset = 3
	if strings.Contains(OpType(int(t)+toPtrOffset).String(), suffix) {
		return OpType(int(t) + toPtrOffset)
	}
	return t
}

func (t OpType) HeadToOmitEmptyHead() OpType {
	const toOmitEmptyOffset = 1
	if strings.Contains(OpType(int(t)+toOmitEmptyOffset).String(), "OmitEmpty") {
		return OpType(int(t) + toOmitEmptyOffset)
	}

	return t
}

func (t OpType) HeadToStringTagHead() OpType {
	const toStringTagOffset = 2
	if strings.Contains(OpType(int(t)+toStringTagOffset).String(), "StringTag") {
		return OpType(int(t) + toStringTagOffset)
	}
	return t
}

func (t OpType) PtrHeadToHead() OpType {
	idx := strings.Index(t.String(), "Ptr")
	if idx == -1 {
		return t
	}
	suffix := t.String()[idx+len("Ptr"):]

	const toPtrOffset = 3
	if strings.Contains(OpType(int(t)-toPtrOffset).String(), suffix) {
		return OpType(int(t) - toPtrOffset)
	}
	return t
}

func (t OpType) FieldToEnd() OpType {
	idx := strings.Index(t.String(), "Field")
	if idx == -1 {
		return t
	}
	suffix := t.String()[idx+len("Field"):]
	if suffix == "" || suffix == "OmitEmpty" || suffix == "StringTag" {
		return t
	}
	const toEndOffset = 3
	if strings.Contains(OpType(int(t)+toEndOffset).String(), "End"+suffix) {
		return OpType(int(t) + toEndOffset)
	}
	return t
}

func (t OpType) FieldToOmitEmptyField() OpType {
	const toOmitEmptyOffset = 1
	if strings.Contains(OpType(int(t)+toOmitEmptyOffset).String(), "OmitEmpty") {
		return OpType(int(t) + toOmitEmptyOffset)
	}
	return t
}

func (t OpType) FieldToStringTagField() OpType {
	const toStringTagOffset = 2
	if strings.Contains(OpType(int(t)+toStringTagOffset).String(), "StringTag") {
		return OpType(int(t) + toStringTagOffset)
	}
	return t
}
