{*ast.File [gojay]}


{*ast.GenDecl -> *ast.ImportSpec -> *ast.BasicLit [STRING "reflect"]}
{*ast.ImportSpec -> *ast.BasicLit [STRING "unsafe"]}


function name is DecodeObject 
	 {*ast.FieldList -> *ast.Field [dec]}
	 {*ast.StarExpr [Decoder DecodeObject]}
	 {*ast.FuncType -> *ast.FieldList -> *ast.Field [j UnmarshalerJSONObject]}
	 {*ast.FieldList -> *ast.Field [error]}
	 {*ast.BlockStmt -> *ast.IfStmt []}
	 {*ast.BinaryExpr [==]}
	 {*ast.SelectorExpr [dec isPooled]}
	 {*ast.BasicLit [INT 1]}
	 {*ast.BlockStmt -> *ast.ExprStmt -> *ast.CallExpr [panic]}
	 {*ast.CallExpr [InvalidUsagePooledDecoderError]}
	 {*ast.BasicLit [STRING "Invalid usage of pooled decoder"]}
	 {*ast.AssignStmt [:= _ err]}
	 {*ast.CallExpr -> *ast.SelectorExpr [dec decodeObject j]}
	 {*ast.ReturnStmt [err]}


function name is decodeObject 
	 {*ast.FieldList -> *ast.Field [dec]}
	 {*ast.StarExpr [Decoder decodeObject]}
	 {*ast.FuncType -> *ast.FieldList -> *ast.Field [j UnmarshalerJSONObject]}
	 {*ast.FieldList -> *ast.Field [int]}
	 {*ast.Field [error]}
	 {*ast.BlockStmt -> *ast.AssignStmt [:= keys]}
	 {*ast.CallExpr -> *ast.SelectorExpr [j NKeys]}
	 {*ast.ForStmt []}
	 {*ast.BinaryExpr [||]}
	 {*ast.BinaryExpr [<]}
	 {*ast.SelectorExpr [dec cursor]}
	 {*ast.SelectorExpr [dec length]}
	 {*ast.CallExpr -> *ast.SelectorExpr [dec read]}
	 {*ast.IncDecStmt -> *ast.SelectorExpr [dec cursor]}
	 {*ast.BlockStmt []}
	 {*ast.SwitchStmt -> *ast.IndexExpr -> *ast.SelectorExpr [dec data]}
	 {*ast.SelectorExpr [dec cursor]}
	 {*ast.BlockStmt []}
	 {*ast.CaseClause -> *ast.BasicLit [CHAR ' ']}
	 {*ast.BasicLit [CHAR '\n']}
	 {*ast.BasicLit [CHAR '\t']}
	 {*ast.BasicLit [CHAR '\r']}
	 {*ast.BasicLit [CHAR ',']}
	 {*ast.CaseClause -> *ast.BasicLit [CHAR '{']}
	 {*ast.AssignStmt [=]}
	 {*ast.SelectorExpr [dec cursor]}
	 {*ast.BinaryExpr [+]}
	 {*ast.SelectorExpr [dec cursor]}
	 {*ast.BasicLit [INT 1]}
	 {*ast.IfStmt []}
	 {*ast.BinaryExpr [== keys]}
	 {*ast.BasicLit [INT 0]}
	 {*ast.BlockStmt -> *ast.ForStmt []}
	 {*ast.BinaryExpr [||]}
	 {*ast.BinaryExpr [<]}
	 {*ast.SelectorExpr [dec cursor]}
	 {*ast.SelectorExpr [dec length]}
	 {*ast.CallExpr -> *ast.SelectorExpr [dec read]}
	 {*ast.BlockStmt -> *ast.AssignStmt [:= k done err]}
	 {*ast.CallExpr -> *ast.SelectorExpr [dec nextKey]}
	 {*ast.IfStmt []}
	 {*ast.BinaryExpr [!= err nil]}
	 {*ast.BlockStmt -> *ast.ReturnStmt -> *ast.BasicLit [INT 0]}
	 { [err]}
	 {*ast.IfStmt [done]}
	 {*ast.BlockStmt -> *ast.ReturnStmt -> *ast.SelectorExpr [dec cursor nil]}
	 {*ast.AssignStmt [= err]}
	 {*ast.CallExpr -> *ast.SelectorExpr [j UnmarshalJSONObject dec k]}
	 {*ast.IfStmt []}
	 {*ast.BinaryExpr [!= err nil]}
	 {*ast.BlockStmt -> *ast.AssignStmt [=]}
	 {*ast.SelectorExpr [dec err err]}
	 {*ast.ReturnStmt -> *ast.BasicLit [INT 0]}
	 { [err]}
	 {*ast.IfStmt []}
	 {*ast.BinaryExpr [==]}
	 {*ast.BinaryExpr [&]}
	 {*ast.SelectorExpr [dec called]}
	 {*ast.BasicLit [INT 1]}
	 {*ast.BasicLit [INT 0]}
	 {*ast.BlockStmt -> *ast.AssignStmt [:= err]}
	 {*ast.CallExpr -> *ast.SelectorExpr [dec skipData]}
	 {*ast.IfStmt []}
	 {*ast.BinaryExpr [!= err nil]}
	 {*ast.BlockStmt -> *ast.ReturnStmt -> *ast.BasicLit [INT 0]}
	 { [err]}
	 {*ast.BlockStmt -> *ast.IncDecStmt -> *ast.SelectorExpr [dec keysDone]}
	 {*ast.AssignStmt [&=]}
	 {*ast.SelectorExpr [dec called]}
	 {*ast.BasicLit [INT 0]}
	 {*ast.BlockStmt -> *ast.ForStmt []}
	 {*ast.BinaryExpr [&&]}
	 {*ast.ParenExpr []}
	 {*ast.BinaryExpr [||]}
	 {*ast.BinaryExpr [<]}
	 {*ast.SelectorExpr [dec cursor]}
	 {*ast.SelectorExpr [dec length]}
	 {*ast.CallExpr -> *ast.SelectorExpr [dec read]}
	 {*ast.BinaryExpr [<]}
	 {*ast.SelectorExpr [dec keysDone keys]}
	 {*ast.BlockStmt -> *ast.AssignStmt [:= k done err]}
	 {*ast.CallExpr -> *ast.SelectorExpr [dec nextKey]}
	 {*ast.IfStmt []}
	 {*ast.BinaryExpr [!= err nil]}
	 {*ast.BlockStmt -> *ast.ReturnStmt -> *ast.BasicLit [INT 0]}
	 { [err]}
	 {*ast.IfStmt [done]}
	 {*ast.BlockStmt -> *ast.ReturnStmt -> *ast.SelectorExpr [dec cursor nil]}
	 {*ast.AssignStmt [= err]}
	 {*ast.CallExpr -> *ast.SelectorExpr [j UnmarshalJSONObject dec k]}
	 {*ast.IfStmt []}
	 {*ast.BinaryExpr [!= err nil]}
	 {*ast.BlockStmt -> *ast.AssignStmt [=]}
	 {*ast.SelectorExpr [dec err err]}
	 {*ast.ReturnStmt -> *ast.BasicLit [INT 0]}
	 { [err]}
	 {*ast.IfStmt []}
	 {*ast.BinaryExpr [==]}
	 {*ast.BinaryExpr [&]}
	 {*ast.SelectorExpr [dec called]}
	 {*ast.BasicLit [INT 1]}
	 {*ast.BasicLit [INT 0]}
	 {*ast.BlockStmt -> *ast.AssignStmt [:= err]}
	 {*ast.CallExpr -> *ast.SelectorExpr [dec skipData]}
	 {*ast.IfStmt []}
	 {*ast.BinaryExpr [!= err nil]}
	 {*ast.BlockStmt -> *ast.ReturnStmt -> *ast.BasicLit [INT 0]}
	 { [err]}
	 {*ast.BlockStmt -> *ast.IncDecStmt -> *ast.SelectorExpr [dec keysDone]}
	 {*ast.AssignStmt [&=]}
	 {*ast.SelectorExpr [dec called]}
	 {*ast.BasicLit [INT 0]}
	 {*ast.IfStmt []}
	 {*ast.BinaryExpr [!=]}
	 {*ast.BinaryExpr [&]}
	 {*ast.SelectorExpr [dec child]}
	 {*ast.BasicLit [INT 1]}
	 {*ast.BasicLit [INT 0]}
	 {*ast.BlockStmt -> *ast.AssignStmt [:= end err]}
	 {*ast.CallExpr -> *ast.SelectorExpr [dec skipObject]}
	 {*ast.AssignStmt [=]}
	 {*ast.SelectorExpr [dec cursor end]}
	 {*ast.ReturnStmt -> *ast.SelectorExpr [dec cursor err]}
	 {*ast.ReturnStmt -> *ast.SelectorExpr [dec cursor nil]}
	 {*ast.CaseClause -> *ast.BasicLit [CHAR 'n']}
	 {*ast.IncDecStmt -> *ast.SelectorExpr [dec cursor]}
	 {*ast.AssignStmt [:= err]}
	 {*ast.CallExpr -> *ast.SelectorExpr [dec assertNull]}
	 {*ast.IfStmt []}
	 {*ast.BinaryExpr [!= err nil]}
	 {*ast.BlockStmt -> *ast.ReturnStmt -> *ast.BasicLit [INT 0]}
	 { [err]}
	 {*ast.ReturnStmt -> *ast.SelectorExpr [dec cursor nil]}
	 {*ast.CaseClause -> *ast.AssignStmt [=]}
	 {*ast.SelectorExpr [dec err]}
	 {*ast.CallExpr -> *ast.SelectorExpr [dec makeInvalidUnmarshalErr j]}
	 {*ast.AssignStmt [:= err]}
	 {*ast.CallExpr -> *ast.SelectorExpr [dec skipData]}
	 {*ast.IfStmt []}
	 {*ast.BinaryExpr [!= err nil]}
	 {*ast.BlockStmt -> *ast.ReturnStmt -> *ast.BasicLit [INT 0]}
	 { [err]}
	 {*ast.ReturnStmt -> *ast.SelectorExpr [dec cursor nil]}
	 {*ast.ReturnStmt -> *ast.BasicLit [INT 0]}
	 {*ast.CallExpr -> *ast.SelectorExpr [dec raiseInvalidJSONErr]}
	 {*ast.SelectorExpr [dec cursor]}


function name is decodeObjectNull 
	 {*ast.FieldList -> *ast.Field [dec]}
	 {*ast.StarExpr [Decoder decodeObjectNull]}
	 {*ast.FuncType -> *ast.FieldList -> *ast.Field [v]}
	 {*ast.InterfaceType []}
	 {*ast.FieldList -> *ast.FieldList -> *ast.Field [int]}
	 {*ast.Field [error]}
	 {*ast.BlockStmt -> *ast.AssignStmt [:= vv]}
	 {*ast.CallExpr -> *ast.SelectorExpr [reflect ValueOf v]}
	 {*ast.AssignStmt [:= vvt]}
	 {*ast.CallExpr -> *ast.SelectorExpr [vv Type]}
	 {*ast.IfStmt []}
	 {*ast.BinaryExpr [||]}
	 {*ast.BinaryExpr [!=]}
	 {*ast.CallExpr -> *ast.SelectorExpr [vvt Kind]}
	 {*ast.SelectorExpr [reflect Ptr]}
	 {*ast.BinaryExpr [!=]}
	 {*ast.CallExpr -> *ast.SelectorExpr -> *ast.CallExpr -> *ast.SelectorExpr [vvt Elem Kind]}
	 {*ast.SelectorExpr [reflect Ptr]}
	 {*ast.BlockStmt -> *ast.AssignStmt [=]}
	 {*ast.SelectorExpr [dec err ErrUnmarshalPtrExpected]}
	 {*ast.ReturnStmt -> *ast.BasicLit [INT 0]}
	 {*ast.SelectorExpr [dec err]}
	 {*ast.ForStmt []}
	 {*ast.BinaryExpr [||]}
	 {*ast.BinaryExpr [<]}
	 {*ast.SelectorExpr [dec cursor]}
	 {*ast.SelectorExpr [dec length]}
	 {*ast.CallExpr -> *ast.SelectorExpr [dec read]}
	 {*ast.IncDecStmt -> *ast.SelectorExpr [dec cursor]}
	 {*ast.BlockStmt []}
	 {*ast.SwitchStmt -> *ast.IndexExpr -> *ast.SelectorExpr [dec data]}
	 {*ast.SelectorExpr [dec cursor]}
	 {*ast.BlockStmt []}
	 {*ast.CaseClause -> *ast.BasicLit [CHAR ' ']}
	 {*ast.BasicLit [CHAR '\n']}
	 {*ast.BasicLit [CHAR '\t']}
	 {*ast.BasicLit [CHAR '\r']}
	 {*ast.BasicLit [CHAR ',']}
	 {*ast.CaseClause -> *ast.BasicLit [CHAR '{']}
	 {*ast.AssignStmt [:= elt]}
	 {*ast.CallExpr -> *ast.SelectorExpr [vv Elem]}
	 {*ast.AssignStmt [:= n]}
	 {*ast.CallExpr -> *ast.SelectorExpr [reflect New]}
	 {*ast.CallExpr -> *ast.SelectorExpr -> *ast.CallExpr -> *ast.SelectorExpr [elt Type Elem]}
	 {*ast.ExprStmt -> *ast.CallExpr -> *ast.SelectorExpr [elt Set n]}
	 {*ast.GenDecl -> *ast.ValueSpec [j UnmarshalerJSONObject]}
	 {*ast.GenDecl -> *ast.ValueSpec [ok bool]}
	 {*ast.IfStmt -> *ast.AssignStmt [= j ok]}
	 {*ast.TypeAssertExpr -> *ast.CallExpr -> *ast.SelectorExpr [n Interface UnmarshalerJSONObject]}
	 {*ast.UnaryExpr [! ok]}
	 {*ast.BlockStmt -> *ast.AssignStmt [=]}
	 {*ast.SelectorExpr [dec err]}
	 {*ast.CallExpr -> *ast.SelectorExpr [dec makeInvalidUnmarshalErr]}
	 {*ast.CallExpr -> *ast.ParenExpr [UnmarshalerJSONObject nil]}
	 {*ast.ReturnStmt -> *ast.BasicLit [INT 0]}
	 {*ast.SelectorExpr [dec err]}
	 {*ast.AssignStmt [:= keys]}
	 {*ast.CallExpr -> *ast.SelectorExpr [j NKeys]}
	 {*ast.AssignStmt [=]}
	 {*ast.SelectorExpr [dec cursor]}
	 {*ast.BinaryExpr [+]}
	 {*ast.SelectorExpr [dec cursor]}
	 {*ast.BasicLit [INT 1]}
	 {*ast.IfStmt []}
	 {*ast.BinaryExpr [== keys]}
	 {*ast.BasicLit [INT 0]}
	 {*ast.BlockStmt -> *ast.ForStmt []}
	 {*ast.BinaryExpr [||]}
	 {*ast.BinaryExpr [<]}
	 {*ast.SelectorExpr [dec cursor]}
	 {*ast.SelectorExpr [dec length]}
	 {*ast.CallExpr -> *ast.SelectorExpr [dec read]}
	 {*ast.BlockStmt -> *ast.AssignStmt [:= k done err]}
	 {*ast.CallExpr -> *ast.SelectorExpr [dec nextKey]}
	 {*ast.IfStmt []}
	 {*ast.BinaryExpr [!= err nil]}
	 {*ast.BlockStmt -> *ast.ReturnStmt -> *ast.BasicLit [INT 0]}
	 { [err]}
	 {*ast.IfStmt [done]}
	 {*ast.BlockStmt -> *ast.ReturnStmt -> *ast.SelectorExpr [dec cursor nil]}
	 {*ast.AssignStmt [= err]}
	 {*ast.CallExpr -> *ast.SelectorExpr [j UnmarshalJSONObject dec k]}
	 {*ast.IfStmt []}
	 {*ast.BinaryExpr [!= err nil]}
	 {*ast.BlockStmt -> *ast.AssignStmt [=]}
	 {*ast.SelectorExpr [dec err err]}
	 {*ast.ReturnStmt -> *ast.BasicLit [INT 0]}
	 { [err]}
	 {*ast.IfStmt []}
	 {*ast.BinaryExpr [==]}
	 {*ast.BinaryExpr [&]}
	 {*ast.SelectorExpr [dec called]}
	 {*ast.BasicLit [INT 1]}
	 {*ast.BasicLit [INT 0]}
	 {*ast.BlockStmt -> *ast.AssignStmt [:= err]}
	 {*ast.CallExpr -> *ast.SelectorExpr [dec skipData]}
	 {*ast.IfStmt []}
	 {*ast.BinaryExpr [!= err nil]}
	 {*ast.BlockStmt -> *ast.ReturnStmt -> *ast.BasicLit [INT 0]}
	 { [err]}
	 {*ast.BlockStmt -> *ast.IncDecStmt -> *ast.SelectorExpr [dec keysDone]}
	 {*ast.AssignStmt [&=]}
	 {*ast.SelectorExpr [dec called]}
	 {*ast.BasicLit [INT 0]}
	 {*ast.BlockStmt -> *ast.ForStmt []}
	 {*ast.BinaryExpr [&&]}
	 {*ast.ParenExpr []}
	 {*ast.BinaryExpr [||]}
	 {*ast.BinaryExpr [<]}
	 {*ast.SelectorExpr [dec cursor]}
	 {*ast.SelectorExpr [dec length]}
	 {*ast.CallExpr -> *ast.SelectorExpr [dec read]}
	 {*ast.BinaryExpr [<]}
	 {*ast.SelectorExpr [dec keysDone keys]}
	 {*ast.BlockStmt -> *ast.AssignStmt [:= k done err]}
	 {*ast.CallExpr -> *ast.SelectorExpr [dec nextKey]}
	 {*ast.IfStmt []}
	 {*ast.BinaryExpr [!= err nil]}
	 {*ast.BlockStmt -> *ast.ReturnStmt -> *ast.BasicLit [INT 0]}
	 { [err]}
	 {*ast.IfStmt [done]}
	 {*ast.BlockStmt -> *ast.ReturnStmt -> *ast.SelectorExpr [dec cursor nil]}
	 {*ast.AssignStmt [= err]}
	 {*ast.CallExpr -> *ast.SelectorExpr [j UnmarshalJSONObject dec k]}
	 {*ast.IfStmt []}
	 {*ast.BinaryExpr [!= err nil]}
	 {*ast.BlockStmt -> *ast.AssignStmt [=]}
	 {*ast.SelectorExpr [dec err err]}
	 {*ast.ReturnStmt -> *ast.BasicLit [INT 0]}
	 { [err]}
	 {*ast.IfStmt []}
	 {*ast.BinaryExpr [==]}
	 {*ast.BinaryExpr [&]}
	 {*ast.SelectorExpr [dec called]}
	 {*ast.BasicLit [INT 1]}
	 {*ast.BasicLit [INT 0]}
	 {*ast.BlockStmt -> *ast.AssignStmt [:= err]}
	 {*ast.CallExpr -> *ast.SelectorExpr [dec skipData]}
	 {*ast.IfStmt []}
	 {*ast.BinaryExpr [!= err nil]}
	 {*ast.BlockStmt -> *ast.ReturnStmt -> *ast.BasicLit [INT 0]}
	 { [err]}
	 {*ast.BlockStmt -> *ast.IncDecStmt -> *ast.SelectorExpr [dec keysDone]}
	 {*ast.AssignStmt [&=]}
	 {*ast.SelectorExpr [dec called]}
	 {*ast.BasicLit [INT 0]}
	 {*ast.IfStmt []}
	 {*ast.BinaryExpr [!=]}
	 {*ast.BinaryExpr [&]}
	 {*ast.SelectorExpr [dec child]}
	 {*ast.BasicLit [INT 1]}
	 {*ast.BasicLit [INT 0]}
	 {*ast.BlockStmt -> *ast.AssignStmt [:= end err]}
	 {*ast.CallExpr -> *ast.SelectorExpr [dec skipObject]}
	 {*ast.AssignStmt [=]}
	 {*ast.SelectorExpr [dec cursor end]}
	 {*ast.ReturnStmt -> *ast.SelectorExpr [dec cursor err]}
	 {*ast.ReturnStmt -> *ast.SelectorExpr [dec cursor nil]}
	 {*ast.CaseClause -> *ast.BasicLit [CHAR 'n']}
	 {*ast.IncDecStmt -> *ast.SelectorExpr [dec cursor]}
	 {*ast.AssignStmt [:= err]}
	 {*ast.CallExpr -> *ast.SelectorExpr [dec assertNull]}
	 {*ast.IfStmt []}
	 {*ast.BinaryExpr [!= err nil]}
	 {*ast.BlockStmt -> *ast.ReturnStmt -> *ast.BasicLit [INT 0]}
	 { [err]}
	 {*ast.ReturnStmt -> *ast.SelectorExpr [dec cursor nil]}
	 {*ast.CaseClause -> *ast.AssignStmt [=]}
	 {*ast.SelectorExpr [dec err]}
	 {*ast.CallExpr -> *ast.SelectorExpr [dec makeInvalidUnmarshalErr]}
	 {*ast.CallExpr -> *ast.ParenExpr [UnmarshalerJSONObject nil]}
	 {*ast.AssignStmt [:= err]}
	 {*ast.CallExpr -> *ast.SelectorExpr [dec skipData]}
	 {*ast.IfStmt []}
	 {*ast.BinaryExpr [!= err nil]}
	 {*ast.BlockStmt -> *ast.ReturnStmt -> *ast.BasicLit [INT 0]}
	 { [err]}
	 {*ast.ReturnStmt -> *ast.SelectorExpr [dec cursor nil]}
	 {*ast.ReturnStmt -> *ast.BasicLit [INT 0]}
	 {*ast.CallExpr -> *ast.SelectorExpr [dec raiseInvalidJSONErr]}
	 {*ast.SelectorExpr [dec cursor]}


function name is skipObject 
	 {*ast.FieldList -> *ast.Field [dec]}
	 {*ast.StarExpr [Decoder skipObject]}
	 {*ast.FuncType -> *ast.FieldList -> *ast.FieldList -> *ast.Field [int]}
	 {*ast.Field [error]}
	 {*ast.BlockStmt -> *ast.GenDecl -> *ast.ValueSpec [objectsOpen]}
	 {*ast.BasicLit [INT 1]}
	 {*ast.GenDecl -> *ast.ValueSpec [objectsClosed]}
	 {*ast.BasicLit [INT 0]}
	 {*ast.ForStmt -> *ast.AssignStmt [:= j]}
	 {*ast.SelectorExpr [dec cursor]}
	 {*ast.BinaryExpr [||]}
	 {*ast.BinaryExpr [< j]}
	 {*ast.SelectorExpr [dec length]}
	 {*ast.CallExpr -> *ast.SelectorExpr [dec read]}
	 {*ast.IncDecStmt [j]}
	 {*ast.BlockStmt []}
	 {*ast.SwitchStmt -> *ast.IndexExpr -> *ast.SelectorExpr [dec data j]}
	 {*ast.BlockStmt []}
	 {*ast.CaseClause -> *ast.BasicLit [CHAR '}']}
	 {*ast.IncDecStmt [objectsClosed]}
	 {*ast.IfStmt []}
	 {*ast.BinaryExpr [== objectsOpen objectsClosed]}
	 {*ast.BlockStmt -> *ast.ReturnStmt []}
	 {*ast.BinaryExpr [+ j]}
	 {*ast.BasicLit [INT 1]}
	 { [nil]}
	 {*ast.CaseClause -> *ast.BasicLit [CHAR '{']}
	 {*ast.IncDecStmt [objectsOpen]}
	 {*ast.CaseClause -> *ast.BasicLit [CHAR '"']}
	 {*ast.IncDecStmt [j]}
	 {*ast.GenDecl -> *ast.ValueSpec [isInEscapeSeq bool]}
	 {*ast.GenDecl -> *ast.ValueSpec [isFirstQuote true]}
	 {*ast.ForStmt []}
	 {*ast.BinaryExpr [||]}
	 {*ast.BinaryExpr [< j]}
	 {*ast.SelectorExpr [dec length]}
	 {*ast.CallExpr -> *ast.SelectorExpr [dec read]}
	 {*ast.IncDecStmt [j]}
	 {*ast.BlockStmt -> *ast.IfStmt []}
	 {*ast.BinaryExpr [!=]}
	 {*ast.IndexExpr -> *ast.SelectorExpr [dec data j]}
	 {*ast.BasicLit [CHAR '"']}
	 {*ast.BlockStmt -> *ast.BranchStmt -> *ast.IfStmt []}
	 {*ast.BinaryExpr [||]}
	 {*ast.BinaryExpr [!=]}
	 {*ast.IndexExpr -> *ast.SelectorExpr [dec data]}
	 {*ast.BinaryExpr [- j]}
	 {*ast.BasicLit [INT 1]}
	 {*ast.BasicLit [CHAR '\\']}
	 {*ast.ParenExpr []}
	 {*ast.BinaryExpr [&&]}
	 {*ast.UnaryExpr [! isInEscapeSeq]}
	 {*ast.UnaryExpr [! isFirstQuote]}
	 {*ast.BlockStmt -> *ast.BranchStmt -> *ast.BlockStmt -> *ast.AssignStmt [= isInEscapeSeq false]}
	 {*ast.IfStmt [isFirstQuote]}
	 {*ast.BlockStmt -> *ast.AssignStmt [= isFirstQuote false]}
	 {*ast.AssignStmt [:= ct]}
	 {*ast.BasicLit [INT 0]}
	 {*ast.ForStmt -> *ast.AssignStmt [:= i]}
	 {*ast.BinaryExpr [- j]}
	 {*ast.BasicLit [INT 1]}
	 {*ast.BinaryExpr [> i]}
	 {*ast.BasicLit [INT 0]}
	 {*ast.IncDecStmt [i]}
	 {*ast.BlockStmt -> *ast.IfStmt []}
	 {*ast.BinaryExpr [!=]}
	 {*ast.IndexExpr -> *ast.SelectorExpr [dec data i]}
	 {*ast.BasicLit [CHAR '\\']}
	 {*ast.BlockStmt -> *ast.BranchStmt -> *ast.IncDecStmt [ct]}
	 {*ast.IfStmt []}
	 {*ast.BinaryExpr [==]}
	 {*ast.BinaryExpr [& ct]}
	 {*ast.BasicLit [INT 1]}
	 {*ast.BasicLit [INT 0]}
	 {*ast.BlockStmt -> *ast.BranchStmt -> *ast.AssignStmt [= isInEscapeSeq true]}
	 {*ast.CaseClause -> *ast.BranchStmt -> *ast.ReturnStmt -> *ast.BasicLit [INT 0]}
	 {*ast.CallExpr -> *ast.SelectorExpr [dec raiseInvalidJSONErr]}
	 {*ast.SelectorExpr [dec cursor]}


function name is nextKey 
	 {*ast.FieldList -> *ast.Field [dec]}
	 {*ast.StarExpr [Decoder nextKey]}
	 {*ast.FuncType -> *ast.FieldList -> *ast.FieldList -> *ast.Field [string]}
	 {*ast.Field [bool]}
	 {*ast.Field [error]}
	 {*ast.BlockStmt -> *ast.ForStmt []}
	 {*ast.BinaryExpr [||]}
	 {*ast.BinaryExpr [<]}
	 {*ast.SelectorExpr [dec cursor]}
	 {*ast.SelectorExpr [dec length]}
	 {*ast.CallExpr -> *ast.SelectorExpr [dec read]}
	 {*ast.IncDecStmt -> *ast.SelectorExpr [dec cursor]}
	 {*ast.BlockStmt []}
	 {*ast.SwitchStmt -> *ast.IndexExpr -> *ast.SelectorExpr [dec data]}
	 {*ast.SelectorExpr [dec cursor]}
	 {*ast.BlockStmt []}
	 {*ast.CaseClause -> *ast.BasicLit [CHAR ' ']}
	 {*ast.BasicLit [CHAR '\n']}
	 {*ast.BasicLit [CHAR '\t']}
	 {*ast.BasicLit [CHAR '\r']}
	 {*ast.BasicLit [CHAR ',']}
	 {*ast.BranchStmt []}
	 {*ast.CaseClause -> *ast.BasicLit [CHAR '"']}
	 {*ast.AssignStmt [=]}
	 {*ast.SelectorExpr [dec cursor]}
	 {*ast.BinaryExpr [+]}
	 {*ast.SelectorExpr [dec cursor]}
	 {*ast.BasicLit [INT 1]}
	 {*ast.AssignStmt [:= start end err]}
	 {*ast.CallExpr -> *ast.SelectorExpr [dec getString]}
	 {*ast.IfStmt []}
	 {*ast.BinaryExpr [!= err nil]}
	 {*ast.BlockStmt -> *ast.ReturnStmt -> *ast.BasicLit [STRING ""]}
	 { [false err]}
	 {*ast.GenDecl -> *ast.ValueSpec [found byte]}
	 {*ast.ForStmt []}
	 {*ast.BinaryExpr [||]}
	 {*ast.BinaryExpr [<]}
	 {*ast.SelectorExpr [dec cursor]}
	 {*ast.SelectorExpr [dec length]}
	 {*ast.CallExpr -> *ast.SelectorExpr [dec read]}
	 {*ast.IncDecStmt -> *ast.SelectorExpr [dec cursor]}
	 {*ast.BlockStmt -> *ast.IfStmt []}
	 {*ast.BinaryExpr [==]}
	 {*ast.IndexExpr -> *ast.SelectorExpr [dec data]}
	 {*ast.SelectorExpr [dec cursor]}
	 {*ast.BasicLit [CHAR ':']}
	 {*ast.BlockStmt -> *ast.AssignStmt [|= found]}
	 {*ast.BasicLit [INT 1]}
	 {*ast.BranchStmt -> *ast.IfStmt []}
	 {*ast.BinaryExpr [!=]}
	 {*ast.BinaryExpr [& found]}
	 {*ast.BasicLit [INT 1]}
	 {*ast.BasicLit [INT 0]}
	 {*ast.BlockStmt -> *ast.IncDecStmt -> *ast.SelectorExpr [dec cursor]}
	 {*ast.AssignStmt [:= d]}
	 {*ast.SliceExpr -> *ast.SelectorExpr [dec data start]}
	 {*ast.BinaryExpr [- end]}
	 {*ast.BasicLit [INT 1]}
	 {*ast.ReturnStmt -> *ast.StarExpr -> *ast.CallExpr -> *ast.ParenExpr -> *ast.StarExpr [string]}
	 {*ast.CallExpr -> *ast.SelectorExpr [unsafe Pointer]}
	 {*ast.UnaryExpr [& d false nil]}
	 {*ast.ReturnStmt -> *ast.BasicLit [STRING ""]}
	 { [false]}
	 {*ast.CallExpr -> *ast.SelectorExpr [dec raiseInvalidJSONErr]}
	 {*ast.SelectorExpr [dec cursor]}
	 {*ast.CaseClause -> *ast.BasicLit [CHAR '}']}
	 {*ast.AssignStmt [=]}
	 {*ast.SelectorExpr [dec cursor]}
	 {*ast.BinaryExpr [+]}
	 {*ast.SelectorExpr [dec cursor]}
	 {*ast.BasicLit [INT 1]}
	 {*ast.ReturnStmt -> *ast.BasicLit [STRING ""]}
	 { [true nil]}
	 {*ast.CaseClause -> *ast.ReturnStmt -> *ast.BasicLit [STRING ""]}
	 { [false]}
	 {*ast.CallExpr -> *ast.SelectorExpr [dec raiseInvalidJSONErr]}
	 {*ast.SelectorExpr [dec cursor]}
	 {*ast.ReturnStmt -> *ast.BasicLit [STRING ""]}
	 { [false]}
	 {*ast.CallExpr -> *ast.SelectorExpr [dec raiseInvalidJSONErr]}
	 {*ast.SelectorExpr [dec cursor]}


function name is skipData 
	 {*ast.FieldList -> *ast.Field [dec]}
	 {*ast.StarExpr [Decoder skipData]}
	 {*ast.FuncType -> *ast.FieldList -> *ast.FieldList -> *ast.Field [error]}
	 {*ast.BlockStmt -> *ast.ForStmt []}
	 {*ast.BinaryExpr [||]}
	 {*ast.BinaryExpr [<]}
	 {*ast.SelectorExpr [dec cursor]}
	 {*ast.SelectorExpr [dec length]}
	 {*ast.CallExpr -> *ast.SelectorExpr [dec read]}
	 {*ast.IncDecStmt -> *ast.SelectorExpr [dec cursor]}
	 {*ast.BlockStmt []}
	 {*ast.SwitchStmt -> *ast.IndexExpr -> *ast.SelectorExpr [dec data]}
	 {*ast.SelectorExpr [dec cursor]}
	 {*ast.BlockStmt []}
	 {*ast.CaseClause -> *ast.BasicLit [CHAR ' ']}
	 {*ast.BasicLit [CHAR '\n']}
	 {*ast.BasicLit [CHAR '\t']}
	 {*ast.BasicLit [CHAR '\r']}
	 {*ast.BasicLit [CHAR ',']}
	 {*ast.BranchStmt []}
	 {*ast.CaseClause -> *ast.BasicLit [CHAR 'n']}
	 {*ast.IncDecStmt -> *ast.SelectorExpr [dec cursor]}
	 {*ast.AssignStmt [:= err]}
	 {*ast.CallExpr -> *ast.SelectorExpr [dec assertNull]}
	 {*ast.IfStmt []}
	 {*ast.BinaryExpr [!= err nil]}
	 {*ast.BlockStmt -> *ast.ReturnStmt [err]}
	 {*ast.ReturnStmt [nil]}
	 {*ast.CaseClause -> *ast.BasicLit [CHAR 't']}
	 {*ast.IncDecStmt -> *ast.SelectorExpr [dec cursor]}
	 {*ast.AssignStmt [:= err]}
	 {*ast.CallExpr -> *ast.SelectorExpr [dec assertTrue]}
	 {*ast.IfStmt []}
	 {*ast.BinaryExpr [!= err nil]}
	 {*ast.BlockStmt -> *ast.ReturnStmt [err]}
	 {*ast.ReturnStmt [nil]}
	 {*ast.CaseClause -> *ast.BasicLit [CHAR 'f']}
	 {*ast.IncDecStmt -> *ast.SelectorExpr [dec cursor]}
	 {*ast.AssignStmt [:= err]}
	 {*ast.CallExpr -> *ast.SelectorExpr [dec assertFalse]}
	 {*ast.IfStmt []}
	 {*ast.BinaryExpr [!= err nil]}
	 {*ast.BlockStmt -> *ast.ReturnStmt [err]}
	 {*ast.ReturnStmt [nil]}
	 {*ast.CaseClause -> *ast.BasicLit [CHAR '{']}
	 {*ast.AssignStmt [=]}
	 {*ast.SelectorExpr [dec cursor]}
	 {*ast.BinaryExpr [+]}
	 {*ast.SelectorExpr [dec cursor]}
	 {*ast.BasicLit [INT 1]}
	 {*ast.AssignStmt [:= end err]}
	 {*ast.CallExpr -> *ast.SelectorExpr [dec skipObject]}
	 {*ast.AssignStmt [=]}
	 {*ast.SelectorExpr [dec cursor end]}
	 {*ast.ReturnStmt [err]}
	 {*ast.CaseClause -> *ast.BasicLit [CHAR '"']}
	 {*ast.AssignStmt [=]}
	 {*ast.SelectorExpr [dec cursor]}
	 {*ast.BinaryExpr [+]}
	 {*ast.SelectorExpr [dec cursor]}
	 {*ast.BasicLit [INT 1]}
	 {*ast.AssignStmt [:= err]}
	 {*ast.CallExpr -> *ast.SelectorExpr [dec skipString]}
	 {*ast.ReturnStmt [err]}
	 {*ast.CaseClause -> *ast.BasicLit [CHAR '[']}
	 {*ast.AssignStmt [=]}
	 {*ast.SelectorExpr [dec cursor]}
	 {*ast.BinaryExpr [+]}
	 {*ast.SelectorExpr [dec cursor]}
	 {*ast.BasicLit [INT 1]}
	 {*ast.AssignStmt [:= end err]}
	 {*ast.CallExpr -> *ast.SelectorExpr [dec skipArray]}
	 {*ast.AssignStmt [=]}
	 {*ast.SelectorExpr [dec cursor end]}
	 {*ast.ReturnStmt [err]}
	 {*ast.CaseClause -> *ast.BasicLit [CHAR '0']}
	 {*ast.BasicLit [CHAR '1']}
	 {*ast.BasicLit [CHAR '2']}
	 {*ast.BasicLit [CHAR '3']}
	 {*ast.BasicLit [CHAR '4']}
	 {*ast.BasicLit [CHAR '5']}
	 {*ast.BasicLit [CHAR '6']}
	 {*ast.BasicLit [CHAR '7']}
	 {*ast.BasicLit [CHAR '8']}
	 {*ast.BasicLit [CHAR '9']}
	 {*ast.BasicLit [CHAR '-']}
	 {*ast.AssignStmt [:= end err]}
	 {*ast.CallExpr -> *ast.SelectorExpr [dec skipNumber]}
	 {*ast.AssignStmt [=]}
	 {*ast.SelectorExpr [dec cursor end]}
	 {*ast.ReturnStmt [err]}
	 {*ast.ReturnStmt -> *ast.CallExpr -> *ast.SelectorExpr [dec raiseInvalidJSONErr]}
	 {*ast.SelectorExpr [dec cursor]}
	 {*ast.ReturnStmt -> *ast.CallExpr -> *ast.SelectorExpr [dec raiseInvalidJSONErr]}
	 {*ast.SelectorExpr [dec cursor]}


{*ast.GenDecl -> *ast.TypeSpec [DecodeObjectFunc]}
{*ast.FuncType -> *ast.FieldList -> *ast.Field -> *ast.StarExpr [Decoder]}
{*ast.Field [string]}
{*ast.FieldList -> *ast.Field [error]}


function name is UnmarshalJSONObject 
	 {*ast.FieldList -> *ast.Field [f DecodeObjectFunc UnmarshalJSONObject]}
	 {*ast.FuncType -> *ast.FieldList -> *ast.Field [dec]}
	 {*ast.StarExpr [Decoder]}
	 {*ast.Field [k string]}
	 {*ast.FieldList -> *ast.Field [error]}
	 {*ast.BlockStmt -> *ast.ReturnStmt -> *ast.CallExpr [f dec k]}


function name is NKeys 
	 {*ast.FieldList -> *ast.Field [f DecodeObjectFunc NKeys]}
	 {*ast.FuncType -> *ast.FieldList -> *ast.FieldList -> *ast.Field [int]}
	 {*ast.BlockStmt -> *ast.ReturnStmt -> *ast.BasicLit [INT 0]}


function name is AddObject 
	 {*ast.FieldList -> *ast.Field [dec]}
	 {*ast.StarExpr [Decoder AddObject]}
	 {*ast.FuncType -> *ast.FieldList -> *ast.Field [v UnmarshalerJSONObject]}
	 {*ast.FieldList -> *ast.Field [error]}
	 {*ast.BlockStmt -> *ast.ReturnStmt -> *ast.CallExpr -> *ast.SelectorExpr [dec Object v]}


function name is AddObjectNull 
	 {*ast.FieldList -> *ast.Field [dec]}
	 {*ast.StarExpr [Decoder AddObjectNull]}
	 {*ast.FuncType -> *ast.FieldList -> *ast.Field [v]}
	 {*ast.InterfaceType []}
	 {*ast.FieldList -> *ast.FieldList -> *ast.Field [error]}
	 {*ast.BlockStmt -> *ast.ReturnStmt -> *ast.CallExpr -> *ast.SelectorExpr [dec ObjectNull v]}


function name is Object 
	 {*ast.FieldList -> *ast.Field [dec]}
	 {*ast.StarExpr [Decoder Object]}
	 {*ast.FuncType -> *ast.FieldList -> *ast.Field [value UnmarshalerJSONObject]}
	 {*ast.FieldList -> *ast.Field [error]}
	 {*ast.BlockStmt -> *ast.AssignStmt [:= initialKeysDone]}
	 {*ast.SelectorExpr [dec keysDone]}
	 {*ast.AssignStmt [:= initialChild]}
	 {*ast.SelectorExpr [dec child]}
	 {*ast.AssignStmt [=]}
	 {*ast.SelectorExpr [dec keysDone]}
	 {*ast.BasicLit [INT 0]}
	 {*ast.AssignStmt [=]}
	 {*ast.SelectorExpr [dec called]}
	 {*ast.BasicLit [INT 0]}
	 {*ast.AssignStmt [|=]}
	 {*ast.SelectorExpr [dec child]}
	 {*ast.BasicLit [INT 1]}
	 {*ast.AssignStmt [:= newCursor err]}
	 {*ast.CallExpr -> *ast.SelectorExpr [dec decodeObject value]}
	 {*ast.IfStmt []}
	 {*ast.BinaryExpr [!= err nil]}
	 {*ast.BlockStmt -> *ast.ReturnStmt [err]}
	 {*ast.AssignStmt [=]}
	 {*ast.SelectorExpr [dec cursor newCursor]}
	 {*ast.AssignStmt [=]}
	 {*ast.SelectorExpr [dec keysDone initialKeysDone]}
	 {*ast.AssignStmt [=]}
	 {*ast.SelectorExpr [dec child initialChild]}
	 {*ast.AssignStmt [|=]}
	 {*ast.SelectorExpr [dec called]}
	 {*ast.BasicLit [INT 1]}
	 {*ast.ReturnStmt [nil]}


function name is ObjectNull 
	 {*ast.FieldList -> *ast.Field [dec]}
	 {*ast.StarExpr [Decoder ObjectNull]}
	 {*ast.FuncType -> *ast.FieldList -> *ast.Field [v]}
	 {*ast.InterfaceType []}
	 {*ast.FieldList -> *ast.FieldList -> *ast.Field [error]}
	 {*ast.BlockStmt -> *ast.AssignStmt [:= initialKeysDone]}
	 {*ast.SelectorExpr [dec keysDone]}
	 {*ast.AssignStmt [:= initialChild]}
	 {*ast.SelectorExpr [dec child]}
	 {*ast.AssignStmt [=]}
	 {*ast.SelectorExpr [dec keysDone]}
	 {*ast.BasicLit [INT 0]}
	 {*ast.AssignStmt [=]}
	 {*ast.SelectorExpr [dec called]}
	 {*ast.BasicLit [INT 0]}
	 {*ast.AssignStmt [|=]}
	 {*ast.SelectorExpr [dec child]}
	 {*ast.BasicLit [INT 1]}
	 {*ast.AssignStmt [:= newCursor err]}
	 {*ast.CallExpr -> *ast.SelectorExpr [dec decodeObjectNull v]}
	 {*ast.IfStmt []}
	 {*ast.BinaryExpr [!= err nil]}
	 {*ast.BlockStmt -> *ast.ReturnStmt [err]}
	 {*ast.AssignStmt [=]}
	 {*ast.SelectorExpr [dec cursor newCursor]}
	 {*ast.AssignStmt [=]}
	 {*ast.SelectorExpr [dec keysDone initialKeysDone]}
	 {*ast.AssignStmt [=]}
	 {*ast.SelectorExpr [dec child initialChild]}
	 {*ast.AssignStmt [|=]}
	 {*ast.SelectorExpr [dec called]}
	 {*ast.BasicLit [INT 1]}
	 {*ast.ReturnStmt [nil]}


