| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | #ifndef __XML_XPATH_INTERNALS_H__ |
| | #define __XML_XPATH_INTERNALS_H__ |
| |
|
| | #include <libxml/xmlversion.h> |
| | #include <libxml/xpath.h> |
| |
|
| | #ifdef LIBXML_XPATH_ENABLED |
| |
|
| | #ifdef __cplusplus |
| | extern "C" { |
| | #endif |
| |
|
| | |
| | |
| | |
| | |
| | |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | #define xmlXPathSetError(ctxt, err) \ |
| | { xmlXPatherror((ctxt), __FILE__, __LINE__, (err)); \ |
| | if ((ctxt) != NULL) (ctxt)->error = (err); } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | #define xmlXPathSetArityError(ctxt) \ |
| | xmlXPathSetError((ctxt), XPATH_INVALID_ARITY) |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | #define xmlXPathSetTypeError(ctxt) \ |
| | xmlXPathSetError((ctxt), XPATH_INVALID_TYPE) |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | #define xmlXPathGetError(ctxt) ((ctxt)->error) |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | #define xmlXPathCheckError(ctxt) ((ctxt)->error != XPATH_EXPRESSION_OK) |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | #define xmlXPathGetDocument(ctxt) ((ctxt)->context->doc) |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | #define xmlXPathGetContextNode(ctxt) ((ctxt)->context->node) |
| |
|
| | XMLPUBFUN int |
| | xmlXPathPopBoolean (xmlXPathParserContextPtr ctxt); |
| | XMLPUBFUN double |
| | xmlXPathPopNumber (xmlXPathParserContextPtr ctxt); |
| | XMLPUBFUN xmlChar * |
| | xmlXPathPopString (xmlXPathParserContextPtr ctxt); |
| | XMLPUBFUN xmlNodeSetPtr |
| | xmlXPathPopNodeSet (xmlXPathParserContextPtr ctxt); |
| | XMLPUBFUN void * |
| | xmlXPathPopExternal (xmlXPathParserContextPtr ctxt); |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | #define xmlXPathReturnBoolean(ctxt, val) \ |
| | valuePush((ctxt), xmlXPathNewBoolean(val)) |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | #define xmlXPathReturnTrue(ctxt) xmlXPathReturnBoolean((ctxt), 1) |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | #define xmlXPathReturnFalse(ctxt) xmlXPathReturnBoolean((ctxt), 0) |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | #define xmlXPathReturnNumber(ctxt, val) \ |
| | valuePush((ctxt), xmlXPathNewFloat(val)) |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | #define xmlXPathReturnString(ctxt, str) \ |
| | valuePush((ctxt), xmlXPathWrapString(str)) |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | #define xmlXPathReturnEmptyString(ctxt) \ |
| | valuePush((ctxt), xmlXPathNewCString("")) |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | #define xmlXPathReturnNodeSet(ctxt, ns) \ |
| | valuePush((ctxt), xmlXPathWrapNodeSet(ns)) |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | #define xmlXPathReturnEmptyNodeSet(ctxt) \ |
| | valuePush((ctxt), xmlXPathNewNodeSet(NULL)) |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | #define xmlXPathReturnExternal(ctxt, val) \ |
| | valuePush((ctxt), xmlXPathWrapExternal(val)) |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | #define xmlXPathStackIsNodeSet(ctxt) \ |
| | (((ctxt)->value != NULL) \ |
| | && (((ctxt)->value->type == XPATH_NODESET) \ |
| | || ((ctxt)->value->type == XPATH_XSLT_TREE))) |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | #define xmlXPathStackIsExternal(ctxt) \ |
| | ((ctxt->value != NULL) && (ctxt->value->type == XPATH_USERS)) |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | #define xmlXPathEmptyNodeSet(ns) \ |
| | { while ((ns)->nodeNr > 0) (ns)->nodeTab[--(ns)->nodeNr] = NULL; } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | #define CHECK_ERROR \ |
| | if (ctxt->error != XPATH_EXPRESSION_OK) return |
| |
|
| | |
| | |
| | |
| | |
| | |
| | #define CHECK_ERROR0 \ |
| | if (ctxt->error != XPATH_EXPRESSION_OK) return(0) |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | #define XP_ERROR(X) \ |
| | { xmlXPathErr(ctxt, X); return; } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | #define XP_ERROR0(X) \ |
| | { xmlXPathErr(ctxt, X); return(0); } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | #define CHECK_TYPE(typeval) \ |
| | if ((ctxt->value == NULL) || (ctxt->value->type != typeval)) \ |
| | XP_ERROR(XPATH_INVALID_TYPE) |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | #define CHECK_TYPE0(typeval) \ |
| | if ((ctxt->value == NULL) || (ctxt->value->type != typeval)) \ |
| | XP_ERROR0(XPATH_INVALID_TYPE) |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | #define CHECK_ARITY(x) \ |
| | if (ctxt == NULL) return; \ |
| | if (nargs != (x)) \ |
| | XP_ERROR(XPATH_INVALID_ARITY); \ |
| | if (ctxt->valueNr < ctxt->valueFrame + (x)) \ |
| | XP_ERROR(XPATH_STACK_ERROR); |
| |
|
| | |
| | |
| | |
| | |
| | |
| | #define CAST_TO_STRING \ |
| | if ((ctxt->value != NULL) && (ctxt->value->type != XPATH_STRING)) \ |
| | xmlXPathStringFunction(ctxt, 1); |
| |
|
| | |
| | |
| | |
| | |
| | |
| | #define CAST_TO_NUMBER \ |
| | if ((ctxt->value != NULL) && (ctxt->value->type != XPATH_NUMBER)) \ |
| | xmlXPathNumberFunction(ctxt, 1); |
| |
|
| | |
| | |
| | |
| | |
| | |
| | #define CAST_TO_BOOLEAN \ |
| | if ((ctxt->value != NULL) && (ctxt->value->type != XPATH_BOOLEAN)) \ |
| | xmlXPathBooleanFunction(ctxt, 1); |
| |
|
| | |
| | |
| | |
| |
|
| | XMLPUBFUN void |
| | xmlXPathRegisterVariableLookup (xmlXPathContextPtr ctxt, |
| | xmlXPathVariableLookupFunc f, |
| | void *data); |
| |
|
| | |
| | |
| | |
| |
|
| | XMLPUBFUN void |
| | xmlXPathRegisterFuncLookup (xmlXPathContextPtr ctxt, |
| | xmlXPathFuncLookupFunc f, |
| | void *funcCtxt); |
| |
|
| | |
| | |
| | |
| | XMLPUBFUN void |
| | xmlXPatherror (xmlXPathParserContextPtr ctxt, |
| | const char *file, |
| | int line, |
| | int no); |
| |
|
| | XMLPUBFUN void |
| | xmlXPathErr (xmlXPathParserContextPtr ctxt, |
| | int error); |
| |
|
| | #ifdef LIBXML_DEBUG_ENABLED |
| | XMLPUBFUN void |
| | xmlXPathDebugDumpObject (FILE *output, |
| | xmlXPathObjectPtr cur, |
| | int depth); |
| | XMLPUBFUN void |
| | xmlXPathDebugDumpCompExpr(FILE *output, |
| | xmlXPathCompExprPtr comp, |
| | int depth); |
| | #endif |
| | |
| | |
| | |
| | XMLPUBFUN int |
| | xmlXPathNodeSetContains (xmlNodeSetPtr cur, |
| | xmlNodePtr val); |
| | XMLPUBFUN xmlNodeSetPtr |
| | xmlXPathDifference (xmlNodeSetPtr nodes1, |
| | xmlNodeSetPtr nodes2); |
| | XMLPUBFUN xmlNodeSetPtr |
| | xmlXPathIntersection (xmlNodeSetPtr nodes1, |
| | xmlNodeSetPtr nodes2); |
| |
|
| | XMLPUBFUN xmlNodeSetPtr |
| | xmlXPathDistinctSorted (xmlNodeSetPtr nodes); |
| | XMLPUBFUN xmlNodeSetPtr |
| | xmlXPathDistinct (xmlNodeSetPtr nodes); |
| |
|
| | XMLPUBFUN int |
| | xmlXPathHasSameNodes (xmlNodeSetPtr nodes1, |
| | xmlNodeSetPtr nodes2); |
| |
|
| | XMLPUBFUN xmlNodeSetPtr |
| | xmlXPathNodeLeadingSorted (xmlNodeSetPtr nodes, |
| | xmlNodePtr node); |
| | XMLPUBFUN xmlNodeSetPtr |
| | xmlXPathLeadingSorted (xmlNodeSetPtr nodes1, |
| | xmlNodeSetPtr nodes2); |
| | XMLPUBFUN xmlNodeSetPtr |
| | xmlXPathNodeLeading (xmlNodeSetPtr nodes, |
| | xmlNodePtr node); |
| | XMLPUBFUN xmlNodeSetPtr |
| | xmlXPathLeading (xmlNodeSetPtr nodes1, |
| | xmlNodeSetPtr nodes2); |
| |
|
| | XMLPUBFUN xmlNodeSetPtr |
| | xmlXPathNodeTrailingSorted (xmlNodeSetPtr nodes, |
| | xmlNodePtr node); |
| | XMLPUBFUN xmlNodeSetPtr |
| | xmlXPathTrailingSorted (xmlNodeSetPtr nodes1, |
| | xmlNodeSetPtr nodes2); |
| | XMLPUBFUN xmlNodeSetPtr |
| | xmlXPathNodeTrailing (xmlNodeSetPtr nodes, |
| | xmlNodePtr node); |
| | XMLPUBFUN xmlNodeSetPtr |
| | xmlXPathTrailing (xmlNodeSetPtr nodes1, |
| | xmlNodeSetPtr nodes2); |
| |
|
| |
|
| | |
| | |
| | |
| |
|
| | XMLPUBFUN int |
| | xmlXPathRegisterNs (xmlXPathContextPtr ctxt, |
| | const xmlChar *prefix, |
| | const xmlChar *ns_uri); |
| | XMLPUBFUN const xmlChar * |
| | xmlXPathNsLookup (xmlXPathContextPtr ctxt, |
| | const xmlChar *prefix); |
| | XMLPUBFUN void |
| | xmlXPathRegisteredNsCleanup (xmlXPathContextPtr ctxt); |
| |
|
| | XMLPUBFUN int |
| | xmlXPathRegisterFunc (xmlXPathContextPtr ctxt, |
| | const xmlChar *name, |
| | xmlXPathFunction f); |
| | XMLPUBFUN int |
| | xmlXPathRegisterFuncNS (xmlXPathContextPtr ctxt, |
| | const xmlChar *name, |
| | const xmlChar *ns_uri, |
| | xmlXPathFunction f); |
| | XMLPUBFUN int |
| | xmlXPathRegisterVariable (xmlXPathContextPtr ctxt, |
| | const xmlChar *name, |
| | xmlXPathObjectPtr value); |
| | XMLPUBFUN int |
| | xmlXPathRegisterVariableNS (xmlXPathContextPtr ctxt, |
| | const xmlChar *name, |
| | const xmlChar *ns_uri, |
| | xmlXPathObjectPtr value); |
| | XMLPUBFUN xmlXPathFunction |
| | xmlXPathFunctionLookup (xmlXPathContextPtr ctxt, |
| | const xmlChar *name); |
| | XMLPUBFUN xmlXPathFunction |
| | xmlXPathFunctionLookupNS (xmlXPathContextPtr ctxt, |
| | const xmlChar *name, |
| | const xmlChar *ns_uri); |
| | XMLPUBFUN void |
| | xmlXPathRegisteredFuncsCleanup (xmlXPathContextPtr ctxt); |
| | XMLPUBFUN xmlXPathObjectPtr |
| | xmlXPathVariableLookup (xmlXPathContextPtr ctxt, |
| | const xmlChar *name); |
| | XMLPUBFUN xmlXPathObjectPtr |
| | xmlXPathVariableLookupNS (xmlXPathContextPtr ctxt, |
| | const xmlChar *name, |
| | const xmlChar *ns_uri); |
| | XMLPUBFUN void |
| | xmlXPathRegisteredVariablesCleanup(xmlXPathContextPtr ctxt); |
| |
|
| | |
| | |
| | |
| | XMLPUBFUN xmlXPathParserContextPtr |
| | xmlXPathNewParserContext (const xmlChar *str, |
| | xmlXPathContextPtr ctxt); |
| | XMLPUBFUN void |
| | xmlXPathFreeParserContext (xmlXPathParserContextPtr ctxt); |
| |
|
| | |
| | XMLPUBFUN xmlXPathObjectPtr |
| | valuePop (xmlXPathParserContextPtr ctxt); |
| | XMLPUBFUN int |
| | valuePush (xmlXPathParserContextPtr ctxt, |
| | xmlXPathObjectPtr value); |
| |
|
| | XMLPUBFUN xmlXPathObjectPtr |
| | xmlXPathNewString (const xmlChar *val); |
| | XMLPUBFUN xmlXPathObjectPtr |
| | xmlXPathNewCString (const char *val); |
| | XMLPUBFUN xmlXPathObjectPtr |
| | xmlXPathWrapString (xmlChar *val); |
| | XMLPUBFUN xmlXPathObjectPtr |
| | xmlXPathWrapCString (char * val); |
| | XMLPUBFUN xmlXPathObjectPtr |
| | xmlXPathNewFloat (double val); |
| | XMLPUBFUN xmlXPathObjectPtr |
| | xmlXPathNewBoolean (int val); |
| | XMLPUBFUN xmlXPathObjectPtr |
| | xmlXPathNewNodeSet (xmlNodePtr val); |
| | XMLPUBFUN xmlXPathObjectPtr |
| | xmlXPathNewValueTree (xmlNodePtr val); |
| | XMLPUBFUN int |
| | xmlXPathNodeSetAdd (xmlNodeSetPtr cur, |
| | xmlNodePtr val); |
| | XMLPUBFUN int |
| | xmlXPathNodeSetAddUnique (xmlNodeSetPtr cur, |
| | xmlNodePtr val); |
| | XMLPUBFUN int |
| | xmlXPathNodeSetAddNs (xmlNodeSetPtr cur, |
| | xmlNodePtr node, |
| | xmlNsPtr ns); |
| | XMLPUBFUN void |
| | xmlXPathNodeSetSort (xmlNodeSetPtr set); |
| |
|
| | XMLPUBFUN void |
| | xmlXPathRoot (xmlXPathParserContextPtr ctxt); |
| | XMLPUBFUN void |
| | xmlXPathEvalExpr (xmlXPathParserContextPtr ctxt); |
| | XMLPUBFUN xmlChar * |
| | xmlXPathParseName (xmlXPathParserContextPtr ctxt); |
| | XMLPUBFUN xmlChar * |
| | xmlXPathParseNCName (xmlXPathParserContextPtr ctxt); |
| |
|
| | |
| | |
| | |
| | XMLPUBFUN double |
| | xmlXPathStringEvalNumber (const xmlChar *str); |
| | XMLPUBFUN int |
| | xmlXPathEvaluatePredicateResult (xmlXPathParserContextPtr ctxt, |
| | xmlXPathObjectPtr res); |
| | XMLPUBFUN void |
| | xmlXPathRegisterAllFunctions (xmlXPathContextPtr ctxt); |
| | XMLPUBFUN xmlNodeSetPtr |
| | xmlXPathNodeSetMerge (xmlNodeSetPtr val1, |
| | xmlNodeSetPtr val2); |
| | XMLPUBFUN void |
| | xmlXPathNodeSetDel (xmlNodeSetPtr cur, |
| | xmlNodePtr val); |
| | XMLPUBFUN void |
| | xmlXPathNodeSetRemove (xmlNodeSetPtr cur, |
| | int val); |
| | XMLPUBFUN xmlXPathObjectPtr |
| | xmlXPathNewNodeSetList (xmlNodeSetPtr val); |
| | XMLPUBFUN xmlXPathObjectPtr |
| | xmlXPathWrapNodeSet (xmlNodeSetPtr val); |
| | XMLPUBFUN xmlXPathObjectPtr |
| | xmlXPathWrapExternal (void *val); |
| |
|
| | XMLPUBFUN int xmlXPathEqualValues(xmlXPathParserContextPtr ctxt); |
| | XMLPUBFUN int xmlXPathNotEqualValues(xmlXPathParserContextPtr ctxt); |
| | XMLPUBFUN int xmlXPathCompareValues(xmlXPathParserContextPtr ctxt, int inf, int strict); |
| | XMLPUBFUN void xmlXPathValueFlipSign(xmlXPathParserContextPtr ctxt); |
| | XMLPUBFUN void xmlXPathAddValues(xmlXPathParserContextPtr ctxt); |
| | XMLPUBFUN void xmlXPathSubValues(xmlXPathParserContextPtr ctxt); |
| | XMLPUBFUN void xmlXPathMultValues(xmlXPathParserContextPtr ctxt); |
| | XMLPUBFUN void xmlXPathDivValues(xmlXPathParserContextPtr ctxt); |
| | XMLPUBFUN void xmlXPathModValues(xmlXPathParserContextPtr ctxt); |
| |
|
| | XMLPUBFUN int xmlXPathIsNodeType(const xmlChar *name); |
| |
|
| | |
| | |
| | |
| | XMLPUBFUN xmlNodePtr xmlXPathNextSelf(xmlXPathParserContextPtr ctxt, |
| | xmlNodePtr cur); |
| | XMLPUBFUN xmlNodePtr xmlXPathNextChild(xmlXPathParserContextPtr ctxt, |
| | xmlNodePtr cur); |
| | XMLPUBFUN xmlNodePtr xmlXPathNextDescendant(xmlXPathParserContextPtr ctxt, |
| | xmlNodePtr cur); |
| | XMLPUBFUN xmlNodePtr xmlXPathNextDescendantOrSelf(xmlXPathParserContextPtr ctxt, |
| | xmlNodePtr cur); |
| | XMLPUBFUN xmlNodePtr xmlXPathNextParent(xmlXPathParserContextPtr ctxt, |
| | xmlNodePtr cur); |
| | XMLPUBFUN xmlNodePtr xmlXPathNextAncestorOrSelf(xmlXPathParserContextPtr ctxt, |
| | xmlNodePtr cur); |
| | XMLPUBFUN xmlNodePtr xmlXPathNextFollowingSibling(xmlXPathParserContextPtr ctxt, |
| | xmlNodePtr cur); |
| | XMLPUBFUN xmlNodePtr xmlXPathNextFollowing(xmlXPathParserContextPtr ctxt, |
| | xmlNodePtr cur); |
| | XMLPUBFUN xmlNodePtr xmlXPathNextNamespace(xmlXPathParserContextPtr ctxt, |
| | xmlNodePtr cur); |
| | XMLPUBFUN xmlNodePtr xmlXPathNextAttribute(xmlXPathParserContextPtr ctxt, |
| | xmlNodePtr cur); |
| | XMLPUBFUN xmlNodePtr xmlXPathNextPreceding(xmlXPathParserContextPtr ctxt, |
| | xmlNodePtr cur); |
| | XMLPUBFUN xmlNodePtr xmlXPathNextAncestor(xmlXPathParserContextPtr ctxt, |
| | xmlNodePtr cur); |
| | XMLPUBFUN xmlNodePtr xmlXPathNextPrecedingSibling(xmlXPathParserContextPtr ctxt, |
| | xmlNodePtr cur); |
| | |
| | |
| | |
| | XMLPUBFUN void xmlXPathLastFunction(xmlXPathParserContextPtr ctxt, int nargs); |
| | XMLPUBFUN void xmlXPathPositionFunction(xmlXPathParserContextPtr ctxt, int nargs); |
| | XMLPUBFUN void xmlXPathCountFunction(xmlXPathParserContextPtr ctxt, int nargs); |
| | XMLPUBFUN void xmlXPathIdFunction(xmlXPathParserContextPtr ctxt, int nargs); |
| | XMLPUBFUN void xmlXPathLocalNameFunction(xmlXPathParserContextPtr ctxt, int nargs); |
| | XMLPUBFUN void xmlXPathNamespaceURIFunction(xmlXPathParserContextPtr ctxt, int nargs); |
| | XMLPUBFUN void xmlXPathStringFunction(xmlXPathParserContextPtr ctxt, int nargs); |
| | XMLPUBFUN void xmlXPathStringLengthFunction(xmlXPathParserContextPtr ctxt, int nargs); |
| | XMLPUBFUN void xmlXPathConcatFunction(xmlXPathParserContextPtr ctxt, int nargs); |
| | XMLPUBFUN void xmlXPathContainsFunction(xmlXPathParserContextPtr ctxt, int nargs); |
| | XMLPUBFUN void xmlXPathStartsWithFunction(xmlXPathParserContextPtr ctxt, int nargs); |
| | XMLPUBFUN void xmlXPathSubstringFunction(xmlXPathParserContextPtr ctxt, int nargs); |
| | XMLPUBFUN void xmlXPathSubstringBeforeFunction(xmlXPathParserContextPtr ctxt, int nargs); |
| | XMLPUBFUN void xmlXPathSubstringAfterFunction(xmlXPathParserContextPtr ctxt, int nargs); |
| | XMLPUBFUN void xmlXPathNormalizeFunction(xmlXPathParserContextPtr ctxt, int nargs); |
| | XMLPUBFUN void xmlXPathTranslateFunction(xmlXPathParserContextPtr ctxt, int nargs); |
| | XMLPUBFUN void xmlXPathNotFunction(xmlXPathParserContextPtr ctxt, int nargs); |
| | XMLPUBFUN void xmlXPathTrueFunction(xmlXPathParserContextPtr ctxt, int nargs); |
| | XMLPUBFUN void xmlXPathFalseFunction(xmlXPathParserContextPtr ctxt, int nargs); |
| | XMLPUBFUN void xmlXPathLangFunction(xmlXPathParserContextPtr ctxt, int nargs); |
| | XMLPUBFUN void xmlXPathNumberFunction(xmlXPathParserContextPtr ctxt, int nargs); |
| | XMLPUBFUN void xmlXPathSumFunction(xmlXPathParserContextPtr ctxt, int nargs); |
| | XMLPUBFUN void xmlXPathFloorFunction(xmlXPathParserContextPtr ctxt, int nargs); |
| | XMLPUBFUN void xmlXPathCeilingFunction(xmlXPathParserContextPtr ctxt, int nargs); |
| | XMLPUBFUN void xmlXPathRoundFunction(xmlXPathParserContextPtr ctxt, int nargs); |
| | XMLPUBFUN void xmlXPathBooleanFunction(xmlXPathParserContextPtr ctxt, int nargs); |
| |
|
| | |
| | |
| | |
| | XMLPUBFUN void xmlXPathNodeSetFreeNs(xmlNsPtr ns); |
| |
|
| | #ifdef __cplusplus |
| | } |
| | #endif |
| |
|
| | #endif |
| | #endif |
| |
|