beginCompilationUnit(@)
  beginMetadataStar(@)
    beginMetadata(@)
      handleIdentifier(A, metadataReference)
      beginTypeArguments(<)
        handleIdentifier(int, typeReference)
        handleNoTypeArguments(>)
        handleType(int, null)
      endTypeArguments(1, <, >)
      beginArguments(()
        handleLiteralInt(0)
      endArguments(1, (, ))
    endMetadata(@, null, typedef)
  endMetadataStar(1)
  beginUncategorizedTopLevelDeclaration(typedef)
    beginTypedef(typedef)
      handleIdentifier(F, typedefDeclaration)
      beginTypeVariables(<)
        beginMetadataStar(@)
          beginMetadata(@)
            handleIdentifier(A, metadataReference)
            beginTypeArguments(<)
              handleIdentifier(int, typeReference)
              handleNoTypeArguments(>)
              handleType(int, null)
            endTypeArguments(1, <, >)
            beginArguments(()
              handleLiteralInt(0)
            endArguments(1, (, ))
          endMetadata(@, null, T)
        endMetadataStar(1)
        handleIdentifier(T, typeVariableDeclaration)
        beginTypeVariable(T)
          handleTypeVariablesDefined(T, 1)
          handleNoType(T)
        endTypeVariable(>, 0, null, null)
      endTypeVariables(<, >)
      beginFunctionType(int)
        beginTypeVariables(<)
          beginMetadataStar(@)
            beginMetadata(@)
              handleIdentifier(A, metadataReference)
              beginTypeArguments(<)
                handleIdentifier(int, typeReference)
                handleNoTypeArguments(>)
                handleType(int, null)
              endTypeArguments(1, <, >)
              beginArguments(()
                handleLiteralInt(0)
              endArguments(1, (, ))
            endMetadata(@, null, X)
          endMetadataStar(1)
          handleIdentifier(X, typeVariableDeclaration)
          beginTypeVariable(X)
            handleTypeVariablesDefined(X, 1)
            handleNoType(X)
          endTypeVariable(>, 0, null, null)
        endTypeVariables(<, >)
        handleIdentifier(int, typeReference)
        handleNoTypeArguments(Function)
        handleType(int, null)
        beginFormalParameters((, MemberKind.GeneralizedFunctionType)
          beginMetadataStar(@)
            beginMetadata(@)
              handleIdentifier(A, metadataReference)
              beginTypeArguments(<)
                handleIdentifier(int, typeReference)
                handleNoTypeArguments(>)
                handleType(int, null)
              endTypeArguments(1, <, >)
              beginArguments(()
                handleLiteralInt(0)
              endArguments(1, (, ))
            endMetadata(@, null, int)
          endMetadataStar(1)
          beginFormalParameter(int, MemberKind.GeneralizedFunctionType, null, null, null)
            handleIdentifier(int, typeReference)
            handleNoTypeArguments())
            handleType(int, null)
            handleNoName())
            handleFormalParameterWithoutValue())
          endFormalParameter(null, null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
        endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
      endFunctionType(Function, null)
    endTypedef(typedef, =, ;)
  endTopLevelDeclaration(void)
  beginMetadataStar(void)
  endMetadataStar(0)
  beginTopLevelMember(void)
    beginTopLevelMethod(;, null)
      handleVoidKeyword(void)
      handleIdentifier(main, topLevelFunctionDeclaration)
      handleNoTypeVariables(()
      beginFormalParameters((, MemberKind.TopLevelMethod)
      endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
      handleAsyncModifier(null, null)
      beginBlockFunctionBody({)
        beginMetadataStar(@)
          beginMetadata(@)
            handleIdentifier(A, metadataReference)
            beginTypeArguments(<)
              handleIdentifier(int, typeReference)
              handleNoTypeArguments(>)
              handleType(int, null)
            endTypeArguments(1, <, >)
            beginArguments(()
              handleLiteralInt(0)
            endArguments(1, (, ))
          endMetadata(@, null, void)
        endMetadataStar(1)
        beginFunctionType(void)
          beginTypeVariables(<)
            beginMetadataStar(@)
              beginMetadata(@)
                handleIdentifier(A, metadataReference)
                beginTypeArguments(<)
                  handleIdentifier(int, typeReference)
                  handleNoTypeArguments(>)
                  handleType(int, null)
                endTypeArguments(1, <, >)
                beginArguments(()
                  handleLiteralInt(0)
                endArguments(1, (, ))
              endMetadata(@, null, X)
            endMetadataStar(1)
            handleIdentifier(X, typeVariableDeclaration)
            beginTypeVariable(X)
              handleTypeVariablesDefined(X, 1)
              handleNoType(X)
            endTypeVariable(>, 0, null, null)
          endTypeVariables(<, >)
          handleVoidKeyword(void)
          beginFormalParameters((, MemberKind.GeneralizedFunctionType)
            beginMetadataStar(@)
              beginMetadata(@)
                handleIdentifier(A, metadataReference)
                beginTypeArguments(<)
                  handleIdentifier(int, typeReference)
                  handleNoTypeArguments(>)
                  handleType(int, null)
                endTypeArguments(1, <, >)
                beginArguments(()
                  handleLiteralInt(0)
                endArguments(1, (, ))
              endMetadata(@, null, int)
            endMetadataStar(1)
            beginFormalParameter(int, MemberKind.GeneralizedFunctionType, null, null, null)
              handleIdentifier(int, typeReference)
              handleNoTypeArguments(y)
              handleType(int, null)
              handleIdentifier(y, formalParameterDeclaration)
              handleFormalParameterWithoutValue())
            endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
          endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
        endFunctionType(Function, ?)
        beginVariablesDeclaration(f, null, null)
          handleIdentifier(f, localVariableDeclaration)
          beginInitializedIdentifier(f)
            beginVariableInitializer(=)
              handleLiteralNull(null)
            endVariableInitializer(=)
          endInitializedIdentifier(f)
        endVariablesDeclaration(1, ;)
      endBlockFunctionBody(1, {, })
    endTopLevelMethod(void, null, })
  endTopLevelDeclaration()
endCompilationUnit(2, )
