// Code generated by gobind. DO NOT EDIT.

// Package main is an autogenerated binder stub for package keywords.
//
//   autogenerated by gobind -lang=go keywords
package main

/*
#include <stdlib.h>
#include <stdint.h>
#include "seq.h"
#include "keywords.h"

*/
import "C"

import (
	_seq "golang.org/x/mobile/bind/seq"
	"keywords"
)

// suppress the error if seq ends up unused
var _ = _seq.FromRefNum

//export proxykeywords_KeywordCaller_Abstract
func proxykeywords_KeywordCaller_Abstract(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Abstract()
}

//export proxykeywords_KeywordCaller_Assert
func proxykeywords_KeywordCaller_Assert(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Assert()
}

//export proxykeywords_KeywordCaller_Bool
func proxykeywords_KeywordCaller_Bool(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Bool()
}

//export proxykeywords_KeywordCaller_Boolean
func proxykeywords_KeywordCaller_Boolean(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Boolean()
}

//export proxykeywords_KeywordCaller_Break
func proxykeywords_KeywordCaller_Break(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Break()
}

//export proxykeywords_KeywordCaller_Byte
func proxykeywords_KeywordCaller_Byte(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Byte()
}

//export proxykeywords_KeywordCaller_Case
func proxykeywords_KeywordCaller_Case(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Case()
}

//export proxykeywords_KeywordCaller_Catch
func proxykeywords_KeywordCaller_Catch(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Catch()
}

//export proxykeywords_KeywordCaller_Char
func proxykeywords_KeywordCaller_Char(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Char()
}

//export proxykeywords_KeywordCaller_Class
func proxykeywords_KeywordCaller_Class(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Class()
}

//export proxykeywords_KeywordCaller_Const
func proxykeywords_KeywordCaller_Const(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Const()
}

//export proxykeywords_KeywordCaller_Continue
func proxykeywords_KeywordCaller_Continue(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Continue()
}

//export proxykeywords_KeywordCaller_Default
func proxykeywords_KeywordCaller_Default(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Default()
}

//export proxykeywords_KeywordCaller_Do
func proxykeywords_KeywordCaller_Do(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Do()
}

//export proxykeywords_KeywordCaller_Double
func proxykeywords_KeywordCaller_Double(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Double()
}

//export proxykeywords_KeywordCaller_Else
func proxykeywords_KeywordCaller_Else(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Else()
}

//export proxykeywords_KeywordCaller_Enum
func proxykeywords_KeywordCaller_Enum(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Enum()
}

//export proxykeywords_KeywordCaller_Extends
func proxykeywords_KeywordCaller_Extends(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Extends()
}

//export proxykeywords_KeywordCaller_False
func proxykeywords_KeywordCaller_False(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.False()
}

//export proxykeywords_KeywordCaller_Final
func proxykeywords_KeywordCaller_Final(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Final()
}

//export proxykeywords_KeywordCaller_Finally
func proxykeywords_KeywordCaller_Finally(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Finally()
}

//export proxykeywords_KeywordCaller_Float
func proxykeywords_KeywordCaller_Float(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Float()
}

//export proxykeywords_KeywordCaller_For
func proxykeywords_KeywordCaller_For(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.For()
}

//export proxykeywords_KeywordCaller_Goto
func proxykeywords_KeywordCaller_Goto(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Goto()
}

//export proxykeywords_KeywordCaller_If
func proxykeywords_KeywordCaller_If(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.If()
}

//export proxykeywords_KeywordCaller_Implements
func proxykeywords_KeywordCaller_Implements(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Implements()
}

//export proxykeywords_KeywordCaller_Import
func proxykeywords_KeywordCaller_Import(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Import()
}

//export proxykeywords_KeywordCaller_Instanceof
func proxykeywords_KeywordCaller_Instanceof(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Instanceof()
}

//export proxykeywords_KeywordCaller_Int
func proxykeywords_KeywordCaller_Int(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Int()
}

//export proxykeywords_KeywordCaller_Interface
func proxykeywords_KeywordCaller_Interface(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Interface()
}

//export proxykeywords_KeywordCaller_Long
func proxykeywords_KeywordCaller_Long(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Long()
}

//export proxykeywords_KeywordCaller_Native
func proxykeywords_KeywordCaller_Native(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Native()
}

//export proxykeywords_KeywordCaller_New
func proxykeywords_KeywordCaller_New(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.New()
}

//export proxykeywords_KeywordCaller_Nil
func proxykeywords_KeywordCaller_Nil(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Nil()
}

//export proxykeywords_KeywordCaller_Null
func proxykeywords_KeywordCaller_Null(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Null()
}

//export proxykeywords_KeywordCaller_Package
func proxykeywords_KeywordCaller_Package(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Package()
}

//export proxykeywords_KeywordCaller_Private
func proxykeywords_KeywordCaller_Private(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Private()
}

//export proxykeywords_KeywordCaller_Protected
func proxykeywords_KeywordCaller_Protected(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Protected()
}

//export proxykeywords_KeywordCaller_Public
func proxykeywords_KeywordCaller_Public(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Public()
}

//export proxykeywords_KeywordCaller_Return
func proxykeywords_KeywordCaller_Return(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Return()
}

//export proxykeywords_KeywordCaller_Short
func proxykeywords_KeywordCaller_Short(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Short()
}

//export proxykeywords_KeywordCaller_Static
func proxykeywords_KeywordCaller_Static(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Static()
}

//export proxykeywords_KeywordCaller_Strictfp
func proxykeywords_KeywordCaller_Strictfp(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Strictfp()
}

//export proxykeywords_KeywordCaller_Super
func proxykeywords_KeywordCaller_Super(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Super()
}

//export proxykeywords_KeywordCaller_Switch
func proxykeywords_KeywordCaller_Switch(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Switch()
}

//export proxykeywords_KeywordCaller_Synchronized
func proxykeywords_KeywordCaller_Synchronized(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Synchronized()
}

//export proxykeywords_KeywordCaller_This
func proxykeywords_KeywordCaller_This(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.This()
}

//export proxykeywords_KeywordCaller_Throw
func proxykeywords_KeywordCaller_Throw(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Throw()
}

//export proxykeywords_KeywordCaller_Throws
func proxykeywords_KeywordCaller_Throws(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Throws()
}

//export proxykeywords_KeywordCaller_Transient
func proxykeywords_KeywordCaller_Transient(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Transient()
}

//export proxykeywords_KeywordCaller_True
func proxykeywords_KeywordCaller_True(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.True()
}

//export proxykeywords_KeywordCaller_Try
func proxykeywords_KeywordCaller_Try(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Try()
}

//export proxykeywords_KeywordCaller_Void
func proxykeywords_KeywordCaller_Void(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Void()
}

//export proxykeywords_KeywordCaller_Volatile
func proxykeywords_KeywordCaller_Volatile(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Volatile()
}

//export proxykeywords_KeywordCaller_While
func proxykeywords_KeywordCaller_While(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.While()
}

type proxykeywords_KeywordCaller _seq.Ref

func (p *proxykeywords_KeywordCaller) Bind_proxy_refnum__() int32 {
	return (*_seq.Ref)(p).Bind_IncNum()
}

func (p *proxykeywords_KeywordCaller) Abstract() {
	C.cproxykeywords_KeywordCaller_Abstract(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Assert() {
	C.cproxykeywords_KeywordCaller_Assert(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Bool() {
	C.cproxykeywords_KeywordCaller_Bool(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Boolean() {
	C.cproxykeywords_KeywordCaller_Boolean(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Break() {
	C.cproxykeywords_KeywordCaller_Break(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Byte() {
	C.cproxykeywords_KeywordCaller_Byte(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Case() {
	C.cproxykeywords_KeywordCaller_Case(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Catch() {
	C.cproxykeywords_KeywordCaller_Catch(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Char() {
	C.cproxykeywords_KeywordCaller_Char(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Class() {
	C.cproxykeywords_KeywordCaller_Class(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Const() {
	C.cproxykeywords_KeywordCaller_Const(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Continue() {
	C.cproxykeywords_KeywordCaller_Continue(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Default() {
	C.cproxykeywords_KeywordCaller_Default(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Do() {
	C.cproxykeywords_KeywordCaller_Do(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Double() {
	C.cproxykeywords_KeywordCaller_Double(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Else() {
	C.cproxykeywords_KeywordCaller_Else(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Enum() {
	C.cproxykeywords_KeywordCaller_Enum(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Extends() {
	C.cproxykeywords_KeywordCaller_Extends(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) False() {
	C.cproxykeywords_KeywordCaller_False(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Final() {
	C.cproxykeywords_KeywordCaller_Final(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Finally() {
	C.cproxykeywords_KeywordCaller_Finally(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Float() {
	C.cproxykeywords_KeywordCaller_Float(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) For() {
	C.cproxykeywords_KeywordCaller_For(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Goto() {
	C.cproxykeywords_KeywordCaller_Goto(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) If() {
	C.cproxykeywords_KeywordCaller_If(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Implements() {
	C.cproxykeywords_KeywordCaller_Implements(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Import() {
	C.cproxykeywords_KeywordCaller_Import(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Instanceof() {
	C.cproxykeywords_KeywordCaller_Instanceof(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Int() {
	C.cproxykeywords_KeywordCaller_Int(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Interface() {
	C.cproxykeywords_KeywordCaller_Interface(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Long() {
	C.cproxykeywords_KeywordCaller_Long(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Native() {
	C.cproxykeywords_KeywordCaller_Native(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) New() {
	C.cproxykeywords_KeywordCaller_New(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Nil() {
	C.cproxykeywords_KeywordCaller_Nil(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Null() {
	C.cproxykeywords_KeywordCaller_Null(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Package() {
	C.cproxykeywords_KeywordCaller_Package(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Private() {
	C.cproxykeywords_KeywordCaller_Private(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Protected() {
	C.cproxykeywords_KeywordCaller_Protected(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Public() {
	C.cproxykeywords_KeywordCaller_Public(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Return() {
	C.cproxykeywords_KeywordCaller_Return(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Short() {
	C.cproxykeywords_KeywordCaller_Short(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Static() {
	C.cproxykeywords_KeywordCaller_Static(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Strictfp() {
	C.cproxykeywords_KeywordCaller_Strictfp(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Super() {
	C.cproxykeywords_KeywordCaller_Super(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Switch() {
	C.cproxykeywords_KeywordCaller_Switch(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Synchronized() {
	C.cproxykeywords_KeywordCaller_Synchronized(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) This() {
	C.cproxykeywords_KeywordCaller_This(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Throw() {
	C.cproxykeywords_KeywordCaller_Throw(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Throws() {
	C.cproxykeywords_KeywordCaller_Throws(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Transient() {
	C.cproxykeywords_KeywordCaller_Transient(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) True() {
	C.cproxykeywords_KeywordCaller_True(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Try() {
	C.cproxykeywords_KeywordCaller_Try(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Void() {
	C.cproxykeywords_KeywordCaller_Void(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Volatile() {
	C.cproxykeywords_KeywordCaller_Volatile(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) While() {
	C.cproxykeywords_KeywordCaller_While(C.int32_t(p.Bind_proxy_refnum__()))
}

//export proxykeywords__Const
func proxykeywords__Const(param_id C.nstring) {
	_param_id := decodeString(param_id)
	keywords.Const(_param_id)
}

//export proxykeywords__Static
func proxykeywords__Static(param_strictfp C.nstring) {
	_param_strictfp := decodeString(param_strictfp)
	keywords.Static(_param_strictfp)
}
